@rblez/authly 0.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.
@@ -0,0 +1,742 @@
1
+ /* ── Reset ────────────────────────────────────────────── */
2
+ *,
3
+ *::before,
4
+ *::after {
5
+ margin: 0;
6
+ padding: 0;
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ /* ── Variables ────────────────────────────────────────── */
11
+ :root {
12
+ --bg: #000;
13
+ --surface: #111;
14
+ --border: #222;
15
+ --border-hi: #333;
16
+ --text: #fff;
17
+ --text-dim: #888;
18
+ --accent: #fff;
19
+ --sidebar-w: 240px;
20
+ --header-h: 56px;
21
+ --radius: 8px;
22
+ --font: "SF Pro Text", -apple-system, BlinkMacSystemFont,
23
+ "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
24
+ --mono: "SF Mono", "Fira Code", "Fira Mono", Menlo, monospace;
25
+ }
26
+
27
+ /* ── Base ─────────────────────────────────────────────── */
28
+ html {
29
+ font-size: 15px;
30
+ }
31
+
32
+ body {
33
+ font-family: var(--font);
34
+ background: var(--bg);
35
+ color: var(--text);
36
+ line-height: 1.5;
37
+ min-height: 100vh;
38
+ overflow-x: hidden;
39
+ }
40
+
41
+ a {
42
+ color: inherit;
43
+ text-decoration: none;
44
+ }
45
+
46
+ code {
47
+ font-family: var(--mono);
48
+ font-size: 0.875rem;
49
+ }
50
+
51
+ .hidden {
52
+ display: none !important;
53
+ }
54
+
55
+ /* ── Layout ───────────────────────────────────────────── */
56
+ .layout {
57
+ display: flex;
58
+ min-height: 100vh;
59
+ }
60
+
61
+ /* ── Sidebar ─────────────────────────────────────────── */
62
+ .sidebar {
63
+ width: var(--sidebar-w);
64
+ background: var(--bg);
65
+ border-right: 1px solid var(--border);
66
+ display: flex;
67
+ flex-direction: column;
68
+ position: fixed;
69
+ top: 0;
70
+ left: 0;
71
+ bottom: 0;
72
+ z-index: 100;
73
+ transition: transform 0.2s ease;
74
+ }
75
+
76
+ .sidebar__brand {
77
+ height: var(--header-h);
78
+ display: flex;
79
+ align-items: center;
80
+ gap: 10px;
81
+ padding: 0 16px;
82
+ font-weight: 600;
83
+ font-size: 0.95rem;
84
+ border-bottom: 1px solid var(--border);
85
+ flex-shrink: 0;
86
+ }
87
+
88
+ .sidebar__brand svg {
89
+ flex-shrink: 0;
90
+ }
91
+
92
+ .sidebar__nav {
93
+ display: flex;
94
+ flex-direction: column;
95
+ padding: 8px 8px;
96
+ gap: 2px;
97
+ overflow-y: auto;
98
+ }
99
+
100
+ .nav-item {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 10px;
104
+ padding: 8px 10px;
105
+ font-size: 0.875rem;
106
+ color: var(--text-dim);
107
+ border-radius: 6px;
108
+ transition: color 0.15s, background 0.15s;
109
+ }
110
+
111
+ .nav-item:hover {
112
+ color: var(--text);
113
+ background: var(--surface);
114
+ }
115
+
116
+ .nav-item.active {
117
+ color: var(--text);
118
+ background: var(--surface);
119
+ }
120
+
121
+ .nav-item i {
122
+ font-size: 1rem;
123
+ width: 20px;
124
+ text-align: center;
125
+ }
126
+
127
+ /* ── Main ─────────────────────────────────────────────── */
128
+ .main {
129
+ flex: 1;
130
+ margin-left: var(--sidebar-w);
131
+ min-width: 0;
132
+ }
133
+
134
+ /* ── Header ──────────────────────────────────────────── */
135
+ .header {
136
+ height: var(--header-h);
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 12px;
140
+ padding: 0 24px;
141
+ border-bottom: 1px solid var(--border);
142
+ position: sticky;
143
+ top: 0;
144
+ background: rgba(0, 0, 0, 0.85);
145
+ backdrop-filter: blur(12px);
146
+ z-index: 50;
147
+ }
148
+
149
+ .header__menu {
150
+ display: none;
151
+ background: none;
152
+ border: none;
153
+ color: var(--text);
154
+ font-size: 1.25rem;
155
+ cursor: pointer;
156
+ padding: 4px;
157
+ }
158
+
159
+ .header__title {
160
+ flex: 1;
161
+ font-size: 0.95rem;
162
+ font-weight: 500;
163
+ }
164
+
165
+ .header__status {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: 6px;
169
+ font-size: 0.75rem;
170
+ color: var(--text-dim);
171
+ }
172
+
173
+ .header__dot {
174
+ width: 6px;
175
+ height: 6px;
176
+ border-radius: 50%;
177
+ background: #22c55e;
178
+ }
179
+
180
+ /* ── Content ─────────────────────────────────────────── */
181
+ .content {
182
+ padding: 24px;
183
+ display: flex;
184
+ flex-direction: column;
185
+ gap: 16px;
186
+ max-width: 800px;
187
+ }
188
+
189
+ /* ── Cards ───────────────────────────────────────────── */
190
+ .card {
191
+ background: var(--surface);
192
+ border: 1px solid var(--border);
193
+ border-radius: var(--radius);
194
+ padding: 20px;
195
+ transition: border-color 0.2s;
196
+ }
197
+
198
+ .card:hover {
199
+ border-color: var(--border-hi);
200
+ }
201
+
202
+ .card__icon {
203
+ width: 36px;
204
+ height: 36px;
205
+ display: flex;
206
+ align-items: center;
207
+ justify-content: center;
208
+ border: 1px solid var(--border);
209
+ border-radius: 8px;
210
+ margin-bottom: 14px;
211
+ font-size: 1.1rem;
212
+ color: var(--text-dim);
213
+ }
214
+
215
+ .card h2 {
216
+ font-size: 1rem;
217
+ font-weight: 600;
218
+ margin-bottom: 6px;
219
+ }
220
+
221
+ .card p {
222
+ font-size: 0.875rem;
223
+ color: var(--text-dim);
224
+ margin-bottom: 12px;
225
+ }
226
+
227
+ .card p:last-child {
228
+ margin-bottom: 0;
229
+ }
230
+
231
+ .card__actions {
232
+ margin-top: 16px;
233
+ display: flex;
234
+ gap: 8px;
235
+ flex-wrap: wrap;
236
+ }
237
+
238
+ /* ── Code block ──────────────────────────────────────── */
239
+ .code-block {
240
+ background: var(--bg);
241
+ border: 1px solid var(--border);
242
+ border-radius: 6px;
243
+ padding: 12px 14px;
244
+ overflow-x: auto;
245
+ }
246
+
247
+ .code-block code {
248
+ color: #ccc;
249
+ }
250
+
251
+ /* ── Status badges ──────────────────────────────────── */
252
+ .status-row {
253
+ margin-bottom: 12px;
254
+ }
255
+
256
+ .status-badge {
257
+ display: inline-block;
258
+ padding: 3px 10px;
259
+ font-size: 0.75rem;
260
+ border-radius: 999px;
261
+ border: 1px solid;
262
+ }
263
+
264
+ .status-badge--pending {
265
+ color: var(--text-dim);
266
+ border-color: var(--border);
267
+ background: var(--bg);
268
+ }
269
+
270
+ .status-badge--ok {
271
+ color: #22c55e;
272
+ border-color: #166534;
273
+ background: #052e16;
274
+ }
275
+
276
+ .status-badge--error {
277
+ color: #f87171;
278
+ border-color: #7f1d1d;
279
+ background: #1c0a0a;
280
+ }
281
+
282
+ /* ── File list ───────────────────────────────────────── */
283
+ .file-list {
284
+ list-style: none;
285
+ display: flex;
286
+ flex-direction: column;
287
+ gap: 8px;
288
+ }
289
+
290
+ .file-list li {
291
+ font-size: 0.875rem;
292
+ color: var(--text-dim);
293
+ display: flex;
294
+ align-items: center;
295
+ gap: 8px;
296
+ }
297
+
298
+ .file-list li i {
299
+ color: var(--text-dim);
300
+ }
301
+
302
+ /* ── Toggle ──────────────────────────────────────────── */
303
+ .toggle-row {
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: space-between;
307
+ }
308
+
309
+ .toggle {
310
+ width: 40px;
311
+ height: 22px;
312
+ border-radius: 999px;
313
+ border: none;
314
+ background: var(--border);
315
+ cursor: pointer;
316
+ position: relative;
317
+ transition: background 0.2s;
318
+ }
319
+
320
+ .toggle::after {
321
+ content: "";
322
+ position: absolute;
323
+ width: 16px;
324
+ height: 16px;
325
+ border-radius: 50%;
326
+ background: #555;
327
+ top: 3px;
328
+ left: 3px;
329
+ transition: transform 0.2s, background 0.2s;
330
+ }
331
+
332
+ .toggle[aria-checked="true"] {
333
+ background: var(--text);
334
+ }
335
+
336
+ .toggle[aria-checked="true"]::after {
337
+ transform: translateX(18px);
338
+ background: var(--bg);
339
+ }
340
+
341
+ /* ── Scaffold grid ───────────────────────────────────── */
342
+ .grid-3 {
343
+ display: grid;
344
+ grid-template-columns: repeat(3, 1fr);
345
+ gap: 12px;
346
+ margin-top: 12px;
347
+ }
348
+
349
+ .scaffold-card {
350
+ display: flex;
351
+ flex-direction: column;
352
+ align-items: center;
353
+ gap: 8px;
354
+ padding: 20px 12px;
355
+ border: 1px solid var(--border);
356
+ border-radius: var(--radius);
357
+ cursor: pointer;
358
+ transition: border-color 0.15s, background 0.15s;
359
+ font-size: 0.875rem;
360
+ color: var(--text-dim);
361
+ }
362
+
363
+ .scaffold-card:hover {
364
+ border-color: var(--border-hi);
365
+ background: var(--bg);
366
+ color: var(--text);
367
+ }
368
+
369
+ .scaffold-card i {
370
+ font-size: 1.5rem;
371
+ }
372
+
373
+ /* ── Role chips ──────────────────────────────────────── */
374
+ .role-chips {
375
+ display: flex;
376
+ gap: 8px;
377
+ flex-wrap: wrap;
378
+ margin-top: 12px;
379
+ }
380
+
381
+ .role-chip {
382
+ padding: 4px 12px;
383
+ font-size: 0.8rem;
384
+ background: var(--bg);
385
+ border: 1px solid var(--border);
386
+ border-radius: 999px;
387
+ font-family: var(--mono);
388
+ color: var(--text-dim);
389
+ }
390
+
391
+ /* ── Vars list ─────────────────────────────────────--- */
392
+ .vars-list {
393
+ margin-top: 12px;
394
+ display: flex;
395
+ flex-direction: column;
396
+ gap: 8px;
397
+ }
398
+
399
+ .var-row {
400
+ display: flex;
401
+ justify-content: space-between;
402
+ align-items: center;
403
+ padding: 6px 0;
404
+ border-bottom: 1px solid var(--border);
405
+ }
406
+
407
+ .var-row:last-child {
408
+ border-bottom: none;
409
+ }
410
+
411
+ .var-name {
412
+ font-family: var(--mono);
413
+ font-size: 0.8rem;
414
+ }
415
+
416
+ .var-status--unset {
417
+ color: var(--text-dim);
418
+ }
419
+
420
+ .var-status--set {
421
+ color: #22c55e;
422
+ font-size: 0.75rem;
423
+ }
424
+
425
+ /* ── Migration list ──────────────────────────────────── */
426
+ .migration-list {
427
+ margin-top: 12px;
428
+ display: flex;
429
+ flex-direction: column;
430
+ gap: 8px;
431
+ }
432
+
433
+ .migration-item {
434
+ display: flex;
435
+ align-items: center;
436
+ gap: 10px;
437
+ padding: 10px 12px;
438
+ background: var(--bg);
439
+ border: 1px solid var(--border);
440
+ border-radius: 6px;
441
+ font-size: 0.85rem;
442
+ }
443
+
444
+ .migration-status {
445
+ margin-left: auto;
446
+ font-size: 0.75rem;
447
+ padding: 2px 8px;
448
+ border-radius: 999px;
449
+ background: var(--surface);
450
+ color: var(--text-dim);
451
+ border: 1px solid var(--border);
452
+ }
453
+
454
+ /* ── Data table ──────────────────────────────────────── */
455
+ .table-wrapper {
456
+ margin-top: 12px;
457
+ overflow-x: auto;
458
+ }
459
+
460
+ .data-table {
461
+ width: 100%;
462
+ border-collapse: collapse;
463
+ font-size: 0.85rem;
464
+ }
465
+
466
+ .data-table th,
467
+ .data-table td {
468
+ text-align: left;
469
+ padding: 10px 12px;
470
+ border-bottom: 1px solid var(--border);
471
+ }
472
+
473
+ .data-table th {
474
+ font-weight: 500;
475
+ color: var(--text-dim);
476
+ font-size: 0.75rem;
477
+ text-transform: uppercase;
478
+ letter-spacing: 0.05em;
479
+ }
480
+
481
+ /* ── Buttons ─────────────────────────────────────────── */
482
+ .btn {
483
+ display: inline-flex;
484
+ align-items: center;
485
+ gap: 6px;
486
+ padding: 8px 16px;
487
+ font-size: 0.85rem;
488
+ font-weight: 500;
489
+ font-family: var(--font);
490
+ border: none;
491
+ border-radius: 6px;
492
+ cursor: pointer;
493
+ transition: background 0.15s;
494
+ }
495
+
496
+ .btn--primary {
497
+ background: var(--text);
498
+ color: var(--bg);
499
+ }
500
+
501
+ .btn--primary:hover {
502
+ background: #ccc;
503
+ }
504
+
505
+ .btn i {
506
+ font-size: 1rem;
507
+ }
508
+
509
+ /* ── Badge ──────────────────────────────────────────── */
510
+ .badge {
511
+ display: inline-block;
512
+ padding: 1px 6px;
513
+ font-size: 0.6rem;
514
+ font-weight: 700;
515
+ letter-spacing: 0.05em;
516
+ background: #1a1a1a;
517
+ border: 1px solid #444;
518
+ border-radius: 4px;
519
+ color: #f59e0b;
520
+ }
521
+
522
+ /* ── Init form ─────────────────────────────────────── */
523
+ .init-form {
524
+ display: flex;
525
+ flex-direction: column;
526
+ gap: 8px;
527
+ margin-top: 12px;
528
+ }
529
+
530
+ .init-form label {
531
+ font-size: 0.8rem;
532
+ font-weight: 500;
533
+ color: #ccc;
534
+ }
535
+
536
+ .init-form input {
537
+ background: var(--bg);
538
+ border: 1px solid #333;
539
+ border-radius: 6px;
540
+ padding: 10px 12px;
541
+ color: #fff;
542
+ font-size: 0.85rem;
543
+ font-family: var(--mono);
544
+ outline: none;
545
+ transition: border-color 0.15s;
546
+ }
547
+
548
+ .init-form input:focus {
549
+ border-color: #555;
550
+ }
551
+
552
+ .init-form input::placeholder {
553
+ color: #555;
554
+ }
555
+
556
+ /* ── Result box ────────────────────────────────────── */
557
+ .result {
558
+ margin-top: 12px;
559
+ padding: 10px 14px;
560
+ border-radius: 6px;
561
+ font-size: 0.8rem;
562
+ line-height: 1.5;
563
+ border: 1px solid;
564
+ }
565
+
566
+ .result--ok {
567
+ background: #052e16;
568
+ border-color: #166534;
569
+ color: #22c55e;
570
+ }
571
+
572
+ .result--error {
573
+ background: #1c0a0a;
574
+ border-color: #7f1d1d;
575
+ color: #f87171;
576
+ }
577
+
578
+ .result--info {
579
+ background: var(--bg);
580
+ border-color: var(--border);
581
+ color: var(--text-dim);
582
+ }
583
+
584
+ /* ── File status ───────────────────────────────────── */
585
+ .file-status,
586
+ .migration-status {
587
+ margin-left: auto;
588
+ font-size: 0.7rem;
589
+ padding: 1px 8px;
590
+ border-radius: 999px;
591
+ }
592
+
593
+ .file-status--ok { color: #22c55e; background: #052e16; }
594
+ .file-status--missing { color: #f87171; background: #1c0a0a; }
595
+ .migration-status--ok { color: #22c55e; background: #052e16; }
596
+ .migration-status--pending { color: #888; background: var(--bg); border: 1px solid var(--border); }
597
+
598
+ /* ── Toast ──────────────────────────────────────────── */
599
+ .toast {
600
+ position: fixed;
601
+ bottom: 24px;
602
+ right: 24px;
603
+ padding: 10px 18px;
604
+ border-radius: 8px;
605
+ font-size: 0.8rem;
606
+ z-index: 999;
607
+ background: var(--surface);
608
+ border: 1px solid var(--border-hi);
609
+ animation: toast-in 0.2s ease;
610
+ max-width: 350px;
611
+ }
612
+
613
+ .toast.hidden { display: none; }
614
+
615
+ .toast--ok { border-color: #166534; color: #22c55e; }
616
+ .toast--error { border-color: #7f1d1d; color: #f87171; }
617
+
618
+ @keyframes toast-in {
619
+ from { opacity: 0; transform: translateY(8px); }
620
+ to { opacity: 1; transform: translateY(0); }
621
+ }
622
+
623
+ /* ── Provider card ─────────────────────────────────── */
624
+ .provider-card {
625
+ display: flex;
626
+ align-items: center;
627
+ justify-content: space-between;
628
+ background: var(--surface);
629
+ border: 1px solid var(--border);
630
+ border-radius: var(--radius);
631
+ padding: 16px 20px;
632
+ gap: 16px;
633
+ }
634
+
635
+ .provider-card i {
636
+ font-size: 1.5rem;
637
+ }
638
+
639
+ .provider-card .provider-info {
640
+ flex: 1;
641
+ }
642
+
643
+ .provider-card .provider-name {
644
+ font-weight: 600;
645
+ font-size: 0.9rem;
646
+ }
647
+
648
+ .provider-card .provider-scopes {
649
+ font-size: 0.75rem;
650
+ color: var(--text-dim);
651
+ font-family: var(--mono);
652
+ }
653
+
654
+ .provider-card .provider-status {
655
+ font-size: 0.75rem;
656
+ padding: 2px 10px;
657
+ border-radius: 999px;
658
+ }
659
+
660
+ .provider-card .provider-status.enabled {
661
+ color: #22c55e;
662
+ background: #052e16;
663
+ }
664
+
665
+ .provider-card .provider-status.disabled {
666
+ color: #888;
667
+ background: var(--bg);
668
+ border: 1px solid var(--border);
669
+ }
670
+
671
+ /* ── Button small ──────────────────────────────────── */
672
+ .btn--sm {
673
+ padding: 5px 12px;
674
+ font-size: 0.75rem;
675
+ }
676
+
677
+ /* ── Scaffold card ─────────────────────────────────── */
678
+ .scaffold-card {
679
+ display: flex;
680
+ flex-direction: column;
681
+ align-items: center;
682
+ gap: 8px;
683
+ padding: 20px 12px;
684
+ border: 1px solid var(--border);
685
+ border-radius: var(--radius);
686
+ cursor: pointer;
687
+ transition: border-color 0.15s, background 0.15s;
688
+ font-size: 0.875rem;
689
+ color: var(--text-dim);
690
+ min-width: 0;
691
+ }
692
+
693
+ .scaffold-card:hover {
694
+ border-color: var(--border-hi);
695
+ background: var(--bg);
696
+ color: var(--text);
697
+ }
698
+
699
+ .scaffold-card i {
700
+ font-size: 1.5rem;
701
+ }
702
+
703
+ /* ── Role chips ────────────────────────────────────── */
704
+ .role-chips {
705
+ display: flex;
706
+ gap: 8px;
707
+ flex-wrap: wrap;
708
+ margin-top: 12px;
709
+ }
710
+
711
+ .role-chip {
712
+ padding: 4px 12px;
713
+ font-size: 0.8rem;
714
+ background: var(--bg);
715
+ border: 1px solid var(--border);
716
+ border-radius: 999px;
717
+ font-family: var(--mono);
718
+ color: var(--text-dim);
719
+ }
720
+
721
+ /* ── Mobile ──────────────────────────────────────────── */
722
+ @media (max-width: 768px) {
723
+ .sidebar {
724
+ transform: translateX(-100%);
725
+ }
726
+
727
+ .sidebar.open {
728
+ transform: translateX(0);
729
+ }
730
+
731
+ .main {
732
+ margin-left: 0;
733
+ }
734
+
735
+ .header__menu {
736
+ display: block;
737
+ }
738
+
739
+ .grid-3 {
740
+ grid-template-columns: 1fr;
741
+ }
742
+ }