@arcblock/did-connect-service 4.1.34 → 4.1.36

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 (69) hide show
  1. package/dist/blocklet-service.d.ts +8 -1
  2. package/dist/blocklet-service.d.ts.map +1 -1
  3. package/dist/blocklet-service.js +6 -1
  4. package/dist/blocklet-service.js.map +1 -1
  5. package/dist/handlers/auth-handler.d.ts +7 -0
  6. package/dist/handlers/auth-handler.d.ts.map +1 -1
  7. package/dist/handlers/auth-handler.js +7 -2
  8. package/dist/handlers/auth-handler.js.map +1 -1
  9. package/dist/handlers/avatar-handler.d.ts.map +1 -1
  10. package/dist/handlers/avatar-handler.js +10 -1
  11. package/dist/handlers/avatar-handler.js.map +1 -1
  12. package/dist/handlers/did-connect-handler.d.ts +2 -0
  13. package/dist/handlers/did-connect-handler.d.ts.map +1 -1
  14. package/dist/handlers/did-connect-handler.js +2 -2
  15. package/dist/handlers/did-connect-handler.js.map +1 -1
  16. package/dist/handlers/email-login-handler.d.ts +2 -0
  17. package/dist/handlers/email-login-handler.d.ts.map +1 -1
  18. package/dist/handlers/email-login-handler.js +2 -2
  19. package/dist/handlers/email-login-handler.js.map +1 -1
  20. package/dist/handlers/oauth-handler.d.ts +2 -0
  21. package/dist/handlers/oauth-handler.d.ts.map +1 -1
  22. package/dist/handlers/oauth-handler.js +3 -4
  23. package/dist/handlers/oauth-handler.js.map +1 -1
  24. package/dist/handlers/passkey-handler.d.ts +1 -0
  25. package/dist/handlers/passkey-handler.d.ts.map +1 -1
  26. package/dist/handlers/passkey-handler.js +5 -4
  27. package/dist/handlers/passkey-handler.js.map +1 -1
  28. package/dist/handlers/ticket-handler.d.ts +2 -0
  29. package/dist/handlers/ticket-handler.d.ts.map +1 -1
  30. package/dist/handlers/ticket-handler.js +2 -2
  31. package/dist/handlers/ticket-handler.js.map +1 -1
  32. package/dist/identity/session-cookie.d.ts +11 -0
  33. package/dist/identity/session-cookie.d.ts.map +1 -0
  34. package/dist/identity/session-cookie.js +17 -0
  35. package/dist/identity/session-cookie.js.map +1 -0
  36. package/dist/types.d.ts +6 -0
  37. package/dist/types.d.ts.map +1 -1
  38. package/package.json +3 -3
  39. package/dist/assets/admin-core.16704b2e.js +0 -2065
  40. package/dist/assets/admin-core.1fc3260c.js +0 -1623
  41. package/dist/assets/admin-core.5a2d69b0.js +0 -2067
  42. package/dist/assets/admin-core.667d2962.js +0 -2094
  43. package/dist/assets/admin-core.880e42df.js +0 -2090
  44. package/dist/assets/admin-core.9fff6042.js +0 -2083
  45. package/dist/assets/admin-core.a13c2729.js +0 -1461
  46. package/dist/assets/admin-core.a63bbc69.js +0 -1464
  47. package/dist/assets/admin-core.c0b5af61.js +0 -1393
  48. package/dist/assets/admin-core.cbbdbe6d.js +0 -1465
  49. package/dist/assets/admin-core.e83fd379.js +0 -1397
  50. package/dist/assets/admin-extra.143b5774.js +0 -2543
  51. package/dist/assets/admin-extra.35b91f98.js +0 -2543
  52. package/dist/assets/admin-extra.531b187f.js +0 -2552
  53. package/dist/assets/admin-extra.5b309e5e.js +0 -2547
  54. package/dist/assets/admin-extra.7ca9c16b.js +0 -2529
  55. package/dist/assets/admin-extra.8243c7f4.js +0 -2562
  56. package/dist/assets/admin-extra.841b2bbe.js +0 -2530
  57. package/dist/assets/admin-extra.afcb3651.js +0 -2528
  58. package/dist/assets/admin-extra.d12f05bb.js +0 -2553
  59. package/dist/assets/admin.21a6c77e.css +0 -2324
  60. package/dist/assets/admin.7c5d5f04.css +0 -2312
  61. package/dist/assets/admin.c26bb17a.css +0 -2219
  62. package/dist/assets/admin.dfeedbe4.css +0 -2229
  63. package/dist/assets/login.0bf3d739.js +0 -720
  64. package/dist/assets/login.4404e695.js +0 -720
  65. package/dist/assets/login.76c483c2.js +0 -720
  66. package/dist/assets/login.bb9f8b03.js +0 -720
  67. package/dist/assets/login.d3f05790.js +0 -720
  68. package/dist/assets/login.fa25f37a.js +0 -720
  69. package/dist/assets/login.fb0bf7b4.js +0 -720
