@arcblock/did-connect-service 4.1.21 → 4.1.23

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 (173) hide show
  1. package/dist/_generated/asset-bytes.js +1 -1
  2. package/dist/_generated/asset-manifest.js +3 -3
  3. package/dist/assets/admin-core.1fc3260c.js +1623 -0
  4. package/dist/assets/admin-core.5a2d69b0.js +2067 -0
  5. package/dist/assets/admin-core.9fff6042.js +2083 -0
  6. package/dist/assets/admin-core.a13c2729.js +1461 -0
  7. package/dist/assets/{admin-core.40671087.js → admin-core.a63bbc69.js} +2 -12
  8. package/dist/assets/admin-core.c0b5af61.js +1393 -0
  9. package/dist/assets/admin-core.cbbdbe6d.js +1465 -0
  10. package/dist/assets/admin-core.e83fd379.js +1397 -0
  11. package/dist/assets/admin-extra.143b5774.js +2543 -0
  12. package/dist/assets/admin-extra.35b91f98.js +2543 -0
  13. package/dist/assets/admin-extra.531b187f.js +2552 -0
  14. package/dist/assets/admin-extra.7ca9c16b.js +2529 -0
  15. package/dist/assets/admin-extra.841b2bbe.js +2530 -0
  16. package/dist/assets/admin-extra.afcb3651.js +2528 -0
  17. package/dist/assets/admin.7c5d5f04.css +2312 -0
  18. package/dist/assets/admin.c26bb17a.css +2219 -0
  19. package/dist/assets/login.4404e695.js +720 -0
  20. package/dist/assets/login.bb9f8b03.js +720 -0
  21. package/dist/assets/login.d3f05790.js +720 -0
  22. package/dist/assets/login.fa25f37a.js +720 -0
  23. package/dist/blocklet-service-rpc.d.ts.map +1 -1
  24. package/dist/blocklet-service-rpc.js +11 -8
  25. package/dist/blocklet-service-rpc.js.map +1 -1
  26. package/dist/blocklet-service.d.ts +11 -8
  27. package/dist/blocklet-service.d.ts.map +1 -1
  28. package/dist/blocklet-service.js +32 -38
  29. package/dist/blocklet-service.js.map +1 -1
  30. package/dist/embedded.d.ts +6 -0
  31. package/dist/embedded.d.ts.map +1 -1
  32. package/dist/embedded.js +1 -0
  33. package/dist/embedded.js.map +1 -1
  34. package/dist/handlers/account-merge-handler.d.ts +63 -0
  35. package/dist/handlers/account-merge-handler.d.ts.map +1 -0
  36. package/dist/handlers/account-merge-handler.js +263 -0
  37. package/dist/handlers/account-merge-handler.js.map +1 -0
  38. package/dist/handlers/auth-handler.d.ts +9 -5
  39. package/dist/handlers/auth-handler.d.ts.map +1 -1
  40. package/dist/handlers/auth-handler.js +28 -7
  41. package/dist/handlers/auth-handler.js.map +1 -1
  42. package/dist/handlers/blocklet-js-handler.d.ts +3 -2
  43. package/dist/handlers/blocklet-js-handler.d.ts.map +1 -1
  44. package/dist/handlers/blocklet-js-handler.js +4 -2
  45. package/dist/handlers/blocklet-js-handler.js.map +1 -1
  46. package/dist/handlers/branding-handler.d.ts +4 -0
  47. package/dist/handlers/branding-handler.d.ts.map +1 -1
  48. package/dist/handlers/branding-handler.js +12 -6
  49. package/dist/handlers/branding-handler.js.map +1 -1
  50. package/dist/handlers/cimd.d.ts +6 -1
  51. package/dist/handlers/cimd.d.ts.map +1 -1
  52. package/dist/handlers/cimd.js +12 -2
  53. package/dist/handlers/cimd.js.map +1 -1
  54. package/dist/handlers/did-connect-handler.d.ts +22 -0
  55. package/dist/handlers/did-connect-handler.d.ts.map +1 -1
  56. package/dist/handlers/did-connect-handler.js +191 -17
  57. package/dist/handlers/did-connect-handler.js.map +1 -1
  58. package/dist/handlers/email-login-handler.d.ts +2 -0
  59. package/dist/handlers/email-login-handler.d.ts.map +1 -1
  60. package/dist/handlers/email-login-handler.js +30 -14
  61. package/dist/handlers/email-login-handler.js.map +1 -1
  62. package/dist/handlers/oauth-handler.d.ts +15 -0
  63. package/dist/handlers/oauth-handler.d.ts.map +1 -1
  64. package/dist/handlers/oauth-handler.js +107 -43
  65. package/dist/handlers/oauth-handler.js.map +1 -1
  66. package/dist/handlers/passkey-handler.d.ts.map +1 -1
  67. package/dist/handlers/passkey-handler.js +40 -8
  68. package/dist/handlers/passkey-handler.js.map +1 -1
  69. package/dist/handlers/team-handler.d.ts +1 -1
  70. package/dist/handlers/team-handler.d.ts.map +1 -1
  71. package/dist/handlers/team-handler.js +43 -3
  72. package/dist/handlers/team-handler.js.map +1 -1
  73. package/dist/handlers/ticket-handler.d.ts.map +1 -1
  74. package/dist/handlers/ticket-handler.js +4 -2
  75. package/dist/handlers/ticket-handler.js.map +1 -1
  76. package/dist/handlers/unbind-account.d.ts +22 -0
  77. package/dist/handlers/unbind-account.d.ts.map +1 -0
  78. package/dist/handlers/unbind-account.js +20 -0
  79. package/dist/handlers/unbind-account.js.map +1 -0
  80. package/dist/http/security-headers.d.ts +38 -0
  81. package/dist/http/security-headers.d.ts.map +1 -0
  82. package/dist/http/security-headers.js +67 -0
  83. package/dist/http/security-headers.js.map +1 -0
  84. package/dist/identity/account-state.d.ts +37 -0
  85. package/dist/identity/account-state.d.ts.map +1 -0
  86. package/dist/identity/account-state.js +97 -0
  87. package/dist/identity/account-state.js.map +1 -0
  88. package/dist/identity/json-content-type.d.ts +14 -0
  89. package/dist/identity/json-content-type.d.ts.map +1 -0
  90. package/dist/identity/json-content-type.js +26 -0
  91. package/dist/identity/json-content-type.js.map +1 -0
  92. package/dist/index.d.ts +3 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +2 -2
  95. package/dist/index.js.map +1 -1
  96. package/dist/oauth-adapters/apple.d.ts +1 -1
  97. package/dist/oauth-adapters/apple.d.ts.map +1 -1
  98. package/dist/oauth-adapters/apple.js +2 -0
  99. package/dist/oauth-adapters/apple.js.map +1 -1
  100. package/dist/oauth-adapters/auth0-legacy.d.ts +1 -1
  101. package/dist/oauth-adapters/auth0-legacy.d.ts.map +1 -1
  102. package/dist/oauth-adapters/auth0-legacy.js +2 -0
  103. package/dist/oauth-adapters/auth0-legacy.js.map +1 -1
  104. package/dist/oauth-adapters/auth0.d.ts +1 -1
  105. package/dist/oauth-adapters/auth0.d.ts.map +1 -1
  106. package/dist/oauth-adapters/auth0.js +2 -0
  107. package/dist/oauth-adapters/auth0.js.map +1 -1
  108. package/dist/oauth-adapters/github.d.ts.map +1 -1
  109. package/dist/oauth-adapters/github.js +19 -12
  110. package/dist/oauth-adapters/github.js.map +1 -1
  111. package/dist/oauth-adapters/google.d.ts +1 -1
  112. package/dist/oauth-adapters/google.d.ts.map +1 -1
  113. package/dist/oauth-adapters/google.js +2 -0
  114. package/dist/oauth-adapters/google.js.map +1 -1
  115. package/dist/oauth-adapters/types.d.ts +7 -0
  116. package/dist/oauth-adapters/types.d.ts.map +1 -1
  117. package/dist/oauth-adapters/types.js +4 -1
  118. package/dist/oauth-adapters/types.js.map +1 -1
  119. package/dist/package-branding.d.ts +18 -0
  120. package/dist/package-branding.d.ts.map +1 -0
  121. package/dist/package-branding.js +103 -0
  122. package/dist/package-branding.js.map +1 -0
  123. package/dist/pages/admin/i18n.d.ts.map +1 -1
  124. package/dist/pages/admin/i18n.js +86 -0
  125. package/dist/pages/admin/i18n.js.map +1 -1
  126. package/dist/pages/admin/index.d.ts +4 -0
  127. package/dist/pages/admin/index.d.ts.map +1 -1
  128. package/dist/pages/admin/index.js +10 -2
  129. package/dist/pages/admin/index.js.map +1 -1
  130. package/dist/pages/admin/merge-confirm-view.d.ts +48 -0
  131. package/dist/pages/admin/merge-confirm-view.d.ts.map +1 -0
  132. package/dist/pages/admin/merge-confirm-view.js +85 -0
  133. package/dist/pages/admin/merge-confirm-view.js.map +1 -0
  134. package/dist/pages/admin/merge-method-picker.d.ts +12 -0
  135. package/dist/pages/admin/merge-method-picker.d.ts.map +1 -0
  136. package/dist/pages/admin/merge-method-picker.js +34 -0
  137. package/dist/pages/admin/merge-method-picker.js.map +1 -0
  138. package/dist/pages/admin/oauth-popup-close.d.ts +13 -0
  139. package/dist/pages/admin/oauth-popup-close.d.ts.map +1 -0
  140. package/dist/pages/admin/oauth-popup-close.js +15 -0
  141. package/dist/pages/admin/oauth-popup-close.js.map +1 -0
  142. package/dist/pages/admin/styles.d.ts +1 -1
  143. package/dist/pages/admin/styles.d.ts.map +1 -1
  144. package/dist/pages/admin/styles.js +83 -0
  145. package/dist/pages/admin/styles.js.map +1 -1
  146. package/dist/pages/admin/tab-audit.d.ts +1 -1
  147. package/dist/pages/admin/tab-audit.d.ts.map +1 -1
  148. package/dist/pages/admin/tab-audit.js +12 -0
  149. package/dist/pages/admin/tab-audit.js.map +1 -1
  150. package/dist/pages/admin/tab-profile-accounts.d.ts.map +1 -1
  151. package/dist/pages/admin/tab-profile-accounts.js +509 -3
  152. package/dist/pages/admin/tab-profile-accounts.js.map +1 -1
  153. package/dist/pages/invite-page.d.ts +1 -0
  154. package/dist/pages/invite-page.d.ts.map +1 -1
  155. package/dist/pages/invite-page.js +13 -3
  156. package/dist/pages/invite-page.js.map +1 -1
  157. package/dist/store/account-merge.d.ts +167 -0
  158. package/dist/store/account-merge.d.ts.map +1 -0
  159. package/dist/store/account-merge.js +313 -0
  160. package/dist/store/account-merge.js.map +1 -0
  161. package/dist/store/d1-store.d.ts +97 -7
  162. package/dist/store/d1-store.d.ts.map +1 -1
  163. package/dist/store/d1-store.js +421 -23
  164. package/dist/store/d1-store.js.map +1 -1
  165. package/dist/types.d.ts +8 -0
  166. package/dist/types.d.ts.map +1 -1
  167. package/migrations/0015_connected_accounts_id_index.sql +6 -0
  168. package/migrations/0016_did_aliases.sql +11 -0
  169. package/migrations/0017_unbind_revoke_and_cascade.sql +49 -0
  170. package/migrations/0018_primary_credential_did.sql +54 -0
  171. package/migrations/0019_account_merge.sql +16 -0
  172. package/migrations/0020_dedupe_connected_accounts.sql +24 -0
  173. package/package.json +3 -3
