@arcblock/did-connect-service 4.0.6 → 4.0.7

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