central-auth-js-sdk 1.0.10

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.
package/styles.css ADDED
@@ -0,0 +1,947 @@
1
+ /**
2
+ * Central Auth SDK — Design System v3.0
3
+ * Ground-up redesign: Centered card, warm gradient mesh, premium SaaS feel
4
+ */
5
+
6
+ @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400;1,500&display=swap');
7
+
8
+ /* ============================= DESIGN TOKENS ============================= */
9
+
10
+ :root {
11
+ --wf-font: 'Plus Jakarta Sans', system-ui, sans-serif;
12
+ --wf-bg: #F5F1EC;
13
+ --wf-card: #FFFFFF;
14
+ --wf-fg: #1A1714;
15
+ --wf-fg-soft: #3D3832;
16
+ --wf-muted: #A09890;
17
+ --wf-muted-bg: #F0EBE4;
18
+ --wf-primary: #D46B2D;
19
+ --wf-primary-dark: #B85A22;
20
+ --wf-primary-light: rgba(212, 107, 45, 0.07);
21
+ --wf-primary-glow: rgba(212, 107, 45, 0.18);
22
+ --wf-border: #E5E0DA;
23
+ --wf-border-hover: #CFC8BF;
24
+ --wf-input-bg: #FAFAF8;
25
+ --wf-destructive: #C43E3E;
26
+ --wf-destructive-bg: rgba(196, 62, 62, 0.06);
27
+ --wf-success: #1A8754;
28
+ --wf-success-bg: rgba(26, 135, 84, 0.07);
29
+ --wf-success-fg: #FFFFFF;
30
+ --wf-radius-sm: 0.5rem;
31
+ --wf-radius: 0.75rem;
32
+ --wf-radius-lg: 1rem;
33
+ --wf-radius-xl: 1.5rem;
34
+ --wf-shadow-card:
35
+ 0 0 0 1px rgba(0, 0, 0, 0.03),
36
+ 0 1px 2px rgba(0, 0, 0, 0.02),
37
+ 0 4px 8px rgba(0, 0, 0, 0.03),
38
+ 0 16px 48px rgba(0, 0, 0, 0.06);
39
+ --wf-shadow-btn: 0 1px 3px rgba(0, 0, 0, 0.06), 0 4px 12px rgba(212, 107, 45, 0.18);
40
+ --wf-shadow-btn-hover: 0 2px 6px rgba(0, 0, 0, 0.08), 0 8px 24px rgba(212, 107, 45, 0.22);
41
+ --wf-shadow-input: 0 1px 2px rgba(0, 0, 0, 0.04);
42
+ --wf-ease: cubic-bezier(0.4, 0, 0.2, 1);
43
+ --wf-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
44
+
45
+ /* Gradient endpoints (derived from primary; overridden by theme engine) */
46
+ --wf-primary-grad-start: #E8985A;
47
+ --wf-primary-grad-end: #C45828;
48
+
49
+ /* Decorative orb colors */
50
+ --wf-orb-1: hsla(28, 70%, 80%, 0.4);
51
+ --wf-orb-2: hsla(15, 50%, 82%, 0.35);
52
+ --wf-orb-3: hsla(40, 60%, 85%, 0.3);
53
+
54
+ /* Face-capture overlay border */
55
+ --wf-face-border: rgba(212, 107, 45, 0.5);
56
+ }
57
+
58
+ /* ============================= BASE ============================= */
59
+
60
+ .wf-layout *,
61
+ .wf-layout *::before,
62
+ .wf-layout *::after {
63
+ box-sizing: border-box;
64
+ }
65
+
66
+ .wf-layout {
67
+ position: relative;
68
+ min-height: 100vh;
69
+ display: flex;
70
+ flex-direction: column;
71
+ align-items: center;
72
+ justify-content: center;
73
+ padding: 1.5rem;
74
+ font-family: var(--wf-font);
75
+ color: var(--wf-fg);
76
+ background: var(--wf-bg);
77
+ -webkit-font-smoothing: antialiased;
78
+ -moz-osx-font-smoothing: grayscale;
79
+ overflow-x: hidden;
80
+ }
81
+
82
+ /* ============================= GRADIENT BACKGROUND ============================= */
83
+
84
+ .wf-bg {
85
+ position: fixed;
86
+ inset: 0;
87
+ pointer-events: none;
88
+ z-index: 0;
89
+ background:
90
+ radial-gradient(ellipse 80% 50% at 20% 80%, hsla(28, 65%, 88%, 0.7) 0%, transparent 55%),
91
+ radial-gradient(ellipse 60% 60% at 85% 15%, hsla(35, 50%, 85%, 0.5) 0%, transparent 50%),
92
+ radial-gradient(ellipse 50% 50% at 50% 50%, hsla(20, 30%, 92%, 0.4) 0%, transparent 60%),
93
+ var(--wf-bg);
94
+ }
95
+
96
+ .wf-bg-orb {
97
+ position: absolute;
98
+ border-radius: 50%;
99
+ filter: blur(80px);
100
+ opacity: 0.5;
101
+ will-change: transform;
102
+ }
103
+
104
+ .wf-bg-orb-1 {
105
+ width: 500px;
106
+ height: 500px;
107
+ top: -10%;
108
+ left: -5%;
109
+ background: var(--wf-orb-1);
110
+ animation: wf-drift-1 22s ease-in-out infinite;
111
+ }
112
+
113
+ .wf-bg-orb-2 {
114
+ width: 400px;
115
+ height: 400px;
116
+ bottom: -10%;
117
+ right: -5%;
118
+ background: var(--wf-orb-2);
119
+ animation: wf-drift-2 26s ease-in-out infinite;
120
+ }
121
+
122
+ .wf-bg-orb-3 {
123
+ width: 300px;
124
+ height: 300px;
125
+ top: 30%;
126
+ right: 20%;
127
+ background: var(--wf-orb-3);
128
+ animation: wf-drift-3 20s ease-in-out infinite;
129
+ }
130
+
131
+ @keyframes wf-drift-1 {
132
+ 0%, 100% { transform: translate(0, 0) scale(1); }
133
+ 50% { transform: translate(40px, 30px) scale(1.05); }
134
+ }
135
+
136
+ @keyframes wf-drift-2 {
137
+ 0%, 100% { transform: translate(0, 0) scale(1); }
138
+ 50% { transform: translate(-30px, -40px) scale(1.08); }
139
+ }
140
+
141
+ @keyframes wf-drift-3 {
142
+ 0%, 100% { transform: translate(0, 0) scale(1); }
143
+ 50% { transform: translate(-20px, 20px) scale(0.95); }
144
+ }
145
+
146
+ /* ============================= CARD ============================= */
147
+
148
+ .wf-card {
149
+ position: relative;
150
+ z-index: 1;
151
+ width: 100%;
152
+ max-width: 460px;
153
+ background: var(--wf-card);
154
+ border-radius: var(--wf-radius-xl);
155
+ box-shadow: var(--wf-shadow-card);
156
+ animation: wf-card-enter 0.5s var(--wf-ease) both;
157
+ }
158
+
159
+ @keyframes wf-card-enter {
160
+ from { opacity: 0; transform: translateY(16px) scale(0.98); }
161
+ to { opacity: 1; transform: translateY(0) scale(1); }
162
+ }
163
+
164
+ .wf-card-accent {
165
+ height: 3px;
166
+ background: linear-gradient(90deg, var(--wf-primary-grad-start) 0%, var(--wf-primary) 50%, var(--wf-primary-grad-end) 100%);
167
+ border-radius: var(--wf-radius-xl) var(--wf-radius-xl) 0 0;
168
+ }
169
+
170
+ .wf-card-inner {
171
+ padding: 2rem 2.25rem 2.25rem;
172
+ }
173
+
174
+ /* ============================= CARD HEADER ============================= */
175
+
176
+ .wf-card-header {
177
+ display: flex;
178
+ align-items: center;
179
+ justify-content: space-between;
180
+ margin-bottom: 1.75rem;
181
+ }
182
+
183
+ .wf-card-brand {
184
+ display: flex;
185
+ align-items: center;
186
+ gap: 0.5rem;
187
+ }
188
+
189
+ .wf-card-logo {
190
+ width: 2rem;
191
+ height: 2rem;
192
+ border-radius: var(--wf-radius-sm);
193
+ background: var(--wf-primary);
194
+ display: flex;
195
+ align-items: center;
196
+ justify-content: center;
197
+ color: white;
198
+ }
199
+
200
+ .wf-card-logo svg {
201
+ width: 1rem;
202
+ height: 1rem;
203
+ }
204
+
205
+ .wf-card-brand-name {
206
+ font-size: 0.9375rem;
207
+ font-weight: 700;
208
+ color: var(--wf-fg);
209
+ letter-spacing: -0.01em;
210
+ }
211
+
212
+ /* ============================= PROGRESS RING ============================= */
213
+
214
+ .wf-ring {
215
+ position: relative;
216
+ width: 2.5rem;
217
+ height: 2.5rem;
218
+ flex-shrink: 0;
219
+ }
220
+
221
+ .wf-ring::before {
222
+ content: '';
223
+ position: absolute;
224
+ inset: -4px;
225
+ border-radius: 50%;
226
+ background: var(--wf-primary-glow);
227
+ opacity: 0;
228
+ animation: wf-ring-glow 3s ease-in-out infinite;
229
+ pointer-events: none;
230
+ }
231
+
232
+ @keyframes wf-ring-glow {
233
+ 0%, 100% { opacity: 0; transform: scale(0.85); }
234
+ 50% { opacity: 0.45; transform: scale(1.08); }
235
+ }
236
+
237
+ .wf-ring-svg {
238
+ display: block;
239
+ width: 100%;
240
+ height: 100%;
241
+ transform: rotate(-90deg);
242
+ }
243
+
244
+ .wf-ring-track {
245
+ fill: none;
246
+ stroke: var(--wf-muted-bg);
247
+ stroke-width: 2.8;
248
+ }
249
+
250
+ .wf-ring-fill {
251
+ fill: none;
252
+ stroke-width: 2.8;
253
+ stroke-linecap: round;
254
+ transition: stroke-dashoffset 0.6s var(--wf-ease);
255
+ }
256
+
257
+ .wf-ring-num {
258
+ position: absolute;
259
+ inset: 0;
260
+ display: flex;
261
+ align-items: center;
262
+ justify-content: center;
263
+ font-size: 0.8125rem;
264
+ font-weight: 700;
265
+ color: var(--wf-primary);
266
+ line-height: 1;
267
+ }
268
+
269
+ .wf-ring-num.wf-ring-pop {
270
+ animation: wf-num-pop 0.35s var(--wf-ease-spring);
271
+ }
272
+
273
+ @keyframes wf-num-pop {
274
+ 0% { transform: scale(0.5); opacity: 0.4; }
275
+ 60% { transform: scale(1.15); }
276
+ 100% { transform: scale(1); opacity: 1; }
277
+ }
278
+
279
+ /* ============================= CARD BODY ============================= */
280
+
281
+ .wf-card-body {
282
+ min-height: 0;
283
+ }
284
+
285
+ /* ============================= ERROR BANNER ============================= */
286
+
287
+ .wf-error-banner {
288
+ padding: 0.625rem 0.875rem;
289
+ margin-bottom: 1.25rem;
290
+ border-radius: var(--wf-radius);
291
+ background: var(--wf-destructive-bg);
292
+ border: 1px solid rgba(196, 62, 62, 0.12);
293
+ color: var(--wf-destructive);
294
+ font-size: 0.8125rem;
295
+ font-weight: 500;
296
+ line-height: 1.4;
297
+ }
298
+
299
+ .wf-error-banner.hidden {
300
+ display: none;
301
+ }
302
+
303
+ /* ============================= PAGE FOOTER ============================= */
304
+
305
+ .wf-page-footer {
306
+ position: relative;
307
+ z-index: 1;
308
+ margin-top: 1.5rem;
309
+ font-size: 0.75rem;
310
+ color: var(--wf-muted);
311
+ text-align: center;
312
+ }
313
+
314
+ /* ============================= SCREEN ============================= */
315
+
316
+ .wf-screen {
317
+ display: flex;
318
+ flex-direction: column;
319
+ gap: 1.5rem;
320
+ animation: wf-screen-in 0.35s var(--wf-ease) both;
321
+ }
322
+
323
+ @keyframes wf-screen-in {
324
+ from { opacity: 0; transform: translateY(6px); }
325
+ to { opacity: 1; transform: translateY(0); }
326
+ }
327
+
328
+ .wf-screen-back {
329
+ margin-bottom: 0.75rem;
330
+ }
331
+
332
+ .wf-screen-back .wf-btn-ghost {
333
+ padding-left: 0;
334
+ }
335
+
336
+ .wf-screen-header {
337
+ margin-bottom: 0;
338
+ }
339
+
340
+ .wf-icon-box {
341
+ width: 2.5rem;
342
+ height: 2.5rem;
343
+ border-radius: var(--wf-radius);
344
+ background: var(--wf-primary-light);
345
+ display: flex;
346
+ align-items: center;
347
+ justify-content: center;
348
+ margin-bottom: 1rem;
349
+ }
350
+
351
+ .wf-icon-box svg {
352
+ width: 1.125rem;
353
+ height: 1.125rem;
354
+ color: var(--wf-primary);
355
+ }
356
+
357
+ .wf-screen-title {
358
+ font-size: 1.5rem;
359
+ font-weight: 700;
360
+ letter-spacing: -0.025em;
361
+ line-height: 1.2;
362
+ margin-bottom: 0.25rem;
363
+ color: var(--wf-fg);
364
+ }
365
+
366
+ .wf-screen-desc {
367
+ color: var(--wf-muted);
368
+ font-size: 0.875rem;
369
+ line-height: 1.5;
370
+ }
371
+
372
+ .wf-highlight {
373
+ font-weight: 600;
374
+ color: var(--wf-fg);
375
+ }
376
+
377
+ /* ============================= FORM ============================= */
378
+
379
+ .wf-form {
380
+ display: flex;
381
+ flex-direction: column;
382
+ gap: 1rem;
383
+ }
384
+
385
+ .wf-field {
386
+ display: flex;
387
+ flex-direction: column;
388
+ gap: 0.3125rem;
389
+ }
390
+
391
+ .wf-label {
392
+ font-size: 0.8125rem;
393
+ font-weight: 600;
394
+ color: var(--wf-fg-soft);
395
+ }
396
+
397
+ /* ============================= INPUTS ============================= */
398
+
399
+ .wf-input-wrap {
400
+ position: relative;
401
+ }
402
+
403
+ .wf-input {
404
+ display: flex;
405
+ height: 2.75rem;
406
+ width: 100%;
407
+ border-radius: var(--wf-radius);
408
+ border: 1.5px solid var(--wf-border);
409
+ background: var(--wf-input-bg);
410
+ padding: 0 0.875rem;
411
+ font-size: 0.875rem;
412
+ font-family: var(--wf-font);
413
+ color: var(--wf-fg);
414
+ box-shadow: var(--wf-shadow-input);
415
+ transition: border-color 0.2s var(--wf-ease), box-shadow 0.2s var(--wf-ease), background 0.2s var(--wf-ease);
416
+ }
417
+
418
+ .wf-input:hover {
419
+ border-color: var(--wf-border-hover);
420
+ background: var(--wf-card);
421
+ }
422
+
423
+ .wf-input:focus {
424
+ outline: none;
425
+ border-color: var(--wf-primary);
426
+ background: var(--wf-card);
427
+ box-shadow: 0 0 0 3px var(--wf-primary-glow);
428
+ }
429
+
430
+ .wf-input::placeholder {
431
+ color: var(--wf-muted);
432
+ }
433
+
434
+ .wf-input-wrap .wf-input {
435
+ padding-left: 2.5rem;
436
+ }
437
+
438
+ .wf-input-password .wf-input {
439
+ padding-right: 2.5rem;
440
+ }
441
+
442
+ .wf-input-icon-left {
443
+ position: absolute;
444
+ left: 0.875rem;
445
+ top: 50%;
446
+ transform: translateY(-50%);
447
+ width: 1rem;
448
+ height: 1rem;
449
+ color: var(--wf-muted);
450
+ pointer-events: none;
451
+ transition: color 0.2s var(--wf-ease);
452
+ }
453
+
454
+ .wf-input:focus ~ .wf-input-icon-left,
455
+ .wf-input-wrap:focus-within .wf-input-icon-left {
456
+ color: var(--wf-primary);
457
+ }
458
+
459
+ .wf-input-toggle {
460
+ position: absolute;
461
+ right: 0.625rem;
462
+ top: 50%;
463
+ transform: translateY(-50%);
464
+ background: none;
465
+ border: none;
466
+ cursor: pointer;
467
+ color: var(--wf-muted);
468
+ padding: 0.25rem;
469
+ border-radius: 0.25rem;
470
+ transition: color 0.2s var(--wf-ease);
471
+ }
472
+
473
+ .wf-input-toggle:hover { color: var(--wf-fg); }
474
+
475
+ .wf-input-toggle svg { width: 1rem; height: 1rem; }
476
+
477
+ /* Mobile row */
478
+ .wf-mobile-row { display: flex; gap: 0.5rem; }
479
+
480
+ .wf-mobile-row .wf-country-select {
481
+ width: auto;
482
+ min-width: 0;
483
+ max-width: 5rem;
484
+ flex-shrink: 0;
485
+ cursor: pointer;
486
+ appearance: none;
487
+ -webkit-appearance: none;
488
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23A09890' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
489
+ background-repeat: no-repeat;
490
+ background-position: right 0.625rem center;
491
+ padding-right: 2rem;
492
+ }
493
+
494
+ .wf-mobile-row .wf-mobile-input { flex: 1; min-width: 0; }
495
+
496
+ /* ============================= OTP ============================= */
497
+
498
+ .wf-otp-row {
499
+ display: flex;
500
+ gap: 0.5rem;
501
+ }
502
+
503
+ .wf-otp-input {
504
+ width: 2.75rem;
505
+ height: 3rem;
506
+ text-align: center;
507
+ font-size: 1.125rem;
508
+ font-weight: 600;
509
+ border-radius: var(--wf-radius);
510
+ border: 1.5px solid var(--wf-border);
511
+ background: var(--wf-input-bg);
512
+ font-family: var(--wf-font);
513
+ color: var(--wf-fg);
514
+ box-shadow: var(--wf-shadow-input);
515
+ transition: border-color 0.2s var(--wf-ease), box-shadow 0.2s var(--wf-ease);
516
+ }
517
+
518
+ .wf-otp-input:hover { border-color: var(--wf-border-hover); }
519
+
520
+ .wf-otp-input:focus {
521
+ outline: none;
522
+ border-color: var(--wf-primary);
523
+ box-shadow: 0 0 0 3px var(--wf-primary-glow);
524
+ background: var(--wf-card);
525
+ }
526
+
527
+ /* ============================= BUTTONS ============================= */
528
+
529
+ .wf-btn {
530
+ display: inline-flex;
531
+ align-items: center;
532
+ justify-content: center;
533
+ gap: 0.5rem;
534
+ white-space: nowrap;
535
+ border-radius: var(--wf-radius);
536
+ font-size: 0.8125rem;
537
+ font-weight: 600;
538
+ font-family: var(--wf-font);
539
+ cursor: pointer;
540
+ border: none;
541
+ transition: all 0.2s var(--wf-ease);
542
+ position: relative;
543
+ }
544
+
545
+ .wf-btn:disabled { pointer-events: none; opacity: 0.4; }
546
+
547
+ .wf-btn:focus-visible {
548
+ outline: 2px solid var(--wf-primary);
549
+ outline-offset: 2px;
550
+ }
551
+
552
+ .wf-btn-lg { height: 2.75rem; padding: 0 1.25rem; font-size: 0.875rem; }
553
+ .wf-btn-full { width: 100%; }
554
+ .wf-btn-flex { flex: 1; }
555
+
556
+ .wf-btn-primary {
557
+ background: linear-gradient(135deg, var(--wf-primary-grad-start) 0%, var(--wf-primary) 100%);
558
+ color: white;
559
+ box-shadow: var(--wf-shadow-btn);
560
+ }
561
+
562
+ .wf-btn-primary:hover:not(:disabled) {
563
+ box-shadow: var(--wf-shadow-btn-hover);
564
+ transform: translateY(-1px);
565
+ filter: brightness(1.05);
566
+ }
567
+
568
+ .wf-btn-primary:active:not(:disabled) {
569
+ transform: translateY(0);
570
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
571
+ }
572
+
573
+ .wf-btn-outline {
574
+ border: 1.5px solid var(--wf-border);
575
+ background: var(--wf-card);
576
+ color: var(--wf-fg);
577
+ box-shadow: var(--wf-shadow-input);
578
+ }
579
+
580
+ .wf-btn-outline:hover:not(:disabled) {
581
+ background: var(--wf-muted-bg);
582
+ border-color: var(--wf-border-hover);
583
+ }
584
+
585
+ .wf-btn-social {
586
+ border: 1.5px solid var(--wf-border);
587
+ background: var(--wf-card);
588
+ color: var(--wf-fg-soft);
589
+ box-shadow: var(--wf-shadow-input);
590
+ font-weight: 500;
591
+ }
592
+
593
+ .wf-btn-social:hover:not(:disabled) {
594
+ background: var(--wf-muted-bg);
595
+ border-color: var(--wf-border-hover);
596
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
597
+ }
598
+
599
+ .wf-btn-success {
600
+ background: linear-gradient(135deg, #22a06b 0%, var(--wf-success) 100%);
601
+ color: var(--wf-success-fg);
602
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 4px 12px rgba(26, 135, 84, 0.2);
603
+ }
604
+
605
+ .wf-btn-success:hover:not(:disabled) {
606
+ transform: translateY(-1px);
607
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08), 0 8px 24px rgba(26, 135, 84, 0.25);
608
+ }
609
+
610
+ .wf-btn-ghost {
611
+ background: transparent;
612
+ color: var(--wf-muted);
613
+ font-weight: 500;
614
+ }
615
+
616
+ .wf-btn-ghost:hover:not(:disabled) {
617
+ background: var(--wf-muted-bg);
618
+ color: var(--wf-fg);
619
+ }
620
+
621
+ .wf-icon-sm { width: 1rem; height: 1rem; flex-shrink: 0; }
622
+
623
+ /* ============================= SOCIAL BUTTONS ============================= */
624
+
625
+ .wf-social-buttons {
626
+ display: flex;
627
+ gap: 0.625rem;
628
+ }
629
+
630
+ .wf-social-buttons .wf-btn-social {
631
+ flex: 1;
632
+ height: 2.625rem;
633
+ font-size: 0.8125rem;
634
+ }
635
+
636
+ .wf-divider {
637
+ display: flex;
638
+ align-items: center;
639
+ gap: 0.75rem;
640
+ }
641
+
642
+ .wf-divider::before,
643
+ .wf-divider::after {
644
+ content: '';
645
+ flex: 1;
646
+ height: 1px;
647
+ background: var(--wf-border);
648
+ }
649
+
650
+ .wf-divider span {
651
+ font-size: 0.75rem;
652
+ font-weight: 500;
653
+ color: var(--wf-muted);
654
+ white-space: nowrap;
655
+ text-transform: uppercase;
656
+ letter-spacing: 0.04em;
657
+ }
658
+
659
+ /* ============================= ROWS ============================= */
660
+
661
+ .wf-row-2 {
662
+ display: grid;
663
+ grid-template-columns: repeat(2, 1fr);
664
+ gap: 0.625rem;
665
+ }
666
+
667
+ .wf-btn-row {
668
+ display: flex;
669
+ gap: 0.625rem;
670
+ }
671
+
672
+ /* ============================= PASSWORD RULES ============================= */
673
+
674
+ .wf-password-rules {
675
+ display: grid;
676
+ grid-template-columns: repeat(2, 1fr);
677
+ gap: 0.25rem;
678
+ }
679
+
680
+ .wf-rule {
681
+ display: flex;
682
+ align-items: center;
683
+ gap: 0.375rem;
684
+ font-size: 0.6875rem;
685
+ transition: color 0.2s var(--wf-ease);
686
+ }
687
+
688
+ .wf-rule-icon { width: 0.8125rem; height: 0.8125rem; flex-shrink: 0; }
689
+ .wf-rule-unmet { color: var(--wf-muted); opacity: 0.5; }
690
+ .wf-rule-met { color: var(--wf-success); }
691
+
692
+ .wf-error {
693
+ font-size: 0.8125rem;
694
+ color: var(--wf-destructive);
695
+ text-align: center;
696
+ font-weight: 500;
697
+ }
698
+
699
+ /* ============================= FOOTER LINK ============================= */
700
+
701
+ .wf-footer-link {
702
+ text-align: center;
703
+ font-size: 0.8125rem;
704
+ color: var(--wf-muted);
705
+ }
706
+
707
+ .wf-link {
708
+ background: none;
709
+ border: none;
710
+ color: var(--wf-primary);
711
+ font-weight: 600;
712
+ cursor: pointer;
713
+ padding: 0;
714
+ font-family: var(--wf-font);
715
+ font-size: inherit;
716
+ transition: color 0.15s var(--wf-ease);
717
+ }
718
+
719
+ .wf-link:hover { color: var(--wf-primary-dark); text-decoration: underline; }
720
+
721
+ /* ============================= FACE REGISTRATION ============================= */
722
+
723
+ .wf-face-area { display: flex; flex-direction: column; gap: 0.75rem; }
724
+
725
+ .wf-camera-view {
726
+ position: relative;
727
+ width: 100%;
728
+ aspect-ratio: 4 / 3;
729
+ border-radius: var(--wf-radius-lg);
730
+ overflow: hidden;
731
+ background: var(--wf-muted-bg);
732
+ border: 2px dashed var(--wf-border);
733
+ display: flex;
734
+ align-items: center;
735
+ justify-content: center;
736
+ }
737
+
738
+ .wf-camera-placeholder { text-align: center; padding: 1.25rem; }
739
+
740
+ .wf-camera-icon {
741
+ width: 3rem;
742
+ height: 3rem;
743
+ border-radius: 50%;
744
+ background: var(--wf-primary-light);
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: center;
748
+ margin: 0 auto 0.625rem;
749
+ }
750
+
751
+ .wf-camera-icon svg { width: 1.25rem; height: 1.25rem; color: var(--wf-primary); }
752
+ .wf-camera-placeholder p { font-size: 0.8125rem; color: var(--wf-muted); margin-bottom: 0.75rem; }
753
+
754
+ .wf-video, .wf-captured { width: 100%; height: 100%; object-fit: cover; }
755
+
756
+ .wf-face-overlay {
757
+ position: absolute;
758
+ inset: 0;
759
+ display: flex;
760
+ align-items: center;
761
+ justify-content: center;
762
+ pointer-events: none;
763
+ }
764
+
765
+ .wf-face-overlay::before {
766
+ content: '';
767
+ width: 10rem;
768
+ height: 13rem;
769
+ border: 2px solid var(--wf-face-border);
770
+ border-radius: 50%;
771
+ }
772
+
773
+ .wf-face-actions { display: flex; flex-direction: column; gap: 0.625rem; }
774
+
775
+ /* ============================= SUCCESS ============================= */
776
+
777
+ .wf-screen-success { align-items: center; text-align: center; }
778
+
779
+ .wf-success-icon {
780
+ width: 4rem;
781
+ height: 4rem;
782
+ border-radius: 50%;
783
+ background: var(--wf-success-bg);
784
+ display: flex;
785
+ align-items: center;
786
+ justify-content: center;
787
+ animation: wf-success-pop 0.5s var(--wf-ease-spring) both;
788
+ }
789
+
790
+ .wf-success-icon svg { width: 2rem; height: 2rem; color: var(--wf-success); }
791
+
792
+ .wf-success-actions {
793
+ width: 100%;
794
+ max-width: 18rem;
795
+ display: flex;
796
+ flex-direction: column;
797
+ gap: 0.5rem;
798
+ }
799
+
800
+ @keyframes wf-success-pop {
801
+ 0% { transform: scale(0.4); opacity: 0; }
802
+ 70% { transform: scale(1.1); }
803
+ 100% { transform: scale(1); opacity: 1; }
804
+ }
805
+
806
+ /* ============================= LOGIN METHODS ============================= */
807
+
808
+ .wf-login-methods { display: flex; flex-direction: column; gap: 0.5rem; }
809
+
810
+ .wf-login-method {
811
+ display: inline-flex;
812
+ align-items: center;
813
+ gap: 0.625rem;
814
+ justify-content: flex-start;
815
+ text-align: left;
816
+ border-radius: var(--wf-radius);
817
+ transition: all 0.2s var(--wf-ease);
818
+ }
819
+
820
+ .wf-login-method:hover:not(:disabled) {
821
+ border-color: var(--wf-primary);
822
+ background: var(--wf-primary-light);
823
+ }
824
+
825
+ .wf-login-method-icon { width: 1.125rem; height: 1.125rem; flex-shrink: 0; }
826
+
827
+ /* ============================= RING GRADIENT (SVG) ============================= */
828
+
829
+ .wf-ring-grad-start { stop-color: var(--wf-primary-grad-start); }
830
+ .wf-ring-grad-end { stop-color: var(--wf-primary-grad-end); }
831
+
832
+ /* ============================= UTILITY ============================= */
833
+
834
+ .hidden { display: none !important; }
835
+
836
+ /* ============================= RESPONSIVE ============================= */
837
+
838
+ /* ---- Tablet (portrait) & small laptops ---- */
839
+ @media (max-width: 768px) {
840
+ .wf-card { max-width: 420px; }
841
+ .wf-card-inner { padding: 1.75rem 1.75rem 2rem; }
842
+ .wf-card-header { margin-bottom: 1.5rem; }
843
+ .wf-screen { gap: 1.25rem; }
844
+ .wf-screen-title { font-size: 1.375rem; }
845
+ .wf-screen-desc { font-size: 0.8125rem; }
846
+ }
847
+
848
+ /* ---- Mobile (standard) ---- */
849
+ @media (max-width: 520px) {
850
+ .wf-layout {
851
+ padding: 0.75rem;
852
+ justify-content: flex-start;
853
+ padding-top: 1.5rem;
854
+ }
855
+
856
+ .wf-card {
857
+ max-width: 100%;
858
+ border-radius: var(--wf-radius-lg);
859
+ }
860
+
861
+ .wf-card-accent { border-radius: var(--wf-radius-lg) var(--wf-radius-lg) 0 0; }
862
+
863
+ .wf-card-inner { padding: 1.25rem 1.125rem 1.5rem; }
864
+
865
+ .wf-card-header { margin-bottom: 1.25rem; }
866
+
867
+ .wf-card-brand-name { font-size: 0.8125rem; }
868
+ .wf-card-logo { width: 1.75rem; height: 1.75rem; }
869
+ .wf-card-logo svg { width: 0.875rem; height: 0.875rem; }
870
+ .wf-ring { width: 2.125rem; height: 2.125rem; }
871
+ .wf-ring-num { font-size: 0.6875rem; }
872
+
873
+ .wf-screen { gap: 1rem; }
874
+ .wf-screen-title { font-size: 1.25rem; }
875
+ .wf-screen-desc { font-size: 0.8125rem; }
876
+ .wf-icon-box { width: 2.25rem; height: 2.25rem; margin-bottom: 0.75rem; }
877
+ .wf-icon-box svg { width: 1rem; height: 1rem; }
878
+
879
+ .wf-form { gap: 0.75rem; }
880
+ .wf-input { height: 2.625rem; font-size: 0.8125rem; }
881
+ .wf-btn-lg { height: 2.625rem; font-size: 0.8125rem; }
882
+
883
+ .wf-social-buttons { flex-direction: column; }
884
+ .wf-social-buttons .wf-btn-social { height: 2.5rem; }
885
+
886
+ .wf-row-2 { grid-template-columns: 1fr 1fr; gap: 0.5rem; }
887
+
888
+ .wf-password-rules { grid-template-columns: 1fr; }
889
+
890
+ .wf-otp-row { gap: 0.375rem; justify-content: center; }
891
+ .wf-otp-input { width: 2.25rem; height: 2.75rem; font-size: 1rem; border-radius: var(--wf-radius-sm); }
892
+
893
+ .wf-camera-view { aspect-ratio: 1 / 1; }
894
+ .wf-face-overlay::before { width: 8rem; height: 10rem; }
895
+
896
+ .wf-footer-link { font-size: 0.75rem; }
897
+ .wf-page-footer { margin-top: 1rem; font-size: 0.6875rem; }
898
+
899
+ .wf-success-icon { width: 3.5rem; height: 3.5rem; }
900
+ .wf-success-icon svg { width: 1.75rem; height: 1.75rem; }
901
+ .wf-success-actions { max-width: 100%; }
902
+
903
+ .wf-bg-orb-1 { width: 250px; height: 250px; }
904
+ .wf-bg-orb-2 { width: 200px; height: 200px; }
905
+ .wf-bg-orb-3 { display: none; }
906
+ }
907
+
908
+ /* ---- Very small phones (< 380px, e.g. SE, older Androids) ---- */
909
+ @media (max-width: 380px) {
910
+ .wf-layout { padding: 0.5rem; padding-top: 1rem; }
911
+ .wf-card-inner { padding: 1rem 0.875rem 1.25rem; }
912
+
913
+ .wf-screen-title { font-size: 1.125rem; }
914
+ .wf-screen-desc { font-size: 0.75rem; }
915
+ .wf-label { font-size: 0.75rem; }
916
+ .wf-input { height: 2.5rem; font-size: 0.8125rem; padding: 0 0.75rem; }
917
+ .wf-input-wrap .wf-input { padding-left: 2.25rem; }
918
+ .wf-btn-lg { height: 2.5rem; font-size: 0.8125rem; padding: 0 1rem; }
919
+
920
+ .wf-row-2 { grid-template-columns: 1fr; }
921
+
922
+ .wf-otp-input { width: 2rem; height: 2.5rem; font-size: 0.9375rem; }
923
+ .wf-otp-row { gap: 0.25rem; }
924
+
925
+ .wf-divider span { font-size: 0.625rem; }
926
+ }
927
+
928
+ /* ---- Tall screens: vertically center the card ---- */
929
+ @media (min-height: 700px) and (min-width: 521px) {
930
+ .wf-layout {
931
+ justify-content: center;
932
+ padding-top: 1.5rem;
933
+ padding-bottom: 3rem;
934
+ }
935
+ }
936
+
937
+ /* ---- Short screens (landscape mobile): reduce spacing ---- */
938
+ @media (max-height: 600px) {
939
+ .wf-layout { padding: 0.5rem; justify-content: flex-start; padding-top: 0.5rem; }
940
+ .wf-card-inner { padding: 1rem 1.125rem 1.25rem; }
941
+ .wf-card-header { margin-bottom: 0.75rem; }
942
+ .wf-screen { gap: 0.75rem; }
943
+ .wf-icon-box { display: none; }
944
+ .wf-screen-title { font-size: 1.125rem; margin-bottom: 0.125rem; }
945
+ .wf-page-footer { margin-top: 0.75rem; }
946
+ .wf-camera-view { aspect-ratio: 16 / 9; }
947
+ }