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