@@ -0,0 +1,2312 @@
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
+ dialog.merge-confirm-dialog { max-width: 560px; }
1200
+ .merge-method-list { display: grid; gap: 10px; margin-top: 16px; }
1201
+ .merge-method-list .btn,
1202
+ .merge-method-btn {
1203
+ width: 100%;
1204
+ justify-content: flex-start;
1205
+ }
1206
+ .merge-method-btn .ca-chip-icon,
1207
+ .merge-method-btn svg {
1208
+ width: 18px;
1209
+ height: 18px;
1210
+ flex-shrink: 0;
1211
+ }
1212
+ .ca-merge-prompt {
1213
+ margin: 0 20px 12px;
1214
+ padding: 12px 14px;
1215
+ border: 1px solid var(--border-strong);
1216
+ border-radius: var(--radius-sm);
1217
+ background: var(--blue-light);
1218
+ }
1219
+ .ca-merge-prompt-title {
1220
+ font-size: 14px;
1221
+ font-weight: 600;
1222
+ color: var(--text-white);
1223
+ margin: 0 0 4px;
1224
+ }
1225
+ .ca-merge-prompt-body {
1226
+ font-size: 13px;
1227
+ color: var(--text-secondary);
1228
+ line-height: 1.45;
1229
+ margin: 0 0 10px;
1230
+ }
1231
+ .ca-merge-prompt-actions {
1232
+ display: flex;
1233
+ flex-wrap: wrap;
1234
+ gap: 8px;
1235
+ }
1236
+ .ca-merge-prompt .btn { width: auto; min-width: 96px; }
1237
+ .merge-email-fields { display: grid; gap: 10px; margin-top: 12px; text-align: left; }
1238
+ .merge-confirm-section { margin: 14px 0 0; }
1239
+ .merge-confirm-section h4 {
1240
+ font-size: 12px;
1241
+ font-weight: 600;
1242
+ color: var(--text-white);
1243
+ margin: 0 0 6px;
1244
+ }
1245
+ .merge-confirm-list {
1246
+ margin: 0;
1247
+ padding-left: 18px;
1248
+ font-size: 13px;
1249
+ color: var(--text);
1250
+ line-height: 1.55;
1251
+ }
1252
+ .merge-confirm-note {
1253
+ font-size: 13px;
1254
+ color: var(--text);
1255
+ line-height: 1.55;
1256
+ margin: 0;
1257
+ }
1258
+ .merge-confirm-did {
1259
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1260
+ font-size: 12px;
1261
+ word-break: break-all;
1262
+ }
1263
+ .merge-confirm-keep-other {
1264
+ font-size: 13px;
1265
+ color: var(--text-secondary);
1266
+ margin: 0 0 4px;
1267
+ line-height: 1.5;
1268
+ }
1269
+ .merge-confirm-irreversible {
1270
+ color: var(--red-text);
1271
+ font-weight: 600;
1272
+ font-size: 13px;
1273
+ margin: 16px 0 0;
1274
+ }
1275
+ .merge-confirm-too-large {
1276
+ color: var(--red-text);
1277
+ font-size: 13px;
1278
+ margin: 8px 0 0;
1279
+ line-height: 1.5;
1280
+ }
1281
+
1282
+ /* ─── Wallet bind QR (mirrors login-page .qr-view) ──────────────── */
1283
+ .wallet-qr-view {
1284
+ margin: 16px auto;
1285
+ display: flex;
1286
+ justify-content: center;
1287
+ min-height: 212px;
1288
+ align-items: center;
1289
+ }
1290
+ .wallet-qr-placeholder {
1291
+ width: 212px;
1292
+ height: 212px;
1293
+ display: flex;
1294
+ align-items: center;
1295
+ justify-content: center;
1296
+ border: 1px solid var(--border-subtle);
1297
+ border-radius: var(--radius);
1298
+ background: var(--bg-elevated);
1299
+ }
1300
+ .wallet-qr-spinner {
1301
+ display: inline-block;
1302
+ width: 32px; height: 32px;
1303
+ border: 3px solid var(--border-strong);
1304
+ border-top-color: var(--blue-muted);
1305
+ border-radius: 50%;
1306
+ animation: spin 0.6s linear infinite;
1307
+ }
1308
+ @keyframes spin { to { transform: rotate(360deg); } }
1309
+ .wallet-deep-link-btn {
1310
+ margin-top: 4px;
1311
+ width: 212px;
1312
+ }
1313
+ .wallet-bind-status {
1314
+ margin-top: 12px;
1315
+ font-size: 13px;
1316
+ min-height: 18px;
1317
+ color: var(--text-secondary);
1318
+ margin-bottom: 0;
1319
+ }
1320
+ .wallet-bind-error {
1321
+ color: var(--red-text);
1322
+ padding: 10px 12px;
1323
+ background: rgba(220,53,69,0.08);
1324
+ border: 1px solid rgba(220,53,69,0.25);
1325
+ border-radius: var(--radius-sm);
1326
+ margin-top: 8px;
1327
+ }
1328
+
1329
+ @keyframes modalIn {
1330
+ from { opacity: 0; transform: scale(0.98); }
1331
+ to { opacity: 1; transform: scale(1); }
1332
+ }
1333
+
1334
+ /* ─── Action menus ───────────────────────────────────────────────── */
1335
+ .action-trigger {
1336
+ width: 28px;
1337
+ height: 28px;
1338
+ display: flex;
1339
+ align-items: center;
1340
+ justify-content: center;
1341
+ border-radius: var(--radius-sm);
1342
+ border: none;
1343
+ background: transparent;
1344
+ color: var(--text-tertiary);
1345
+ cursor: pointer;
1346
+ font-size: 16px;
1347
+ transition: background-color 0.15s ease, color 0.15s ease;
1348
+ flex-shrink: 0;
1349
+ }
1350
+ .action-trigger:hover { background: var(--bg-hover); color: var(--text-secondary); }
1351
+ .action-menu {
1352
+ display: none;
1353
+ position: absolute;
1354
+ right: 8px;
1355
+ top: 100%;
1356
+ z-index: 50;
1357
+ min-width: 180px;
1358
+ padding: 4px;
1359
+ background: var(--bg-elevated);
1360
+ border: 1px solid var(--border-strong);
1361
+ border-radius: var(--radius);
1362
+ box-shadow: var(--shadow-md);
1363
+ }
1364
+ .action-menu.open { display: block; }
1365
+ .action-menu-item {
1366
+ display: flex;
1367
+ align-items: center;
1368
+ gap: 8px;
1369
+ padding: 6px 8px;
1370
+ border-radius: var(--radius-xs);
1371
+ font-size: 13px;
1372
+ color: var(--text);
1373
+ cursor: pointer;
1374
+ border: none;
1375
+ background: none;
1376
+ width: 100%;
1377
+ text-align: left;
1378
+ transition: background-color 0.1s ease;
1379
+ }
1380
+ .action-menu-item:hover { background: var(--bg-hover); }
1381
+ .action-menu-item.danger { color: var(--red-text); }
1382
+ .action-menu-item.danger:hover { background: var(--red-light); }
1383
+ .action-menu-sep {
1384
+ height: 1px;
1385
+ background: var(--border);
1386
+ margin: 4px 0;
1387
+ }
1388
+
1389
+ /* ─── Status badges ──────────────────────────────────────────────── */
1390
+ .badge-active { background: var(--green-light); color: var(--green-text); }
1391
+ .badge-pending { background: var(--yellow-light); color: var(--yellow-text); }
1392
+ .badge-blocked { background: var(--red-light); color: var(--red-text); }
1393
+ .badge-expired { background: rgba(255,255,255,0.06); color: var(--text-tertiary); }
1394
+ .badge-neutral { background: rgba(255,255,255,0.06); color: var(--text-secondary); }
1395
+
1396
+ /* ─── Toast ──────────────────────────────────────────────────────── */
1397
+ .toast-container {
1398
+ position: fixed;
1399
+ bottom: 24px;
1400
+ right: 24px;
1401
+ z-index: 100;
1402
+ display: flex;
1403
+ flex-direction: column;
1404
+ gap: 8px;
1405
+ }
1406
+ .toast {
1407
+ padding: 10px 16px;
1408
+ border-radius: var(--radius);
1409
+ font-size: 13px;
1410
+ font-weight: 500;
1411
+ color: var(--text);
1412
+ background: var(--bg-elevated);
1413
+ border: 1px solid var(--border-strong);
1414
+ box-shadow: var(--shadow-md);
1415
+ animation: toastIn 0.2s ease;
1416
+ }
1417
+ .toast.success { border-left: 3px solid var(--green); }
1418
+ .toast.error { background: var(--red); color: #fff; border-color: var(--red); }
1419
+ @keyframes toastIn {
1420
+ from { opacity: 0; transform: translateY(8px); }
1421
+ to { opacity: 1; transform: translateY(0); }
1422
+ }
1423
+
1424
+ /* ─── Toggle switch ────────────────────────────────────────────── */
1425
+ .toggle-switch {
1426
+ position: relative;
1427
+ display: inline-block;
1428
+ width: 40px;
1429
+ height: 22px;
1430
+ cursor: pointer;
1431
+ }
1432
+ .toggle-switch input { opacity: 0; width: 0; height: 0; position: absolute; }
1433
+ .toggle-slider {
1434
+ position: absolute;
1435
+ inset: 0;
1436
+ background: var(--bg-hover);
1437
+ border-radius: 11px;
1438
+ transition: background-color 0.2s ease;
1439
+ }
1440
+ .toggle-slider::before {
1441
+ content: "";
1442
+ position: absolute;
1443
+ left: 2px;
1444
+ top: 2px;
1445
+ width: 18px;
1446
+ height: 18px;
1447
+ border-radius: 50%;
1448
+ background: var(--text-secondary);
1449
+ transition: transform 0.2s ease, background-color 0.2s ease;
1450
+ }
1451
+ .toggle-switch input:checked + .toggle-slider { background: var(--blue); }
1452
+ .toggle-switch input:checked + .toggle-slider::before {
1453
+ transform: translateX(18px);
1454
+ background: #fff;
1455
+ }
1456
+
1457
+ /* ─── Range slider ─────────────────────────────────────────────── */
1458
+ .range-slider {
1459
+ -webkit-appearance: none;
1460
+ width: 100%;
1461
+ height: 6px;
1462
+ border-radius: 3px;
1463
+ background: var(--bg-hover);
1464
+ outline: none;
1465
+ margin: 8px 0;
1466
+ }
1467
+ .range-slider::-webkit-slider-thumb {
1468
+ -webkit-appearance: none;
1469
+ width: 18px;
1470
+ height: 18px;
1471
+ border-radius: 50%;
1472
+ background: var(--blue);
1473
+ cursor: pointer;
1474
+ }
1475
+ .range-slider::-moz-range-thumb {
1476
+ width: 18px;
1477
+ height: 18px;
1478
+ border-radius: 50%;
1479
+ background: var(--blue);
1480
+ cursor: pointer;
1481
+ border: none;
1482
+ }
1483
+
1484
+ /* ─── Branding: Section layout ─────────────────────── */
1485
+ .br-section {
1486
+ margin-bottom: 56px;
1487
+ }
1488
+ .br-section-header {
1489
+ display: flex;
1490
+ align-items: baseline;
1491
+ justify-content: space-between;
1492
+ margin-bottom: 20px;
1493
+ }
1494
+ .br-section-title {
1495
+ font-size: 16px;
1496
+ font-weight: 600;
1497
+ color: var(--text);
1498
+ letter-spacing: -0.01em;
1499
+ }
1500
+ .br-section-category {
1501
+ font-size: 10px;
1502
+ font-weight: 600;
1503
+ color: var(--text-tertiary);
1504
+ text-transform: uppercase;
1505
+ letter-spacing: 0.08em;
1506
+ }
1507
+ .br-two-col {
1508
+ display: grid;
1509
+ grid-template-columns: 1fr 2fr;
1510
+ gap: 32px;
1511
+ }
1512
+ .br-col-desc {
1513
+ font-size: 13px;
1514
+ color: var(--text-secondary);
1515
+ line-height: 1.6;
1516
+ }
1517
+ .br-field-hint {
1518
+ font-size: 11px;
1519
+ color: var(--text-tertiary);
1520
+ margin-top: 4px;
1521
+ margin-bottom: 12px;
1522
+ }
1523
+ /* Info icon tooltip */
1524
+ .info-tip {
1525
+ position: relative;
1526
+ display: inline-flex;
1527
+ align-items: center;
1528
+ justify-content: center;
1529
+ width: 14px;
1530
+ height: 14px;
1531
+ border-radius: 50%;
1532
+ background: rgba(255,255,255,0.08);
1533
+ color: var(--text-tertiary);
1534
+ font-size: 10px;
1535
+ font-weight: 600;
1536
+ cursor: help;
1537
+ flex-shrink: 0;
1538
+ }
1539
+ .info-tip::after {
1540
+ content: attr(data-tip);
1541
+ position: absolute;
1542
+ bottom: calc(100% + 8px);
1543
+ left: 50%;
1544
+ transform: translateX(-50%);
1545
+ background: var(--bg-card);
1546
+ border: 1px solid var(--border-strong);
1547
+ color: var(--text-secondary);
1548
+ font-size: 12px;
1549
+ font-weight: 400;
1550
+ padding: 8px 14px;
1551
+ border-radius: var(--radius);
1552
+ opacity: 0;
1553
+ pointer-events: none;
1554
+ transition: opacity 0.15s ease;
1555
+ z-index: 10;
1556
+ box-shadow: var(--shadow-md);
1557
+ min-width: 220px;
1558
+ max-width: 360px;
1559
+ white-space: normal;
1560
+ line-height: 1.5;
1561
+ text-align: left;
1562
+ }
1563
+ .info-tip:hover::after { opacity: 1; }
1564
+ .br-panel {
1565
+ background: var(--bg-elevated);
1566
+ border: 1px solid var(--border-subtle);
1567
+ border-radius: var(--radius-lg);
1568
+ padding: 20px 24px;
1569
+ }
1570
+ .accent-dot {
1571
+ width: 28px;
1572
+ height: 28px;
1573
+ border-radius: 50%;
1574
+ cursor: pointer;
1575
+ border: 2px solid transparent;
1576
+ transition: transform 0.1s ease, border-color 0.15s ease;
1577
+ }
1578
+ .accent-dot:hover { transform: scale(1.15); }
1579
+ .accent-dot.selected { border-color: var(--text-white); }
1580
+
1581
+ /* ─── Branding: Language toggles ──────────────────── */
1582
+ .lang-toggles {
1583
+ display: flex;
1584
+ flex-wrap: wrap;
1585
+ gap: 8px;
1586
+ align-items: center;
1587
+ }
1588
+ .lang-toggle {
1589
+ position: relative;
1590
+ display: flex;
1591
+ align-items: center;
1592
+ gap: 8px;
1593
+ padding: 10px 20px;
1594
+ background: var(--bg-elevated);
1595
+ border: 1px solid var(--border-subtle);
1596
+ border-radius: var(--radius);
1597
+ font-size: 13px;
1598
+ font-weight: 500;
1599
+ color: var(--text-secondary);
1600
+ cursor: pointer;
1601
+ transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease;
1602
+ }
1603
+ .lang-toggle:hover { border-color: var(--border-strong); color: var(--text); }
1604
+ .lang-toggle.active {
1605
+ border-color: var(--border-strong);
1606
+ color: var(--text-white);
1607
+ background: rgba(255,255,255,0.04);
1608
+ }
1609
+ .lang-toggle.active::after {
1610
+ content: "✓";
1611
+ position: absolute;
1612
+ top: -1px;
1613
+ right: -1px;
1614
+ width: 16px;
1615
+ height: 16px;
1616
+ background: var(--blue);
1617
+ border-radius: 0 var(--radius) 0 var(--radius);
1618
+ display: flex;
1619
+ align-items: center;
1620
+ justify-content: center;
1621
+ font-size: 10px;
1622
+ font-weight: 700;
1623
+ color: #fff;
1624
+ line-height: 1;
1625
+ }
1626
+
1627
+ /* ─── Branding: Logo grid (redesigned) ───────────── */
1628
+ .logo-grid {
1629
+ display: grid;
1630
+ grid-template-columns: repeat(4, 1fr);
1631
+ gap: 16px;
1632
+ }
1633
+ .logo-item {
1634
+ position: relative;
1635
+ background: var(--bg-elevated);
1636
+ border: 1px solid var(--border-subtle);
1637
+ border-radius: var(--radius-lg);
1638
+ overflow: hidden;
1639
+ display: flex;
1640
+ flex-direction: column;
1641
+ padding: 16px;
1642
+ transition: border-color 0.15s ease;
1643
+ min-height: 170px;
1644
+ }
1645
+ .logo-item:hover { border-color: rgba(255,255,255,0.15); }
1646
+ .logo-item-header {
1647
+ display: flex;
1648
+ justify-content: space-between;
1649
+ align-items: flex-start;
1650
+ margin-bottom: auto;
1651
+ }
1652
+ .logo-item-icon {
1653
+ color: var(--text-tertiary);
1654
+ font-size: 20px;
1655
+ line-height: 1;
1656
+ }
1657
+ .logo-item-spec {
1658
+ font-size: 10px;
1659
+ font-weight: 600;
1660
+ color: var(--text-tertiary);
1661
+ text-transform: uppercase;
1662
+ letter-spacing: 0.03em;
1663
+ }
1664
+ .logo-preview {
1665
+ width: 100%;
1666
+ flex: 1;
1667
+ display: flex;
1668
+ align-items: center;
1669
+ justify-content: center;
1670
+ overflow: hidden;
1671
+ }
1672
+ .logo-preview img {
1673
+ max-width: 100%;
1674
+ max-height: 80px;
1675
+ object-fit: contain;
1676
+ }
1677
+ .logo-item-footer {
1678
+ margin-top: 12px;
1679
+ }
1680
+ .logo-name {
1681
+ font-size: 14px;
1682
+ font-weight: 600;
1683
+ color: var(--text-white);
1684
+ margin-bottom: 2px;
1685
+ }
1686
+ .logo-subtitle {
1687
+ font-size: 12px;
1688
+ color: var(--text-tertiary);
1689
+ }
1690
+ .logo-placeholder {
1691
+ font-size: 24px;
1692
+ color: var(--text-tertiary);
1693
+ opacity: 0.3;
1694
+ }
1695
+ /* Hover overlay for upload — glassmorphism */
1696
+ .logo-hover-upload {
1697
+ position: absolute;
1698
+ inset: 0;
1699
+ background: rgba(20,20,30,0.65);
1700
+ backdrop-filter: blur(8px);
1701
+ -webkit-backdrop-filter: blur(8px);
1702
+ display: flex;
1703
+ flex-direction: column;
1704
+ align-items: center;
1705
+ justify-content: center;
1706
+ gap: 6px;
1707
+ opacity: 0;
1708
+ transition: opacity 0.2s ease;
1709
+ cursor: pointer;
1710
+ border-radius: inherit;
1711
+ }
1712
+ .logo-item:hover .logo-hover-upload { opacity: 1; }
1713
+ .logo-hover-icon {
1714
+ width: 36px;
1715
+ height: 36px;
1716
+ border-radius: 50%;
1717
+ background: rgba(255,255,255,0.1);
1718
+ display: flex;
1719
+ align-items: center;
1720
+ justify-content: center;
1721
+ color: var(--text-white);
1722
+ margin-bottom: 2px;
1723
+ }
1724
+ .logo-hover-icon svg { width: 18px; height: 18px; }
1725
+ .logo-hover-text {
1726
+ font-size: 12px;
1727
+ font-weight: 500;
1728
+ color: var(--text-secondary);
1729
+ letter-spacing: 0.02em;
1730
+ }
1731
+ /* Uploaded state: replace/discard shown on hover via overlay */
1732
+ .logo-uploaded-overlay {
1733
+ position: absolute;
1734
+ inset: 0;
1735
+ background: rgba(20,20,30,0.65);
1736
+ backdrop-filter: blur(8px);
1737
+ -webkit-backdrop-filter: blur(8px);
1738
+ display: flex;
1739
+ align-items: center;
1740
+ justify-content: center;
1741
+ gap: 12px;
1742
+ opacity: 0;
1743
+ transition: opacity 0.2s ease;
1744
+ border-radius: inherit;
1745
+ z-index: 2;
1746
+ }
1747
+ .logo-item:hover .logo-uploaded-overlay { opacity: 1; }
1748
+ .logo-overlay-btn {
1749
+ font-size: 12px;
1750
+ font-weight: 600;
1751
+ padding: 6px 14px;
1752
+ border-radius: var(--radius-sm);
1753
+ cursor: pointer;
1754
+ border: 1px solid;
1755
+ transition: background 0.15s ease;
1756
+ }
1757
+ .logo-overlay-btn-replace { color: var(--blue); border-color: var(--blue); background: transparent; }
1758
+ .logo-overlay-btn-replace:hover { background: rgba(99,102,241,0.12); }
1759
+ .logo-overlay-btn-discard { color: var(--red-text); border-color: rgba(224,46,46,0.4); background: transparent; }
1760
+ .logo-overlay-btn-discard:hover { background: rgba(224,46,46,0.1); }
1761
+ .btn-text { background: none; border: none; color: var(--blue); font-size: 11px; font-weight: 600; cursor: pointer; padding: 0; }
1762
+ .btn-text:hover { text-decoration: underline; }
1763
+ .btn-text-danger { color: var(--red-text); }
1764
+
1765
+ /* ─── Branding: Sticky save bar ──────────────────── */
1766
+ .br-save-bar {
1767
+ position: fixed;
1768
+ bottom: 0;
1769
+ left: 0;
1770
+ right: 0;
1771
+ z-index: 40;
1772
+ background: rgba(28,28,32,0.85);
1773
+ backdrop-filter: blur(12px);
1774
+ border-top: 1px solid var(--border-subtle);
1775
+ padding: 16px 40px;
1776
+ display: none;
1777
+ }
1778
+ .br-save-bar.visible { display: block; }
1779
+ .br-save-bar-inner {
1780
+ max-width: 1120px;
1781
+ margin: 0 auto;
1782
+ display: flex;
1783
+ align-items: center;
1784
+ justify-content: space-between;
1785
+ width: 100%;
1786
+ }
1787
+ .br-save-hint {
1788
+ font-size: 12px;
1789
+ color: var(--text-tertiary);
1790
+ display: flex;
1791
+ align-items: center;
1792
+ gap: 8px;
1793
+ }
1794
+ .br-save-actions {
1795
+ display: flex;
1796
+ gap: 8px;
1797
+ }
1798
+ .br-save-actions .btn { width: auto; }
1799
+
1800
+ /* ─── Branding: Accent color swatches ────────────── */
1801
+ .accent-grid {
1802
+ display: grid;
1803
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
1804
+ gap: 10px;
1805
+ }
1806
+ .accent-swatch {
1807
+ position: relative;
1808
+ height: 64px;
1809
+ border-radius: var(--radius);
1810
+ display: flex;
1811
+ flex-direction: column;
1812
+ justify-content: flex-end;
1813
+ padding: 6px 8px;
1814
+ cursor: pointer;
1815
+ transition: transform 0.1s ease, box-shadow 0.15s ease;
1816
+ border: 2px solid transparent;
1817
+ }
1818
+ .accent-swatch:hover { transform: scale(1.02); }
1819
+ .accent-swatch.selected { border-color: var(--text-white); }
1820
+ .accent-swatch .accent-check {
1821
+ position: absolute;
1822
+ top: 4px;
1823
+ right: 4px;
1824
+ width: 18px;
1825
+ height: 18px;
1826
+ border-radius: 50%;
1827
+ background: rgba(0,0,0,0.5);
1828
+ display: none;
1829
+ align-items: center;
1830
+ justify-content: center;
1831
+ color: white;
1832
+ font-size: 12px;
1833
+ }
1834
+ .accent-swatch.selected .accent-check { display: flex; }
1835
+ .accent-label { font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; opacity: 0.8; }
1836
+ .accent-hex { font-size: 10px; font-weight: 700; }
1837
+
1838
+ /* ─── Branding tab: Language grid ───────────────────── */
1839
+ .lang-grid {
1840
+ display: grid;
1841
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1842
+ gap: 4px 16px;
1843
+ }
1844
+ .lang-item {
1845
+ display: flex;
1846
+ align-items: center;
1847
+ gap: 6px;
1848
+ font-size: 13px;
1849
+ padding: 4px 0;
1850
+ cursor: pointer;
1851
+ }
1852
+
1853
+ /* ─── Crop dialog ──────────────────────────────────── */
1854
+ dialog.dialog-wide { max-width: 660px; }
1855
+ .crop-container {
1856
+ width: 100%;
1857
+ height: 400px;
1858
+ background: var(--bg);
1859
+ border-radius: var(--radius-sm);
1860
+ overflow: hidden;
1861
+ }
1862
+ .crop-toolbar {
1863
+ display: flex;
1864
+ justify-content: center;
1865
+ gap: 6px;
1866
+ padding: 12px 0 4px;
1867
+ }
1868
+ .crop-tool-btn {
1869
+ width: 36px;
1870
+ height: 36px;
1871
+ display: flex;
1872
+ align-items: center;
1873
+ justify-content: center;
1874
+ background: var(--bg-input);
1875
+ border: 1px solid var(--border-strong);
1876
+ border-radius: var(--radius-sm);
1877
+ color: var(--text-secondary);
1878
+ cursor: pointer;
1879
+ transition: background-color 0.15s ease, color 0.15s ease;
1880
+ }
1881
+ .crop-tool-btn:hover { background: var(--bg-hover); color: var(--text); }
1882
+ .crop-tool-btn svg { width: 18px; height: 18px; }
1883
+
1884
+ /* Crop dialog progress */
1885
+ .crop-progress {
1886
+ width: 120px;
1887
+ height: 4px;
1888
+ background: var(--bg-hover);
1889
+ border-radius: 2px;
1890
+ overflow: hidden;
1891
+ }
1892
+ .crop-progress-bar {
1893
+ width: 30%;
1894
+ height: 100%;
1895
+ background: var(--blue);
1896
+ border-radius: 2px;
1897
+ animation: cropProgress 1.5s ease infinite;
1898
+ }
1899
+ @keyframes cropProgress {
1900
+ 0% { width: 10%; margin-left: 0; }
1901
+ 50% { width: 40%; margin-left: 30%; }
1902
+ 100% { width: 10%; margin-left: 90%; }
1903
+ }
1904
+
1905
+ /* cropperjs dark theme overrides */
1906
+ .cropper-view-box { outline-color: var(--blue) !important; }
1907
+ .cropper-line { background-color: var(--blue) !important; }
1908
+ .cropper-point { background-color: var(--blue) !important; width: 8px !important; height: 8px !important; }
1909
+ .cropper-modal { background-color: rgba(0,0,0,0.6) !important; }
1910
+ .cropper-dashed { border-color: rgba(255,255,255,0.3) !important; }
1911
+
1912
+ /* ─── Branding: Mobile responsive ──────────────────── */
1913
+ @media (max-width: 768px) {
1914
+ .br-two-col { grid-template-columns: 1fr; gap: 16px; }
1915
+ .logo-grid { grid-template-columns: repeat(2, 1fr); }
1916
+ .br-save-bar { padding: 12px 16px; }
1917
+ .br-save-bar-inner { flex-direction: column; gap: 12px; text-align: center; }
1918
+ .br-save-actions { justify-content: center; }
1919
+ .tab-panel { padding: 20px 16px; }
1920
+ .accent-grid { grid-template-columns: repeat(3, 1fr); }
1921
+ .br-panel > div[style*="grid-template-columns: 1fr 1fr"] { grid-template-columns: 1fr !important; }
1922
+ }
1923
+ @media (max-width: 480px) {
1924
+ .logo-grid { grid-template-columns: 1fr; }
1925
+ .accent-grid { grid-template-columns: repeat(2, 1fr); }
1926
+ }
1927
+
1928
+ /* ─── Appearance tab: Color input ───────────────────── */
1929
+ .color-input {
1930
+ width: 40px;
1931
+ height: 28px;
1932
+ padding: 0;
1933
+ border: 1px solid var(--border-strong);
1934
+ border-radius: 4px;
1935
+ cursor: pointer;
1936
+ background: none;
1937
+ }
1938
+
1939
+ /* ─── Auto theme: follow system preference ───────────────────────── */
1940
+ @media (prefers-color-scheme: light) {
1941
+ [data-theme="auto"] {
1942
+ --bg-root: #f8f9fa;
1943
+ --bg-surface: #ffffff;
1944
+ --bg-card: #ffffff;
1945
+ --bg-elevated: #f0f1f3;
1946
+ --bg-hover: #e9eaec;
1947
+ --bg-active: #dddee1;
1948
+ --bg-input: rgba(0,0,0,0.04);
1949
+ --border: rgba(0,0,0,0.10);
1950
+ --border-subtle: rgba(0,0,0,0.06);
1951
+ --border-strong: rgba(0,0,0,0.15);
1952
+ --border-focus: rgba(0,0,0,0.25);
1953
+ --text: #1a1a1a;
1954
+ --text-secondary: #6b7280;
1955
+ --text-tertiary: #9ca3af;
1956
+ --text-placeholder: #c0c5ce;
1957
+ --text-white: #1a1a1a;
1958
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.08), 0 1px 2px -1px rgba(0,0,0,0.06);
1959
+ --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06);
1960
+ --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.12), 0 4px 6px -4px rgba(0,0,0,0.08);
1961
+ --shadow-focus: 0 0 0 1px rgba(0,0,0,0.08), 0 0 0 3px rgba(108,71,255,0.2);
1962
+ color-scheme: light;
1963
+ }
1964
+ }
1965
+
1966
+ /* ─── Skeleton loading ──────────────────────────────────────────────── */
1967
+ @keyframes shimmer {
1968
+ 0% { background-position: 200% 0; }
1969
+ 100% { background-position: -200% 0; }
1970
+ }
1971
+ .skel {
1972
+ display: block;
1973
+ background: linear-gradient(90deg, var(--bg-hover) 25%, var(--bg-active, rgba(255,255,255,0.06)) 50%, var(--bg-hover) 75%);
1974
+ background-size: 200% 100%;
1975
+ animation: shimmer 1.4s infinite;
1976
+ border-radius: 4px;
1977
+ }
1978
+ .skel-circle { border-radius: 50%; }
1979
+ .skel-row td { padding: 12px 16px; }
1980
+
1981
+ /* ─── Responsive: column visibility helpers ─────────────────────────── */
1982
+ /* col-hide-lg: hide on tablet (≤900px) */
1983
+ @media (max-width: 900px) {
1984
+ .col-hide-lg { display: none; }
1985
+ }
1986
+ /* col-hide-md: hide on small tablet (≤768px) */
1987
+ @media (max-width: 768px) {
1988
+ .col-hide-md { display: none; }
1989
+ }
1990
+ /* col-hide-sm: hide on mobile (≤640px) */
1991
+ @media (max-width: 640px) {
1992
+ .col-hide-sm { display: none; }
1993
+ }
1994
+
1995
+ /* ─── Mobile sidebar drawer ──────────────────────────────────────────── */
1996
+ .sidebar-toggle { display: none; }
1997
+ .sidebar-overlay {
1998
+ display: none;
1999
+ position: fixed;
2000
+ inset: 0;
2001
+ background: rgba(0,0,0,0.5);
2002
+ z-index: 200;
2003
+ opacity: 0;
2004
+ transition: opacity 0.25s ease;
2005
+ }
2006
+ .sidebar-overlay-visible {
2007
+ display: block;
2008
+ opacity: 1;
2009
+ }
2010
+ .sidebar {
2011
+ display: none;
2012
+ position: fixed;
2013
+ top: 0;
2014
+ left: 0;
2015
+ bottom: 0;
2016
+ width: 280px;
2017
+ max-width: 80vw;
2018
+ background: var(--bg-surface);
2019
+ border-right: 1px solid var(--border);
2020
+ z-index: 210;
2021
+ transform: translateX(-100%);
2022
+ transition: transform 0.25s ease;
2023
+ overflow-y: auto;
2024
+ -webkit-overflow-scrolling: touch;
2025
+ }
2026
+ .sidebar-open { transform: translateX(0); }
2027
+ .sidebar-header {
2028
+ display: flex;
2029
+ align-items: center;
2030
+ justify-content: space-between;
2031
+ padding: 12px 16px;
2032
+ border-bottom: 1px solid var(--border);
2033
+ }
2034
+ .sidebar-header h2 {
2035
+ font-size: 15px;
2036
+ font-weight: 600;
2037
+ color: var(--text-white);
2038
+ margin: 0;
2039
+ }
2040
+ .sidebar-nav {
2041
+ padding: 8px;
2042
+ display: flex;
2043
+ flex-direction: column;
2044
+ gap: 2px;
2045
+ }
2046
+ .sidebar-item {
2047
+ display: flex;
2048
+ align-items: center;
2049
+ gap: 12px;
2050
+ padding: 10px 12px;
2051
+ border: none;
2052
+ background: transparent;
2053
+ border-radius: var(--radius-sm);
2054
+ font-size: 14px;
2055
+ font-weight: 500;
2056
+ color: var(--text-secondary);
2057
+ cursor: pointer;
2058
+ transition: background 0.15s, color 0.15s;
2059
+ text-align: left;
2060
+ width: 100%;
2061
+ -webkit-tap-highlight-color: transparent;
2062
+ }
2063
+ .sidebar-item:hover { background: var(--bg-hover); color: var(--text); }
2064
+ .sidebar-item:active { background: var(--bg-active); }
2065
+ .sidebar-item svg { width: 18px; height: 18px; flex-shrink: 0; color: var(--text-tertiary); transition: color 0.15s; }
2066
+ .sidebar-item:hover svg { color: var(--text-secondary); }
2067
+ .sidebar-item-active {
2068
+ background: var(--bg-hover);
2069
+ color: var(--text-white);
2070
+ }
2071
+ .sidebar-item-active svg { color: var(--text-white); }
2072
+
2073
+ /* ─── Responsive: show sidebar toggle, hide tabs on mobile ──────────── */
2074
+ @media (max-width: 640px) {
2075
+ .sidebar-toggle { display: flex; }
2076
+ .sidebar { display: block; }
2077
+ .tabs { display: none; }
2078
+ }
2079
+
2080
+ /* ─── Responsive: toolbar / filter bar ──────────────────────────────── */
2081
+ @media (max-width: 640px) {
2082
+ .tab-toolbar {
2083
+ flex-wrap: wrap;
2084
+ gap: 6px;
2085
+ }
2086
+ .search-wrapper {
2087
+ width: 100%;
2088
+ min-width: 0;
2089
+ }
2090
+ .tab-toolbar .select {
2091
+ flex: 1;
2092
+ min-width: 0;
2093
+ font-size: 12px;
2094
+ padding: 0 8px;
2095
+ height: 34px;
2096
+ }
2097
+ .tab-toolbar .btn-sm {
2098
+ font-size: 12px;
2099
+ padding: 0 10px;
2100
+ height: 34px;
2101
+ }
2102
+ }
2103
+
2104
+ /* ─── Responsive: header ────────────────────────────────────────────── */
2105
+ @media (max-width: 640px) {
2106
+ .admin-header-left {
2107
+ gap: 6px;
2108
+ min-width: 0;
2109
+ overflow: hidden;
2110
+ }
2111
+ .admin-header-left a {
2112
+ max-width: 80px;
2113
+ overflow: hidden;
2114
+ text-overflow: ellipsis;
2115
+ white-space: nowrap;
2116
+ flex-shrink: 1;
2117
+ }
2118
+ .admin-header h1 {
2119
+ font-size: 13px;
2120
+ white-space: nowrap;
2121
+ overflow: hidden;
2122
+ text-overflow: ellipsis;
2123
+ }
2124
+ .header-dot { display: none; }
2125
+ }
2126
+
2127
+ /* ─── Responsive: table compact ─────────────────────────────────────── */
2128
+ @media (max-width: 640px) {
2129
+ .table th, .table td {
2130
+ padding: 10px 8px;
2131
+ font-size: 13px;
2132
+ }
2133
+ .table th {
2134
+ font-size: 10px;
2135
+ }
2136
+ .member-identity {
2137
+ gap: 8px;
2138
+ }
2139
+ .member-name {
2140
+ font-size: 13px;
2141
+ max-width: 120px;
2142
+ }
2143
+ .member-email {
2144
+ font-size: 11px;
2145
+ max-width: 100px;
2146
+ }
2147
+ .action-cell { width: 32px; }
2148
+ }
2149
+
2150
+ /* ─── Responsive: pagination ────────────────────────────────────────── */
2151
+ @media (max-width: 640px) {
2152
+ .pagination {
2153
+ flex-direction: column;
2154
+ gap: 8px;
2155
+ align-items: center;
2156
+ font-size: 12px;
2157
+ }
2158
+ .pagination-info {
2159
+ font-size: 12px;
2160
+ }
2161
+ .page-btn {
2162
+ min-width: 28px;
2163
+ height: 28px;
2164
+ font-size: 12px;
2165
+ }
2166
+ }
2167
+
2168
+ /* ─── Responsive: section titles ────────────────────────────────────── */
2169
+ @media (max-width: 640px) {
2170
+ .section-title { font-size: 17px; }
2171
+ .section-desc { font-size: 13px; margin-bottom: 20px; padding-bottom: 16px; }
2172
+ }
2173
+
2174
+ /* ─── Responsive: settings card ─────────────────────────────────────── */
2175
+ @media (max-width: 640px) {
2176
+ .settings-card { border-radius: var(--radius-sm); }
2177
+ .settings-card-header {
2178
+ gap: 8px;
2179
+ padding: 12px 14px;
2180
+ }
2181
+ .settings-card-header-desc { text-align: left; }
2182
+ .settings-row {
2183
+ gap: 6px;
2184
+ padding: 12px 14px;
2185
+ }
2186
+ .settings-row.settings-row-stack {
2187
+ flex-direction: column;
2188
+ align-items: flex-start;
2189
+ }
2190
+ }
2191
+
2192
+ /* ─── Responsive: table horizontal scroll on very small screens ─── */
2193
+ @media (max-width: 480px) {
2194
+ .settings-card {
2195
+ overflow-x: auto;
2196
+ -webkit-overflow-scrolling: touch;
2197
+ }
2198
+ .settings-card .table {
2199
+ min-width: 360px;
2200
+ }
2201
+ }
2202
+
2203
+ /* ─── Settings: OAuth card grid ─────────────────────────────── */
2204
+ .st-oauth-grid {
2205
+ display: flex;
2206
+ flex-wrap: wrap;
2207
+ gap: 8px;
2208
+ padding: 8px 20px 16px;
2209
+ }
2210
+ .st-oauth-card {
2211
+ display: flex;
2212
+ align-items: center;
2213
+ gap: 8px;
2214
+ padding: 8px 14px;
2215
+ border: 1px solid var(--border);
2216
+ border-radius: var(--radius-md);
2217
+ cursor: pointer;
2218
+ transition: border-color 0.15s, background 0.15s;
2219
+ min-width: 110px;
2220
+ }
2221
+ .st-oauth-card:hover {
2222
+ border-color: var(--border-strong);
2223
+ background: var(--bg-hover);
2224
+ }
2225
+ .st-oauth-card-icon {
2226
+ display: inline-flex;
2227
+ width: 20px;
2228
+ height: 20px;
2229
+ flex-shrink: 0;
2230
+ }
2231
+ .st-oauth-card-name {
2232
+ font-size: 13px;
2233
+ font-weight: 500;
2234
+ color: var(--text);
2235
+ }
2236
+ .st-oauth-dot {
2237
+ width: 7px;
2238
+ height: 7px;
2239
+ border-radius: 50%;
2240
+ flex-shrink: 0;
2241
+ margin-left: auto;
2242
+ }
2243
+ .st-oauth-dot-on { background: var(--green-text); }
2244
+ .st-oauth-dot-off { background: var(--text-tertiary); }
2245
+
2246
+ /* ─── Settings: dual panel (login methods + email) ──────────── */
2247
+ .st-dual-panel {
2248
+ display: flex;
2249
+ gap: 16px;
2250
+ }
2251
+ @media (max-width: 640px) {
2252
+ .st-dual-panel {
2253
+ flex-direction: column;
2254
+ }
2255
+ }
2256
+
2257
+ /* ─── Settings: email hint ─────────────────────────────────── */
2258
+ .st-hint {
2259
+ font-size: 11px;
2260
+ color: var(--yellow-text, #92400e);
2261
+ font-weight: 400;
2262
+ margin-left: 4px;
2263
+ }
2264
+
2265
+ /* ─── Federation ──────────────────────────────────────────── */
2266
+ .fed-status-badge {
2267
+ display: inline-flex;
2268
+ align-items: center;
2269
+ gap: 4px;
2270
+ font-size: 12px;
2271
+ font-weight: 500;
2272
+ padding: 2px 8px;
2273
+ border-radius: var(--radius-full);
2274
+ }
2275
+ .fed-status-badge.master {
2276
+ background: var(--blue-light);
2277
+ color: var(--blue-muted);
2278
+ }
2279
+ .fed-status-badge.member {
2280
+ background: var(--green-light);
2281
+ color: var(--green-text);
2282
+ }
2283
+ .fed-star {
2284
+ color: var(--yellow);
2285
+ font-size: 14px;
2286
+ }
2287
+ .fed-site-row {
2288
+ display: flex;
2289
+ align-items: center;
2290
+ gap: 12px;
2291
+ padding: 10px 20px;
2292
+ border-bottom: 1px solid var(--border);
2293
+ }
2294
+ .fed-site-row:last-child { border-bottom: none; }
2295
+ .fed-site-row { flex-wrap: wrap; }
2296
+ .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; }
2297
+ .fed-site-name > span { flex-shrink: 0; }
2298
+ .fed-site-name > span.fed-site-label { flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2299
+ .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; }
2300
+ .fed-site-url a { color: var(--text-secondary); text-decoration: none; }
2301
+ .fed-site-url a:hover { color: var(--blue); text-decoration: underline; }
2302
+ .fed-site-role { width: 80px; font-size: 12px; color: var(--text-tertiary); }
2303
+ .fed-site-actions { display: flex; align-items: center; gap: 6px; justify-content: flex-end; min-width: 64px; flex-shrink: 0; }
2304
+ @media (max-width: 768px) {
2305
+ .fed-site-row { flex-wrap: wrap; }
2306
+ .fed-site-name { flex: 1 1 100%; }
2307
+ .fed-site-url { flex: 1 1 auto; }
2308
+ }
2309
+ .fed-delegation-status { display: flex; align-items: center; gap: 8px; padding: 12px 20px; font-size: 13px; color: var(--text-secondary); }
2310
+ .fed-delegation-status .checkmark { color: var(--green); font-weight: 600; }
2311
+ .fed-init-buttons { display: flex; gap: 12px; justify-content: center; padding: 8px 20px 16px; }
2312
+ .fed-init-buttons .btn { width: auto; min-width: 160px; }