@arcblock/did-connect-service 4.1.34 → 4.1.35

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