@arcblock/did-connect-service 4.1.29 → 4.1.31

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 (46) hide show
  1. package/dist/_generated/asset-bytes.js +1 -1
  2. package/dist/_generated/asset-manifest.js +1 -1
  3. package/dist/assets/{admin-extra.d12f05bb.js → admin-extra.8243c7f4.js} +12 -3
  4. package/dist/handlers/branding-handler.d.ts.map +1 -1
  5. package/dist/handlers/branding-handler.js +37 -1
  6. package/dist/handlers/branding-handler.js.map +1 -1
  7. package/dist/og/templates.d.ts +4 -0
  8. package/dist/og/templates.d.ts.map +1 -1
  9. package/dist/og/templates.js +313 -34
  10. package/dist/og/templates.js.map +1 -1
  11. package/dist/og/worker.d.ts +29 -0
  12. package/dist/og/worker.d.ts.map +1 -1
  13. package/dist/og/worker.js +79 -2
  14. package/dist/og/worker.js.map +1 -1
  15. package/dist/pages/admin/scripts/cropper.d.ts +1 -1
  16. package/dist/pages/admin/scripts/cropper.d.ts.map +1 -1
  17. package/dist/pages/admin/scripts/cropper.js +12 -3
  18. package/dist/pages/admin/scripts/cropper.js.map +1 -1
  19. package/package.json +5 -5
  20. package/dist/assets/admin-core.1fc3260c.js +0 -1623
  21. package/dist/assets/admin-core.5a2d69b0.js +0 -2067
  22. package/dist/assets/admin-core.9fff6042.js +0 -2083
  23. package/dist/assets/admin-core.a13c2729.js +0 -1461
  24. package/dist/assets/admin-core.a63bbc69.js +0 -1464
  25. package/dist/assets/admin-core.c0b5af61.js +0 -1393
  26. package/dist/assets/admin-core.cbbdbe6d.js +0 -1465
  27. package/dist/assets/admin-core.e83fd379.js +0 -1397
  28. package/dist/assets/admin-extra.143b5774.js +0 -2543
  29. package/dist/assets/admin-extra.35b91f98.js +0 -2543
  30. package/dist/assets/admin-extra.531b187f.js +0 -2552
  31. package/dist/assets/admin-extra.5b309e5e.js +0 -2547
  32. package/dist/assets/admin-extra.7ca9c16b.js +0 -2529
  33. package/dist/assets/admin-extra.841b2bbe.js +0 -2530
  34. package/dist/assets/admin-extra.afcb3651.js +0 -2528
  35. package/dist/assets/admin.c26bb17a.css +0 -2219
  36. package/dist/assets/admin.dfeedbe4.css +0 -2229
  37. package/dist/assets/login.0bf3d739.js +0 -720
  38. package/dist/assets/login.4404e695.js +0 -720
  39. package/dist/assets/login.76c483c2.js +0 -720
  40. package/dist/assets/login.bb9f8b03.js +0 -720
  41. package/dist/assets/login.d3f05790.js +0 -720
  42. package/dist/assets/login.fa25f37a.js +0 -720
  43. package/dist/http/security-headers.d.ts +0 -38
  44. package/dist/http/security-headers.d.ts.map +0 -1
  45. package/dist/http/security-headers.js +0 -67
  46. package/dist/http/security-headers.js.map +0 -1
