@javagt/express-easy-auth 1.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.
@@ -0,0 +1,1293 @@
1
+ /* ─── TOKENS (Anthropic Style) ───────────────────────────────────────── */
2
+ :root {
3
+ /* Surfaces */
4
+ --surface-base: #ECE9E0;
5
+ --surface-raised: #DBD1C0;
6
+ --surface-overlay: #0F0F10;
7
+ --surface-bright: #FFFFFF;
8
+
9
+ /* Text */
10
+ --text-primary: #201F1D;
11
+ --text-body: #35312A;
12
+ --text-secondary: #625F59;
13
+ --text-muted: #9F9F9C;
14
+ --text-accent: #454036;
15
+
16
+ /* Accents */
17
+ --accent: #5E6AD2;
18
+ --accent-soft: rgba(94, 106, 210, 0.1);
19
+ --red: #D95D5D;
20
+ --yellow: #F2C94C;
21
+ --green: #27AE60;
22
+
23
+ /* Misc */
24
+ --border-subtle: var(--surface-raised);
25
+ --inverse-text: #FFFFFF;
26
+ --nav-hover: rgba(0,0,0,0.05);
27
+
28
+ /* Spacing (4px grid) */
29
+ --s-1: 4px;
30
+ --s-2: 8px;
31
+ --s-3: 12px;
32
+ --s-4: 16px;
33
+ --s-5: 20px;
34
+ --s-6: 24px;
35
+ --s-8: 32px;
36
+ --s-10: 40px;
37
+
38
+ /* Radius */
39
+ --radius-sm: 3px;
40
+ --radius-lg: 15px;
41
+
42
+ /* Typography */
43
+ --font-family: 'Inter', system-ui, -apple-system, sans-serif;
44
+ }
45
+
46
+ /* ─── DARK THEME TOKENS ────────────────────────────────────────────── */
47
+
48
+ :root[data-theme="dark"] {
49
+ --surface-base: #0B0B0A;
50
+ --surface-raised: #1A1A18;
51
+ --surface-overlay: #242421;
52
+ --surface-bright: #121211;
53
+
54
+ --text-primary: #FDFDFD;
55
+ --text-body: #ECE9E0;
56
+ --text-secondary: #9F9F9C;
57
+ --text-muted: #625F59;
58
+ --text-accent: #DBD1C0;
59
+
60
+ --accent-soft: rgba(94, 106, 210, 0.2);
61
+ --border-subtle: #2D2D2B;
62
+ --nav-hover: rgba(255,255,255,0.05);
63
+ }
64
+
65
+ /* Respect system preference if no manual toggle set */
66
+ @media (prefers-color-scheme: dark) {
67
+ :root:not([data-theme]) {
68
+ --surface-base: #0B0B0A;
69
+ --surface-raised: #1A1A18;
70
+ --surface-overlay: #242421;
71
+ --surface-bright: #121211;
72
+
73
+ --text-primary: #FDFDFD;
74
+ --text-body: #ECE9E0;
75
+ --text-secondary: #9F9F9C;
76
+ --text-muted: #625F59;
77
+ --text-accent: #DBD1C0;
78
+
79
+ --accent-soft: rgba(94, 106, 210, 0.2);
80
+ --border-subtle: #2D2D2B;
81
+ --nav-hover: rgba(255,255,255,0.05);
82
+ }
83
+ }
84
+
85
+ /* ─── THEME ICONS ────────────────────────────────────────────────────── */
86
+ .sun { display: none; }
87
+ .moon { display: inline; }
88
+
89
+ :root[data-theme="dark"] .sun { display: inline; }
90
+ :root[data-theme="dark"] .moon { display: none; }
91
+
92
+ @media (prefers-color-scheme: dark) {
93
+ :root:not([data-theme]) .sun { display: inline; }
94
+ :root:not([data-theme]) .moon { display: none; }
95
+ }
96
+
97
+ /* ─── RESET ──────────────────────────────────────────────────────────── */
98
+ html {
99
+ transition: background-color 0.3s ease, color 0.3s ease;
100
+ }
101
+
102
+ *,
103
+ *::before,
104
+ *::after {
105
+ box-sizing: border-box;
106
+ margin: 0;
107
+ padding: 0;
108
+ }
109
+
110
+ html {
111
+ font-size: 16px;
112
+ scroll-behavior: smooth;
113
+ }
114
+
115
+ body {
116
+ font-family: var(--font-family);
117
+ background: var(--surface-base);
118
+ color: var(--text-body);
119
+ min-height: 100vh;
120
+ line-height: 1.5;
121
+ -webkit-font-smoothing: antialiased;
122
+ text-rendering: optimizeLegibility;
123
+ }
124
+
125
+ h1, .heading-1 {
126
+ font-size: 68px;
127
+ font-weight: 700;
128
+ color: var(--text-primary);
129
+ line-height: 1.1;
130
+ text-wrap: balance;
131
+ margin-bottom: var(--s-6);
132
+ }
133
+
134
+ .body-large {
135
+ font-size: 33px;
136
+ font-weight: 600;
137
+ color: var(--text-body);
138
+ line-height: 1.3;
139
+ text-wrap: pretty;
140
+ margin-bottom: var(--s-4);
141
+ }
142
+
143
+ a {
144
+ color: var(--accent);
145
+ text-decoration: none;
146
+ }
147
+
148
+ a:hover {
149
+ text-decoration: underline;
150
+ }
151
+
152
+ button {
153
+ cursor: pointer;
154
+ font-family: inherit;
155
+ }
156
+
157
+ input,
158
+ textarea {
159
+ font-family: var(--font-body);
160
+ }
161
+
162
+ /* ─── LOADING ────────────────────────────────────────────────────────── */
163
+ #loading-screen {
164
+ position: fixed;
165
+ inset: 0;
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ background: var(--bg);
170
+ z-index: 100;
171
+ transition: opacity 0.4s;
172
+ }
173
+
174
+ #loading-screen.fade-out {
175
+ opacity: 0;
176
+ pointer-events: none;
177
+ }
178
+
179
+ .loading-mark {
180
+ font-family: var(--font-mono);
181
+ font-size: 2rem;
182
+ color: var(--accent);
183
+ display: flex;
184
+ gap: 6px;
185
+ align-items: center;
186
+ animation: pulse 1.2s ease-in-out infinite;
187
+ }
188
+
189
+ .lm-icon {
190
+ animation: spin 2s linear infinite;
191
+ display: inline-block;
192
+ }
193
+
194
+ @keyframes pulse {
195
+
196
+ 0%,
197
+ 100% {
198
+ opacity: 1
199
+ }
200
+
201
+ 50% {
202
+ opacity: 0.3
203
+ }
204
+ }
205
+
206
+ @keyframes spin {
207
+ from {
208
+ transform: rotate(0deg)
209
+ }
210
+
211
+ to {
212
+ transform: rotate(360deg)
213
+ }
214
+ }
215
+
216
+ /* ─── VIEWS ──────────────────────────────────────────────────────────── */
217
+ .view {
218
+ min-height: 100vh;
219
+ }
220
+
221
+ .hidden {
222
+ display: none !important;
223
+ }
224
+
225
+ /* ─── AUTH SPLIT ─────────────────────────────────────────────────────── */
226
+ /* ─── AUTH LAYOUT ────────────────────────────────────────────────────── */
227
+ .auth-split {
228
+ display: grid;
229
+ grid-template-columns: 1.2fr 1fr;
230
+ min-height: 100vh;
231
+ background: var(--surface-base);
232
+ }
233
+
234
+ .auth-brand {
235
+ background: var(--surface-base);
236
+ padding: var(--s-10);
237
+ display: flex;
238
+ flex-direction: column;
239
+ justify-content: center;
240
+ border-right: 1px solid var(--surface-raised);
241
+ }
242
+
243
+ .brand-tagline {
244
+ font-size: 68px;
245
+ font-weight: 700;
246
+ color: var(--text-primary);
247
+ line-height: 1.1;
248
+ letter-spacing: -0.01em;
249
+ margin-bottom: var(--s-6);
250
+ text-wrap: balance;
251
+ }
252
+
253
+ .brand-tagline em {
254
+ font-style: normal;
255
+ color: var(--accent);
256
+ }
257
+
258
+ .brand-features {
259
+ display: flex;
260
+ flex-direction: column;
261
+ gap: var(--s-2);
262
+ }
263
+
264
+ .feat {
265
+ font-size: 21px;
266
+ color: var(--text-secondary);
267
+ font-weight: 400;
268
+ }
269
+
270
+ .auth-panel {
271
+ display: flex;
272
+ align-items: center;
273
+ justify-content: center;
274
+ padding: var(--s-10);
275
+ background: var(--surface-bright); /* Clean background for the focus area */
276
+ }
277
+
278
+ .auth-form {
279
+ width: 100%;
280
+ max-width: 480px;
281
+ display: none;
282
+ flex-direction: column;
283
+ gap: var(--s-6);
284
+ }
285
+
286
+ .auth-form.active {
287
+ display: flex;
288
+ }
289
+
290
+ .form-title {
291
+ font-size: 33px;
292
+ font-weight: 600;
293
+ color: var(--text-primary);
294
+ margin-bottom: var(--s-1);
295
+ }
296
+
297
+ .form-hint {
298
+ font-size: 17px;
299
+ color: var(--text-secondary);
300
+ margin-top: calc(-1 * var(--s-4));
301
+ }
302
+
303
+ .form-switch {
304
+ font-size: 0.875rem;
305
+ color: var(--text-2);
306
+ text-align: center;
307
+ }
308
+
309
+ /* ─── FIELDS ─────────────────────────────────────────────────────────── */
310
+ /* ─── FIELDS ─────────────────────────────────────────────────────────── */
311
+ .field {
312
+ display: flex;
313
+ flex-direction: column;
314
+ gap: var(--s-2);
315
+ }
316
+
317
+ .field label {
318
+ font-size: 14px;
319
+ font-weight: 500;
320
+ color: var(--text-secondary);
321
+ text-transform: none;
322
+ letter-spacing: 0;
323
+ }
324
+
325
+ input,
326
+ textarea,
327
+ select {
328
+ background: var(--surface-bright);
329
+ border: 1px solid var(--border-subtle);
330
+ border-radius: var(--radius-sm);
331
+ color: var(--text-primary);
332
+ padding: var(--s-3) var(--s-4);
333
+ font-size: 16px;
334
+ outline: none;
335
+ transition: all 0.2s;
336
+ width: 100%;
337
+ min-height: 44px;
338
+ font-family: inherit;
339
+ }
340
+
341
+ input:focus,
342
+ textarea:focus,
343
+ select:focus {
344
+ border-color: var(--accent);
345
+ box-shadow: 0 0 0 2px var(--accent-soft);
346
+ }
347
+
348
+ .permission-check-group {
349
+ display: flex;
350
+ flex-direction: column;
351
+ gap: var(--s-2);
352
+ margin-top: var(--s-2);
353
+ }
354
+
355
+ .check-item {
356
+ display: flex;
357
+ align-items: center;
358
+ gap: var(--s-3);
359
+ cursor: pointer;
360
+ padding: var(--s-2) var(--s-3);
361
+ border-radius: var(--radius-sm);
362
+ background: var(--surface-base);
363
+ transition: all 0.2s;
364
+ }
365
+
366
+ .check-item:hover {
367
+ background: var(--surface-raised);
368
+ }
369
+
370
+ .check-item input[type="checkbox"] {
371
+ width: 18px;
372
+ height: 18px;
373
+ min-height: 18px;
374
+ width: 18px;
375
+ cursor: pointer;
376
+ }
377
+
378
+ .check-item span {
379
+ font-size: 14px;
380
+ font-weight: 500;
381
+ color: var(--text-body);
382
+ }
383
+
384
+ .api-key-create-form {
385
+ background: var(--surface-bright);
386
+ border: 1px solid var(--border-subtle);
387
+ border-radius: var(--radius-sm);
388
+ padding: var(--s-6);
389
+ display: flex;
390
+ flex-direction: column;
391
+ gap: var(--s-6);
392
+ }
393
+
394
+ /* ─── BUTTONS ────────────────────────────────────────────────────────── */
395
+ .btn-primary {
396
+ background: var(--accent);
397
+ color: white;
398
+ border: none;
399
+ border-radius: var(--radius-sm);
400
+ padding: var(--s-3) var(--s-6);
401
+ font-size: 16px;
402
+ font-weight: 500;
403
+ transition: all 0.2s;
404
+ display: flex;
405
+ align-items: center;
406
+ justify-content: center;
407
+ gap: var(--s-2);
408
+ width: auto;
409
+ }
410
+
411
+ .auth-form .btn-primary,
412
+ .auth-form .btn-secondary {
413
+ width: 100%;
414
+ }
415
+
416
+ .btn-primary:hover {
417
+ filter: brightness(1.1);
418
+ }
419
+
420
+ .btn-secondary {
421
+ background: var(--surface-raised);
422
+ border: none;
423
+ color: var(--text-primary);
424
+ border-radius: var(--radius-sm);
425
+ padding: var(--s-3) var(--s-6);
426
+ font-size: 16px;
427
+ transition: all 0.2s;
428
+ width: auto;
429
+ display: flex;
430
+ align-items: center;
431
+ justify-content: center;
432
+ }
433
+
434
+ .btn-secondary:hover {
435
+ background: var(--surface-raised);
436
+ filter: brightness(0.95);
437
+ }
438
+
439
+ .btn-ghost {
440
+ background: transparent;
441
+ border: none;
442
+ color: var(--text-muted);
443
+ font-size: 16px;
444
+ padding: var(--s-2) var(--s-4);
445
+ border-radius: var(--radius-sm);
446
+ transition: all 0.2s;
447
+ }
448
+
449
+ .btn-ghost:hover {
450
+ color: var(--text-primary);
451
+ background: var(--surface-raised);
452
+ }
453
+
454
+ .btn-danger {
455
+ background: var(--red);
456
+ color: white;
457
+ border: none;
458
+ border-radius: var(--radius-sm);
459
+ padding: var(--s-3) var(--s-6);
460
+ font-size: 16px;
461
+ }
462
+
463
+ .btn-passkey {
464
+ background: var(--surface-bright);
465
+ border: 1px solid var(--border-subtle);
466
+ color: var(--text-primary);
467
+ border-radius: var(--radius-sm);
468
+ padding: var(--s-4);
469
+ font-size: 16px;
470
+ width: 100%;
471
+ display: flex;
472
+ align-items: center;
473
+ justify-content: center;
474
+ gap: var(--s-2);
475
+ transition: all 0.2s;
476
+ }
477
+
478
+ .btn-passkey:hover {
479
+ background: var(--surface-raised);
480
+ }
481
+
482
+ .btn-row {
483
+ display: flex;
484
+ gap: var(--s-3);
485
+ align-items: center;
486
+ }
487
+
488
+ .auth-form .btn-row {
489
+ flex-direction: column;
490
+ align-items: stretch;
491
+ width: 100%;
492
+ gap: var(--s-4);
493
+ }
494
+
495
+ /* ─── DIVIDER ────────────────────────────────────────────────────────── */
496
+
497
+ /* ─── DIVIDER ────────────────────────────────────────────────────────── */
498
+ .divider {
499
+ display: flex;
500
+ align-items: center;
501
+ gap: var(--s-4);
502
+ color: var(--text-muted);
503
+ font-size: 14px;
504
+ text-transform: lowercase;
505
+ margin: var(--s-2) 0;
506
+ }
507
+
508
+ .divider::before,
509
+ .divider::after {
510
+ content: '';
511
+ flex: 1;
512
+ height: 1px;
513
+ background: var(--surface-raised);
514
+ }
515
+
516
+ /* ─── DIVIDER ────────────────────────────────────────────────────────── */
517
+ .divider {
518
+ display: flex;
519
+ align-items: center;
520
+ gap: 0.75rem;
521
+ color: var(--text-3);
522
+ font-size: 0.8rem;
523
+ }
524
+
525
+ .divider::before,
526
+ .divider::after {
527
+ content: '';
528
+ flex: 1;
529
+ height: 1px;
530
+ background: var(--border);
531
+ }
532
+
533
+ .passkey-btn-wrap {
534
+ width: 100%;
535
+ }
536
+
537
+ /* ─── DASHBOARD ──────────────────────────────────────────────────────── */
538
+ .dash-header {
539
+ display: flex;
540
+ align-items: center;
541
+ justify-content: space-between;
542
+ padding: var(--s-4) var(--s-8);
543
+ background: var(--surface-bright);
544
+ border-bottom: 1px solid var(--border-subtle);
545
+ position: sticky;
546
+ top: 0;
547
+ z-index: 50;
548
+ }
549
+
550
+ .dash-logo {
551
+ display: flex;
552
+ align-items: center;
553
+ gap: var(--s-2);
554
+ font-weight: 600;
555
+ font-size: 20px;
556
+ }
557
+
558
+ .dash-main {
559
+ max-width: 960px;
560
+ margin: 0 auto;
561
+ padding: var(--s-10) var(--s-6);
562
+ }
563
+
564
+ .dash-nav {
565
+ display: flex;
566
+ gap: var(--s-1);
567
+ margin-bottom: var(--s-8);
568
+ background: var(--surface-raised);
569
+ border-radius: var(--radius-sm);
570
+ padding: var(--s-1);
571
+ }
572
+
573
+ .nav-btn {
574
+ background: none;
575
+ border: none;
576
+ color: var(--text-secondary);
577
+ padding: var(--s-2) var(--s-5);
578
+ border-radius: var(--radius-sm);
579
+ font-size: 16px;
580
+ white-space: nowrap;
581
+ transition: all 0.2s;
582
+ }
583
+
584
+ .nav-btn:hover {
585
+ color: var(--text-primary);
586
+ background: var(--nav-hover);
587
+ }
588
+
589
+ .nav-btn.active {
590
+ background: var(--surface-bright);
591
+ color: var(--text-primary);
592
+ box-shadow: 0 1px 2px rgba(0,0,0,0.05);
593
+ }
594
+
595
+ .tab-title {
596
+ font-size: 33px;
597
+ font-weight: 700;
598
+ color: var(--text-primary);
599
+ margin-bottom: var(--s-2);
600
+ }
601
+
602
+ .tab-desc {
603
+ font-size: 17px;
604
+ color: var(--text-secondary);
605
+ margin-bottom: var(--s-8);
606
+ }
607
+
608
+ /* Security blocks / Cards */
609
+ .security-block, .info-card {
610
+ background: var(--surface-bright);
611
+ border: 1px solid var(--border-subtle);
612
+ border-radius: var(--radius-lg);
613
+ padding: var(--s-6);
614
+ margin-bottom: var(--s-4);
615
+ }
616
+
617
+ .security-block-header {
618
+ display: flex;
619
+ align-items: flex-start;
620
+ justify-content: space-between;
621
+ gap: 1rem;
622
+ margin-bottom: 1rem;
623
+ }
624
+
625
+ .security-block h3 {
626
+ font-size: 1rem;
627
+ font-weight: 500;
628
+ margin-bottom: 0.25rem;
629
+ }
630
+
631
+ .security-block p {
632
+ font-size: 0.875rem;
633
+ color: var(--text-secondary);
634
+ }
635
+
636
+ .security-badge {
637
+ font-family: var(--font-mono);
638
+ font-size: 0.7rem;
639
+ font-weight: 500;
640
+ padding: 0.25rem 0.6rem;
641
+ border-radius: 100px;
642
+ background: rgba(248, 113, 113, 0.12);
643
+ color: var(--red);
644
+ border: 1px solid rgba(248, 113, 113, 0.25);
645
+ white-space: nowrap;
646
+ }
647
+
648
+ .security-badge.on {
649
+ background: rgba(110, 231, 183, 0.12);
650
+ color: var(--accent);
651
+ border-color: rgba(110, 231, 183, 0.25);
652
+ }
653
+
654
+ .qr-wrap {
655
+ display: flex;
656
+ gap: 1.5rem;
657
+ align-items: flex-start;
658
+ margin-bottom: 1rem;
659
+ }
660
+
661
+ .qr-wrap img {
662
+ width: 140px;
663
+ height: 140px;
664
+ border-radius: var(--radius-sm);
665
+ background: white; /* Keep white for QR codes for contrast */
666
+ padding: 4px;
667
+ }
668
+
669
+ .qr-manual {
670
+ display: flex;
671
+ flex-direction: column;
672
+ gap: 0.5rem;
673
+ font-size: 0.85rem;
674
+ color: var(--text-2);
675
+ }
676
+
677
+ .qr-manual code {
678
+ font-family: var(--font-mono);
679
+ font-size: 0.78rem;
680
+ background: var(--bg-3);
681
+ padding: 0.4rem 0.6rem;
682
+ border-radius: 4px;
683
+ word-break: break-all;
684
+ }
685
+
686
+ /* Passkeys & API Keys */
687
+ .passkey-item, .session-item, .api-key-item {
688
+ background: var(--surface-bright);
689
+ border: 1px solid var(--border-subtle);
690
+ border-radius: var(--radius-sm);
691
+ padding: var(--s-4) var(--s-5);
692
+ display: flex;
693
+ align-items: center;
694
+ gap: var(--s-4);
695
+ margin-bottom: var(--s-2);
696
+ transition: all 0.2s;
697
+ }
698
+
699
+ .api-key-item {
700
+ border-left: 4px solid var(--accent);
701
+ }
702
+
703
+ .api-key-item:hover {
704
+ transform: translateY(-1px);
705
+ box-shadow: 0 4px 12px rgba(0,0,0,0.05);
706
+ }
707
+
708
+ .pk-info, .sess-info {
709
+ flex: 1;
710
+ }
711
+
712
+ .pk-name, .sess-label {
713
+ font-weight: 600;
714
+ color: var(--text-primary);
715
+ font-size: 16px;
716
+ }
717
+
718
+ .pk-meta, .sess-meta {
719
+ font-size: 14px;
720
+ color: var(--text-secondary);
721
+ }
722
+
723
+ .qr-wrap {
724
+ display: flex;
725
+ gap: var(--s-6);
726
+ align-items: flex-start;
727
+ margin-top: var(--s-4);
728
+ }
729
+
730
+ .qr-wrap img {
731
+ width: 140px;
732
+ border-radius: var(--radius-sm);
733
+ border: 1px solid var(--surface-raised);
734
+ }
735
+
736
+ .sess-meta {
737
+ font-family: var(--font-family);
738
+ font-size: 14px;
739
+ color: var(--text-secondary);
740
+ }
741
+
742
+ .empty-msg {
743
+ padding: var(--s-6);
744
+ text-align: center;
745
+ color: var(--text-muted);
746
+ font-style: italic;
747
+ border: 1px dashed var(--border-subtle);
748
+ border-radius: var(--radius-sm);
749
+ }
750
+
751
+ /* Fresh auth */
752
+ .fresh-auth-status {
753
+ display: flex;
754
+ align-items: center;
755
+ gap: 1rem;
756
+ background: var(--surface-raised);
757
+ border: 1px solid var(--border-subtle);
758
+ border-radius: var(--radius-sm);
759
+ padding: 1rem 1.2rem;
760
+ margin-bottom: 1.5rem;
761
+ }
762
+
763
+ .fresh-auth-status.fresh-verified {
764
+ border-color: rgba(110, 231, 183, 0.3);
765
+ background: rgba(110, 231, 183, 0.04);
766
+ }
767
+
768
+ .fab-icon {
769
+ font-size: 1.4rem;
770
+ }
771
+
772
+ .fab-text {
773
+ flex: 1;
774
+ display: flex;
775
+ flex-direction: column;
776
+ }
777
+
778
+ .fab-text strong {
779
+ font-size: 0.9rem;
780
+ }
781
+
782
+ .fab-text span {
783
+ font-size: 0.8rem;
784
+ color: var(--text-2);
785
+ }
786
+
787
+ /* Actions grid */
788
+ .actions-grid {
789
+ display: grid;
790
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
791
+ gap: 1rem;
792
+ margin-bottom: 1.5rem;
793
+ }
794
+
795
+ .action-card {
796
+ background: var(--surface-bright);
797
+ border: 1px solid var(--border-subtle);
798
+ border-radius: var(--radius-sm);
799
+ padding: 1.25rem;
800
+ display: flex;
801
+ flex-direction: column;
802
+ gap: 0.5rem;
803
+ transition: border-color 0.15s;
804
+ }
805
+
806
+ .action-card:hover {
807
+ border-color: var(--border-hi);
808
+ }
809
+
810
+ .action-icon {
811
+ font-size: 1.6rem;
812
+ }
813
+
814
+ .action-card h4 {
815
+ font-size: 0.9rem;
816
+ font-weight: 500;
817
+ }
818
+
819
+ .action-card p {
820
+ font-size: 0.8rem;
821
+ color: var(--text-2);
822
+ flex: 1;
823
+ }
824
+
825
+ .action-result {
826
+ background: var(--bg-1);
827
+ border: 1px solid var(--border);
828
+ border-radius: var(--radius);
829
+ padding: 1.25rem;
830
+ }
831
+
832
+ .action-result h4 {
833
+ font-size: 0.85rem;
834
+ font-weight: 500;
835
+ margin-bottom: 0.75rem;
836
+ color: var(--text-2);
837
+ }
838
+
839
+ .action-result pre {
840
+ font-family: var(--font-mono);
841
+ font-size: 0.78rem;
842
+ color: var(--accent);
843
+ background: var(--bg-3);
844
+ padding: 1rem;
845
+ border-radius: 4px;
846
+ overflow-x: auto;
847
+ white-space: pre-wrap;
848
+ word-break: break-all;
849
+ }
850
+
851
+ /* ─── MODALS ─────────────────────────────────────────────────────────── */
852
+ .modal {
853
+ position: fixed;
854
+ inset: 0;
855
+ z-index: 200;
856
+ background: rgba(0, 0, 0, 0.7);
857
+ display: flex;
858
+ align-items: center;
859
+ justify-content: center;
860
+ padding: 1rem;
861
+ backdrop-filter: blur(4px);
862
+ animation: fadein 0.15s ease;
863
+ }
864
+
865
+ @keyframes fadein {
866
+ from {
867
+ opacity: 0
868
+ }
869
+
870
+ to {
871
+ opacity: 1
872
+ }
873
+ }
874
+
875
+ .modal-box {
876
+ background: var(--bg-2);
877
+ border: 1px solid var(--border);
878
+ border-radius: calc(var(--radius) * 2);
879
+ padding: 1.75rem;
880
+ width: 100%;
881
+ max-width: 400px;
882
+ display: flex;
883
+ flex-direction: column;
884
+ gap: 1rem;
885
+ animation: fadeUp 0.2s ease;
886
+ }
887
+
888
+ .modal-box h3 {
889
+ font-family: var(--font-display);
890
+ font-size: 1.5rem;
891
+ font-weight: normal;
892
+ }
893
+
894
+ .modal-hint {
895
+ font-size: 0.875rem;
896
+ color: var(--text-2);
897
+ }
898
+
899
+ .method-tabs {
900
+ display: flex;
901
+ gap: 0.25rem;
902
+ background: var(--surface-raised);
903
+ border-radius: var(--radius-sm);
904
+ padding: 0.25rem;
905
+ }
906
+
907
+ .method-tab {
908
+ flex: 1;
909
+ background: none;
910
+ border: none;
911
+ color: var(--text-secondary);
912
+ padding: var(--s-1) var(--s-3);
913
+ border-radius: var(--radius-sm);
914
+ font-size: 14px;
915
+ font-weight: 500;
916
+ transition: all 0.2s;
917
+ }
918
+
919
+ .method-tab.active {
920
+ background: var(--surface-bright);
921
+ color: var(--text-primary);
922
+ box-shadow: 0 1px 2px rgba(0,0,0,0.05);
923
+ }
924
+
925
+ #test-result-log {
926
+ background: #1e1e1e;
927
+ color: #d4d4d4;
928
+ padding: var(--s-4);
929
+ border-radius: var(--radius-sm);
930
+ font-family: var(--font-mono);
931
+ font-size: 13px;
932
+ overflow-x: auto;
933
+ white-space: pre-wrap;
934
+ word-break: break-all;
935
+ margin-top: 10px;
936
+ border: 1px solid #333;
937
+ }
938
+
939
+ .test-success {
940
+ border-color: var(--green) !important;
941
+ }
942
+
943
+ .test-error {
944
+ border-color: var(--red) !important;
945
+ }
946
+ color: var(--text-2);
947
+ padding: 0.4rem;
948
+ border-radius: calc(var(--radius) - 2px);
949
+ font-size: 0.85rem;
950
+ transition: all 0.15s;
951
+ }
952
+
953
+ .method-tab.active {
954
+ background: var(--bg-3);
955
+ color: var(--text);
956
+ }
957
+
958
+ /* ─── TOAST ──────────────────────────────────────────────────────────── */
959
+ #toast-container {
960
+ position: fixed;
961
+ bottom: 1.5rem;
962
+ right: 1.5rem;
963
+ display: flex;
964
+ flex-direction: column;
965
+ gap: 0.5rem;
966
+ z-index: 300;
967
+ pointer-events: none;
968
+ }
969
+
970
+ .toast {
971
+ font-family: var(--font-mono);
972
+ font-size: 0.8rem;
973
+ background: var(--bg-2);
974
+ border: 1px solid var(--border);
975
+ border-left: 3px solid var(--accent);
976
+ border-radius: var(--radius);
977
+ padding: 0.75rem 1rem;
978
+ color: var(--text);
979
+ pointer-events: auto;
980
+ max-width: 320px;
981
+ animation: slideIn 0.2s ease;
982
+ }
983
+
984
+ .toast.error {
985
+ border-left-color: var(--red);
986
+ }
987
+
988
+ .toast.warning {
989
+ border-left-color: var(--yellow);
990
+ }
991
+
992
+ @keyframes slideIn {
993
+ from {
994
+ opacity: 0;
995
+ transform: translateX(20px);
996
+ }
997
+
998
+ to {
999
+ opacity: 1;
1000
+ transform: translateX(0);
1001
+ }
1002
+ }
1003
+
1004
+ /* ─── EMPTY STATE ────────────────────────────────────────────────────── */
1005
+ .empty-state {
1006
+ text-align: center;
1007
+ color: var(--text-3);
1008
+ font-size: 0.875rem;
1009
+ padding: 2rem;
1010
+ border: 1px dashed var(--border);
1011
+ border-radius: var(--radius);
1012
+ }
1013
+
1014
+ /* ─── NOTICES & ALERTS ───────────────────────────────────────────────── */
1015
+ .browser-notice, .alert-banner {
1016
+ background: white;
1017
+ border: 1px solid var(--surface-raised);
1018
+ border-radius: var(--radius-sm);
1019
+ padding: var(--s-4) var(--s-5);
1020
+ margin-bottom: var(--s-4);
1021
+ font-size: 15px;
1022
+ color: var(--text-secondary);
1023
+ display: flex;
1024
+ gap: var(--s-3);
1025
+ align-items: flex-start;
1026
+ }
1027
+
1028
+ /* ─── RESPONSIVE ─────────────────────────────────────────────────────── */
1029
+ @media (max-width: 720px) {
1030
+ .auth-split {
1031
+ grid-template-columns: 1fr;
1032
+ }
1033
+
1034
+ .auth-brand {
1035
+ display: none;
1036
+ }
1037
+
1038
+ .auth-panel {
1039
+ padding: 2rem 1.5rem;
1040
+ }
1041
+
1042
+ .dash-header {
1043
+ padding: 0.75rem 1rem;
1044
+ }
1045
+
1046
+ .dash-main {
1047
+ padding: 1.5rem 1rem;
1048
+ }
1049
+
1050
+ .dash-nav {
1051
+ gap: 0;
1052
+ }
1053
+
1054
+ .nav-btn {
1055
+ font-size: 0.8rem;
1056
+ padding: 0.45rem 0.65rem;
1057
+ }
1058
+
1059
+ .tab-title {
1060
+ font-size: 1.5rem;
1061
+ }
1062
+
1063
+ .qr-wrap {
1064
+ flex-direction: column;
1065
+ }
1066
+
1067
+ .actions-grid {
1068
+ grid-template-columns: 1fr 1fr;
1069
+ }
1070
+
1071
+ .info-grid {
1072
+ grid-template-columns: 1fr 1fr;
1073
+ }
1074
+ }
1075
+
1076
+ @media (max-width: 480px) {
1077
+ .actions-grid {
1078
+ grid-template-columns: 1fr;
1079
+ }
1080
+
1081
+ .info-grid {
1082
+ grid-template-columns: 1fr;
1083
+ }
1084
+ }
1085
+
1086
+ .recovery-box {
1087
+ background: var(--surface-bright);
1088
+ border: 1px solid var(--border-subtle);
1089
+ border-radius: var(--radius-lg);
1090
+ padding: var(--s-8);
1091
+ margin-bottom: var(--s-4);
1092
+ }
1093
+
1094
+ .recovery-box h4 {
1095
+ font-size: 23px;
1096
+ font-weight: 600;
1097
+ margin-bottom: var(--s-2);
1098
+ }
1099
+
1100
+ .recovery-box p {
1101
+ font-size: 16px;
1102
+ color: var(--text-secondary);
1103
+ margin-bottom: var(--s-6);
1104
+ }
1105
+
1106
+ .recovery-grid {
1107
+ display: grid;
1108
+ grid-template-columns: repeat(2, 1fr);
1109
+ gap: var(--s-3);
1110
+ margin-bottom: var(--s-6);
1111
+ }
1112
+
1113
+ .recovery-code {
1114
+ font-family: inherit;
1115
+ font-variant-numeric: tabular-nums;
1116
+ font-size: 16px;
1117
+ background: var(--surface-base);
1118
+ padding: var(--s-3);
1119
+ border-radius: var(--radius-sm);
1120
+ text-align: center;
1121
+ color: var(--text-primary);
1122
+ font-weight: 600;
1123
+ }
1124
+
1125
+ .recovery-advisory {
1126
+ background: rgba(96, 165, 250, 0.08);
1127
+ border: 1px solid rgba(96, 165, 250, 0.2);
1128
+ border-radius: var(--radius);
1129
+ padding: 1rem;
1130
+ font-size: 0.85rem;
1131
+ color: var(--text-2);
1132
+ display: flex;
1133
+ flex-direction: column;
1134
+ gap: 0.75rem;
1135
+ line-height: 1.4;
1136
+ margin-bottom: 0.5rem;
1137
+ }
1138
+
1139
+ .recovery-advisory strong {
1140
+ color: var(--blue);
1141
+ }
1142
+
1143
+ .alert-banner {
1144
+ border-left: 4px solid var(--yellow);
1145
+ }
1146
+
1147
+ .alert-body {
1148
+ flex: 1;
1149
+ font-size: 15px;
1150
+ color: var(--text-secondary);
1151
+ }
1152
+
1153
+ .alert-body strong {
1154
+ color: var(--text-primary);
1155
+ font-weight: 600;
1156
+ display: block;
1157
+ }
1158
+
1159
+ /* ─── TOGGLE SWITCH ──────────────────────────────────────────────────── */
1160
+ .toggle-switch {
1161
+ position: relative;
1162
+ display: inline-block;
1163
+ width: 44px;
1164
+ height: 24px;
1165
+ }
1166
+
1167
+ .toggle-switch input {
1168
+ opacity: 0;
1169
+ width: 0;
1170
+ height: 0;
1171
+ }
1172
+
1173
+ .toggle-slider {
1174
+ position: absolute;
1175
+ cursor: pointer;
1176
+ top: 0;
1177
+ left: 0;
1178
+ right: 0;
1179
+ bottom: 0;
1180
+ background-color: var(--bg-3);
1181
+ transition: .4s;
1182
+ border-radius: 24px;
1183
+ border: 1px solid var(--border-hi);
1184
+ }
1185
+
1186
+ .toggle-slider:before {
1187
+ position: absolute;
1188
+ content: "";
1189
+ height: 18px;
1190
+ width: 18px;
1191
+ left: 2px;
1192
+ bottom: 2px;
1193
+ background-color: white;
1194
+ transition: .4s;
1195
+ border-radius: 50%;
1196
+ }
1197
+
1198
+ input:checked+.toggle-slider {
1199
+ background-color: var(--blue);
1200
+ border-color: var(--blue);
1201
+ }
1202
+
1203
+ input:checked+.toggle-slider:before {
1204
+ transform: translateX(20px);
1205
+ }
1206
+
1207
+ /* ─── DEVELOPER MAILBOX (SIMULATED) ──────────────────────────────────── */
1208
+ .dev-mailbox {
1209
+ position: fixed;
1210
+ bottom: 0;
1211
+ right: 2rem;
1212
+ width: 320px;
1213
+ background: var(--surface-bright);
1214
+ border: 1px solid var(--border-subtle);
1215
+ border-bottom: none;
1216
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
1217
+ box-shadow: 0 -4px 30px rgba(0, 0, 0, 0.08);
1218
+ z-index: 1000;
1219
+ overflow: hidden;
1220
+ }
1221
+
1222
+ .mailbox-header {
1223
+ background: var(--surface-raised);
1224
+ padding: var(--s-3) var(--s-4);
1225
+ display: flex;
1226
+ justify-content: space-between;
1227
+ align-items: center;
1228
+ font-size: 13px;
1229
+ font-weight: 600;
1230
+ color: var(--text-title);
1231
+ border-bottom: 1px solid rgba(0,0,0,0.05);
1232
+ }
1233
+
1234
+ .mailbox-body {
1235
+ padding: var(--s-4);
1236
+ max-height: 300px;
1237
+ overflow-y: auto;
1238
+ background: var(--surface-bright);
1239
+ }
1240
+
1241
+ .mailbox-item {
1242
+ padding: var(--s-3) 0;
1243
+ border-bottom: 1px solid var(--surface-base);
1244
+ }
1245
+
1246
+ .mailbox-item:last-child {
1247
+ border-bottom: none;
1248
+ }
1249
+
1250
+ .msg-header {
1251
+ display: flex;
1252
+ justify-content: space-between;
1253
+ margin-bottom: var(--s-1);
1254
+ }
1255
+
1256
+ .msg-type {
1257
+ font-size: 10px;
1258
+ font-weight: 700;
1259
+ text-transform: uppercase;
1260
+ color: var(--accent);
1261
+ letter-spacing: 0.05em;
1262
+ }
1263
+
1264
+ .msg-time {
1265
+ font-size: 10px;
1266
+ color: var(--text-muted);
1267
+ }
1268
+
1269
+ .msg-subject {
1270
+ font-size: 12px;
1271
+ font-weight: 600;
1272
+ color: var(--text-title);
1273
+ margin-bottom: var(--s-1);
1274
+ }
1275
+
1276
+ .msg-body {
1277
+ font-size: 11px;
1278
+ color: var(--text-body);
1279
+ line-height: 1.5;
1280
+ white-space: pre-wrap;
1281
+ }
1282
+
1283
+ .empty-msg {
1284
+ text-align: center;
1285
+ color: var(--text-muted);
1286
+ font-size: 12px;
1287
+ padding: var(--s-6) 0;
1288
+ }
1289
+
1290
+ /* Make wide info cards span the full grid width */
1291
+ .info-card.wide {
1292
+ grid-column: 1 / -1;
1293
+ }