@arcblock/did-connect-service 4.1.34 → 4.1.36

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