@@ -1,2219 +0,0 @@
1
-
2
- .hidden { display: none !important; }
3
-
4
- /* ─── Shared component styles (extracted from shared-styles.ts) ───── */
5
- h1 {
6
- font-size: 24px;
7
- font-weight: 600;
8
- margin-bottom: 8px;
9
- color: var(--text-white);
10
- letter-spacing: -0.01em;
11
- line-height: 1.25;
12
- }
13
- .input {
14
- width: 100%;
15
- height: 40px;
16
- padding: 0 14px;
17
- font-size: 14px;
18
- color: var(--text);
19
- background: var(--bg-input);
20
- border: 1px solid var(--border-strong);
21
- border-radius: var(--radius-sm);
22
- outline: none;
23
- margin-bottom: 0;
24
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
25
- }
26
- textarea.input { height: auto; padding: 10px 14px; }
27
- .input:focus { border-color: var(--blue); box-shadow: var(--shadow-focus); }
28
- .input::placeholder { color: var(--text-placeholder); }
29
- .btn {
30
- display: inline-flex;
31
- align-items: center;
32
- justify-content: center;
33
- gap: 6px;
34
- width: 100%;
35
- height: 36px;
36
- padding: 0 16px;
37
- font-size: 14px;
38
- font-weight: 500;
39
- color: #fff;
40
- background: var(--blue);
41
- border: none;
42
- border-radius: var(--radius-sm);
43
- cursor: pointer;
44
- transition: background-color 0.15s ease;
45
- line-height: 1;
46
- }
47
- .btn:hover { background: var(--blue-hover); }
48
- .btn:disabled { opacity: 0.5; cursor: not-allowed; pointer-events: none; }
49
- .btn:focus-visible { box-shadow: var(--shadow-focus); }
50
- .btn svg { width: 18px; height: 18px; }
51
- .btn-secondary {
52
- background: transparent;
53
- border: 1px solid var(--border-strong);
54
- color: var(--text);
55
- }
56
- .btn-secondary:hover { background: var(--bg-hover); border-color: rgba(255,255,255,0.20); }
57
- .btn-danger { background: var(--red); }
58
- .btn-danger:hover { background: #c22a2a; }
59
- .badge {
60
- display: inline-flex;
61
- align-items: center;
62
- padding: 2px 8px;
63
- border-radius: var(--radius-full);
64
- font-size: 11px;
65
- font-weight: 500;
66
- line-height: 1.45;
67
- white-space: nowrap;
68
- }
69
- .badge-owner { background: var(--blue-light); color: var(--blue-muted); }
70
- .badge-admin { background: var(--info-light); color: var(--info-text); }
71
- .badge-member { background: var(--green-light); color: var(--green-text); }
72
- .badge-guest { background: var(--yellow-light); color: var(--yellow-text); }
73
- .badge-verified { background: var(--green-light); color: var(--green-text); }
74
- .badge-unverified { background: var(--yellow-light); color: var(--yellow-text); }
75
-
76
- /* ─── Admin layout ─────────────────────────────────────────────────── */
77
- body {
78
- display: block;
79
- min-height: 100vh;
80
- }
81
-
82
- /* ─── Header ─────────────────────────────────────────────────────── */
83
- .admin-header {
84
- display: flex;
85
- align-items: center;
86
- justify-content: space-between;
87
- padding: 0 24px;
88
- height: 56px;
89
- border-bottom: 1px solid var(--border);
90
- background: var(--bg-surface);
91
- }
92
- .admin-header-left {
93
- display: flex;
94
- align-items: center;
95
- gap: 16px;
96
- }
97
- .admin-header-left a {
98
- font-size: 13px;
99
- transition: color 0.15s ease;
100
- }
101
- .admin-header-left .app-name-link {
102
- color: var(--text);
103
- }
104
- .admin-header-left .app-name-link:hover {
105
- color: var(--text);
106
- text-decoration: none;
107
- }
108
- .admin-header h1 {
109
- font-size: 15px;
110
- font-weight: 600;
111
- margin: 0;
112
- letter-spacing: -0.006em;
113
- }
114
- .admin-header-right {
115
- position: relative;
116
- display: flex;
117
- align-items: center;
118
- gap: 4px;
119
- }
120
- /* ─── Toolbar buttons (ghost style) ───────────────────────────── */
121
- .toolbar-wrapper {
122
- position: relative;
123
- }
124
- .toolbar-btn {
125
- width: 36px;
126
- height: 36px;
127
- display: flex;
128
- align-items: center;
129
- justify-content: center;
130
- background: transparent;
131
- border: none;
132
- border-radius: var(--radius-sm);
133
- color: var(--text-tertiary);
134
- cursor: pointer;
135
- transition: background-color 0.15s ease, color 0.15s ease;
136
- -webkit-tap-highlight-color: transparent;
137
- }
138
- .toolbar-btn:hover { background: var(--bg-hover); color: var(--text); }
139
- .toolbar-btn:active { background: var(--bg-active); }
140
- .toolbar-btn svg { width: 16px; height: 16px; }
141
-
142
- /* ─── Popover (language picker) ──────────────────────────────── */
143
- .popover {
144
- position: absolute;
145
- right: 0;
146
- top: calc(100% + 6px);
147
- min-width: 160px;
148
- background: var(--bg-card);
149
- border: 1px solid var(--border);
150
- border-radius: var(--radius-lg);
151
- box-shadow: var(--shadow-lg);
152
- z-index: 1000;
153
- overflow: hidden;
154
- opacity: 0;
155
- transform: translateY(-4px) scale(0.96);
156
- pointer-events: none;
157
- transform-origin: top right;
158
- transition: opacity 0.15s ease, transform 0.15s ease;
159
- }
160
- .popover.open {
161
- opacity: 1;
162
- transform: translateY(0) scale(1);
163
- pointer-events: auto;
164
- }
165
- .popover-header {
166
- padding: 8px 14px;
167
- font-size: 11px;
168
- font-weight: 600;
169
- text-transform: uppercase;
170
- letter-spacing: 0.04em;
171
- color: var(--text-tertiary);
172
- border-bottom: 1px solid var(--border-subtle);
173
- }
174
- .popover-item {
175
- display: flex;
176
- align-items: center;
177
- gap: 10px;
178
- padding: 10px 14px;
179
- font-size: 13px;
180
- color: var(--text);
181
- cursor: pointer;
182
- transition: background 0.12s;
183
- -webkit-tap-highlight-color: transparent;
184
- }
185
- .popover-item:hover { background: var(--bg-hover); }
186
- .popover-item:active { background: var(--bg-active); }
187
- .popover-item.selected { color: var(--blue-muted); font-weight: 500; }
188
- .popover-item .check-icon { width: 14px; display: flex; align-items: center; flex-shrink: 0; }
189
- .popover-item .check-icon svg { width: 14px; height: 14px; }
190
-
191
- /* ─── Mobile: larger touch targets, full-width popover ───────── */
192
- @media (max-width: 640px) {
193
- .admin-header { padding: 0 12px; }
194
- .admin-header-right { gap: 4px; }
195
- .toolbar-btn { width: 40px; height: 40px; }
196
- .popover { right: -8px; min-width: 150px; }
197
- .popover-item { padding: 12px 14px; font-size: 14px; }
198
- .user-menu-arrow { display: none; }
199
- .user-dropdown { right: -12px; width: 220px; }
200
- .dropdown-item { padding: 12px 16px; }
201
- }
202
-
203
- /* ─── User menu trigger ────────────────────────────────────────── */
204
- .user-menu-trigger {
205
- position: relative;
206
- display: flex;
207
- align-items: center;
208
- gap: 8px;
209
- cursor: pointer;
210
- }
211
- .user-menu-arrow {
212
- font-size: 12px;
213
- color: var(--text-tertiary);
214
- line-height: 1;
215
- }
216
-
217
- /* ─── User dropdown ────────────────────────────────────────────── */
218
- .user-dropdown {
219
- position: absolute;
220
- right: 0;
221
- top: calc(100% + 8px);
222
- width: 240px;
223
- max-width: calc(100vw - 32px);
224
- background: var(--bg-card);
225
- border: 1px solid var(--border);
226
- border-radius: var(--radius-lg);
227
- box-shadow: var(--shadow-lg);
228
- z-index: 1000;
229
- overflow: hidden;
230
- }
231
- .dropdown-user {
232
- padding: 12px 16px;
233
- display: flex;
234
- align-items: center;
235
- gap: 8px;
236
- border-bottom: 1px solid var(--border-subtle);
237
- }
238
- .dropdown-user-name {
239
- font-weight: 600;
240
- font-size: 15px;
241
- color: var(--text-white);
242
- overflow: hidden;
243
- text-overflow: ellipsis;
244
- white-space: nowrap;
245
- }
246
- .dropdown-item {
247
- display: flex;
248
- align-items: center;
249
- gap: 12px;
250
- padding: 10px 16px;
251
- color: var(--text);
252
- font-size: 14px;
253
- cursor: pointer;
254
- transition: background 0.15s;
255
- text-decoration: none;
256
- }
257
- .dropdown-item:hover { background: var(--bg-hover); }
258
- .dropdown-item.danger { color: var(--red-text); }
259
- .dropdown-item.danger:hover { background: var(--red-light); }
260
- .dropdown-divider {
261
- height: 1px;
262
- background: var(--border-subtle);
263
- margin: 4px 0;
264
- }
265
- .dropdown-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--text-secondary); }
266
- .dropdown-item.danger svg { color: var(--red-text); }
267
-
268
- /* ─── Tabs ───────────────────────────────────────────────────────── */
269
- .tabs {
270
- display: flex;
271
- gap: 0;
272
- border-bottom: 1px solid var(--border);
273
- padding: 0 24px;
274
- background: var(--bg-surface);
275
- overflow-x: auto;
276
- -webkit-overflow-scrolling: touch;
277
- scrollbar-width: none;
278
- }
279
- .tabs::-webkit-scrollbar { display: none; }
280
- [data-tab] {
281
- position: relative;
282
- padding: 10px 16px;
283
- font-size: 13px;
284
- font-weight: 500;
285
- color: var(--text-tertiary);
286
- cursor: pointer;
287
- border: none;
288
- background: none;
289
- border-bottom: 2px solid transparent;
290
- transition: color 0.15s ease, border-color 0.15s ease;
291
- }
292
- [data-tab]:hover { color: var(--text-secondary); }
293
- .tab-active {
294
- color: var(--text-white) !important;
295
- border-bottom-color: var(--text-white) !important;
296
- }
297
- .tab-panel {
298
- padding: 32px 40px;
299
- max-width: 1120px;
300
- margin: 0 auto;
301
- }
302
-
303
- /* ─── Section titles ─────────────────────────────────────────────── */
304
- .section-title {
305
- font-size: 20px;
306
- font-weight: 600;
307
- color: var(--text-white);
308
- letter-spacing: -0.02em;
309
- line-height: 1.25;
310
- margin-bottom: 4px;
311
- }
312
- .section-desc {
313
- font-size: 14px;
314
- color: var(--text-tertiary);
315
- margin-bottom: 32px;
316
- padding-bottom: 24px;
317
- border-bottom: 1px solid var(--border-subtle);
318
- line-height: 1.5;
319
- }
320
-
321
- /* ─── Profile ────────────────────────────────────────────────────── */
322
- .profile-header {
323
- padding: 16px 20px;
324
- display: flex;
325
- align-items: center;
326
- gap: 14px;
327
- }
328
- .avatar-lg {
329
- width: 48px;
330
- height: 48px;
331
- font-size: 18px;
332
- }
333
- .profile-header-body {
334
- flex: 1;
335
- min-width: 0;
336
- display: flex;
337
- align-items: center;
338
- gap: 8px;
339
- }
340
- .profile-header-name {
341
- font-weight: 600;
342
- font-size: 15px;
343
- color: var(--text-white);
344
- white-space: nowrap;
345
- overflow: hidden;
346
- text-overflow: ellipsis;
347
- }
348
- .profile-grid {
349
- display: grid;
350
- grid-template-columns: 1fr 1fr;
351
- border-top: 1px solid var(--border);
352
- }
353
- .profile-cell {
354
- padding: 12px 20px;
355
- }
356
- .profile-cell-label {
357
- display: block;
358
- font-size: 11px;
359
- font-weight: 500;
360
- color: var(--text-tertiary);
361
- text-transform: uppercase;
362
- letter-spacing: 0.5px;
363
- margin-bottom: 4px;
364
- }
365
- .profile-cell-value {
366
- display: flex;
367
- align-items: center;
368
- gap: 6px;
369
- font-size: 13px;
370
- color: var(--text);
371
- min-height: 24px;
372
- }
373
- .profile-cell-editable {
374
- margin: -2px -8px;
375
- }
376
- @media (max-width: 560px) {
377
- .profile-grid { grid-template-columns: 1fr; }
378
- }
379
- .profile-editable {
380
- flex: 1;
381
- min-width: 0;
382
- height: 30px;
383
- padding: 0 8px;
384
- font-size: 13px;
385
- color: var(--text);
386
- background: transparent;
387
- border: 1px solid transparent;
388
- border-radius: var(--radius-sm);
389
- outline: none;
390
- transition: border-color 0.15s, background 0.15s;
391
- }
392
- .profile-editable:hover {
393
- border-color: var(--border-strong);
394
- background: var(--bg-input);
395
- }
396
- .profile-editable:focus {
397
- border-color: var(--blue);
398
- background: var(--bg-input);
399
- box-shadow: var(--shadow-focus);
400
- }
401
- .btn-text {
402
- background: none;
403
- border: none;
404
- color: var(--blue);
405
- font-size: 12px;
406
- font-weight: 500;
407
- cursor: pointer;
408
- padding: 4px 8px;
409
- border-radius: var(--radius-sm);
410
- white-space: nowrap;
411
- flex-shrink: 0;
412
- }
413
- .btn-text:hover { background: var(--blue-light); }
414
- .btn-text:disabled { opacity: 0.5; cursor: default; }
415
- .avatar {
416
- width: 48px;
417
- height: 48px;
418
- border-radius: var(--radius-full);
419
- background: var(--blue-light);
420
- color: var(--blue-muted);
421
- display: flex;
422
- align-items: center;
423
- justify-content: center;
424
- font-size: 16px;
425
- font-weight: 600;
426
- flex-shrink: 0;
427
- overflow: hidden;
428
- position: relative;
429
- }
430
- .avatar img {
431
- width: 100%;
432
- height: 100%;
433
- object-fit: cover;
434
- }
435
- .avatar-fallback {
436
- width: 100%;
437
- height: 100%;
438
- display: flex;
439
- align-items: center;
440
- justify-content: center;
441
- }
442
- .avatar-sm {
443
- width: 32px;
444
- height: 32px;
445
- font-size: 12px;
446
- }
447
- .avatar-editable { cursor: pointer; }
448
- .avatar-overlay {
449
- position: absolute;
450
- inset: 0;
451
- background: rgba(0,0,0,0.5);
452
- display: none;
453
- align-items: center;
454
- justify-content: center;
455
- color: white;
456
- font-size: 12px;
457
- border-radius: inherit;
458
- }
459
- .avatar-editable:hover .avatar-overlay { display: flex; }
460
- /* <did-address> Web Component theme bridge — CSS custom properties penetrate Shadow DOM */
461
- did-address {
462
- --did-text-color: var(--text-secondary);
463
- --did-copy-success-color: var(--green);
464
- font-size: 11px;
465
- }
466
- did-address:hover {
467
- --did-text-color: var(--text-white);
468
- }
469
- .profile-meta {
470
- margin: 16px 0;
471
- font-size: 13px;
472
- }
473
-
474
- /* ─── Settings card ──────────────────────────────────────────────── */
475
- .settings-card {
476
- background: var(--bg-card);
477
- border: 1px solid var(--border);
478
- border-radius: var(--radius);
479
- margin-bottom: 24px;
480
- }
481
- .settings-card-header {
482
- display: flex;
483
- align-items: center;
484
- justify-content: space-between;
485
- padding: 16px 20px;
486
- border-bottom: 1px solid var(--border-subtle);
487
- gap: 12px;
488
- }
489
- details.settings-card > summary.settings-card-header {
490
- list-style: none;
491
- }
492
- details.settings-card > summary.settings-card-header::before {
493
- content: "\25B6";
494
- font-size: 10px;
495
- transition: transform 0.2s;
496
- margin-right: 4px;
497
- }
498
- details[open].settings-card > summary.settings-card-header::before {
499
- transform: rotate(90deg);
500
- }
501
- details.settings-card > summary.settings-card-header::-webkit-details-marker {
502
- display: none;
503
- }
504
-
505
- /* Icon action buttons for access/policy tables */
506
- .ap-actions {
507
- display: flex;
508
- align-items: center;
509
- justify-content: center;
510
- gap: 4px;
511
- white-space: nowrap;
512
- }
513
- .ap-icon-btn {
514
- display: inline-flex;
515
- align-items: center;
516
- justify-content: center;
517
- width: 32px;
518
- height: 32px;
519
- padding: 0;
520
- border: 1px solid var(--border);
521
- border-radius: var(--radius-sm);
522
- background: var(--bg-card);
523
- color: var(--text-secondary);
524
- cursor: pointer;
525
- transition: background 0.15s, color 0.15s, border-color 0.15s;
526
- flex-shrink: 0;
527
- }
528
- .ap-icon-btn:hover {
529
- background: var(--bg-hover);
530
- color: var(--text-white);
531
- border-color: var(--border-strong);
532
- }
533
- .ap-icon-btn-danger:hover {
534
- background: var(--red-light);
535
- color: var(--red-text);
536
- border-color: var(--red-text);
537
- }
538
-
539
- .ap-lock-name {
540
- display: inline-flex;
541
- align-items: center;
542
- gap: 6px;
543
- color: var(--fg);
544
- }
545
- .ap-lock-name svg {
546
- color: var(--fg-muted);
547
- flex-shrink: 0;
548
- }
549
-
550
- tr.ap-separator td {
551
- padding: 0;
552
- border-bottom: 2px solid var(--border);
553
- }
554
-
555
- .ap-switch {
556
- position: relative;
557
- display: inline-block;
558
- width: 36px;
559
- height: 20px;
560
- cursor: pointer;
561
- }
562
- .ap-switch input {
563
- opacity: 0;
564
- width: 0;
565
- height: 0;
566
- }
567
- .ap-switch-slider {
568
- position: absolute;
569
- inset: 0;
570
- background: var(--bg-tertiary, #ccc);
571
- border-radius: 20px;
572
- transition: background 0.2s;
573
- }
574
- .ap-switch-slider::before {
575
- content: "";
576
- position: absolute;
577
- left: 2px;
578
- top: 2px;
579
- width: 16px;
580
- height: 16px;
581
- background: #fff;
582
- border-radius: 50%;
583
- transition: transform 0.2s;
584
- }
585
- .ap-switch input:checked + .ap-switch-slider {
586
- background: var(--color-primary, #2563eb);
587
- }
588
- .ap-switch input:checked + .ap-switch-slider::before {
589
- transform: translateX(16px);
590
- }
591
-
592
- .settings-card-header-desc {
593
- font-size: 12px;
594
- color: var(--text-tertiary);
595
- font-weight: 400;
596
- flex: 1;
597
- text-align: right;
598
- }
599
- .settings-card-desc {
600
- font-size: 12px;
601
- color: var(--text-tertiary);
602
- padding: 8px 20px 0;
603
- margin: 0;
604
- line-height: 1.5;
605
- }
606
- .settings-card-title {
607
- font-size: 14px;
608
- font-weight: 600;
609
- color: var(--text-white);
610
- }
611
- .settings-row {
612
- display: flex;
613
- align-items: center;
614
- justify-content: space-between;
615
- padding: 14px 20px;
616
- border-bottom: 1px solid var(--border-subtle);
617
- }
618
- .settings-row:last-child { border-bottom: none; }
619
- .settings-label {
620
- font-size: 13px;
621
- font-weight: 500;
622
- color: var(--text);
623
- }
624
- .settings-value {
625
- font-size: 13px;
626
- color: var(--text-secondary);
627
- }
628
-
629
- /* ─── Connected Accounts chips ──────────────────────────────────── */
630
- .ca-section {
631
- padding: 12px 20px;
632
- }
633
- .ca-section + .ca-section {
634
- padding-top: 0;
635
- }
636
- .ca-section-label {
637
- font-size: 11px;
638
- font-weight: 500;
639
- color: var(--text-tertiary);
640
- text-transform: uppercase;
641
- letter-spacing: 0.5px;
642
- margin-bottom: 8px;
643
- }
644
- .ca-chips {
645
- display: flex;
646
- flex-wrap: wrap;
647
- gap: 8px;
648
- }
649
- .ca-chip {
650
- display: inline-flex;
651
- align-items: center;
652
- gap: 8px;
653
- padding: 6px 12px;
654
- border: 1px solid var(--border);
655
- border-radius: var(--radius-sm);
656
- background: var(--bg-elevated);
657
- font-size: 13px;
658
- color: var(--text);
659
- transition: border-color 0.15s, background 0.15s;
660
- position: relative;
661
- max-width: 260px;
662
- }
663
- .ca-chip-icon {
664
- display: inline-flex;
665
- align-items: center;
666
- justify-content: center;
667
- width: 18px;
668
- height: 18px;
669
- flex-shrink: 0;
670
- }
671
- .ca-chip-icon svg { width: 18px; height: 18px; }
672
- .ca-chip-body {
673
- display: flex;
674
- flex-direction: column;
675
- min-width: 0;
676
- }
677
- .ca-chip-name {
678
- font-weight: 500;
679
- font-size: 13px;
680
- line-height: 1.3;
681
- white-space: nowrap;
682
- overflow: hidden;
683
- text-overflow: ellipsis;
684
- }
685
- .ca-chip-detail {
686
- font-size: 11px;
687
- color: var(--text-secondary);
688
- line-height: 1.3;
689
- white-space: nowrap;
690
- overflow: hidden;
691
- text-overflow: ellipsis;
692
- }
693
- .ca-chip-badge {
694
- display: inline-flex;
695
- font-size: 10px;
696
- font-weight: 500;
697
- padding: 1px 6px;
698
- border-radius: var(--radius-full);
699
- background: var(--blue-light);
700
- color: var(--blue-muted);
701
- white-space: nowrap;
702
- vertical-align: middle;
703
- margin-left: 4px;
704
- }
705
- .ca-chip-remove {
706
- display: none;
707
- align-items: center;
708
- justify-content: center;
709
- width: 18px;
710
- height: 18px;
711
- border: none;
712
- background: transparent;
713
- color: var(--text-tertiary);
714
- cursor: pointer;
715
- padding: 0;
716
- border-radius: var(--radius-full);
717
- flex-shrink: 0;
718
- transition: color 0.15s, background 0.15s;
719
- }
720
- .ca-chip-remove:hover { color: var(--red-text); background: var(--red-light); }
721
- .ca-chip:hover .ca-chip-remove { display: inline-flex; }
722
-
723
- /* ─── Bound account cards ─────────────────────────────────────── */
724
- .ca-bound-grid {
725
- display: grid;
726
- grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
727
- gap: 12px;
728
- }
729
- .ca-bound-card {
730
- display: flex;
731
- flex-direction: column;
732
- gap: 12px;
733
- padding: 16px;
734
- border: 1px solid var(--border);
735
- border-radius: var(--radius-sm);
736
- background: var(--bg-card);
737
- transition: border-color 0.15s;
738
- }
739
- .ca-bound-card:hover { border-color: var(--border-strong); }
740
- .ca-bound-top {
741
- display: flex;
742
- align-items: flex-start;
743
- gap: 12px;
744
- }
745
- .ca-bound-icon {
746
- display: flex;
747
- align-items: center;
748
- justify-content: center;
749
- width: 40px;
750
- height: 40px;
751
- border-radius: var(--radius-sm);
752
- background: var(--bg-elevated);
753
- border: 1px solid var(--border);
754
- flex-shrink: 0;
755
- margin-top: 1px;
756
- }
757
- .ca-bound-icon svg { width: 22px; height: 22px; }
758
- .ca-bound-icon-lg {
759
- width: 48px;
760
- height: 48px;
761
- background: var(--blue-light);
762
- border-color: transparent;
763
- }
764
- .ca-bound-icon-lg svg { width: 28px; height: 28px; color: var(--blue-muted); }
765
- .ca-bound-top-body {
766
- flex: 1;
767
- min-width: 0;
768
- }
769
- .ca-bound-header {
770
- display: flex;
771
- align-items: center;
772
- gap: 8px;
773
- }
774
- .ca-bound-name {
775
- font-weight: 600;
776
- font-size: 15px;
777
- color: var(--text-white);
778
- line-height: 1.3;
779
- }
780
- .ca-bound-detail {
781
- font-size: 13px;
782
- color: var(--text-secondary);
783
- line-height: 1.4;
784
- white-space: nowrap;
785
- overflow: hidden;
786
- text-overflow: ellipsis;
787
- }
788
- .ca-bound-field {
789
- display: flex;
790
- align-items: center;
791
- gap: 8px;
792
- min-width: 0;
793
- }
794
- .ca-bound-field-label {
795
- font-size: 11px;
796
- font-weight: 500;
797
- color: var(--text-tertiary);
798
- text-transform: uppercase;
799
- letter-spacing: 0.4px;
800
- flex-shrink: 0;
801
- width: 36px;
802
- }
803
- .ca-bound-field-value {
804
- flex: 1;
805
- min-width: 0;
806
- font-size: 12px;
807
- color: var(--text-secondary);
808
- white-space: nowrap;
809
- overflow: hidden;
810
- text-overflow: ellipsis;
811
- font-family: 'JetBrains Mono', 'SF Mono', monospace;
812
- }
813
- .ca-bound-copy {
814
- display: inline-flex;
815
- align-items: center;
816
- justify-content: center;
817
- width: 24px;
818
- height: 24px;
819
- border: none;
820
- background: transparent;
821
- color: var(--text-tertiary);
822
- cursor: pointer;
823
- padding: 0;
824
- border-radius: var(--radius-sm);
825
- flex-shrink: 0;
826
- transition: color 0.15s, background 0.15s;
827
- }
828
- .ca-bound-copy:hover { color: var(--text); background: var(--bg-hover); }
829
- .ca-bound-copy svg { width: 14px; height: 14px; }
830
- .ca-bound-actions {
831
- display: flex;
832
- align-items: center;
833
- gap: 4px;
834
- flex-shrink: 0;
835
- }
836
-
837
- /* ─── Connected Accounts: mobile ───────────────────────────────── */
838
- @media (max-width: 640px) {
839
- .ca-bound-grid { grid-template-columns: 1fr; gap: 8px; }
840
- .ca-bound-card { padding: 12px; gap: 10px; }
841
- .ca-bound-top { gap: 10px; }
842
- .ca-bound-icon { width: 32px; height: 32px; }
843
- .ca-bound-icon svg { width: 18px; height: 18px; }
844
- .ca-bound-icon-lg { width: 40px; height: 40px; }
845
- .ca-bound-icon-lg svg { width: 22px; height: 22px; }
846
- .ca-bound-name { font-size: 14px; }
847
- .ca-bound-detail { font-size: 12px; }
848
- .ca-bound-field-label { display: none; }
849
- .ca-bound-field-value { font-size: 11px; }
850
- .ca-section { padding: 10px 16px; }
851
- .ca-chips { gap: 6px; }
852
- .ca-chip { padding: 5px 10px; font-size: 12px; }
853
- }
854
- .ca-chip-unbound {
855
- border-style: dashed;
856
- color: var(--text-tertiary);
857
- cursor: pointer;
858
- }
859
- .ca-chip-unbound:hover {
860
- border-color: var(--border-strong);
861
- background: var(--bg-hover);
862
- color: var(--text);
863
- }
864
- .ca-chip-add-icon {
865
- font-size: 14px;
866
- font-weight: 300;
867
- line-height: 1;
868
- color: var(--text-tertiary);
869
- }
870
- .ca-chip-unbound:hover .ca-chip-add-icon { color: var(--text-secondary); }
871
- .ca-passkey-add {
872
- display: inline-flex;
873
- align-items: center;
874
- gap: 6px;
875
- padding: 6px 12px;
876
- border: 1px dashed var(--border);
877
- border-radius: var(--radius-sm);
878
- background: transparent;
879
- font-size: 13px;
880
- color: var(--text-tertiary);
881
- cursor: pointer;
882
- transition: border-color 0.15s, background 0.15s, color 0.15s;
883
- }
884
- .ca-passkey-add:hover {
885
- border-color: var(--border-strong);
886
- background: var(--bg-hover);
887
- color: var(--text);
888
- }
889
-
890
- /* ─── Forms ──────────────────────────────────────────────────────── */
891
- .form-group {
892
- margin-bottom: 16px;
893
- }
894
- .form-label {
895
- display: flex;
896
- align-items: center;
897
- gap: 6px;
898
- font-size: 13px;
899
- font-weight: 600;
900
- color: var(--text-secondary);
901
- margin-bottom: 4px;
902
- }
903
- .form-actions {
904
- display: flex;
905
- justify-content: flex-end;
906
- gap: 8px;
907
- margin-top: 24px;
908
- }
909
- .form-actions .btn { width: auto; }
910
- .text-muted { color: var(--text-secondary); }
911
-
912
- /* ─── Tables ─────────────────────────────────────────────────────── */
913
- .table {
914
- width: 100%;
915
- border-collapse: collapse;
916
- }
917
- .table th, .table td {
918
- padding: 12px 16px;
919
- text-align: left;
920
- border-bottom: 1px solid var(--border-subtle);
921
- font-size: 14px;
922
- vertical-align: middle;
923
- }
924
- .table th {
925
- color: var(--text-tertiary);
926
- font-weight: 500;
927
- font-size: 11px;
928
- text-transform: uppercase;
929
- letter-spacing: 0.04em;
930
- background: transparent;
931
- border-bottom-color: var(--border);
932
- }
933
- .table th.sortable {
934
- cursor: pointer;
935
- user-select: none;
936
- transition: color 0.1s ease;
937
- }
938
- .table th.sortable:hover { color: var(--text-secondary); }
939
- .table th.sort-active { color: var(--text-white); }
940
- .table th .sort-arrow {
941
- display: inline-block;
942
- margin-left: 4px;
943
- font-size: 10px;
944
- opacity: 0.25;
945
- transition: opacity 0.1s ease;
946
- }
947
- .table th.sortable:hover .sort-arrow { opacity: 0.6; }
948
- .table th .sort-arrow-active { opacity: 1; }
949
- .table tbody tr {
950
- transition: background-color 0.1s ease;
951
- }
952
- .table tbody tr:hover { background: var(--bg-hover); }
953
-
954
- /* Action cell — hosts ⋯ trigger + dropdown menu */
955
- .action-cell {
956
- position: relative;
957
- width: 40px;
958
- text-align: center;
959
- }
960
-
961
- /* Member identity cell */
962
- .member-identity {
963
- display: flex;
964
- align-items: center;
965
- gap: 12px;
966
- }
967
- .member-name {
968
- font-size: 14px;
969
- font-weight: 500;
970
- color: var(--text);
971
- line-height: 1.3;
972
- white-space: nowrap;
973
- overflow: hidden;
974
- text-overflow: ellipsis;
975
- }
976
- .member-email {
977
- font-size: 12px;
978
- color: var(--text-secondary);
979
- line-height: 1.3;
980
- margin-top: 1px;
981
- white-space: nowrap;
982
- overflow: hidden;
983
- text-overflow: ellipsis;
984
- }
985
- .cell-date {
986
- font-size: 13px;
987
- color: var(--text-tertiary);
988
- font-variant-numeric: tabular-nums;
989
- }
990
-
991
- /* ─── Toolbar ────────────────────────────────────────────────────── */
992
- .tab-toolbar {
993
- display: flex;
994
- gap: 8px;
995
- margin-bottom: 20px;
996
- align-items: center;
997
- }
998
- .search-wrapper {
999
- position: relative;
1000
- width: 280px;
1001
- }
1002
- .search-icon {
1003
- position: absolute;
1004
- left: 10px;
1005
- top: 50%;
1006
- transform: translateY(-50%);
1007
- color: var(--text-tertiary);
1008
- width: 16px;
1009
- height: 16px;
1010
- pointer-events: none;
1011
- }
1012
- .search-bar {
1013
- width: 100%;
1014
- height: 36px;
1015
- padding: 0 12px 0 34px;
1016
- background: transparent;
1017
- border: 1px solid var(--border-strong);
1018
- border-radius: var(--radius-sm);
1019
- font-size: 14px;
1020
- color: var(--text);
1021
- outline: none;
1022
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
1023
- }
1024
- .search-bar::placeholder { color: var(--text-tertiary); }
1025
- .search-bar:focus { border-color: var(--border-focus); box-shadow: 0 0 0 2px rgba(255,255,255,0.05); }
1026
- .select {
1027
- height: 36px;
1028
- padding: 0 12px;
1029
- font-size: 13px;
1030
- color: var(--text);
1031
- background: transparent;
1032
- border: 1px solid var(--border-strong);
1033
- border-radius: var(--radius-sm);
1034
- outline: none;
1035
- cursor: pointer;
1036
- transition: border-color 0.15s ease;
1037
- }
1038
- .select:focus { border-color: var(--border-focus); }
1039
- .btn-sm { height: 36px; padding: 0 12px; font-size: 13px; width: auto; }
1040
- .btn-xs { height: 28px; padding: 0 10px; font-size: 12px; width: auto; }
1041
-
1042
- /* ─── OAuth provider picker ──────────────────────────────────────── */
1043
- .provider-picker {
1044
- display: grid;
1045
- grid-template-columns: repeat(5, 1fr);
1046
- gap: 8px;
1047
- }
1048
- .provider-card {
1049
- display: flex;
1050
- flex-direction: column;
1051
- align-items: center;
1052
- justify-content: center;
1053
- gap: 6px;
1054
- padding: 10px 6px 8px;
1055
- border: 1px solid var(--border);
1056
- border-radius: var(--radius-sm);
1057
- background: var(--bg-elevated);
1058
- cursor: pointer;
1059
- transition: border-color 0.15s, background 0.15s;
1060
- position: relative;
1061
- min-width: 0;
1062
- }
1063
- .provider-card:hover:not(.added) { border-color: var(--border-strong); background: var(--bg-hover); }
1064
- .provider-card.selected { border-color: var(--blue); background: rgba(108,71,255,0.08); }
1065
- .provider-card.added { opacity: 0.45; cursor: default; }
1066
- .provider-icon { display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; }
1067
- .provider-icon svg { width: 20px; height: 20px; }
1068
- .provider-name { font-size: 11px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
1069
- .provider-card.selected .provider-name { color: var(--text); }
1070
- .provider-added-badge {
1071
- position: absolute;
1072
- top: -6px; right: -6px;
1073
- font-size: 9px;
1074
- font-weight: 600;
1075
- padding: 1px 4px;
1076
- border-radius: 4px;
1077
- background: var(--bg-card);
1078
- border: 1px solid var(--border);
1079
- color: var(--text-tertiary);
1080
- line-height: 1.4;
1081
- white-space: nowrap;
1082
- }
1083
-
1084
- /* ─── Pagination ─────────────────────────────────────────────────── */
1085
- .pagination {
1086
- display: flex;
1087
- align-items: center;
1088
- justify-content: space-between;
1089
- margin-top: 16px;
1090
- font-size: 13px;
1091
- color: var(--text-tertiary);
1092
- }
1093
- .pagination-btns {
1094
- display: flex;
1095
- gap: 4px;
1096
- }
1097
- .page-btn {
1098
- min-width: 32px;
1099
- height: 32px;
1100
- display: flex;
1101
- align-items: center;
1102
- justify-content: center;
1103
- border: none;
1104
- background: transparent;
1105
- color: var(--text-secondary);
1106
- border-radius: var(--radius-sm);
1107
- cursor: pointer;
1108
- font-size: 13px;
1109
- font-weight: 500;
1110
- transition: background-color 0.1s ease;
1111
- }
1112
- .page-btn:hover { background: var(--bg-hover); color: var(--text); }
1113
- .page-btn.active { background: var(--bg-active); color: var(--text-white); }
1114
- .page-btn:disabled { opacity: 0.3; cursor: not-allowed; }
1115
-
1116
- /* ─── Empty state ────────────────────────────────────────────────── */
1117
- .empty-state {
1118
- display: flex;
1119
- flex-direction: column;
1120
- align-items: center;
1121
- justify-content: center;
1122
- padding: 48px 24px;
1123
- text-align: center;
1124
- }
1125
- .empty-state-icon {
1126
- width: 48px;
1127
- height: 48px;
1128
- border-radius: var(--radius);
1129
- background: rgba(255,255,255,0.06);
1130
- display: flex;
1131
- align-items: center;
1132
- justify-content: center;
1133
- color: var(--text-tertiary);
1134
- margin-bottom: 16px;
1135
- }
1136
- .empty-state-title {
1137
- font-size: 15px;
1138
- font-weight: 500;
1139
- color: var(--text);
1140
- margin-bottom: 4px;
1141
- }
1142
- .empty-state-desc {
1143
- font-size: 13px;
1144
- color: var(--text-secondary);
1145
- max-width: 320px;
1146
- line-height: 1.5;
1147
- }
1148
-
1149
- /* ─── Dialogs ────────────────────────────────────────────────────── */
1150
- dialog {
1151
- background: var(--bg-elevated);
1152
- border: 1px solid var(--border-strong);
1153
- border-radius: var(--radius-lg);
1154
- color: var(--text);
1155
- padding: 0;
1156
- margin: auto;
1157
- max-width: 520px;
1158
- width: 90%;
1159
- box-shadow: var(--shadow-lg);
1160
- overflow: hidden;
1161
- animation: modalIn 0.2s ease;
1162
- }
1163
- dialog::backdrop { background: rgba(0,0,0,0.7); }
1164
- .dialog-content {
1165
- padding: 24px;
1166
- }
1167
- .dialog-content h3 {
1168
- font-size: 16px;
1169
- font-weight: 600;
1170
- color: var(--text-white);
1171
- margin-bottom: 4px;
1172
- letter-spacing: -0.01em;
1173
- }
1174
- .dialog-desc {
1175
- font-size: 14px;
1176
- color: var(--text-secondary);
1177
- margin-bottom: 20px;
1178
- line-height: 1.5;
1179
- }
1180
- .dialog-actions {
1181
- display: flex;
1182
- justify-content: flex-end;
1183
- gap: 8px;
1184
- padding: 16px 24px;
1185
- border-top: 1px solid var(--border);
1186
- }
1187
- .dialog-actions .btn { width: auto; }
1188
-
1189
- /* ─── Wallet bind QR (mirrors login-page .qr-view) ──────────────── */
1190
- .wallet-qr-view {
1191
- margin: 16px auto;
1192
- display: flex;
1193
- justify-content: center;
1194
- min-height: 212px;
1195
- align-items: center;
1196
- }
1197
- .wallet-qr-placeholder {
1198
- width: 212px;
1199
- height: 212px;
1200
- display: flex;
1201
- align-items: center;
1202
- justify-content: center;
1203
- border: 1px solid var(--border-subtle);
1204
- border-radius: var(--radius);
1205
- background: var(--bg-elevated);
1206
- }
1207
- .wallet-qr-spinner {
1208
- display: inline-block;
1209
- width: 32px; height: 32px;
1210
- border: 3px solid var(--border-strong);
1211
- border-top-color: var(--blue-muted);
1212
- border-radius: 50%;
1213
- animation: spin 0.6s linear infinite;
1214
- }
1215
- @keyframes spin { to { transform: rotate(360deg); } }
1216
- .wallet-deep-link-btn {
1217
- margin-top: 4px;
1218
- width: 212px;
1219
- }
1220
- .wallet-bind-status {
1221
- margin-top: 12px;
1222
- font-size: 13px;
1223
- min-height: 18px;
1224
- color: var(--text-secondary);
1225
- margin-bottom: 0;
1226
- }
1227
- .wallet-bind-error {
1228
- color: var(--red-text);
1229
- padding: 10px 12px;
1230
- background: rgba(220,53,69,0.08);
1231
- border: 1px solid rgba(220,53,69,0.25);
1232
- border-radius: var(--radius-sm);
1233
- margin-top: 8px;
1234
- }
1235
-
1236
- @keyframes modalIn {
1237
- from { opacity: 0; transform: scale(0.98); }
1238
- to { opacity: 1; transform: scale(1); }
1239
- }
1240
-
1241
- /* ─── Action menus ───────────────────────────────────────────────── */
1242
- .action-trigger {
1243
- width: 28px;
1244
- height: 28px;
1245
- display: flex;
1246
- align-items: center;
1247
- justify-content: center;
1248
- border-radius: var(--radius-sm);
1249
- border: none;
1250
- background: transparent;
1251
- color: var(--text-tertiary);
1252
- cursor: pointer;
1253
- font-size: 16px;
1254
- transition: background-color 0.15s ease, color 0.15s ease;
1255
- flex-shrink: 0;
1256
- }
1257
- .action-trigger:hover { background: var(--bg-hover); color: var(--text-secondary); }
1258
- .action-menu {
1259
- display: none;
1260
- position: absolute;
1261
- right: 8px;
1262
- top: 100%;
1263
- z-index: 50;
1264
- min-width: 180px;
1265
- padding: 4px;
1266
- background: var(--bg-elevated);
1267
- border: 1px solid var(--border-strong);
1268
- border-radius: var(--radius);
1269
- box-shadow: var(--shadow-md);
1270
- }
1271
- .action-menu.open { display: block; }
1272
- .action-menu-item {
1273
- display: flex;
1274
- align-items: center;
1275
- gap: 8px;
1276
- padding: 6px 8px;
1277
- border-radius: var(--radius-xs);
1278
- font-size: 13px;
1279
- color: var(--text);
1280
- cursor: pointer;
1281
- border: none;
1282
- background: none;
1283
- width: 100%;
1284
- text-align: left;
1285
- transition: background-color 0.1s ease;
1286
- }
1287
- .action-menu-item:hover { background: var(--bg-hover); }
1288
- .action-menu-item.danger { color: var(--red-text); }
1289
- .action-menu-item.danger:hover { background: var(--red-light); }
1290
- .action-menu-sep {
1291
- height: 1px;
1292
- background: var(--border);
1293
- margin: 4px 0;
1294
- }
1295
-
1296
- /* ─── Status badges ──────────────────────────────────────────────── */
1297
- .badge-active { background: var(--green-light); color: var(--green-text); }
1298
- .badge-pending { background: var(--yellow-light); color: var(--yellow-text); }
1299
- .badge-blocked { background: var(--red-light); color: var(--red-text); }
1300
- .badge-expired { background: rgba(255,255,255,0.06); color: var(--text-tertiary); }
1301
- .badge-neutral { background: rgba(255,255,255,0.06); color: var(--text-secondary); }
1302
-
1303
- /* ─── Toast ──────────────────────────────────────────────────────── */
1304
- .toast-container {
1305
- position: fixed;
1306
- bottom: 24px;
1307
- right: 24px;
1308
- z-index: 100;
1309
- display: flex;
1310
- flex-direction: column;
1311
- gap: 8px;
1312
- }
1313
- .toast {
1314
- padding: 10px 16px;
1315
- border-radius: var(--radius);
1316
- font-size: 13px;
1317
- font-weight: 500;
1318
- color: var(--text);
1319
- background: var(--bg-elevated);
1320
- border: 1px solid var(--border-strong);
1321
- box-shadow: var(--shadow-md);
1322
- animation: toastIn 0.2s ease;
1323
- }
1324
- .toast.success { border-left: 3px solid var(--green); }
1325
- .toast.error { background: var(--red); color: #fff; border-color: var(--red); }
1326
- @keyframes toastIn {
1327
- from { opacity: 0; transform: translateY(8px); }
1328
- to { opacity: 1; transform: translateY(0); }
1329
- }
1330
-
1331
- /* ─── Toggle switch ────────────────────────────────────────────── */
1332
- .toggle-switch {
1333
- position: relative;
1334
- display: inline-block;
1335
- width: 40px;
1336
- height: 22px;
1337
- cursor: pointer;
1338
- }
1339
- .toggle-switch input { opacity: 0; width: 0; height: 0; position: absolute; }
1340
- .toggle-slider {
1341
- position: absolute;
1342
- inset: 0;
1343
- background: var(--bg-hover);
1344
- border-radius: 11px;
1345
- transition: background-color 0.2s ease;
1346
- }
1347
- .toggle-slider::before {
1348
- content: "";
1349
- position: absolute;
1350
- left: 2px;
1351
- top: 2px;
1352
- width: 18px;
1353
- height: 18px;
1354
- border-radius: 50%;
1355
- background: var(--text-secondary);
1356
- transition: transform 0.2s ease, background-color 0.2s ease;
1357
- }
1358
- .toggle-switch input:checked + .toggle-slider { background: var(--blue); }
1359
- .toggle-switch input:checked + .toggle-slider::before {
1360
- transform: translateX(18px);
1361
- background: #fff;
1362
- }
1363
-
1364
- /* ─── Range slider ─────────────────────────────────────────────── */
1365
- .range-slider {
1366
- -webkit-appearance: none;
1367
- width: 100%;
1368
- height: 6px;
1369
- border-radius: 3px;
1370
- background: var(--bg-hover);
1371
- outline: none;
1372
- margin: 8px 0;
1373
- }
1374
- .range-slider::-webkit-slider-thumb {
1375
- -webkit-appearance: none;
1376
- width: 18px;
1377
- height: 18px;
1378
- border-radius: 50%;
1379
- background: var(--blue);
1380
- cursor: pointer;
1381
- }
1382
- .range-slider::-moz-range-thumb {
1383
- width: 18px;
1384
- height: 18px;
1385
- border-radius: 50%;
1386
- background: var(--blue);
1387
- cursor: pointer;
1388
- border: none;
1389
- }
1390
-
1391
- /* ─── Branding: Section layout ─────────────────────── */
1392
- .br-section {
1393
- margin-bottom: 56px;
1394
- }
1395
- .br-section-header {
1396
- display: flex;
1397
- align-items: baseline;
1398
- justify-content: space-between;
1399
- margin-bottom: 20px;
1400
- }
1401
- .br-section-title {
1402
- font-size: 16px;
1403
- font-weight: 600;
1404
- color: var(--text);
1405
- letter-spacing: -0.01em;
1406
- }
1407
- .br-section-category {
1408
- font-size: 10px;
1409
- font-weight: 600;
1410
- color: var(--text-tertiary);
1411
- text-transform: uppercase;
1412
- letter-spacing: 0.08em;
1413
- }
1414
- .br-two-col {
1415
- display: grid;
1416
- grid-template-columns: 1fr 2fr;
1417
- gap: 32px;
1418
- }
1419
- .br-col-desc {
1420
- font-size: 13px;
1421
- color: var(--text-secondary);
1422
- line-height: 1.6;
1423
- }
1424
- .br-field-hint {
1425
- font-size: 11px;
1426
- color: var(--text-tertiary);
1427
- margin-top: 4px;
1428
- margin-bottom: 12px;
1429
- }
1430
- /* Info icon tooltip */
1431
- .info-tip {
1432
- position: relative;
1433
- display: inline-flex;
1434
- align-items: center;
1435
- justify-content: center;
1436
- width: 14px;
1437
- height: 14px;
1438
- border-radius: 50%;
1439
- background: rgba(255,255,255,0.08);
1440
- color: var(--text-tertiary);
1441
- font-size: 10px;
1442
- font-weight: 600;
1443
- cursor: help;
1444
- flex-shrink: 0;
1445
- }
1446
- .info-tip::after {
1447
- content: attr(data-tip);
1448
- position: absolute;
1449
- bottom: calc(100% + 8px);
1450
- left: 50%;
1451
- transform: translateX(-50%);
1452
- background: var(--bg-card);
1453
- border: 1px solid var(--border-strong);
1454
- color: var(--text-secondary);
1455
- font-size: 12px;
1456
- font-weight: 400;
1457
- padding: 8px 14px;
1458
- border-radius: var(--radius);
1459
- opacity: 0;
1460
- pointer-events: none;
1461
- transition: opacity 0.15s ease;
1462
- z-index: 10;
1463
- box-shadow: var(--shadow-md);
1464
- min-width: 220px;
1465
- max-width: 360px;
1466
- white-space: normal;
1467
- line-height: 1.5;
1468
- text-align: left;
1469
- }
1470
- .info-tip:hover::after { opacity: 1; }
1471
- .br-panel {
1472
- background: var(--bg-elevated);
1473
- border: 1px solid var(--border-subtle);
1474
- border-radius: var(--radius-lg);
1475
- padding: 20px 24px;
1476
- }
1477
- .accent-dot {
1478
- width: 28px;
1479
- height: 28px;
1480
- border-radius: 50%;
1481
- cursor: pointer;
1482
- border: 2px solid transparent;
1483
- transition: transform 0.1s ease, border-color 0.15s ease;
1484
- }
1485
- .accent-dot:hover { transform: scale(1.15); }
1486
- .accent-dot.selected { border-color: var(--text-white); }
1487
-
1488
- /* ─── Branding: Language toggles ──────────────────── */
1489
- .lang-toggles {
1490
- display: flex;
1491
- flex-wrap: wrap;
1492
- gap: 8px;
1493
- align-items: center;
1494
- }
1495
- .lang-toggle {
1496
- position: relative;
1497
- display: flex;
1498
- align-items: center;
1499
- gap: 8px;
1500
- padding: 10px 20px;
1501
- background: var(--bg-elevated);
1502
- border: 1px solid var(--border-subtle);
1503
- border-radius: var(--radius);
1504
- font-size: 13px;
1505
- font-weight: 500;
1506
- color: var(--text-secondary);
1507
- cursor: pointer;
1508
- transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
1509
- }
1510
- .lang-toggle:hover { border-color: var(--border-strong); color: var(--text); }
1511
- .lang-toggle.active {
1512
- border-color: var(--border-strong);
1513
- color: var(--text-white);
1514
- background: rgba(255,255,255,0.04);
1515
- }
1516
- .lang-toggle.active::after {
1517
- content: "✓";
1518
- position: absolute;
1519
- top: -1px;
1520
- right: -1px;
1521
- width: 16px;
1522
- height: 16px;
1523
- background: var(--blue);
1524
- border-radius: 0 var(--radius) 0 var(--radius);
1525
- display: flex;
1526
- align-items: center;
1527
- justify-content: center;
1528
- font-size: 10px;
1529
- font-weight: 700;
1530
- color: #fff;
1531
- line-height: 1;
1532
- }
1533
-
1534
- /* ─── Branding: Logo grid (redesigned) ───────────── */
1535
- .logo-grid {
1536
- display: grid;
1537
- grid-template-columns: repeat(4, 1fr);
1538
- gap: 16px;
1539
- }
1540
- .logo-item {
1541
- position: relative;
1542
- background: var(--bg-elevated);
1543
- border: 1px solid var(--border-subtle);
1544
- border-radius: var(--radius-lg);
1545
- overflow: hidden;
1546
- display: flex;
1547
- flex-direction: column;
1548
- padding: 16px;
1549
- transition: border-color 0.15s ease;
1550
- min-height: 170px;
1551
- }
1552
- .logo-item:hover { border-color: rgba(255,255,255,0.15); }
1553
- .logo-item-header {
1554
- display: flex;
1555
- justify-content: space-between;
1556
- align-items: flex-start;
1557
- margin-bottom: auto;
1558
- }
1559
- .logo-item-icon {
1560
- color: var(--text-tertiary);
1561
- font-size: 20px;
1562
- line-height: 1;
1563
- }
1564
- .logo-item-spec {
1565
- font-size: 10px;
1566
- font-weight: 600;
1567
- color: var(--text-tertiary);
1568
- text-transform: uppercase;
1569
- letter-spacing: 0.03em;
1570
- }
1571
- .logo-preview {
1572
- width: 100%;
1573
- flex: 1;
1574
- display: flex;
1575
- align-items: center;
1576
- justify-content: center;
1577
- overflow: hidden;
1578
- }
1579
- .logo-preview img {
1580
- max-width: 100%;
1581
- max-height: 80px;
1582
- object-fit: contain;
1583
- }
1584
- .logo-item-footer {
1585
- margin-top: 12px;
1586
- }
1587
- .logo-name {
1588
- font-size: 14px;
1589
- font-weight: 600;
1590
- color: var(--text-white);
1591
- margin-bottom: 2px;
1592
- }
1593
- .logo-subtitle {
1594
- font-size: 12px;
1595
- color: var(--text-tertiary);
1596
- }
1597
- .logo-placeholder {
1598
- font-size: 24px;
1599
- color: var(--text-tertiary);
1600
- opacity: 0.3;
1601
- }
1602
- /* Hover overlay for upload — glassmorphism */
1603
- .logo-hover-upload {
1604
- position: absolute;
1605
- inset: 0;
1606
- background: rgba(20,20,30,0.65);
1607
- backdrop-filter: blur(8px);
1608
- -webkit-backdrop-filter: blur(8px);
1609
- display: flex;
1610
- flex-direction: column;
1611
- align-items: center;
1612
- justify-content: center;
1613
- gap: 6px;
1614
- opacity: 0;
1615
- transition: opacity 0.2s ease;
1616
- cursor: pointer;
1617
- border-radius: inherit;
1618
- }
1619
- .logo-item:hover .logo-hover-upload { opacity: 1; }
1620
- .logo-hover-icon {
1621
- width: 36px;
1622
- height: 36px;
1623
- border-radius: 50%;
1624
- background: rgba(255,255,255,0.1);
1625
- display: flex;
1626
- align-items: center;
1627
- justify-content: center;
1628
- color: var(--text-white);
1629
- margin-bottom: 2px;
1630
- }
1631
- .logo-hover-icon svg { width: 18px; height: 18px; }
1632
- .logo-hover-text {
1633
- font-size: 12px;
1634
- font-weight: 500;
1635
- color: var(--text-secondary);
1636
- letter-spacing: 0.02em;
1637
- }
1638
- /* Uploaded state: replace/discard shown on hover via overlay */
1639
- .logo-uploaded-overlay {
1640
- position: absolute;
1641
- inset: 0;
1642
- background: rgba(20,20,30,0.65);
1643
- backdrop-filter: blur(8px);
1644
- -webkit-backdrop-filter: blur(8px);
1645
- display: flex;
1646
- align-items: center;
1647
- justify-content: center;
1648
- gap: 12px;
1649
- opacity: 0;
1650
- transition: opacity 0.2s ease;
1651
- border-radius: inherit;
1652
- z-index: 2;
1653
- }
1654
- .logo-item:hover .logo-uploaded-overlay { opacity: 1; }
1655
- .logo-overlay-btn {
1656
- font-size: 12px;
1657
- font-weight: 600;
1658
- padding: 6px 14px;
1659
- border-radius: var(--radius-sm);
1660
- cursor: pointer;
1661
- border: 1px solid;
1662
- transition: background 0.15s ease;
1663
- }
1664
- .logo-overlay-btn-replace { color: var(--blue); border-color: var(--blue); background: transparent; }
1665
- .logo-overlay-btn-replace:hover { background: rgba(99,102,241,0.12); }
1666
- .logo-overlay-btn-discard { color: var(--red-text); border-color: rgba(224,46,46,0.4); background: transparent; }
1667
- .logo-overlay-btn-discard:hover { background: rgba(224,46,46,0.1); }
1668
- .btn-text { background: none; border: none; color: var(--blue); font-size: 11px; font-weight: 600; cursor: pointer; padding: 0; }
1669
- .btn-text:hover { text-decoration: underline; }
1670
- .btn-text-danger { color: var(--red-text); }
1671
-
1672
- /* ─── Branding: Sticky save bar ──────────────────── */
1673
- .br-save-bar {
1674
- position: fixed;
1675
- bottom: 0;
1676
- left: 0;
1677
- right: 0;
1678
- z-index: 40;
1679
- background: rgba(28,28,32,0.85);
1680
- backdrop-filter: blur(12px);
1681
- border-top: 1px solid var(--border-subtle);
1682
- padding: 16px 40px;
1683
- display: none;
1684
- }
1685
- .br-save-bar.visible { display: block; }
1686
- .br-save-bar-inner {
1687
- max-width: 1120px;
1688
- margin: 0 auto;
1689
- display: flex;
1690
- align-items: center;
1691
- justify-content: space-between;
1692
- width: 100%;
1693
- }
1694
- .br-save-hint {
1695
- font-size: 12px;
1696
- color: var(--text-tertiary);
1697
- display: flex;
1698
- align-items: center;
1699
- gap: 8px;
1700
- }
1701
- .br-save-actions {
1702
- display: flex;
1703
- gap: 8px;
1704
- }
1705
- .br-save-actions .btn { width: auto; }
1706
-
1707
- /* ─── Branding: Accent color swatches ────────────── */
1708
- .accent-grid {
1709
- display: grid;
1710
- grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
1711
- gap: 10px;
1712
- }
1713
- .accent-swatch {
1714
- position: relative;
1715
- height: 64px;
1716
- border-radius: var(--radius);
1717
- display: flex;
1718
- flex-direction: column;
1719
- justify-content: flex-end;
1720
- padding: 6px 8px;
1721
- cursor: pointer;
1722
- transition: transform 0.1s ease, box-shadow 0.15s ease;
1723
- border: 2px solid transparent;
1724
- }
1725
- .accent-swatch:hover { transform: scale(1.02); }
1726
- .accent-swatch.selected { border-color: var(--text-white); }
1727
- .accent-swatch .accent-check {
1728
- position: absolute;
1729
- top: 4px;
1730
- right: 4px;
1731
- width: 18px;
1732
- height: 18px;
1733
- border-radius: 50%;
1734
- background: rgba(0,0,0,0.5);
1735
- display: none;
1736
- align-items: center;
1737
- justify-content: center;
1738
- color: white;
1739
- font-size: 12px;
1740
- }
1741
- .accent-swatch.selected .accent-check { display: flex; }
1742
- .accent-label { font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; opacity: 0.8; }
1743
- .accent-hex { font-size: 10px; font-weight: 700; }
1744
-
1745
- /* ─── Branding tab: Language grid ───────────────────── */
1746
- .lang-grid {
1747
- display: grid;
1748
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1749
- gap: 4px 16px;
1750
- }
1751
- .lang-item {
1752
- display: flex;
1753
- align-items: center;
1754
- gap: 6px;
1755
- font-size: 13px;
1756
- padding: 4px 0;
1757
- cursor: pointer;
1758
- }
1759
-
1760
- /* ─── Crop dialog ──────────────────────────────────── */
1761
- dialog.dialog-wide { max-width: 660px; }
1762
- .crop-container {
1763
- width: 100%;
1764
- height: 400px;
1765
- background: var(--bg);
1766
- border-radius: var(--radius-sm);
1767
- overflow: hidden;
1768
- }
1769
- .crop-toolbar {
1770
- display: flex;
1771
- justify-content: center;
1772
- gap: 6px;
1773
- padding: 12px 0 4px;
1774
- }
1775
- .crop-tool-btn {
1776
- width: 36px;
1777
- height: 36px;
1778
- display: flex;
1779
- align-items: center;
1780
- justify-content: center;
1781
- background: var(--bg-input);
1782
- border: 1px solid var(--border-strong);
1783
- border-radius: var(--radius-sm);
1784
- color: var(--text-secondary);
1785
- cursor: pointer;
1786
- transition: background-color 0.15s ease, color 0.15s ease;
1787
- }
1788
- .crop-tool-btn:hover { background: var(--bg-hover); color: var(--text); }
1789
- .crop-tool-btn svg { width: 18px; height: 18px; }
1790
-
1791
- /* Crop dialog progress */
1792
- .crop-progress {
1793
- width: 120px;
1794
- height: 4px;
1795
- background: var(--bg-hover);
1796
- border-radius: 2px;
1797
- overflow: hidden;
1798
- }
1799
- .crop-progress-bar {
1800
- width: 30%;
1801
- height: 100%;
1802
- background: var(--blue);
1803
- border-radius: 2px;
1804
- animation: cropProgress 1.5s ease infinite;
1805
- }
1806
- @keyframes cropProgress {
1807
- 0% { width: 10%; margin-left: 0; }
1808
- 50% { width: 40%; margin-left: 30%; }
1809
- 100% { width: 10%; margin-left: 90%; }
1810
- }
1811
-
1812
- /* cropperjs dark theme overrides */
1813
- .cropper-view-box { outline-color: var(--blue) !important; }
1814
- .cropper-line { background-color: var(--blue) !important; }
1815
- .cropper-point { background-color: var(--blue) !important; width: 8px !important; height: 8px !important; }
1816
- .cropper-modal { background-color: rgba(0,0,0,0.6) !important; }
1817
- .cropper-dashed { border-color: rgba(255,255,255,0.3) !important; }
1818
-
1819
- /* ─── Branding: Mobile responsive ──────────────────── */
1820
- @media (max-width: 768px) {
1821
- .br-two-col { grid-template-columns: 1fr; gap: 16px; }
1822
- .logo-grid { grid-template-columns: repeat(2, 1fr); }
1823
- .br-save-bar { padding: 12px 16px; }
1824
- .br-save-bar-inner { flex-direction: column; gap: 12px; text-align: center; }
1825
- .br-save-actions { justify-content: center; }
1826
- .tab-panel { padding: 20px 16px; }
1827
- .accent-grid { grid-template-columns: repeat(3, 1fr); }
1828
- .br-panel > div[style*="grid-template-columns: 1fr 1fr"] { grid-template-columns: 1fr !important; }
1829
- }
1830
- @media (max-width: 480px) {
1831
- .logo-grid { grid-template-columns: 1fr; }
1832
- .accent-grid { grid-template-columns: repeat(2, 1fr); }
1833
- }
1834
-
1835
- /* ─── Appearance tab: Color input ───────────────────── */
1836
- .color-input {
1837
- width: 40px;
1838
- height: 28px;
1839
- padding: 0;
1840
- border: 1px solid var(--border-strong);
1841
- border-radius: 4px;
1842
- cursor: pointer;
1843
- background: none;
1844
- }
1845
-
1846
- /* ─── Auto theme: follow system preference ───────────────────────── */
1847
- @media (prefers-color-scheme: light) {
1848
- [data-theme="auto"] {
1849
- --bg-root: #f8f9fa;
1850
- --bg-surface: #ffffff;
1851
- --bg-card: #ffffff;
1852
- --bg-elevated: #f0f1f3;
1853
- --bg-hover: #e9eaec;
1854
- --bg-active: #dddee1;
1855
- --bg-input: rgba(0,0,0,0.04);
1856
- --border: rgba(0,0,0,0.10);
1857
- --border-subtle: rgba(0,0,0,0.06);
1858
- --border-strong: rgba(0,0,0,0.15);
1859
- --border-focus: rgba(0,0,0,0.25);
1860
- --text: #1a1a1a;
1861
- --text-secondary: #6b7280;
1862
- --text-tertiary: #9ca3af;
1863
- --text-placeholder: #c0c5ce;
1864
- --text-white: #1a1a1a;
1865
- --shadow-sm: 0 1px 3px rgba(0,0,0,0.08), 0 1px 2px -1px rgba(0,0,0,0.06);
1866
- --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06);
1867
- --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.12), 0 4px 6px -4px rgba(0,0,0,0.08);
1868
- --shadow-focus: 0 0 0 1px rgba(0,0,0,0.08), 0 0 0 3px rgba(108,71,255,0.2);
1869
- color-scheme: light;
1870
- }
1871
- }
1872
-
1873
- /* ─── Skeleton loading ──────────────────────────────────────────────── */
1874
- @keyframes shimmer {
1875
- 0% { background-position: 200% 0; }
1876
- 100% { background-position: -200% 0; }
1877
- }
1878
- .skel {
1879
- display: block;
1880
- background: linear-gradient(90deg, var(--bg-hover) 25%, var(--bg-active, rgba(255,255,255,0.06)) 50%, var(--bg-hover) 75%);
1881
- background-size: 200% 100%;
1882
- animation: shimmer 1.4s infinite;
1883
- border-radius: 4px;
1884
- }
1885
- .skel-circle { border-radius: 50%; }
1886
- .skel-row td { padding: 12px 16px; }
1887
-
1888
- /* ─── Responsive: column visibility helpers ─────────────────────────── */
1889
- /* col-hide-lg: hide on tablet (≤900px) */
1890
- @media (max-width: 900px) {
1891
- .col-hide-lg { display: none; }
1892
- }
1893
- /* col-hide-md: hide on small tablet (≤768px) */
1894
- @media (max-width: 768px) {
1895
- .col-hide-md { display: none; }
1896
- }
1897
- /* col-hide-sm: hide on mobile (≤640px) */
1898
- @media (max-width: 640px) {
1899
- .col-hide-sm { display: none; }
1900
- }
1901
-
1902
- /* ─── Mobile sidebar drawer ──────────────────────────────────────────── */
1903
- .sidebar-toggle { display: none; }
1904
- .sidebar-overlay {
1905
- display: none;
1906
- position: fixed;
1907
- inset: 0;
1908
- background: rgba(0,0,0,0.5);
1909
- z-index: 200;
1910
- opacity: 0;
1911
- transition: opacity 0.25s ease;
1912
- }
1913
- .sidebar-overlay-visible {
1914
- display: block;
1915
- opacity: 1;
1916
- }
1917
- .sidebar {
1918
- display: none;
1919
- position: fixed;
1920
- top: 0;
1921
- left: 0;
1922
- bottom: 0;
1923
- width: 280px;
1924
- max-width: 80vw;
1925
- background: var(--bg-surface);
1926
- border-right: 1px solid var(--border);
1927
- z-index: 210;
1928
- transform: translateX(-100%);
1929
- transition: transform 0.25s ease;
1930
- overflow-y: auto;
1931
- -webkit-overflow-scrolling: touch;
1932
- }
1933
- .sidebar-open { transform: translateX(0); }
1934
- .sidebar-header {
1935
- display: flex;
1936
- align-items: center;
1937
- justify-content: space-between;
1938
- padding: 12px 16px;
1939
- border-bottom: 1px solid var(--border);
1940
- }
1941
- .sidebar-header h2 {
1942
- font-size: 15px;
1943
- font-weight: 600;
1944
- color: var(--text-white);
1945
- margin: 0;
1946
- }
1947
- .sidebar-nav {
1948
- padding: 8px;
1949
- display: flex;
1950
- flex-direction: column;
1951
- gap: 2px;
1952
- }
1953
- .sidebar-item {
1954
- display: flex;
1955
- align-items: center;
1956
- gap: 12px;
1957
- padding: 10px 12px;
1958
- border: none;
1959
- background: transparent;
1960
- border-radius: var(--radius-sm);
1961
- font-size: 14px;
1962
- font-weight: 500;
1963
- color: var(--text-secondary);
1964
- cursor: pointer;
1965
- transition: background 0.15s, color 0.15s;
1966
- text-align: left;
1967
- width: 100%;
1968
- -webkit-tap-highlight-color: transparent;
1969
- }
1970
- .sidebar-item:hover { background: var(--bg-hover); color: var(--text); }
1971
- .sidebar-item:active { background: var(--bg-active); }
1972
- .sidebar-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--text-tertiary); transition: color 0.15s; }
1973
- .sidebar-item:hover svg { color: var(--text-secondary); }
1974
- .sidebar-item-active {
1975
- background: var(--bg-hover);
1976
- color: var(--text-white);
1977
- }
1978
- .sidebar-item-active svg { color: var(--text-white); }
1979
-
1980
- /* ─── Responsive: show sidebar toggle, hide tabs on mobile ──────────── */
1981
- @media (max-width: 640px) {
1982
- .sidebar-toggle { display: flex; }
1983
- .sidebar { display: block; }
1984
- .tabs { display: none; }
1985
- }
1986
-
1987
- /* ─── Responsive: toolbar / filter bar ──────────────────────────────── */
1988
- @media (max-width: 640px) {
1989
- .tab-toolbar {
1990
- flex-wrap: wrap;
1991
- gap: 6px;
1992
- }
1993
- .search-wrapper {
1994
- width: 100%;
1995
- min-width: 0;
1996
- }
1997
- .tab-toolbar .select {
1998
- flex: 1;
1999
- min-width: 0;
2000
- font-size: 12px;
2001
- padding: 0 8px;
2002
- height: 34px;
2003
- }
2004
- .tab-toolbar .btn-sm {
2005
- font-size: 12px;
2006
- padding: 0 10px;
2007
- height: 34px;
2008
- }
2009
- }
2010
-
2011
- /* ─── Responsive: header ────────────────────────────────────────────── */
2012
- @media (max-width: 640px) {
2013
- .admin-header-left {
2014
- gap: 6px;
2015
- min-width: 0;
2016
- overflow: hidden;
2017
- }
2018
- .admin-header-left a {
2019
- max-width: 80px;
2020
- overflow: hidden;
2021
- text-overflow: ellipsis;
2022
- white-space: nowrap;
2023
- flex-shrink: 1;
2024
- }
2025
- .admin-header h1 {
2026
- font-size: 13px;
2027
- white-space: nowrap;
2028
- overflow: hidden;
2029
- text-overflow: ellipsis;
2030
- }
2031
- .header-dot { display: none; }
2032
- }
2033
-
2034
- /* ─── Responsive: table compact ─────────────────────────────────────── */
2035
- @media (max-width: 640px) {
2036
- .table th, .table td {
2037
- padding: 10px 8px;
2038
- font-size: 13px;
2039
- }
2040
- .table th {
2041
- font-size: 10px;
2042
- }
2043
- .member-identity {
2044
- gap: 8px;
2045
- }
2046
- .member-name {
2047
- font-size: 13px;
2048
- max-width: 120px;
2049
- }
2050
- .member-email {
2051
- font-size: 11px;
2052
- max-width: 100px;
2053
- }
2054
- .action-cell { width: 32px; }
2055
- }
2056
-
2057
- /* ─── Responsive: pagination ────────────────────────────────────────── */
2058
- @media (max-width: 640px) {
2059
- .pagination {
2060
- flex-direction: column;
2061
- gap: 8px;
2062
- align-items: center;
2063
- font-size: 12px;
2064
- }
2065
- .pagination-info {
2066
- font-size: 12px;
2067
- }
2068
- .page-btn {
2069
- min-width: 28px;
2070
- height: 28px;
2071
- font-size: 12px;
2072
- }
2073
- }
2074
-
2075
- /* ─── Responsive: section titles ────────────────────────────────────── */
2076
- @media (max-width: 640px) {
2077
- .section-title { font-size: 17px; }
2078
- .section-desc { font-size: 13px; margin-bottom: 20px; padding-bottom: 16px; }
2079
- }
2080
-
2081
- /* ─── Responsive: settings card ─────────────────────────────────────── */
2082
- @media (max-width: 640px) {
2083
- .settings-card { border-radius: var(--radius-sm); }
2084
- .settings-card-header {
2085
- gap: 8px;
2086
- padding: 12px 14px;
2087
- }
2088
- .settings-card-header-desc { text-align: left; }
2089
- .settings-row {
2090
- gap: 6px;
2091
- padding: 12px 14px;
2092
- }
2093
- .settings-row.settings-row-stack {
2094
- flex-direction: column;
2095
- align-items: flex-start;
2096
- }
2097
- }
2098
-
2099
- /* ─── Responsive: table horizontal scroll on very small screens ─── */
2100
- @media (max-width: 480px) {
2101
- .settings-card {
2102
- overflow-x: auto;
2103
- -webkit-overflow-scrolling: touch;
2104
- }
2105
- .settings-card .table {
2106
- min-width: 360px;
2107
- }
2108
- }
2109
-
2110
- /* ─── Settings: OAuth card grid ─────────────────────────────── */
2111
- .st-oauth-grid {
2112
- display: flex;
2113
- flex-wrap: wrap;
2114
- gap: 8px;
2115
- padding: 8px 20px 16px;
2116
- }
2117
- .st-oauth-card {
2118
- display: flex;
2119
- align-items: center;
2120
- gap: 8px;
2121
- padding: 8px 14px;
2122
- border: 1px solid var(--border);
2123
- border-radius: var(--radius-md);
2124
- cursor: pointer;
2125
- transition: border-color 0.15s, background 0.15s;
2126
- min-width: 110px;
2127
- }
2128
- .st-oauth-card:hover {
2129
- border-color: var(--border-strong);
2130
- background: var(--bg-hover);
2131
- }
2132
- .st-oauth-card-icon {
2133
- display: inline-flex;
2134
- width: 20px;
2135
- height: 20px;
2136
- flex-shrink: 0;
2137
- }
2138
- .st-oauth-card-name {
2139
- font-size: 13px;
2140
- font-weight: 500;
2141
- color: var(--text);
2142
- }
2143
- .st-oauth-dot {
2144
- width: 7px;
2145
- height: 7px;
2146
- border-radius: 50%;
2147
- flex-shrink: 0;
2148
- margin-left: auto;
2149
- }
2150
- .st-oauth-dot-on { background: var(--green-text); }
2151
- .st-oauth-dot-off { background: var(--text-tertiary); }
2152
-
2153
- /* ─── Settings: dual panel (login methods + email) ──────────── */
2154
- .st-dual-panel {
2155
- display: flex;
2156
- gap: 16px;
2157
- }
2158
- @media (max-width: 640px) {
2159
- .st-dual-panel {
2160
- flex-direction: column;
2161
- }
2162
- }
2163
-
2164
- /* ─── Settings: email hint ─────────────────────────────────── */
2165
- .st-hint {
2166
- font-size: 11px;
2167
- color: var(--yellow-text, #92400e);
2168
- font-weight: 400;
2169
- margin-left: 4px;
2170
- }
2171
-
2172
- /* ─── Federation ──────────────────────────────────────────── */
2173
- .fed-status-badge {
2174
- display: inline-flex;
2175
- align-items: center;
2176
- gap: 4px;
2177
- font-size: 12px;
2178
- font-weight: 500;
2179
- padding: 2px 8px;
2180
- border-radius: var(--radius-full);
2181
- }
2182
- .fed-status-badge.master {
2183
- background: var(--blue-light);
2184
- color: var(--blue-muted);
2185
- }
2186
- .fed-status-badge.member {
2187
- background: var(--green-light);
2188
- color: var(--green-text);
2189
- }
2190
- .fed-star {
2191
- color: var(--yellow);
2192
- font-size: 14px;
2193
- }
2194
- .fed-site-row {
2195
- display: flex;
2196
- align-items: center;
2197
- gap: 12px;
2198
- padding: 10px 20px;
2199
- border-bottom: 1px solid var(--border);
2200
- }
2201
- .fed-site-row:last-child { border-bottom: none; }
2202
- .fed-site-row { flex-wrap: wrap; }
2203
- .fed-site-name { flex: 1 1 0%; min-width: 120px; font-weight: 500; font-size: 14px; color: var(--text); display: flex; align-items: center; gap: 6px; overflow: hidden; flex-wrap: nowrap; }
2204
- .fed-site-name > span { flex-shrink: 0; }
2205
- .fed-site-name > span.fed-site-label { flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2206
- .fed-site-url { flex: 0 0 500px; min-width: 0; font-size: 13px; color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2207
- .fed-site-url a { color: var(--text-secondary); text-decoration: none; }
2208
- .fed-site-url a:hover { color: var(--blue); text-decoration: underline; }
2209
- .fed-site-role { width: 80px; font-size: 12px; color: var(--text-tertiary); }
2210
- .fed-site-actions { display: flex; align-items: center; gap: 6px; justify-content: flex-end; min-width: 64px; flex-shrink: 0; }
2211
- @media (max-width: 768px) {
2212
- .fed-site-row { flex-wrap: wrap; }
2213
- .fed-site-name { flex: 1 1 100%; }
2214
- .fed-site-url { flex: 1 1 auto; }
2215
- }
2216
- .fed-delegation-status { display: flex; align-items: center; gap: 8px; padding: 12px 20px; font-size: 13px; color: var(--text-secondary); }
2217
- .fed-delegation-status .checkmark { color: var(--green); font-weight: 600; }
2218
- .fed-init-buttons { display: flex; gap: 12px; justify-content: center; padding: 8px 20px 16px; }
2219
- .fed-init-buttons .btn { width: auto; min-width: 160px; }