@@ -1,2312 +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
- max-height: calc(100vh - 32px);
1161
- max-height: calc(100dvh - 32px);
1162
- overflow: hidden;
1163
- animation: modalIn 0.2s ease;
1164
- }
1165
- dialog[open] {
1166
- display: flex;
1167
- flex-direction: column;
1168
- }
1169
- dialog::backdrop { background: rgba(0,0,0,0.7); }
1170
- .dialog-content {
1171
- min-height: 0;
1172
- overflow-y: auto;
1173
- overscroll-behavior: contain;
1174
- padding: 24px;
1175
- }
1176
- .dialog-content h3 {
1177
- font-size: 16px;
1178
- font-weight: 600;
1179
- color: var(--text-white);
1180
- margin-bottom: 4px;
1181
- letter-spacing: -0.01em;
1182
- }
1183
- .dialog-desc {
1184
- font-size: 14px;
1185
- color: var(--text-secondary);
1186
- margin-bottom: 20px;
1187
- line-height: 1.5;
1188
- }
1189
- .dialog-actions {
1190
- display: flex;
1191
- flex: 0 0 auto;
1192
- justify-content: flex-end;
1193
- gap: 8px;
1194
- padding: 16px 24px;
1195
- border-top: 1px solid var(--border);
1196
- }
1197
- .dialog-actions .btn { width: auto; }
1198
-
1199
- dialog.merge-confirm-dialog { max-width: 560px; }
1200
- .merge-method-list { display: grid; gap: 10px; margin-top: 16px; }
1201
- .merge-method-list .btn,
1202
- .merge-method-btn {
1203
- width: 100%;
1204
- justify-content: flex-start;
1205
- }
1206
- .merge-method-btn .ca-chip-icon,
1207
- .merge-method-btn svg {
1208
- width: 18px;
1209
- height: 18px;
1210
- flex-shrink: 0;
1211
- }
1212
- .ca-merge-prompt {
1213
- margin: 0 20px 12px;
1214
- padding: 12px 14px;
1215
- border: 1px solid var(--border-strong);
1216
- border-radius: var(--radius-sm);
1217
- background: var(--blue-light);
1218
- }
1219
- .ca-merge-prompt-title {
1220
- font-size: 14px;
1221
- font-weight: 600;
1222
- color: var(--text-white);
1223
- margin: 0 0 4px;
1224
- }
1225
- .ca-merge-prompt-body {
1226
- font-size: 13px;
1227
- color: var(--text-secondary);
1228
- line-height: 1.45;
1229
- margin: 0 0 10px;
1230
- }
1231
- .ca-merge-prompt-actions {
1232
- display: flex;
1233
- flex-wrap: wrap;
1234
- gap: 8px;
1235
- }
1236
- .ca-merge-prompt .btn { width: auto; min-width: 96px; }
1237
- .merge-email-fields { display: grid; gap: 10px; margin-top: 12px; text-align: left; }
1238
- .merge-confirm-section { margin: 14px 0 0; }
1239
- .merge-confirm-section h4 {
1240
- font-size: 12px;
1241
- font-weight: 600;
1242
- color: var(--text-white);
1243
- margin: 0 0 6px;
1244
- }
1245
- .merge-confirm-list {
1246
- margin: 0;
1247
- padding-left: 18px;
1248
- font-size: 13px;
1249
- color: var(--text);
1250
- line-height: 1.55;
1251
- }
1252
- .merge-confirm-note {
1253
- font-size: 13px;
1254
- color: var(--text);
1255
- line-height: 1.55;
1256
- margin: 0;
1257
- }
1258
- .merge-confirm-did {
1259
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1260
- font-size: 12px;
1261
- word-break: break-all;
1262
- }
1263
- .merge-confirm-keep-other {
1264
- font-size: 13px;
1265
- color: var(--text-secondary);
1266
- margin: 0 0 4px;
1267
- line-height: 1.5;
1268
- }
1269
- .merge-confirm-irreversible {
1270
- color: var(--red-text);
1271
- font-weight: 600;
1272
- font-size: 13px;
1273
- margin: 16px 0 0;
1274
- }
1275
- .merge-confirm-too-large {
1276
- color: var(--red-text);
1277
- font-size: 13px;
1278
- margin: 8px 0 0;
1279
- line-height: 1.5;
1280
- }
1281
-
1282
- /* ─── Wallet bind QR (mirrors login-page .qr-view) ──────────────── */
1283
- .wallet-qr-view {
1284
- margin: 16px auto;
1285
- display: flex;
1286
- justify-content: center;
1287
- min-height: 212px;
1288
- align-items: center;
1289
- }
1290
- .wallet-qr-placeholder {
1291
- width: 212px;
1292
- height: 212px;
1293
- display: flex;
1294
- align-items: center;
1295
- justify-content: center;
1296
- border: 1px solid var(--border-subtle);
1297
- border-radius: var(--radius);
1298
- background: var(--bg-elevated);
1299
- }
1300
- .wallet-qr-spinner {
1301
- display: inline-block;
1302
- width: 32px; height: 32px;
1303
- border: 3px solid var(--border-strong);
1304
- border-top-color: var(--blue-muted);
1305
- border-radius: 50%;
1306
- animation: spin 0.6s linear infinite;
1307
- }
1308
- @keyframes spin { to { transform: rotate(360deg); } }
1309
- .wallet-deep-link-btn {
1310
- margin-top: 4px;
1311
- width: 212px;
1312
- }
1313
- .wallet-bind-status {
1314
- margin-top: 12px;
1315
- font-size: 13px;
1316
- min-height: 18px;
1317
- color: var(--text-secondary);
1318
- margin-bottom: 0;
1319
- }
1320
- .wallet-bind-error {
1321
- color: var(--red-text);
1322
- padding: 10px 12px;
1323
- background: rgba(220,53,69,0.08);
1324
- border: 1px solid rgba(220,53,69,0.25);
1325
- border-radius: var(--radius-sm);
1326
- margin-top: 8px;
1327
- }
1328
-
1329
- @keyframes modalIn {
1330
- from { opacity: 0; transform: scale(0.98); }
1331
- to { opacity: 1; transform: scale(1); }
1332
- }
1333
-
1334
- /* ─── Action menus ───────────────────────────────────────────────── */
1335
- .action-trigger {
1336
- width: 28px;
1337
- height: 28px;
1338
- display: flex;
1339
- align-items: center;
1340
- justify-content: center;
1341
- border-radius: var(--radius-sm);
1342
- border: none;
1343
- background: transparent;
1344
- color: var(--text-tertiary);
1345
- cursor: pointer;
1346
- font-size: 16px;
1347
- transition: background-color 0.15s ease, color 0.15s ease;
1348
- flex-shrink: 0;
1349
- }
1350
- .action-trigger:hover { background: var(--bg-hover); color: var(--text-secondary); }
1351
- .action-menu {
1352
- display: none;
1353
- position: absolute;
1354
- right: 8px;
1355
- top: 100%;
1356
- z-index: 50;
1357
- min-width: 180px;
1358
- padding: 4px;
1359
- background: var(--bg-elevated);
1360
- border: 1px solid var(--border-strong);
1361
- border-radius: var(--radius);
1362
- box-shadow: var(--shadow-md);
1363
- }
1364
- .action-menu.open { display: block; }
1365
- .action-menu-item {
1366
- display: flex;
1367
- align-items: center;
1368
- gap: 8px;
1369
- padding: 6px 8px;
1370
- border-radius: var(--radius-xs);
1371
- font-size: 13px;
1372
- color: var(--text);
1373
- cursor: pointer;
1374
- border: none;
1375
- background: none;
1376
- width: 100%;
1377
- text-align: left;
1378
- transition: background-color 0.1s ease;
1379
- }
1380
- .action-menu-item:hover { background: var(--bg-hover); }
1381
- .action-menu-item.danger { color: var(--red-text); }
1382
- .action-menu-item.danger:hover { background: var(--red-light); }
1383
- .action-menu-sep {
1384
- height: 1px;
1385
- background: var(--border);
1386
- margin: 4px 0;
1387
- }
1388
-
1389
- /* ─── Status badges ──────────────────────────────────────────────── */
1390
- .badge-active { background: var(--green-light); color: var(--green-text); }
1391
- .badge-pending { background: var(--yellow-light); color: var(--yellow-text); }
1392
- .badge-blocked { background: var(--red-light); color: var(--red-text); }
1393
- .badge-expired { background: rgba(255,255,255,0.06); color: var(--text-tertiary); }
1394
- .badge-neutral { background: rgba(255,255,255,0.06); color: var(--text-secondary); }
1395
-
1396
- /* ─── Toast ──────────────────────────────────────────────────────── */
1397
- .toast-container {
1398
- position: fixed;
1399
- bottom: 24px;
1400
- right: 24px;
1401
- z-index: 100;
1402
- display: flex;
1403
- flex-direction: column;
1404
- gap: 8px;
1405
- }
1406
- .toast {
1407
- padding: 10px 16px;
1408
- border-radius: var(--radius);
1409
- font-size: 13px;
1410
- font-weight: 500;
1411
- color: var(--text);
1412
- background: var(--bg-elevated);
1413
- border: 1px solid var(--border-strong);
1414
- box-shadow: var(--shadow-md);
1415
- animation: toastIn 0.2s ease;
1416
- }
1417
- .toast.success { border-left: 3px solid var(--green); }
1418
- .toast.error { background: var(--red); color: #fff; border-color: var(--red); }
1419
- @keyframes toastIn {
1420
- from { opacity: 0; transform: translateY(8px); }
1421
- to { opacity: 1; transform: translateY(0); }
1422
- }
1423
-
1424
- /* ─── Toggle switch ────────────────────────────────────────────── */
1425
- .toggle-switch {
1426
- position: relative;
1427
- display: inline-block;
1428
- width: 40px;
1429
- height: 22px;
1430
- cursor: pointer;
1431
- }
1432
- .toggle-switch input { opacity: 0; width: 0; height: 0; position: absolute; }
1433
- .toggle-slider {
1434
- position: absolute;
1435
- inset: 0;
1436
- background: var(--bg-hover);
1437
- border-radius: 11px;
1438
- transition: background-color 0.2s ease;
1439
- }
1440
- .toggle-slider::before {
1441
- content: "";
1442
- position: absolute;
1443
- left: 2px;
1444
- top: 2px;
1445
- width: 18px;
1446
- height: 18px;
1447
- border-radius: 50%;
1448
- background: var(--text-secondary);
1449
- transition: transform 0.2s ease, background-color 0.2s ease;
1450
- }
1451
- .toggle-switch input:checked + .toggle-slider { background: var(--blue); }
1452
- .toggle-switch input:checked + .toggle-slider::before {
1453
- transform: translateX(18px);
1454
- background: #fff;
1455
- }
1456
-
1457
- /* ─── Range slider ─────────────────────────────────────────────── */
1458
- .range-slider {
1459
- -webkit-appearance: none;
1460
- width: 100%;
1461
- height: 6px;
1462
- border-radius: 3px;
1463
- background: var(--bg-hover);
1464
- outline: none;
1465
- margin: 8px 0;
1466
- }
1467
- .range-slider::-webkit-slider-thumb {
1468
- -webkit-appearance: none;
1469
- width: 18px;
1470
- height: 18px;
1471
- border-radius: 50%;
1472
- background: var(--blue);
1473
- cursor: pointer;
1474
- }
1475
- .range-slider::-moz-range-thumb {
1476
- width: 18px;
1477
- height: 18px;
1478
- border-radius: 50%;
1479
- background: var(--blue);
1480
- cursor: pointer;
1481
- border: none;
1482
- }
1483
-
1484
- /* ─── Branding: Section layout ─────────────────────── */
1485
- .br-section {
1486
- margin-bottom: 56px;
1487
- }
1488
- .br-section-header {
1489
- display: flex;
1490
- align-items: baseline;
1491
- justify-content: space-between;
1492
- margin-bottom: 20px;
1493
- }
1494
- .br-section-title {
1495
- font-size: 16px;
1496
- font-weight: 600;
1497
- color: var(--text);
1498
- letter-spacing: -0.01em;
1499
- }
1500
- .br-section-category {
1501
- font-size: 10px;
1502
- font-weight: 600;
1503
- color: var(--text-tertiary);
1504
- text-transform: uppercase;
1505
- letter-spacing: 0.08em;
1506
- }
1507
- .br-two-col {
1508
- display: grid;
1509
- grid-template-columns: 1fr 2fr;
1510
- gap: 32px;
1511
- }
1512
- .br-col-desc {
1513
- font-size: 13px;
1514
- color: var(--text-secondary);
1515
- line-height: 1.6;
1516
- }
1517
- .br-field-hint {
1518
- font-size: 11px;
1519
- color: var(--text-tertiary);
1520
- margin-top: 4px;
1521
- margin-bottom: 12px;
1522
- }
1523
- /* Info icon tooltip */
1524
- .info-tip {
1525
- position: relative;
1526
- display: inline-flex;
1527
- align-items: center;
1528
- justify-content: center;
1529
- width: 14px;
1530
- height: 14px;
1531
- border-radius: 50%;
1532
- background: rgba(255,255,255,0.08);
1533
- color: var(--text-tertiary);
1534
- font-size: 10px;
1535
- font-weight: 600;
1536
- cursor: help;
1537
- flex-shrink: 0;
1538
- }
1539
- .info-tip::after {
1540
- content: attr(data-tip);
1541
- position: absolute;
1542
- bottom: calc(100% + 8px);
1543
- left: 50%;
1544
- transform: translateX(-50%);
1545
- background: var(--bg-card);
1546
- border: 1px solid var(--border-strong);
1547
- color: var(--text-secondary);
1548
- font-size: 12px;
1549
- font-weight: 400;
1550
- padding: 8px 14px;
1551
- border-radius: var(--radius);
1552
- opacity: 0;
1553
- pointer-events: none;
1554
- transition: opacity 0.15s ease;
1555
- z-index: 10;
1556
- box-shadow: var(--shadow-md);
1557
- min-width: 220px;
1558
- max-width: 360px;
1559
- white-space: normal;
1560
- line-height: 1.5;
1561
- text-align: left;
1562
- }
1563
- .info-tip:hover::after { opacity: 1; }
1564
- .br-panel {
1565
- background: var(--bg-elevated);
1566
- border: 1px solid var(--border-subtle);
1567
- border-radius: var(--radius-lg);
1568
- padding: 20px 24px;
1569
- }
1570
- .accent-dot {
1571
- width: 28px;
1572
- height: 28px;
1573
- border-radius: 50%;
1574
- cursor: pointer;
1575
- border: 2px solid transparent;
1576
- transition: transform 0.1s ease, border-color 0.15s ease;
1577
- }
1578
- .accent-dot:hover { transform: scale(1.15); }
1579
- .accent-dot.selected { border-color: var(--text-white); }
1580
-
1581
- /* ─── Branding: Language toggles ──────────────────── */
1582
- .lang-toggles {
1583
- display: flex;
1584
- flex-wrap: wrap;
1585
- gap: 8px;
1586
- align-items: center;
1587
- }
1588
- .lang-toggle {
1589
- position: relative;
1590
- display: flex;
1591
- align-items: center;
1592
- gap: 8px;
1593
- padding: 10px 20px;
1594
- background: var(--bg-elevated);
1595
- border: 1px solid var(--border-subtle);
1596
- border-radius: var(--radius);
1597
- font-size: 13px;
1598
- font-weight: 500;
1599
- color: var(--text-secondary);
1600
- cursor: pointer;
1601
- transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
1602
- }
1603
- .lang-toggle:hover { border-color: var(--border-strong); color: var(--text); }
1604
- .lang-toggle.active {
1605
- border-color: var(--border-strong);
1606
- color: var(--text-white);
1607
- background: rgba(255,255,255,0.04);
1608
- }
1609
- .lang-toggle.active::after {
1610
- content: "✓";
1611
- position: absolute;
1612
- top: -1px;
1613
- right: -1px;
1614
- width: 16px;
1615
- height: 16px;
1616
- background: var(--blue);
1617
- border-radius: 0 var(--radius) 0 var(--radius);
1618
- display: flex;
1619
- align-items: center;
1620
- justify-content: center;
1621
- font-size: 10px;
1622
- font-weight: 700;
1623
- color: #fff;
1624
- line-height: 1;
1625
- }
1626
-
1627
- /* ─── Branding: Logo grid (redesigned) ───────────── */
1628
- .logo-grid {
1629
- display: grid;
1630
- grid-template-columns: repeat(4, 1fr);
1631
- gap: 16px;
1632
- }
1633
- .logo-item {
1634
- position: relative;
1635
- background: var(--bg-elevated);
1636
- border: 1px solid var(--border-subtle);
1637
- border-radius: var(--radius-lg);
1638
- overflow: hidden;
1639
- display: flex;
1640
- flex-direction: column;
1641
- padding: 16px;
1642
- transition: border-color 0.15s ease;
1643
- min-height: 170px;
1644
- }
1645
- .logo-item:hover { border-color: rgba(255,255,255,0.15); }
1646
- .logo-item-header {
1647
- display: flex;
1648
- justify-content: space-between;
1649
- align-items: flex-start;
1650
- margin-bottom: auto;
1651
- }
1652
- .logo-item-icon {
1653
- color: var(--text-tertiary);
1654
- font-size: 20px;
1655
- line-height: 1;
1656
- }
1657
- .logo-item-spec {
1658
- font-size: 10px;
1659
- font-weight: 600;
1660
- color: var(--text-tertiary);
1661
- text-transform: uppercase;
1662
- letter-spacing: 0.03em;
1663
- }
1664
- .logo-preview {
1665
- width: 100%;
1666
- flex: 1;
1667
- display: flex;
1668
- align-items: center;
1669
- justify-content: center;
1670
- overflow: hidden;
1671
- }
1672
- .logo-preview img {
1673
- max-width: 100%;
1674
- max-height: 80px;
1675
- object-fit: contain;
1676
- }
1677
- .logo-item-footer {
1678
- margin-top: 12px;
1679
- }
1680
- .logo-name {
1681
- font-size: 14px;
1682
- font-weight: 600;
1683
- color: var(--text-white);
1684
- margin-bottom: 2px;
1685
- }
1686
- .logo-subtitle {
1687
- font-size: 12px;
1688
- color: var(--text-tertiary);
1689
- }
1690
- .logo-placeholder {
1691
- font-size: 24px;
1692
- color: var(--text-tertiary);
1693
- opacity: 0.3;
1694
- }
1695
- /* Hover overlay for upload — glassmorphism */
1696
- .logo-hover-upload {
1697
- position: absolute;
1698
- inset: 0;
1699
- background: rgba(20,20,30,0.65);
1700
- backdrop-filter: blur(8px);
1701
- -webkit-backdrop-filter: blur(8px);
1702
- display: flex;
1703
- flex-direction: column;
1704
- align-items: center;
1705
- justify-content: center;
1706
- gap: 6px;
1707
- opacity: 0;
1708
- transition: opacity 0.2s ease;
1709
- cursor: pointer;
1710
- border-radius: inherit;
1711
- }
1712
- .logo-item:hover .logo-hover-upload { opacity: 1; }
1713
- .logo-hover-icon {
1714
- width: 36px;
1715
- height: 36px;
1716
- border-radius: 50%;
1717
- background: rgba(255,255,255,0.1);
1718
- display: flex;
1719
- align-items: center;
1720
- justify-content: center;
1721
- color: var(--text-white);
1722
- margin-bottom: 2px;
1723
- }
1724
- .logo-hover-icon svg { width: 18px; height: 18px; }
1725
- .logo-hover-text {
1726
- font-size: 12px;
1727
- font-weight: 500;
1728
- color: var(--text-secondary);
1729
- letter-spacing: 0.02em;
1730
- }
1731
- /* Uploaded state: replace/discard shown on hover via overlay */
1732
- .logo-uploaded-overlay {
1733
- position: absolute;
1734
- inset: 0;
1735
- background: rgba(20,20,30,0.65);
1736
- backdrop-filter: blur(8px);
1737
- -webkit-backdrop-filter: blur(8px);
1738
- display: flex;
1739
- align-items: center;
1740
- justify-content: center;
1741
- gap: 12px;
1742
- opacity: 0;
1743
- transition: opacity 0.2s ease;
1744
- border-radius: inherit;
1745
- z-index: 2;
1746
- }
1747
- .logo-item:hover .logo-uploaded-overlay { opacity: 1; }
1748
- .logo-overlay-btn {
1749
- font-size: 12px;
1750
- font-weight: 600;
1751
- padding: 6px 14px;
1752
- border-radius: var(--radius-sm);
1753
- cursor: pointer;
1754
- border: 1px solid;
1755
- transition: background 0.15s ease;
1756
- }
1757
- .logo-overlay-btn-replace { color: var(--blue); border-color: var(--blue); background: transparent; }
1758
- .logo-overlay-btn-replace:hover { background: rgba(99,102,241,0.12); }
1759
- .logo-overlay-btn-discard { color: var(--red-text); border-color: rgba(224,46,46,0.4); background: transparent; }
1760
- .logo-overlay-btn-discard:hover { background: rgba(224,46,46,0.1); }
1761
- .btn-text { background: none; border: none; color: var(--blue); font-size: 11px; font-weight: 600; cursor: pointer; padding: 0; }
1762
- .btn-text:hover { text-decoration: underline; }
1763
- .btn-text-danger { color: var(--red-text); }
1764
-
1765
- /* ─── Branding: Sticky save bar ──────────────────── */
1766
- .br-save-bar {
1767
- position: fixed;
1768
- bottom: 0;
1769
- left: 0;
1770
- right: 0;
1771
- z-index: 40;
1772
- background: rgba(28,28,32,0.85);
1773
- backdrop-filter: blur(12px);
1774
- border-top: 1px solid var(--border-subtle);
1775
- padding: 16px 40px;
1776
- display: none;
1777
- }
1778
- .br-save-bar.visible { display: block; }
1779
- .br-save-bar-inner {
1780
- max-width: 1120px;
1781
- margin: 0 auto;
1782
- display: flex;
1783
- align-items: center;
1784
- justify-content: space-between;
1785
- width: 100%;
1786
- }
1787
- .br-save-hint {
1788
- font-size: 12px;
1789
- color: var(--text-tertiary);
1790
- display: flex;
1791
- align-items: center;
1792
- gap: 8px;
1793
- }
1794
- .br-save-actions {
1795
- display: flex;
1796
- gap: 8px;
1797
- }
1798
- .br-save-actions .btn { width: auto; }
1799
-
1800
- /* ─── Branding: Accent color swatches ────────────── */
1801
- .accent-grid {
1802
- display: grid;
1803
- grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
1804
- gap: 10px;
1805
- }
1806
- .accent-swatch {
1807
- position: relative;
1808
- height: 64px;
1809
- border-radius: var(--radius);
1810
- display: flex;
1811
- flex-direction: column;
1812
- justify-content: flex-end;
1813
- padding: 6px 8px;
1814
- cursor: pointer;
1815
- transition: transform 0.1s ease, box-shadow 0.15s ease;
1816
- border: 2px solid transparent;
1817
- }
1818
- .accent-swatch:hover { transform: scale(1.02); }
1819
- .accent-swatch.selected { border-color: var(--text-white); }
1820
- .accent-swatch .accent-check {
1821
- position: absolute;
1822
- top: 4px;
1823
- right: 4px;
1824
- width: 18px;
1825
- height: 18px;
1826
- border-radius: 50%;
1827
- background: rgba(0,0,0,0.5);
1828
- display: none;
1829
- align-items: center;
1830
- justify-content: center;
1831
- color: white;
1832
- font-size: 12px;
1833
- }
1834
- .accent-swatch.selected .accent-check { display: flex; }
1835
- .accent-label { font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; opacity: 0.8; }
1836
- .accent-hex { font-size: 10px; font-weight: 700; }
1837
-
1838
- /* ─── Branding tab: Language grid ───────────────────── */
1839
- .lang-grid {
1840
- display: grid;
1841
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1842
- gap: 4px 16px;
1843
- }
1844
- .lang-item {
1845
- display: flex;
1846
- align-items: center;
1847
- gap: 6px;
1848
- font-size: 13px;
1849
- padding: 4px 0;
1850
- cursor: pointer;
1851
- }
1852
-
1853
- /* ─── Crop dialog ──────────────────────────────────── */
1854
- dialog.dialog-wide { max-width: 660px; }
1855
- .crop-container {
1856
- width: 100%;
1857
- height: 400px;
1858
- background: var(--bg);
1859
- border-radius: var(--radius-sm);
1860
- overflow: hidden;
1861
- }
1862
- .crop-toolbar {
1863
- display: flex;
1864
- justify-content: center;
1865
- gap: 6px;
1866
- padding: 12px 0 4px;
1867
- }
1868
- .crop-tool-btn {
1869
- width: 36px;
1870
- height: 36px;
1871
- display: flex;
1872
- align-items: center;
1873
- justify-content: center;
1874
- background: var(--bg-input);
1875
- border: 1px solid var(--border-strong);
1876
- border-radius: var(--radius-sm);
1877
- color: var(--text-secondary);
1878
- cursor: pointer;
1879
- transition: background-color 0.15s ease, color 0.15s ease;
1880
- }
1881
- .crop-tool-btn:hover { background: var(--bg-hover); color: var(--text); }
1882
- .crop-tool-btn svg { width: 18px; height: 18px; }
1883
-
1884
- /* Crop dialog progress */
1885
- .crop-progress {
1886
- width: 120px;
1887
- height: 4px;
1888
- background: var(--bg-hover);
1889
- border-radius: 2px;
1890
- overflow: hidden;
1891
- }
1892
- .crop-progress-bar {
1893
- width: 30%;
1894
- height: 100%;
1895
- background: var(--blue);
1896
- border-radius: 2px;
1897
- animation: cropProgress 1.5s ease infinite;
1898
- }
1899
- @keyframes cropProgress {
1900
- 0% { width: 10%; margin-left: 0; }
1901
- 50% { width: 40%; margin-left: 30%; }
1902
- 100% { width: 10%; margin-left: 90%; }
1903
- }
1904
-
1905
- /* cropperjs dark theme overrides */
1906
- .cropper-view-box { outline-color: var(--blue) !important; }
1907
- .cropper-line { background-color: var(--blue) !important; }
1908
- .cropper-point { background-color: var(--blue) !important; width: 8px !important; height: 8px !important; }
1909
- .cropper-modal { background-color: rgba(0,0,0,0.6) !important; }
1910
- .cropper-dashed { border-color: rgba(255,255,255,0.3) !important; }
1911
-
1912
- /* ─── Branding: Mobile responsive ──────────────────── */
1913
- @media (max-width: 768px) {
1914
- .br-two-col { grid-template-columns: 1fr; gap: 16px; }
1915
- .logo-grid { grid-template-columns: repeat(2, 1fr); }
1916
- .br-save-bar { padding: 12px 16px; }
1917
- .br-save-bar-inner { flex-direction: column; gap: 12px; text-align: center; }
1918
- .br-save-actions { justify-content: center; }
1919
- .tab-panel { padding: 20px 16px; }
1920
- .accent-grid { grid-template-columns: repeat(3, 1fr); }
1921
- .br-panel > div[style*="grid-template-columns: 1fr 1fr"] { grid-template-columns: 1fr !important; }
1922
- }
1923
- @media (max-width: 480px) {
1924
- .logo-grid { grid-template-columns: 1fr; }
1925
- .accent-grid { grid-template-columns: repeat(2, 1fr); }
1926
- }
1927
-
1928
- /* ─── Appearance tab: Color input ───────────────────── */
1929
- .color-input {
1930
- width: 40px;
1931
- height: 28px;
1932
- padding: 0;
1933
- border: 1px solid var(--border-strong);
1934
- border-radius: 4px;
1935
- cursor: pointer;
1936
- background: none;
1937
- }
1938
-
1939
- /* ─── Auto theme: follow system preference ───────────────────────── */
1940
- @media (prefers-color-scheme: light) {
1941
- [data-theme="auto"] {
1942
- --bg-root: #f8f9fa;
1943
- --bg-surface: #ffffff;
1944
- --bg-card: #ffffff;
1945
- --bg-elevated: #f0f1f3;
1946
- --bg-hover: #e9eaec;
1947
- --bg-active: #dddee1;
1948
- --bg-input: rgba(0,0,0,0.04);
1949
- --border: rgba(0,0,0,0.10);
1950
- --border-subtle: rgba(0,0,0,0.06);
1951
- --border-strong: rgba(0,0,0,0.15);
1952
- --border-focus: rgba(0,0,0,0.25);
1953
- --text: #1a1a1a;
1954
- --text-secondary: #6b7280;
1955
- --text-tertiary: #9ca3af;
1956
- --text-placeholder: #c0c5ce;
1957
- --text-white: #1a1a1a;
1958
- --shadow-sm: 0 1px 3px rgba(0,0,0,0.08), 0 1px 2px -1px rgba(0,0,0,0.06);
1959
- --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06);
1960
- --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.12), 0 4px 6px -4px rgba(0,0,0,0.08);
1961
- --shadow-focus: 0 0 0 1px rgba(0,0,0,0.08), 0 0 0 3px rgba(108,71,255,0.2);
1962
- color-scheme: light;
1963
- }
1964
- }
1965
-
1966
- /* ─── Skeleton loading ──────────────────────────────────────────────── */
1967
- @keyframes shimmer {
1968
- 0% { background-position: 200% 0; }
1969
- 100% { background-position: -200% 0; }
1970
- }
1971
- .skel {
1972
- display: block;
1973
- background: linear-gradient(90deg, var(--bg-hover) 25%, var(--bg-active, rgba(255,255,255,0.06)) 50%, var(--bg-hover) 75%);
1974
- background-size: 200% 100%;
1975
- animation: shimmer 1.4s infinite;
1976
- border-radius: 4px;
1977
- }
1978
- .skel-circle { border-radius: 50%; }
1979
- .skel-row td { padding: 12px 16px; }
1980
-
1981
- /* ─── Responsive: column visibility helpers ─────────────────────────── */
1982
- /* col-hide-lg: hide on tablet (≤900px) */
1983
- @media (max-width: 900px) {
1984
- .col-hide-lg { display: none; }
1985
- }
1986
- /* col-hide-md: hide on small tablet (≤768px) */
1987
- @media (max-width: 768px) {
1988
- .col-hide-md { display: none; }
1989
- }
1990
- /* col-hide-sm: hide on mobile (≤640px) */
1991
- @media (max-width: 640px) {
1992
- .col-hide-sm { display: none; }
1993
- }
1994
-
1995
- /* ─── Mobile sidebar drawer ──────────────────────────────────────────── */
1996
- .sidebar-toggle { display: none; }
1997
- .sidebar-overlay {
1998
- display: none;
1999
- position: fixed;
2000
- inset: 0;
2001
- background: rgba(0,0,0,0.5);
2002
- z-index: 200;
2003
- opacity: 0;
2004
- transition: opacity 0.25s ease;
2005
- }
2006
- .sidebar-overlay-visible {
2007
- display: block;
2008
- opacity: 1;
2009
- }
2010
- .sidebar {
2011
- display: none;
2012
- position: fixed;
2013
- top: 0;
2014
- left: 0;
2015
- bottom: 0;
2016
- width: 280px;
2017
- max-width: 80vw;
2018
- background: var(--bg-surface);
2019
- border-right: 1px solid var(--border);
2020
- z-index: 210;
2021
- transform: translateX(-100%);
2022
- transition: transform 0.25s ease;
2023
- overflow-y: auto;
2024
- -webkit-overflow-scrolling: touch;
2025
- }
2026
- .sidebar-open { transform: translateX(0); }
2027
- .sidebar-header {
2028
- display: flex;
2029
- align-items: center;
2030
- justify-content: space-between;
2031
- padding: 12px 16px;
2032
- border-bottom: 1px solid var(--border);
2033
- }
2034
- .sidebar-header h2 {
2035
- font-size: 15px;
2036
- font-weight: 600;
2037
- color: var(--text-white);
2038
- margin: 0;
2039
- }
2040
- .sidebar-nav {
2041
- padding: 8px;
2042
- display: flex;
2043
- flex-direction: column;
2044
- gap: 2px;
2045
- }
2046
- .sidebar-item {
2047
- display: flex;
2048
- align-items: center;
2049
- gap: 12px;
2050
- padding: 10px 12px;
2051
- border: none;
2052
- background: transparent;
2053
- border-radius: var(--radius-sm);
2054
- font-size: 14px;
2055
- font-weight: 500;
2056
- color: var(--text-secondary);
2057
- cursor: pointer;
2058
- transition: background 0.15s, color 0.15s;
2059
- text-align: left;
2060
- width: 100%;
2061
- -webkit-tap-highlight-color: transparent;
2062
- }
2063
- .sidebar-item:hover { background: var(--bg-hover); color: var(--text); }
2064
- .sidebar-item:active { background: var(--bg-active); }
2065
- .sidebar-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--text-tertiary); transition: color 0.15s; }
2066
- .sidebar-item:hover svg { color: var(--text-secondary); }
2067
- .sidebar-item-active {
2068
- background: var(--bg-hover);
2069
- color: var(--text-white);
2070
- }
2071
- .sidebar-item-active svg { color: var(--text-white); }
2072
-
2073
- /* ─── Responsive: show sidebar toggle, hide tabs on mobile ──────────── */
2074
- @media (max-width: 640px) {
2075
- .sidebar-toggle { display: flex; }
2076
- .sidebar { display: block; }
2077
- .tabs { display: none; }
2078
- }
2079
-
2080
- /* ─── Responsive: toolbar / filter bar ──────────────────────────────── */
2081
- @media (max-width: 640px) {
2082
- .tab-toolbar {
2083
- flex-wrap: wrap;
2084
- gap: 6px;
2085
- }
2086
- .search-wrapper {
2087
- width: 100%;
2088
- min-width: 0;
2089
- }
2090
- .tab-toolbar .select {
2091
- flex: 1;
2092
- min-width: 0;
2093
- font-size: 12px;
2094
- padding: 0 8px;
2095
- height: 34px;
2096
- }
2097
- .tab-toolbar .btn-sm {
2098
- font-size: 12px;
2099
- padding: 0 10px;
2100
- height: 34px;
2101
- }
2102
- }
2103
-
2104
- /* ─── Responsive: header ────────────────────────────────────────────── */
2105
- @media (max-width: 640px) {
2106
- .admin-header-left {
2107
- gap: 6px;
2108
- min-width: 0;
2109
- overflow: hidden;
2110
- }
2111
- .admin-header-left a {
2112
- max-width: 80px;
2113
- overflow: hidden;
2114
- text-overflow: ellipsis;
2115
- white-space: nowrap;
2116
- flex-shrink: 1;
2117
- }
2118
- .admin-header h1 {
2119
- font-size: 13px;
2120
- white-space: nowrap;
2121
- overflow: hidden;
2122
- text-overflow: ellipsis;
2123
- }
2124
- .header-dot { display: none; }
2125
- }
2126
-
2127
- /* ─── Responsive: table compact ─────────────────────────────────────── */
2128
- @media (max-width: 640px) {
2129
- .table th, .table td {
2130
- padding: 10px 8px;
2131
- font-size: 13px;
2132
- }
2133
- .table th {
2134
- font-size: 10px;
2135
- }
2136
- .member-identity {
2137
- gap: 8px;
2138
- }
2139
- .member-name {
2140
- font-size: 13px;
2141
- max-width: 120px;
2142
- }
2143
- .member-email {
2144
- font-size: 11px;
2145
- max-width: 100px;
2146
- }
2147
- .action-cell { width: 32px; }
2148
- }
2149
-
2150
- /* ─── Responsive: pagination ────────────────────────────────────────── */
2151
- @media (max-width: 640px) {
2152
- .pagination {
2153
- flex-direction: column;
2154
- gap: 8px;
2155
- align-items: center;
2156
- font-size: 12px;
2157
- }
2158
- .pagination-info {
2159
- font-size: 12px;
2160
- }
2161
- .page-btn {
2162
- min-width: 28px;
2163
- height: 28px;
2164
- font-size: 12px;
2165
- }
2166
- }
2167
-
2168
- /* ─── Responsive: section titles ────────────────────────────────────── */
2169
- @media (max-width: 640px) {
2170
- .section-title { font-size: 17px; }
2171
- .section-desc { font-size: 13px; margin-bottom: 20px; padding-bottom: 16px; }
2172
- }
2173
-
2174
- /* ─── Responsive: settings card ─────────────────────────────────────── */
2175
- @media (max-width: 640px) {
2176
- .settings-card { border-radius: var(--radius-sm); }
2177
- .settings-card-header {
2178
- gap: 8px;
2179
- padding: 12px 14px;
2180
- }
2181
- .settings-card-header-desc { text-align: left; }
2182
- .settings-row {
2183
- gap: 6px;
2184
- padding: 12px 14px;
2185
- }
2186
- .settings-row.settings-row-stack {
2187
- flex-direction: column;
2188
- align-items: flex-start;
2189
- }
2190
- }
2191
-
2192
- /* ─── Responsive: table horizontal scroll on very small screens ─── */
2193
- @media (max-width: 480px) {
2194
- .settings-card {
2195
- overflow-x: auto;
2196
- -webkit-overflow-scrolling: touch;
2197
- }
2198
- .settings-card .table {
2199
- min-width: 360px;
2200
- }
2201
- }
2202
-
2203
- /* ─── Settings: OAuth card grid ─────────────────────────────── */
2204
- .st-oauth-grid {
2205
- display: flex;
2206
- flex-wrap: wrap;
2207
- gap: 8px;
2208
- padding: 8px 20px 16px;
2209
- }
2210
- .st-oauth-card {
2211
- display: flex;
2212
- align-items: center;
2213
- gap: 8px;
2214
- padding: 8px 14px;
2215
- border: 1px solid var(--border);
2216
- border-radius: var(--radius-md);
2217
- cursor: pointer;
2218
- transition: border-color 0.15s, background 0.15s;
2219
- min-width: 110px;
2220
- }
2221
- .st-oauth-card:hover {
2222
- border-color: var(--border-strong);
2223
- background: var(--bg-hover);
2224
- }
2225
- .st-oauth-card-icon {
2226
- display: inline-flex;
2227
- width: 20px;
2228
- height: 20px;
2229
- flex-shrink: 0;
2230
- }
2231
- .st-oauth-card-name {
2232
- font-size: 13px;
2233
- font-weight: 500;
2234
- color: var(--text);
2235
- }
2236
- .st-oauth-dot {
2237
- width: 7px;
2238
- height: 7px;
2239
- border-radius: 50%;
2240
- flex-shrink: 0;
2241
- margin-left: auto;
2242
- }
2243
- .st-oauth-dot-on { background: var(--green-text); }
2244
- .st-oauth-dot-off { background: var(--text-tertiary); }
2245
-
2246
- /* ─── Settings: dual panel (login methods + email) ──────────── */
2247
- .st-dual-panel {
2248
- display: flex;
2249
- gap: 16px;
2250
- }
2251
- @media (max-width: 640px) {
2252
- .st-dual-panel {
2253
- flex-direction: column;
2254
- }
2255
- }
2256
-
2257
- /* ─── Settings: email hint ─────────────────────────────────── */
2258
- .st-hint {
2259
- font-size: 11px;
2260
- color: var(--yellow-text, #92400e);
2261
- font-weight: 400;
2262
- margin-left: 4px;
2263
- }
2264
-
2265
- /* ─── Federation ──────────────────────────────────────────── */
2266
- .fed-status-badge {
2267
- display: inline-flex;
2268
- align-items: center;
2269
- gap: 4px;
2270
- font-size: 12px;
2271
- font-weight: 500;
2272
- padding: 2px 8px;
2273
- border-radius: var(--radius-full);
2274
- }
2275
- .fed-status-badge.master {
2276
- background: var(--blue-light);
2277
- color: var(--blue-muted);
2278
- }
2279
- .fed-status-badge.member {
2280
- background: var(--green-light);
2281
- color: var(--green-text);
2282
- }
2283
- .fed-star {
2284
- color: var(--yellow);
2285
- font-size: 14px;
2286
- }
2287
- .fed-site-row {
2288
- display: flex;
2289
- align-items: center;
2290
- gap: 12px;
2291
- padding: 10px 20px;
2292
- border-bottom: 1px solid var(--border);
2293
- }
2294
- .fed-site-row:last-child { border-bottom: none; }
2295
- .fed-site-row { flex-wrap: wrap; }
2296
- .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; }
2297
- .fed-site-name > span { flex-shrink: 0; }
2298
- .fed-site-name > span.fed-site-label { flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2299
- .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; }
2300
- .fed-site-url a { color: var(--text-secondary); text-decoration: none; }
2301
- .fed-site-url a:hover { color: var(--blue); text-decoration: underline; }
2302
- .fed-site-role { width: 80px; font-size: 12px; color: var(--text-tertiary); }
2303
- .fed-site-actions { display: flex; align-items: center; gap: 6px; justify-content: flex-end; min-width: 64px; flex-shrink: 0; }
2304
- @media (max-width: 768px) {
2305
- .fed-site-row { flex-wrap: wrap; }
2306
- .fed-site-name { flex: 1 1 100%; }
2307
- .fed-site-url { flex: 1 1 auto; }
2308
- }
2309
- .fed-delegation-status { display: flex; align-items: center; gap: 8px; padding: 12px 20px; font-size: 13px; color: var(--text-secondary); }
2310
- .fed-delegation-status .checkmark { color: var(--green); font-weight: 600; }
2311
- .fed-init-buttons { display: flex; gap: 12px; justify-content: center; padding: 8px 20px 16px; }
2312
- .fed-init-buttons .btn { width: auto; min-width: 160px; }