@arcblock/did-connect-service 4.1.32 → 4.1.34

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