@synqauth/react 0.2.0 → 0.3.0

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.
package/dist/styles.css CHANGED
@@ -3,83 +3,210 @@
3
3
  *
4
4
  * import '@synqauth/react/styles.css'
5
5
  *
6
- * A theme is a few variables, set on :root or any element above the
7
- * components. Every rule is inside :where(), so the app's own CSS wins over
8
- * any of them without fighting specificity. A component with `unstyled`
9
- * carries none of these classes.
6
+ * The default look is Molly's design for Synq (design/app in the synq repo):
7
+ * dark surfaces, teal actions, pill buttons, rounded cards, with a light
8
+ * counterpart when the page prefers light. A theme is a few variables, set on
9
+ * :root or any element above the components. Every rule is inside :where(),
10
+ * so the app's own CSS wins over any of them without fighting specificity. A
11
+ * component with `unstyled` carries none of these classes.
10
12
  */
11
13
 
12
14
  :where(.synq) {
13
15
  --synq-font-family: inherit;
14
16
  --synq-font-size: 0.9375rem;
15
- --synq-color-text: #0f172a;
16
- --synq-color-muted: #64748b;
17
- --synq-color-background: #ffffff;
18
- --synq-color-surface: #f8fafc;
19
- --synq-color-border: #e2e8f0;
20
- --synq-color-primary: #4f46e5;
21
- --synq-color-primary-text: #ffffff;
22
- --synq-color-danger: #dc2626;
23
- --synq-radius: 0.5rem;
17
+ --synq-color-text: #f5f5f7;
18
+ --synq-color-muted: #b8a5c9;
19
+ /* Inputs, addresses and the cards inside a section. */
20
+ --synq-color-background: #0a0612;
21
+ /* A section's own card. */
22
+ --synq-color-surface: #140a1f;
23
+ --synq-color-border: rgb(148 94 199 / 0.22);
24
+ --synq-color-primary: #5fd8ca;
25
+ --synq-color-primary-hover: #4fb8ab;
26
+ --synq-color-primary-text: #0a0612;
27
+ /* The primary color where it is text or a line, on the surfaces above. */
28
+ --synq-color-primary-ink: #5fd8ca;
29
+ /* Marks that aren't status: the primary wallet. */
30
+ --synq-color-accent: #fb7b56;
31
+ --synq-color-danger: #f23a30;
32
+ --synq-color-danger-text: #f5f5f7;
33
+ /* Cards and sections; inputs and inner cards take --synq-radius-control. Buttons are pills. */
34
+ --synq-radius: 1rem;
35
+ --synq-radius-control: 0.75rem;
24
36
  --synq-spacing: 0.75rem;
25
- --synq-shadow: 0 8px 24px rgb(15 23 42 / 0.12);
37
+ --synq-shadow: 0 12px 32px rgb(0 0 0 / 0.5);
38
+ --synq-backdrop: rgb(10 6 18 / 0.72);
39
+ /* Done, available, connected. */
40
+ --synq-color-success: #34d399;
41
+ /*
42
+ * A control that is off (AERO-2737): a flat grey, never the primary
43
+ * faded, its edge 3:1 against the surfaces and its words 4.5:1 on it.
44
+ */
45
+ --synq-color-disabled: #231a2e;
46
+ --synq-color-disabled-border: #786b8b;
47
+ --synq-color-disabled-text: #a497b3;
48
+ /* <AccountPanel>'s titles and greetings: the app's display face, if it has one. */
49
+ --synq-font-display: inherit;
50
+ /* <AvatarMoment>: the ring's three colors, and the embers'. */
51
+ --synq-moment-1: var(--synq-color-primary);
52
+ --synq-moment-2: var(--synq-color-accent);
53
+ --synq-moment-3: #f5c84c;
54
+ /* <AccountPanel>: how wide its popover is, and what it sits above. */
55
+ --synq-panel-width: 400px;
56
+ --synq-panel-z: 1000;
57
+ /* <AccountPanel>'s own corners; its cards, rows and fields follow --synq-radius and --synq-radius-control. */
58
+ --synq-radius-panel: calc(var(--synq-radius) * 1.5);
59
+ /* The plate behind a provider's full-color artwork (Google's), and the face addresses are set in. */
60
+ --synq-icon-plate: #fff;
61
+ --synq-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
62
+ /* The issuer's white provider glyphs, as they show on the panel: as they are on a dark one. */
63
+ --synq-glyph-filter: none;
26
64
 
27
65
  font-family: var(--synq-font-family);
28
66
  font-size: var(--synq-font-size);
29
67
  color: var(--synq-color-text);
30
68
  }
31
69
 
32
- @media (prefers-color-scheme: dark) {
70
+ @media (prefers-color-scheme: light) {
33
71
  :where(.synq) {
34
- --synq-color-text: #e2e8f0;
35
- --synq-color-muted: #94a3b8;
36
- --synq-color-background: #0f172a;
37
- --synq-color-surface: #1e293b;
38
- --synq-color-border: #334155;
39
- --synq-color-primary: #818cf8;
40
- --synq-color-primary-text: #0f172a;
41
- --synq-color-danger: #f87171;
42
- --synq-shadow: 0 8px 24px rgb(0 0 0 / 0.4);
72
+ --synq-color-text: #140a1f;
73
+ --synq-color-muted: #6b5a7b;
74
+ --synq-color-background: #ffffff;
75
+ --synq-color-surface: #faf7fc;
76
+ --synq-color-border: rgb(60 18 83 / 0.14);
77
+ --synq-color-primary-ink: #0f766e;
78
+ --synq-color-accent: #c2410c;
79
+ --synq-color-danger: #d92d20;
80
+ --synq-color-danger-text: #ffffff;
81
+ --synq-shadow: 0 12px 32px rgb(20 10 31 / 0.14);
82
+ --synq-backdrop: rgb(20 10 31 / 0.4);
83
+ --synq-color-success: #047857;
84
+ --synq-color-disabled: #efeaf3;
85
+ --synq-color-disabled-border: #8b7d99;
86
+ --synq-color-disabled-text: #625571;
87
+ --synq-moment-3: #d97706;
88
+ --synq-glyph-filter: invert(1);
43
89
  }
44
90
  }
45
91
 
92
+ /* Buttons: pills. Primary is solid teal with dark text; the rest are quiet outlines. */
93
+
46
94
  :where(.synq-sign-in-button, .synq-button) {
47
95
  display: inline-flex;
48
96
  align-items: center;
97
+ justify-content: center;
49
98
  gap: 0.375rem;
50
- padding: 0.5rem 0.875rem;
99
+ min-height: 2.5rem;
100
+ padding: 0.5rem 1.25rem;
51
101
  border: 1px solid var(--synq-color-border);
52
- border-radius: var(--synq-radius);
53
- background: var(--synq-color-background);
102
+ border-radius: 999px;
103
+ background: transparent;
54
104
  color: var(--synq-color-text);
55
105
  font: inherit;
56
106
  font-weight: 500;
107
+ white-space: nowrap;
57
108
  cursor: pointer;
109
+ transition:
110
+ background-color 150ms,
111
+ border-color 150ms,
112
+ color 150ms;
113
+ }
114
+
115
+ :where(.synq-button):hover:not(:disabled) {
116
+ border-color: var(--synq-color-primary-ink);
117
+ color: var(--synq-color-primary-ink);
58
118
  }
59
119
 
60
120
  :where(.synq-sign-in-button, .synq-button-primary) {
61
121
  border-color: var(--synq-color-primary);
62
122
  background: var(--synq-color-primary);
63
123
  color: var(--synq-color-primary-text);
124
+ font-weight: 700;
64
125
  }
65
126
 
66
- :where(.synq-sign-in-button, .synq-button):disabled {
67
- opacity: 0.55;
68
- cursor: not-allowed;
127
+ :where(.synq-sign-in-button, .synq-button-primary):hover:not(:disabled) {
128
+ border-color: var(--synq-color-primary-hover);
129
+ background: var(--synq-color-primary-hover);
130
+ color: var(--synq-color-primary-text);
131
+ }
132
+
133
+ :where(.synq-button-quiet) {
134
+ min-height: 2rem;
135
+ padding: 0.25rem 0.875rem;
136
+ color: var(--synq-color-muted);
137
+ }
138
+
139
+ :where(.synq-button-danger) {
140
+ border-color: var(--synq-color-danger);
141
+ background: var(--synq-color-danger);
142
+ color: var(--synq-color-danger-text);
143
+ }
144
+
145
+ :where(.synq-button-danger):hover:not(:disabled) {
146
+ border-color: var(--synq-color-danger);
147
+ background: var(--synq-color-danger);
148
+ color: var(--synq-color-danger-text);
149
+ filter: brightness(1.1);
150
+ }
151
+
152
+ :where(.synq-button-danger-outline) {
153
+ border-color: color-mix(in srgb, var(--synq-color-danger) 50%, transparent);
154
+ color: var(--synq-color-danger);
155
+ }
156
+
157
+ :where(.synq-button-danger-outline):hover:not(:disabled) {
158
+ border-color: var(--synq-color-danger);
159
+ background: var(--synq-color-danger);
160
+ color: var(--synq-color-danger-text);
161
+ }
162
+
163
+ :where(.synq-icon-button) {
164
+ display: inline-grid;
165
+ place-items: center;
166
+ flex: none;
167
+ width: 2.25rem;
168
+ height: 2.25rem;
169
+ padding: 0;
170
+ border: 1px solid var(--synq-color-border);
171
+ border-radius: var(--synq-radius-control);
172
+ background: var(--synq-color-background);
173
+ color: var(--synq-color-muted);
174
+ cursor: pointer;
175
+ transition:
176
+ border-color 150ms,
177
+ color 150ms;
178
+ }
179
+
180
+ :where(.synq-icon-button):hover:not(:disabled) {
181
+ border-color: var(--synq-color-primary-ink);
182
+ color: var(--synq-color-primary-ink);
183
+ }
184
+
185
+ :where(.synq-icon-button-danger) {
186
+ border-color: transparent;
187
+ background: transparent;
188
+ }
189
+
190
+ :where(.synq-icon-button-danger):hover:not(:disabled) {
191
+ border-color: transparent;
192
+ color: var(--synq-color-danger);
69
193
  }
70
194
 
71
195
  :where(
72
196
  .synq-sign-in-button,
73
197
  .synq-button,
198
+ .synq-icon-button,
74
199
  .synq-user-button-trigger,
75
200
  .synq-menu-item,
76
201
  .synq-input,
77
202
  .synq-link
78
203
  ):focus-visible {
79
- outline: 2px solid var(--synq-color-primary);
204
+ outline: 2px solid var(--synq-color-primary-ink);
80
205
  outline-offset: 2px;
81
206
  }
82
207
 
208
+ /* The user button and its menu. */
209
+
83
210
  :where(.synq-user-button) {
84
211
  position: relative;
85
212
  display: inline-block;
@@ -89,39 +216,77 @@
89
216
  display: inline-flex;
90
217
  align-items: center;
91
218
  gap: 0.5rem;
92
- padding: 0.25rem 0.625rem 0.25rem 0.25rem;
219
+ padding: 0.25rem 0.75rem 0.25rem 0.25rem;
93
220
  border: 1px solid var(--synq-color-border);
94
221
  border-radius: 999px;
95
- background: var(--synq-color-background);
222
+ background: var(--synq-color-surface);
96
223
  color: inherit;
97
224
  font: inherit;
225
+ font-weight: 500;
98
226
  cursor: pointer;
227
+ transition: border-color 150ms;
228
+ }
229
+
230
+ :where(.synq-user-button-trigger):hover {
231
+ border-color: var(--synq-color-primary-ink);
99
232
  }
100
233
 
234
+ /* `<Avatar size>` sets --synq-avatar-size on the element itself. */
101
235
  :where(.synq-avatar) {
102
236
  display: inline-grid;
103
237
  place-items: center;
104
- width: 2rem;
105
- height: 2rem;
238
+ flex: none;
239
+ width: var(--synq-avatar-size, 2rem);
240
+ height: var(--synq-avatar-size, 2rem);
241
+ border: 1px solid color-mix(in srgb, var(--synq-color-primary-ink) 30%, transparent);
106
242
  border-radius: 999px;
107
- background: var(--synq-color-primary);
108
- color: var(--synq-color-primary-text);
243
+ background: color-mix(in srgb, var(--synq-color-primary) 10%, transparent);
244
+ color: var(--synq-color-primary-ink);
109
245
  font-size: 0.8125rem;
110
- font-weight: 600;
246
+ font-weight: 700;
111
247
  object-fit: cover;
112
248
  }
113
249
 
250
+ /* A picture, or a default drawn as an SVG that fills the circle (AERO-2704). */
251
+ :where(.synq-avatar) {
252
+ overflow: hidden;
253
+ padding: 0;
254
+ }
255
+
256
+ :where(.synq-avatar) > :where(svg) {
257
+ display: block;
258
+ width: 100%;
259
+ height: 100%;
260
+ }
261
+
262
+ :where(.synq-picture) {
263
+ display: flex;
264
+ flex-wrap: wrap;
265
+ align-items: center;
266
+ gap: var(--synq-spacing);
267
+ }
268
+
269
+ :where(.synq-avatar-large) {
270
+ width: 5rem;
271
+ height: 5rem;
272
+ justify-self: start;
273
+ font-size: 1.75rem;
274
+ }
275
+
114
276
  :where(.synq-menu) {
115
277
  position: absolute;
116
278
  right: 0;
117
279
  z-index: 50;
118
280
  display: grid;
119
281
  min-width: 12rem;
282
+ /* UserButton moves it back on screen on a narrow window (AERO-2734). */
283
+ max-width: calc(100vw - 16px);
284
+ transform: translateX(var(--synq-menu-shift, 0px));
120
285
  margin-top: 0.375rem;
121
286
  padding: 0.25rem;
122
287
  border: 1px solid var(--synq-color-border);
123
- border-radius: var(--synq-radius);
124
- background: var(--synq-color-background);
288
+ border-radius: var(--synq-radius-control);
289
+ background: var(--synq-color-surface);
125
290
  box-shadow: var(--synq-shadow);
126
291
  }
127
292
 
@@ -129,19 +294,22 @@
129
294
  display: block;
130
295
  padding: 0.5rem 0.75rem;
131
296
  border: 0;
132
- border-radius: calc(var(--synq-radius) - 0.125rem);
297
+ border-radius: calc(var(--synq-radius-control) - 0.25rem);
133
298
  background: none;
134
299
  color: inherit;
135
300
  font: inherit;
136
301
  text-align: left;
137
302
  text-decoration: none;
138
303
  cursor: pointer;
304
+ transition: background-color 150ms;
139
305
  }
140
306
 
141
307
  :where(.synq-menu-item):hover {
142
- background: var(--synq-color-surface);
308
+ background: var(--synq-color-background);
143
309
  }
144
310
 
311
+ /* Sections: one card each, a heading with an action beside it. */
312
+
145
313
  :where(.synq-account-manager) {
146
314
  display: grid;
147
315
  gap: calc(var(--synq-spacing) * 2);
@@ -149,26 +317,163 @@
149
317
 
150
318
  :where(.synq-section, .synq-wallet-manager) {
151
319
  display: grid;
152
- gap: var(--synq-spacing);
153
- padding: calc(var(--synq-spacing) * 1.5);
320
+ gap: calc(var(--synq-spacing) * 1.5);
321
+ padding: calc(var(--synq-spacing) * 2);
154
322
  border: 1px solid var(--synq-color-border);
155
323
  border-radius: var(--synq-radius);
156
- background: var(--synq-color-background);
324
+ background: var(--synq-color-surface);
325
+ }
326
+
327
+ :where(.synq-section-danger) {
328
+ border-color: color-mix(in srgb, var(--synq-color-danger) 35%, transparent);
329
+ background: color-mix(in srgb, var(--synq-color-danger) 6%, var(--synq-color-surface));
330
+ }
331
+
332
+ :where(.synq-section-danger) :where(.synq-heading) {
333
+ color: var(--synq-color-danger);
334
+ }
335
+
336
+ :where(.synq-header) {
337
+ display: flex;
338
+ flex-wrap: wrap;
339
+ align-items: center;
340
+ justify-content: space-between;
341
+ gap: var(--synq-spacing);
342
+ }
343
+
344
+ :where(.synq-header-text) {
345
+ display: grid;
346
+ gap: 0.25rem;
157
347
  }
158
348
 
159
349
  :where(.synq-heading) {
350
+ margin: 0;
351
+ font-size: 1.25rem;
352
+ font-weight: 700;
353
+ }
354
+
355
+ :where(.synq-subheading) {
160
356
  margin: 0;
161
357
  font-size: 1rem;
162
- font-weight: 600;
358
+ font-weight: 700;
163
359
  }
164
360
 
165
- :where(.synq-form) {
361
+ :where(.synq-link-methods) {
362
+ display: grid;
363
+ gap: var(--synq-spacing);
364
+ }
365
+
366
+ /* Cards inside a section: a wallet, a way to sign in. */
367
+
368
+ :where(.synq-cards) {
369
+ display: grid;
370
+ gap: var(--synq-spacing);
371
+ }
372
+
373
+ :where(.synq-cards-grid) {
374
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
375
+ }
376
+
377
+ :where(.synq-card) {
166
378
  display: grid;
167
379
  gap: var(--synq-spacing);
380
+ padding: calc(var(--synq-spacing) * 1.5);
381
+ border: 1px solid var(--synq-color-border);
382
+ border-radius: var(--synq-radius-control);
383
+ background: var(--synq-color-background);
384
+ transition: border-color 150ms;
385
+ }
386
+
387
+ :where(.synq-card):hover {
388
+ border-color: color-mix(in srgb, var(--synq-color-primary-ink) 50%, transparent);
389
+ }
390
+
391
+ :where(.synq-card-row) {
392
+ display: flex;
393
+ align-items: center;
394
+ justify-content: space-between;
395
+ }
396
+
397
+ :where(.synq-card-head) {
398
+ display: flex;
399
+ flex-wrap: wrap;
400
+ align-items: center;
401
+ gap: 0.5rem;
402
+ }
403
+
404
+ :where(.synq-card-title) {
405
+ font-size: 1.0625rem;
406
+ font-weight: 700;
407
+ }
408
+
409
+ :where(.synq-card-foot) {
410
+ display: flex;
411
+ flex-wrap: wrap;
412
+ align-items: center;
413
+ justify-content: space-between;
414
+ gap: var(--synq-spacing);
415
+ }
416
+
417
+ :where(.synq-address) {
418
+ display: flex;
419
+ align-items: center;
420
+ gap: 0.5rem;
421
+ }
422
+
423
+ :where(.synq-code) {
424
+ flex: 1 1 auto;
425
+ min-width: 0;
426
+ padding: 0.5rem 0.875rem;
427
+ overflow: hidden;
428
+ border: 1px solid var(--synq-color-border);
429
+ border-radius: var(--synq-radius-control);
430
+ background: var(--synq-color-surface);
431
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
432
+ font-size: 0.875rem;
433
+ text-overflow: ellipsis;
434
+ white-space: nowrap;
435
+ }
436
+
437
+ :where(.synq-truncate) {
438
+ overflow: hidden;
439
+ text-overflow: ellipsis;
440
+ white-space: nowrap;
441
+ }
442
+
443
+ /* A card that is itself a button: a way to sign in they could add. */
444
+
445
+ :where(.synq-card-button) {
446
+ width: 100%;
447
+ color: inherit;
448
+ font: inherit;
449
+ text-align: left;
450
+ cursor: pointer;
451
+ }
452
+
453
+ :where(.synq-card-button):disabled {
454
+ color: var(--synq-color-disabled-text);
455
+ cursor: not-allowed;
456
+ }
457
+
458
+ :where(.synq-card-button):focus-visible {
459
+ outline: 2px solid var(--synq-color-primary-ink);
460
+ outline-offset: 2px;
461
+ }
462
+
463
+ :where(.synq-card .synq-link) {
464
+ white-space: nowrap;
465
+ }
466
+
467
+ /* Forms. */
468
+
469
+ :where(.synq-form) {
470
+ display: grid;
471
+ gap: calc(var(--synq-spacing) * 1.25);
168
472
  }
169
473
 
170
474
  :where(.synq-form-inline) {
171
475
  display: flex;
476
+ flex: 1 1 auto;
172
477
  flex-wrap: wrap;
173
478
  align-items: end;
174
479
  gap: 0.5rem;
@@ -176,29 +481,53 @@
176
481
 
177
482
  :where(.synq-field) {
178
483
  display: grid;
179
- gap: 0.25rem;
484
+ gap: 0.375rem;
180
485
  }
181
486
 
182
487
  :where(.synq-label) {
183
488
  color: var(--synq-color-muted);
184
489
  font-size: 0.8125rem;
490
+ font-weight: 500;
185
491
  }
186
492
 
187
493
  :where(.synq-input) {
188
- padding: 0.5rem 0.625rem;
494
+ min-height: 2.75rem;
495
+ padding: 0.5rem 0.875rem;
189
496
  border: 1px solid var(--synq-color-border);
190
- border-radius: var(--synq-radius);
497
+ border-radius: var(--synq-radius-control);
191
498
  background: var(--synq-color-background);
192
499
  color: inherit;
193
500
  font: inherit;
501
+ transition: border-color 150ms;
502
+ }
503
+
504
+ :where(.synq-input):focus {
505
+ border-color: color-mix(in srgb, var(--synq-color-primary-ink) 50%, transparent);
506
+ }
507
+
508
+ :where(.synq-input-confirm) {
509
+ text-align: center;
510
+ font-weight: 500;
194
511
  }
195
512
 
196
513
  :where(.synq-actions) {
197
514
  display: flex;
515
+ flex-wrap: wrap;
198
516
  align-items: center;
517
+ gap: 0.5rem;
518
+ }
519
+
520
+ :where(.synq-actions-split) {
521
+ justify-content: space-between;
199
522
  gap: var(--synq-spacing);
200
523
  }
201
524
 
525
+ :where(.synq-actions-split) > :where(p) {
526
+ flex: 1 1 18rem;
527
+ }
528
+
529
+ /* Lists of rows: passkeys, devices. */
530
+
202
531
  :where(.synq-list) {
203
532
  display: grid;
204
533
  margin: 0;
@@ -211,12 +540,13 @@
211
540
  flex-wrap: wrap;
212
541
  align-items: center;
213
542
  gap: 0.5rem;
214
- padding: 0.625rem 0;
543
+ padding: 0.75rem 0;
215
544
  border-top: 1px solid var(--synq-color-border);
216
545
  }
217
546
 
218
547
  :where(.synq-row):first-child {
219
548
  border-top: 0;
549
+ padding-top: 0;
220
550
  }
221
551
 
222
552
  :where(.synq-row-title) {
@@ -224,13 +554,22 @@
224
554
  font-weight: 500;
225
555
  }
226
556
 
557
+ /* Marks: teal for status, coral for the primary wallet. */
558
+
227
559
  :where(.synq-badge) {
228
- padding: 0.125rem 0.5rem;
560
+ padding: 0.0625rem 0.5rem;
561
+ border: 1px solid color-mix(in srgb, var(--synq-color-primary-ink) 30%, transparent);
229
562
  border-radius: 999px;
230
- background: var(--synq-color-surface);
231
- color: var(--synq-color-primary);
563
+ background: color-mix(in srgb, var(--synq-color-primary) 8%, transparent);
564
+ color: var(--synq-color-primary-ink);
232
565
  font-size: 0.75rem;
233
- font-weight: 600;
566
+ font-weight: 500;
567
+ }
568
+
569
+ :where(.synq-badge-accent) {
570
+ border-color: color-mix(in srgb, var(--synq-color-accent) 30%, transparent);
571
+ background: color-mix(in srgb, var(--synq-color-accent) 10%, transparent);
572
+ color: var(--synq-color-accent);
234
573
  }
235
574
 
236
575
  :where(.synq-muted) {
@@ -238,6 +577,13 @@
238
577
  color: var(--synq-color-muted);
239
578
  }
240
579
 
580
+ :where(.synq-empty) {
581
+ padding: calc(var(--synq-spacing) * 2);
582
+ border: 1px dashed var(--synq-color-border);
583
+ border-radius: var(--synq-radius-control);
584
+ text-align: center;
585
+ }
586
+
241
587
  :where(.synq-error) {
242
588
  flex-basis: 100%;
243
589
  margin: 0;
@@ -261,8 +607,1318 @@
261
607
  padding: 0;
262
608
  border: 0;
263
609
  background: none;
264
- color: var(--synq-color-primary);
610
+ color: var(--synq-color-primary-ink);
265
611
  font: inherit;
266
612
  font-weight: 500;
267
613
  cursor: pointer;
268
614
  }
615
+
616
+ /* Why a change failed, and a way to sign in again when that is what it needs. */
617
+
618
+ :where(.synq-failure) {
619
+ display: flex;
620
+ flex-wrap: wrap;
621
+ align-items: center;
622
+ gap: 0.5rem;
623
+ }
624
+
625
+ :where(.synq-failure) > :where(.synq-error) {
626
+ flex: 1 1 14rem;
627
+ }
628
+
629
+ /* The question asked before something goes. */
630
+
631
+ :where(.synq-dialog-backdrop) {
632
+ position: fixed;
633
+ inset: 0;
634
+ z-index: 100;
635
+ display: grid;
636
+ place-items: center;
637
+ padding: 1rem;
638
+ background: var(--synq-backdrop);
639
+ }
640
+
641
+ :where(.synq-dialog) {
642
+ display: grid;
643
+ gap: var(--synq-spacing);
644
+ width: min(28rem, 100%);
645
+ padding: calc(var(--synq-spacing) * 2);
646
+ border: 1px solid color-mix(in srgb, var(--synq-color-danger) 45%, transparent);
647
+ border-radius: var(--synq-radius);
648
+ background: var(--synq-color-surface);
649
+ box-shadow: var(--synq-shadow);
650
+ color: var(--synq-color-text);
651
+ }
652
+
653
+ :where(.synq-dialog-title) {
654
+ margin: 0;
655
+ font-size: 1.25rem;
656
+ font-weight: 700;
657
+ }
658
+
659
+ :where(.synq-dialog-actions) {
660
+ justify-content: flex-end;
661
+ margin-top: 0.25rem;
662
+ }
663
+
664
+ :where(.synq-dialog-actions) > :where(button) {
665
+ flex: 1 1 0;
666
+ }
667
+
668
+ /*
669
+ * <AccountPanel> (AERO-2696): the account button, and the panel it opens, a
670
+ * popover under it from 640px wide and a bottom sheet below. Type is never
671
+ * under 13px, body and fields are 16px, and every target is 44px or more.
672
+ */
673
+
674
+ :where(.synq-account-panel) {
675
+ position: relative;
676
+ display: inline-flex;
677
+ }
678
+
679
+ :where(.synq-account-panel-trigger) {
680
+ min-height: 44px;
681
+ padding: 0 1rem;
682
+ border: 1px solid color-mix(in srgb, var(--synq-color-text) 12%, transparent);
683
+ border-radius: 999px;
684
+ background: color-mix(in srgb, var(--synq-color-text) 8%, transparent);
685
+ color: var(--synq-color-text);
686
+ font: inherit;
687
+ font-size: 15px;
688
+ font-weight: 600;
689
+ white-space: nowrap;
690
+ cursor: pointer;
691
+ transition: background-color 150ms;
692
+ }
693
+
694
+ :where(.synq-account-panel-trigger):hover {
695
+ background: color-mix(in srgb, var(--synq-color-text) 12%, transparent);
696
+ }
697
+
698
+ :where(.synq-account-panel-avatar-trigger) {
699
+ display: grid;
700
+ place-items: center;
701
+ width: 44px;
702
+ height: 44px;
703
+ padding: 0;
704
+ border: 1px solid color-mix(in srgb, var(--synq-color-text) 12%, transparent);
705
+ border-radius: 999px;
706
+ background: transparent;
707
+ cursor: pointer;
708
+ transition: background-color 150ms;
709
+ }
710
+
711
+ :where(.synq-account-panel-avatar-trigger):hover {
712
+ background: color-mix(in srgb, var(--synq-color-text) 5%, transparent);
713
+ }
714
+
715
+ :where(.synq-account-panel-face) {
716
+ display: inline-grid;
717
+ place-items: center;
718
+ }
719
+
720
+ /* Once the button's face swaps, the new one fades in: the avatar over 200ms, "Sign in" over 160ms. */
721
+ :where(.synq-account-panel-face[data-swap='avatar']) {
722
+ animation: synq-fade-in 200ms ease-out both;
723
+ }
724
+
725
+ :where(.synq-account-panel-face[data-swap='sign-in']) {
726
+ animation: synq-fade-in 160ms ease-out both;
727
+ }
728
+
729
+ :where(.synq-account-panel-layer) {
730
+ position: fixed;
731
+ inset: 0;
732
+ z-index: var(--synq-panel-z);
733
+ pointer-events: none;
734
+ }
735
+
736
+ :where(.synq-account-panel-backdrop) {
737
+ position: absolute;
738
+ inset: 0;
739
+ background: var(--synq-backdrop);
740
+ pointer-events: auto;
741
+ animation: synq-fade-in 220ms ease-out both;
742
+ }
743
+
744
+ :where(.synq-account-panel-backdrop[data-state='closing']) {
745
+ animation: synq-fade-out 160ms ease-in both;
746
+ }
747
+
748
+ :where(.synq-account-panel-dialog) {
749
+ position: absolute;
750
+ display: flex;
751
+ flex-direction: column;
752
+ overflow: hidden;
753
+ border: 1px solid var(--synq-color-border);
754
+ background: var(--synq-color-background);
755
+ box-shadow: var(--synq-shadow);
756
+ color: var(--synq-color-text);
757
+ font-family: var(--synq-font-family);
758
+ font-size: 1rem;
759
+ line-height: 1.45;
760
+ text-align: left;
761
+ pointer-events: auto;
762
+ outline: none;
763
+ interpolate-size: allow-keywords;
764
+ transition: height 360ms cubic-bezier(0.22, 1, 0.36, 1);
765
+ }
766
+
767
+ :where(.synq-account-panel-dialog[data-layout='popover']) {
768
+ top: var(--synq-panel-top, 4rem);
769
+ right: var(--synq-panel-right, 1rem);
770
+ width: min(var(--synq-panel-width), calc(100vw - 16px));
771
+ max-height: var(--synq-panel-max-height, calc(100vh - 5rem));
772
+ border-radius: var(--synq-radius-panel);
773
+ transform-origin: top right;
774
+ }
775
+
776
+ :where(.synq-account-panel-dialog[data-layout='sheet']) {
777
+ right: 0;
778
+ bottom: 0;
779
+ left: 0;
780
+ max-height: 90vh;
781
+ max-height: 90dvh;
782
+ padding-bottom: env(safe-area-inset-bottom, 0px);
783
+ border-bottom: 0;
784
+ border-radius: var(--synq-radius-panel) var(--synq-radius-panel) 0 0;
785
+ }
786
+
787
+ /* A first sign-in's onboarding takes the room it may. */
788
+ :where(.synq-account-panel-dialog[data-layout='sheet'][data-view='onboarding']) {
789
+ height: 90vh;
790
+ height: 90dvh;
791
+ }
792
+
793
+ :where(.synq-account-panel-dialog[data-layout='popover'][data-view='onboarding']) {
794
+ height: var(--synq-panel-max-height, calc(100vh - 5rem));
795
+ }
796
+
797
+ :where(.synq-account-panel-grabber) {
798
+ display: flex;
799
+ flex-shrink: 0;
800
+ align-items: center;
801
+ justify-content: center;
802
+ height: 28px;
803
+ cursor: grab;
804
+ touch-action: none;
805
+ }
806
+
807
+ :where(.synq-account-panel-grabber) > :where(span) {
808
+ width: 36px;
809
+ height: 4px;
810
+ border-radius: 999px;
811
+ background: color-mix(in srgb, var(--synq-color-text) 18%, transparent);
812
+ }
813
+
814
+ :where(.synq-account-panel-body) {
815
+ display: grid;
816
+ flex: 1 1 auto;
817
+ align-content: start;
818
+ gap: 16px;
819
+ min-height: 0;
820
+ padding: 20px;
821
+ overflow-y: auto;
822
+ overscroll-behavior: contain;
823
+ }
824
+
825
+ :where(.synq-account-panel-dialog[data-layout='sheet']) :where(.synq-account-panel-body) {
826
+ padding-top: 4px;
827
+ }
828
+
829
+ :where(.synq-account-panel-footer) {
830
+ display: flex;
831
+ flex-shrink: 0;
832
+ flex-wrap: wrap;
833
+ gap: 8px;
834
+ padding: 12px 20px 16px;
835
+ border-top: 1px solid color-mix(in srgb, var(--synq-color-text) 6%, transparent);
836
+ background: var(--synq-color-background);
837
+ }
838
+
839
+ :where(.synq-account-panel-footer) > :where(*) {
840
+ flex: 1 1 0;
841
+ }
842
+
843
+ :where(.synq-account-panel-footer) > :where(.synq-account-panel-problem) {
844
+ flex-basis: 100%;
845
+ }
846
+
847
+ :where(.synq-account-panel-head) {
848
+ display: grid;
849
+ grid-template-columns: minmax(0, 1fr) 44px;
850
+ align-items: start;
851
+ gap: 8px;
852
+ }
853
+
854
+ :where(.synq-account-panel-head-back) {
855
+ grid-template-columns: 44px minmax(0, 1fr) 44px;
856
+ align-items: center;
857
+ }
858
+
859
+ :where(.synq-account-panel-title) {
860
+ margin: 0;
861
+ font-family: var(--synq-font-display);
862
+ font-size: 24px;
863
+ font-weight: 700;
864
+ line-height: 1.1;
865
+ text-wrap: balance;
866
+ }
867
+
868
+ :where(.synq-account-panel-title-small) {
869
+ font-size: 20px;
870
+ }
871
+
872
+ :where(.synq-account-panel-subtitle) {
873
+ margin: 4px 0 0;
874
+ color: var(--synq-color-muted);
875
+ font-size: 16px;
876
+ }
877
+
878
+ :where(.synq-account-panel-icon-button) {
879
+ display: grid;
880
+ place-items: center;
881
+ width: 44px;
882
+ height: 44px;
883
+ padding: 0;
884
+ border: 0;
885
+ border-radius: 999px;
886
+ background: color-mix(in srgb, var(--synq-color-text) 5%, transparent);
887
+ color: var(--synq-color-muted);
888
+ cursor: pointer;
889
+ transition:
890
+ background-color 150ms,
891
+ color 150ms;
892
+ }
893
+
894
+ :where(.synq-account-panel-icon-button):hover {
895
+ background: color-mix(in srgb, var(--synq-color-text) 10%, transparent);
896
+ color: var(--synq-color-text);
897
+ }
898
+
899
+ :where(.synq-account-panel-methods) {
900
+ display: grid;
901
+ gap: 10px;
902
+ }
903
+
904
+ :where(.synq-account-panel-method) {
905
+ display: grid;
906
+ gap: 6px;
907
+ }
908
+
909
+ :where(.synq-account-panel-pill) {
910
+ position: relative;
911
+ display: grid;
912
+ grid-template-columns: 24px minmax(0, 1fr) auto;
913
+ align-items: center;
914
+ gap: 12px;
915
+ width: 100%;
916
+ min-height: 48px;
917
+ padding: 0 16px;
918
+ border: 1px solid color-mix(in srgb, var(--synq-color-text) 10%, transparent);
919
+ border-radius: 999px;
920
+ background: color-mix(in srgb, var(--synq-color-text) 6%, transparent);
921
+ color: var(--synq-color-text);
922
+ font: inherit;
923
+ font-size: 16px;
924
+ font-weight: 600;
925
+ text-align: left;
926
+ cursor: pointer;
927
+ transition:
928
+ background-color 150ms,
929
+ opacity 160ms,
930
+ border-color 160ms;
931
+ }
932
+
933
+ :where(.synq-account-panel-dialog[data-layout='popover']) :where(.synq-account-panel-pill) {
934
+ min-height: 44px;
935
+ }
936
+
937
+ :where(.synq-account-panel-pill):hover:not(:disabled) {
938
+ background: color-mix(in srgb, var(--synq-color-text) 10%, transparent);
939
+ }
940
+
941
+ :where(.synq-account-panel-pill[data-busy], .synq-account-panel-row-button[data-busy]) {
942
+ border-color: color-mix(in srgb, var(--synq-moment-2) 55%, transparent);
943
+ background: color-mix(in srgb, var(--synq-moment-2) 8%, transparent);
944
+ cursor: default;
945
+ }
946
+
947
+ :where(.synq-account-panel-pill-icon) {
948
+ display: grid;
949
+ place-items: center;
950
+ width: 24px;
951
+ height: 24px;
952
+ }
953
+
954
+ :where(.synq-account-panel-icon) {
955
+ display: block;
956
+ width: 20px;
957
+ height: 20px;
958
+ border-radius: calc(var(--synq-radius-control) * 0.5);
959
+ }
960
+
961
+ :where(.synq-account-panel-icon-color) {
962
+ box-sizing: border-box;
963
+ width: 24px;
964
+ height: 24px;
965
+ padding: 2px;
966
+ border-radius: 50%;
967
+ /* Color artwork is drawn for a white button, as the hosted page has it. */
968
+ background: var(--synq-icon-plate);
969
+ }
970
+
971
+ :where(.synq-account-panel-icon-glyph) {
972
+ border-radius: 0;
973
+ filter: var(--synq-glyph-filter);
974
+ }
975
+
976
+ :where(.synq-account-panel-pill-label) {
977
+ min-width: 0;
978
+ overflow: hidden;
979
+ text-overflow: ellipsis;
980
+ white-space: nowrap;
981
+ }
982
+
983
+ :where(.synq-account-panel-last-used) {
984
+ position: absolute;
985
+ top: -9px;
986
+ right: 18px;
987
+ padding: 0 8px;
988
+ border: 1px solid color-mix(in srgb, var(--synq-color-primary-ink) 45%, transparent);
989
+ border-radius: 999px;
990
+ background: var(--synq-color-background);
991
+ color: var(--synq-color-primary-ink);
992
+ font-size: 13px;
993
+ font-weight: 600;
994
+ line-height: 16px;
995
+ white-space: nowrap;
996
+ }
997
+
998
+ :where(.synq-account-panel-row-button) :where(.synq-account-panel-last-used) {
999
+ position: static;
1000
+ }
1001
+
1002
+ :where(.synq-account-panel-dots) {
1003
+ display: inline-flex;
1004
+ gap: 4px;
1005
+ }
1006
+
1007
+ :where(.synq-account-panel-dots) > :where(i) {
1008
+ width: 6px;
1009
+ height: 6px;
1010
+ border-radius: 50%;
1011
+ background: var(--synq-moment-2);
1012
+ opacity: 0.3;
1013
+ animation: synq-dot 1.2s ease-in-out infinite;
1014
+ }
1015
+
1016
+ :where(.synq-account-panel-dots) > :where(i:nth-child(2)) {
1017
+ animation-delay: 0.15s;
1018
+ }
1019
+
1020
+ :where(.synq-account-panel-dots) > :where(i:nth-child(3)) {
1021
+ animation-delay: 0.3s;
1022
+ }
1023
+
1024
+ :where(.synq-account-panel-text-button) {
1025
+ justify-self: start;
1026
+ min-width: 44px;
1027
+ min-height: 44px;
1028
+ padding: 0 8px;
1029
+ border: 0;
1030
+ background: none;
1031
+ color: var(--synq-color-muted);
1032
+ font: inherit;
1033
+ font-size: 15px;
1034
+ font-weight: 600;
1035
+ text-decoration: underline;
1036
+ text-underline-offset: 3px;
1037
+ cursor: pointer;
1038
+ }
1039
+
1040
+ :where(.synq-account-panel-text-button):hover {
1041
+ color: var(--synq-color-text);
1042
+ }
1043
+
1044
+ :where(.synq-account-panel-cancel) {
1045
+ justify-self: center;
1046
+ }
1047
+
1048
+ :where(.synq-account-panel-more) {
1049
+ display: inline-flex;
1050
+ align-items: center;
1051
+ gap: 6px;
1052
+ padding: 0 4px;
1053
+ text-decoration: none;
1054
+ }
1055
+
1056
+ :where(.synq-account-panel-more[aria-expanded='true']) > :where(svg) {
1057
+ transform: rotate(180deg);
1058
+ }
1059
+
1060
+ :where(.synq-account-panel-wallet-hint) {
1061
+ display: flex;
1062
+ flex-wrap: wrap;
1063
+ align-items: center;
1064
+ justify-content: space-between;
1065
+ gap: 0 8px;
1066
+ padding-left: 16px;
1067
+ }
1068
+
1069
+ :where(.synq-account-panel-note) {
1070
+ margin: 0;
1071
+ color: var(--synq-color-muted);
1072
+ font-size: 15px;
1073
+ }
1074
+
1075
+ :where(.synq-account-panel-by) {
1076
+ margin: 0;
1077
+ color: var(--synq-color-muted);
1078
+ font-size: 13px;
1079
+ text-align: center;
1080
+ }
1081
+
1082
+ :where(.synq-account-panel-problem) {
1083
+ display: grid;
1084
+ grid-template-columns: 20px minmax(0, 1fr);
1085
+ align-items: start;
1086
+ gap: 8px;
1087
+ color: var(--synq-color-text);
1088
+ font-size: 15px;
1089
+ }
1090
+
1091
+ :where(.synq-account-panel-problem) > :where(svg) {
1092
+ margin-top: 1px;
1093
+ color: var(--synq-color-danger);
1094
+ }
1095
+
1096
+ :where(.synq-account-panel-problem-actions) {
1097
+ display: flex;
1098
+ flex-wrap: wrap;
1099
+ grid-column: 2;
1100
+ gap: 0 12px;
1101
+ }
1102
+
1103
+ :where(.synq-account-panel-list) {
1104
+ display: grid;
1105
+ gap: 8px;
1106
+ }
1107
+
1108
+ :where(.synq-account-panel-row-button) {
1109
+ display: grid;
1110
+ grid-template-columns: 32px minmax(0, 1fr) auto;
1111
+ align-items: center;
1112
+ gap: 12px;
1113
+ width: 100%;
1114
+ min-height: 56px;
1115
+ padding: 8px 14px;
1116
+ border: 1px solid var(--synq-color-border);
1117
+ border-radius: var(--synq-radius);
1118
+ background: color-mix(in srgb, var(--synq-color-text) 4%, transparent);
1119
+ color: var(--synq-color-text);
1120
+ font: inherit;
1121
+ text-align: left;
1122
+ cursor: pointer;
1123
+ transition: background-color 150ms;
1124
+ }
1125
+
1126
+ :where(.synq-account-panel-row-button):hover:not(:disabled) {
1127
+ background: color-mix(in srgb, var(--synq-color-text) 8%, transparent);
1128
+ }
1129
+
1130
+ :where(.synq-account-panel-row-button[data-current]) {
1131
+ border-color: color-mix(in srgb, var(--synq-color-success) 45%, transparent);
1132
+ background: color-mix(in srgb, var(--synq-color-success) 6%, transparent);
1133
+ cursor: default;
1134
+ }
1135
+
1136
+ :where(.synq-account-panel-row-icon) {
1137
+ display: grid;
1138
+ place-items: center;
1139
+ width: 32px;
1140
+ height: 32px;
1141
+ overflow: hidden;
1142
+ border-radius: calc(var(--synq-radius-control) * 0.75);
1143
+ color: var(--synq-color-muted);
1144
+ }
1145
+
1146
+ :where(.synq-account-panel-row-text) {
1147
+ display: grid;
1148
+ min-width: 0;
1149
+ }
1150
+
1151
+ :where(.synq-account-panel-row-title) {
1152
+ font-size: 16px;
1153
+ font-weight: 600;
1154
+ }
1155
+
1156
+ :where(.synq-account-panel-row-line) {
1157
+ display: inline-flex;
1158
+ flex-wrap: wrap;
1159
+ align-items: center;
1160
+ gap: 6px;
1161
+ color: var(--synq-color-muted);
1162
+ font-size: 15px;
1163
+ font-weight: 400;
1164
+ overflow-wrap: anywhere;
1165
+ }
1166
+
1167
+ :where(.synq-account-panel-showing, .synq-account-panel-ok) {
1168
+ display: inline-flex;
1169
+ align-items: center;
1170
+ gap: 6px;
1171
+ color: var(--synq-color-success);
1172
+ }
1173
+
1174
+ :where(.synq-account-panel-showing) {
1175
+ font-size: 13px;
1176
+ font-weight: 600;
1177
+ white-space: nowrap;
1178
+ }
1179
+
1180
+ :where(.synq-account-panel-bad) {
1181
+ color: var(--synq-color-danger);
1182
+ }
1183
+
1184
+ /* The greeting: the moment, and what it says. */
1185
+
1186
+ :where(.synq-account-panel-welcome) {
1187
+ position: relative;
1188
+ display: grid;
1189
+ justify-items: center;
1190
+ gap: 10px;
1191
+ padding-top: 6px;
1192
+ text-align: center;
1193
+ }
1194
+
1195
+ :where(.synq-account-panel-welcome-close) {
1196
+ position: absolute;
1197
+ top: 0;
1198
+ right: 0;
1199
+ }
1200
+
1201
+ :where(.synq-account-panel-welcome-text) {
1202
+ display: grid;
1203
+ justify-items: center;
1204
+ gap: 6px;
1205
+ }
1206
+
1207
+ :where(.synq-account-panel-greeting) {
1208
+ margin: 6px 0 0;
1209
+ font-family: var(--synq-font-display);
1210
+ font-size: 26px;
1211
+ font-weight: 700;
1212
+ line-height: 1.1;
1213
+ text-wrap: balance;
1214
+ }
1215
+
1216
+ :where(.synq-account-panel-welcome) :where(.synq-account-panel-subtitle) {
1217
+ margin: 0;
1218
+ }
1219
+
1220
+ :where(.synq-account-panel-address, .synq-account-panel-mono) {
1221
+ color: var(--synq-color-muted);
1222
+ font-family: var(--synq-font-mono);
1223
+ font-size: 14px;
1224
+ font-weight: 400;
1225
+ }
1226
+
1227
+ :where(.synq-account-panel-address) {
1228
+ margin: 0;
1229
+ }
1230
+
1231
+ /* Cards: the sections, and the app's own between them. */
1232
+
1233
+ :where(.synq-account-panel-cards) {
1234
+ display: grid;
1235
+ gap: 12px;
1236
+ }
1237
+
1238
+ :where(.synq-account-panel-dialog[data-view='onboarding'])
1239
+ :where(.synq-account-panel-cards)
1240
+ > :where(*) {
1241
+ animation: synq-rise 360ms cubic-bezier(0.22, 1, 0.36, 1) both;
1242
+ animation-delay: 600ms;
1243
+ }
1244
+
1245
+ :where(.synq-account-panel-dialog[data-view='onboarding'])
1246
+ :where(.synq-account-panel-cards)
1247
+ > :where(:nth-child(2)) {
1248
+ animation-delay: 640ms;
1249
+ }
1250
+
1251
+ :where(.synq-account-panel-dialog[data-view='onboarding'])
1252
+ :where(.synq-account-panel-cards)
1253
+ > :where(:nth-child(3)) {
1254
+ animation-delay: 680ms;
1255
+ }
1256
+
1257
+ :where(.synq-account-panel-dialog[data-view='onboarding'])
1258
+ :where(.synq-account-panel-cards)
1259
+ > :where(:nth-child(n + 4)) {
1260
+ animation-delay: 720ms;
1261
+ }
1262
+
1263
+ :where(.synq-account-panel-card) {
1264
+ display: grid;
1265
+ gap: 12px;
1266
+ margin: 0;
1267
+ padding: 16px;
1268
+ border: 1px solid var(--synq-color-border);
1269
+ border-radius: calc(var(--synq-radius) * 1.25);
1270
+ background: var(--synq-color-surface);
1271
+ }
1272
+
1273
+ :where(.synq-account-panel-card-title) {
1274
+ display: flex;
1275
+ align-items: center;
1276
+ gap: 8px;
1277
+ margin: 0;
1278
+ color: var(--synq-color-muted);
1279
+ font-size: 13px;
1280
+ font-weight: 600;
1281
+ letter-spacing: 0.08em;
1282
+ line-height: 1.3;
1283
+ text-transform: uppercase;
1284
+ }
1285
+
1286
+ :where(.synq-account-panel-count) {
1287
+ padding: 0 8px;
1288
+ border-radius: 999px;
1289
+ background: color-mix(in srgb, var(--synq-color-text) 8%, transparent);
1290
+ color: var(--synq-color-text);
1291
+ letter-spacing: 0;
1292
+ }
1293
+
1294
+ :where(.synq-account-panel-username) {
1295
+ display: flex;
1296
+ align-items: center;
1297
+ min-height: 48px;
1298
+ padding-left: 14px;
1299
+ border: 1px solid var(--synq-color-border);
1300
+ border-radius: calc(var(--synq-radius-control) * 7 / 6);
1301
+ background: color-mix(in srgb, var(--synq-color-text) 3%, transparent);
1302
+ transition: border-color 150ms;
1303
+ }
1304
+
1305
+ :where(.synq-account-panel-username):focus-within {
1306
+ border-color: var(--synq-color-primary-ink);
1307
+ }
1308
+
1309
+ :where(.synq-account-panel-username-at) {
1310
+ color: var(--synq-color-muted);
1311
+ font-size: 16px;
1312
+ font-weight: 600;
1313
+ }
1314
+
1315
+ :where(.synq-account-panel-username-input) {
1316
+ flex: 1;
1317
+ min-width: 0;
1318
+ min-height: 46px;
1319
+ padding: 0 14px 0 2px;
1320
+ border: 0;
1321
+ background: none;
1322
+ color: var(--synq-color-text);
1323
+ font: inherit;
1324
+ font-size: 16px;
1325
+ outline: none;
1326
+ }
1327
+
1328
+ :where(.synq-account-panel-inline-save) {
1329
+ min-height: 44px;
1330
+ margin-right: 1px;
1331
+ padding: 0 16px;
1332
+ border: 0;
1333
+ border-radius: 999px;
1334
+ background: var(--synq-color-primary);
1335
+ color: var(--synq-color-primary-text);
1336
+ font: inherit;
1337
+ font-size: 15px;
1338
+ font-weight: 700;
1339
+ cursor: pointer;
1340
+ }
1341
+
1342
+ :where(.synq-account-panel-status) {
1343
+ display: grid;
1344
+ gap: 8px;
1345
+ min-height: 24px;
1346
+ color: var(--synq-color-muted);
1347
+ font-size: 15px;
1348
+ }
1349
+
1350
+ :where(.synq-account-panel-chips) {
1351
+ display: flex;
1352
+ flex-wrap: wrap;
1353
+ gap: 6px;
1354
+ }
1355
+
1356
+ :where(.synq-account-panel-chip) {
1357
+ min-height: 44px;
1358
+ padding: 0 14px;
1359
+ border: 1px solid color-mix(in srgb, var(--synq-color-text) 12%, transparent);
1360
+ border-radius: 999px;
1361
+ background: none;
1362
+ color: var(--synq-color-text);
1363
+ font: inherit;
1364
+ font-size: 15px;
1365
+ font-weight: 600;
1366
+ cursor: pointer;
1367
+ }
1368
+
1369
+ :where(.synq-account-panel-field) {
1370
+ display: grid;
1371
+ gap: 6px;
1372
+ }
1373
+
1374
+ :where(.synq-account-panel-label) {
1375
+ font-size: 15px;
1376
+ font-weight: 600;
1377
+ }
1378
+
1379
+ :where(.synq-account-panel-input) {
1380
+ box-sizing: border-box;
1381
+ width: 100%;
1382
+ min-height: 48px;
1383
+ padding: 0 14px;
1384
+ border: 1px solid var(--synq-color-border);
1385
+ border-radius: calc(var(--synq-radius-control) * 7 / 6);
1386
+ background: color-mix(in srgb, var(--synq-color-text) 3%, transparent);
1387
+ color: var(--synq-color-text);
1388
+ font: inherit;
1389
+ font-size: 16px;
1390
+ }
1391
+
1392
+ :where(.synq-account-panel-actions) {
1393
+ display: flex;
1394
+ flex-wrap: wrap;
1395
+ align-items: center;
1396
+ gap: 8px;
1397
+ }
1398
+
1399
+ :where(
1400
+ .synq-account-panel-primary,
1401
+ .synq-account-panel-secondary,
1402
+ .synq-account-panel-small-button
1403
+ ) {
1404
+ display: inline-flex;
1405
+ align-items: center;
1406
+ justify-content: center;
1407
+ min-width: 44px;
1408
+ min-height: 44px;
1409
+ padding: 0 16px;
1410
+ border-radius: 999px;
1411
+ font: inherit;
1412
+ font-size: 15px;
1413
+ font-weight: 600;
1414
+ text-decoration: none;
1415
+ white-space: nowrap;
1416
+ cursor: pointer;
1417
+ }
1418
+
1419
+ :where(.synq-account-panel-primary) {
1420
+ min-height: 48px;
1421
+ padding: 0 20px;
1422
+ border: 0;
1423
+ background: var(--synq-color-primary);
1424
+ color: var(--synq-color-primary-text);
1425
+ font-size: 16px;
1426
+ font-weight: 700;
1427
+ }
1428
+
1429
+ :where(.synq-account-panel-dialog[data-layout='popover']) :where(.synq-account-panel-primary) {
1430
+ min-height: 44px;
1431
+ }
1432
+
1433
+ :where(.synq-account-panel-primary):hover:not(:disabled) {
1434
+ background: var(--synq-color-primary-hover);
1435
+ }
1436
+
1437
+ :where(.synq-account-panel-secondary, .synq-account-panel-small-button) {
1438
+ border: 1px solid color-mix(in srgb, var(--synq-color-text) 14%, transparent);
1439
+ background: color-mix(in srgb, var(--synq-color-text) 4%, transparent);
1440
+ color: var(--synq-color-text);
1441
+ }
1442
+
1443
+ :where(.synq-account-panel-secondary, .synq-account-panel-small-button):hover:not(:disabled) {
1444
+ background: color-mix(in srgb, var(--synq-color-text) 9%, transparent);
1445
+ }
1446
+
1447
+ :where(.synq-account-panel-sign-out, .synq-account-panel-danger) {
1448
+ border-color: color-mix(in srgb, var(--synq-color-danger) 50%, transparent);
1449
+ background: none;
1450
+ color: var(--synq-color-danger);
1451
+ }
1452
+
1453
+ :where(.synq-account-panel-nudge) {
1454
+ display: grid;
1455
+ grid-template-columns: minmax(0, 1fr) auto;
1456
+ align-items: center;
1457
+ gap: 10px;
1458
+ padding: 12px;
1459
+ border: 1px solid color-mix(in srgb, var(--synq-moment-3) 22%, transparent);
1460
+ border-radius: calc(var(--synq-radius-control) * 7 / 6);
1461
+ background: color-mix(in srgb, var(--synq-moment-3) 7%, transparent);
1462
+ }
1463
+
1464
+ :where(.synq-account-panel-nudge) > :where(p) {
1465
+ margin: 0;
1466
+ font-size: 15px;
1467
+ }
1468
+
1469
+ :where(.synq-account-panel-rows) {
1470
+ display: grid;
1471
+ margin: 0;
1472
+ padding: 0;
1473
+ list-style: none;
1474
+ }
1475
+
1476
+ :where(
1477
+ .synq-account-panel-wallet + .synq-account-panel-wallet,
1478
+ .synq-account-panel-link-row + .synq-account-panel-link-row
1479
+ ) {
1480
+ border-top: 1px solid color-mix(in srgb, var(--synq-color-text) 6%, transparent);
1481
+ }
1482
+
1483
+ :where(.synq-account-panel-wallet-row) {
1484
+ display: grid;
1485
+ grid-template-columns: 32px minmax(0, 1fr) auto;
1486
+ align-items: center;
1487
+ gap: 12px;
1488
+ min-height: 56px;
1489
+ }
1490
+
1491
+ :where(.synq-account-panel-wallet-icon) {
1492
+ display: grid;
1493
+ place-items: center;
1494
+ width: 32px;
1495
+ height: 32px;
1496
+ overflow: hidden;
1497
+ border-radius: calc(var(--synq-radius-control) * 0.75);
1498
+ background: color-mix(in srgb, var(--synq-color-text) 8%, transparent);
1499
+ color: var(--synq-color-muted);
1500
+ }
1501
+
1502
+ :where(.synq-account-panel-wallet-icon) > :where(img) {
1503
+ width: 32px;
1504
+ height: 32px;
1505
+ }
1506
+
1507
+ :where(.synq-account-panel-wallet-text) {
1508
+ display: grid;
1509
+ gap: 4px;
1510
+ min-width: 0;
1511
+ padding: 8px 0;
1512
+ }
1513
+
1514
+ :where(.synq-account-panel-wallet-name) {
1515
+ font-size: 16px;
1516
+ font-weight: 600;
1517
+ overflow-wrap: anywhere;
1518
+ }
1519
+
1520
+ :where(.synq-account-panel-tags) {
1521
+ display: flex;
1522
+ flex-wrap: wrap;
1523
+ gap: 4px;
1524
+ }
1525
+
1526
+ :where(.synq-account-panel-tag) {
1527
+ display: inline-flex;
1528
+ align-items: center;
1529
+ gap: 5px;
1530
+ padding: 1px 8px;
1531
+ border-radius: 999px;
1532
+ background: color-mix(in srgb, var(--synq-color-text) 6%, transparent);
1533
+ color: var(--synq-color-muted);
1534
+ font-size: 13px;
1535
+ font-weight: 600;
1536
+ line-height: 1.3;
1537
+ white-space: nowrap;
1538
+ }
1539
+
1540
+ :where(.synq-account-panel-tag-connected) > :where(i) {
1541
+ width: 6px;
1542
+ height: 6px;
1543
+ border-radius: 50%;
1544
+ background: var(--synq-color-success);
1545
+ }
1546
+
1547
+ :where(.synq-account-panel-wallet-extra) {
1548
+ color: var(--synq-color-muted);
1549
+ font-size: 14px;
1550
+ }
1551
+
1552
+ :where(.synq-account-panel-wallet-actions) {
1553
+ display: flex;
1554
+ align-items: center;
1555
+ gap: 4px;
1556
+ }
1557
+
1558
+ :where(.synq-account-panel-menu) {
1559
+ display: grid;
1560
+ margin: 0 0 12px 44px;
1561
+ overflow: hidden;
1562
+ border: 1px solid var(--synq-color-border);
1563
+ border-radius: calc(var(--synq-radius-control) * 7 / 6);
1564
+ }
1565
+
1566
+ :where(.synq-account-panel-menu-item) {
1567
+ min-height: 44px;
1568
+ padding: 0 14px;
1569
+ border: 0;
1570
+ border-top: 1px solid color-mix(in srgb, var(--synq-color-text) 6%, transparent);
1571
+ background: none;
1572
+ color: var(--synq-color-text);
1573
+ font: inherit;
1574
+ font-size: 16px;
1575
+ text-align: left;
1576
+ cursor: pointer;
1577
+ }
1578
+
1579
+ :where(.synq-account-panel-menu-item):first-child {
1580
+ border-top: 0;
1581
+ }
1582
+
1583
+ :where(.synq-account-panel-menu-item):hover:not(:disabled) {
1584
+ background: color-mix(in srgb, var(--synq-color-text) 5%, transparent);
1585
+ }
1586
+
1587
+ :where(.synq-account-panel-menu-item):disabled {
1588
+ color: var(--synq-color-muted);
1589
+ cursor: default;
1590
+ }
1591
+
1592
+ :where(.synq-account-panel-menu-danger) {
1593
+ color: var(--synq-color-danger);
1594
+ }
1595
+
1596
+ :where(.synq-account-panel-menu) > :where(.synq-account-panel-note) {
1597
+ padding: 8px 14px 12px;
1598
+ }
1599
+
1600
+ :where(.synq-account-panel-inline-form, .synq-account-panel-confirm) {
1601
+ display: grid;
1602
+ gap: 8px;
1603
+ padding: 0 0 12px 44px;
1604
+ }
1605
+
1606
+ :where(.synq-account-panel-confirm) > :where(p) {
1607
+ margin: 0;
1608
+ font-size: 15px;
1609
+ }
1610
+
1611
+ :where(.synq-account-panel-add) {
1612
+ display: flex;
1613
+ align-items: center;
1614
+ gap: 10px;
1615
+ width: 100%;
1616
+ min-height: 48px;
1617
+ padding: 0 14px;
1618
+ border: 1px dashed color-mix(in srgb, var(--synq-color-text) 18%, transparent);
1619
+ border-radius: calc(var(--synq-radius-control) * 7 / 6);
1620
+ background: none;
1621
+ color: var(--synq-color-text);
1622
+ font: inherit;
1623
+ font-size: 16px;
1624
+ font-weight: 600;
1625
+ cursor: pointer;
1626
+ }
1627
+
1628
+ :where(.synq-account-panel-add):hover:not(:disabled) {
1629
+ background: color-mix(in srgb, var(--synq-color-text) 4%, transparent);
1630
+ }
1631
+
1632
+ :where(.synq-account-panel-link-row) {
1633
+ display: grid;
1634
+ grid-template-columns: 40px minmax(0, 1fr) auto;
1635
+ align-items: center;
1636
+ gap: 12px;
1637
+ min-height: 64px;
1638
+ }
1639
+
1640
+ :where(.synq-account-panel-link-tile) {
1641
+ display: grid;
1642
+ place-items: center;
1643
+ width: 40px;
1644
+ height: 40px;
1645
+ border-radius: var(--synq-radius-control);
1646
+ background: color-mix(in srgb, var(--synq-color-text) 8%, transparent);
1647
+ color: var(--synq-color-text);
1648
+ }
1649
+
1650
+ :where(.synq-account-panel-row-problem) {
1651
+ grid-column: 1 / -1;
1652
+ padding-bottom: 12px;
1653
+ }
1654
+
1655
+ :where(.synq-account-panel-profile-head) {
1656
+ display: grid;
1657
+ grid-template-columns: 56px minmax(0, 1fr) auto 44px;
1658
+ align-items: center;
1659
+ gap: 12px;
1660
+ }
1661
+
1662
+ :where(.synq-account-panel-picture-button) {
1663
+ position: relative;
1664
+ display: grid;
1665
+ place-items: center;
1666
+ width: 56px;
1667
+ height: 56px;
1668
+ padding: 0;
1669
+ border: 0;
1670
+ border-radius: 50%;
1671
+ background: none;
1672
+ cursor: pointer;
1673
+ }
1674
+
1675
+ :where(.synq-account-panel-picture-badge) {
1676
+ position: absolute;
1677
+ right: -3px;
1678
+ bottom: -3px;
1679
+ display: grid;
1680
+ place-items: center;
1681
+ width: 24px;
1682
+ height: 24px;
1683
+ border-radius: 50%;
1684
+ background: var(--synq-color-surface);
1685
+ box-shadow: 0 0 0 2px var(--synq-color-background);
1686
+ color: var(--synq-color-text);
1687
+ }
1688
+
1689
+ :where(.synq-account-panel-profile-text) {
1690
+ min-width: 0;
1691
+ }
1692
+
1693
+ :where(.synq-account-panel-profile-name) {
1694
+ margin: 0;
1695
+ font-size: 18px;
1696
+ font-weight: 600;
1697
+ line-height: 1.25;
1698
+ overflow-wrap: anywhere;
1699
+ }
1700
+
1701
+ :where(.synq-account-panel-profile-text) :where(.synq-account-panel-subtitle) {
1702
+ margin: 0;
1703
+ overflow: hidden;
1704
+ text-overflow: ellipsis;
1705
+ white-space: nowrap;
1706
+ }
1707
+
1708
+ :where(.synq-account-panel-picture-now) {
1709
+ display: grid;
1710
+ justify-items: center;
1711
+ gap: 10px;
1712
+ padding: 2px 0 4px;
1713
+ text-align: center;
1714
+ }
1715
+
1716
+ /* The forms an in-place sign-in borrows from <SignInForm>, at the panel's sizes. */
1717
+ :where(.synq-account-panel-dialog) :where(.synq-input) {
1718
+ min-height: 48px;
1719
+ font-size: 16px;
1720
+ }
1721
+
1722
+ :where(.synq-account-panel-dialog) :where(.synq-button) {
1723
+ min-height: 44px;
1724
+ }
1725
+
1726
+ :where(.synq-account-panel-dialog) :where(.synq-label) {
1727
+ font-size: 15px;
1728
+ }
1729
+
1730
+ :where(
1731
+ .synq-account-panel-trigger,
1732
+ .synq-account-panel-avatar-trigger,
1733
+ .synq-account-panel-icon-button,
1734
+ .synq-account-panel-pill,
1735
+ .synq-account-panel-text-button,
1736
+ .synq-account-panel-row-button,
1737
+ .synq-account-panel-chip,
1738
+ .synq-account-panel-inline-save,
1739
+ .synq-account-panel-primary,
1740
+ .synq-account-panel-secondary,
1741
+ .synq-account-panel-small-button,
1742
+ .synq-account-panel-menu-item,
1743
+ .synq-account-panel-add,
1744
+ .synq-account-panel-picture-button,
1745
+ .synq-account-panel-input
1746
+ ):focus-visible {
1747
+ outline: 2px solid var(--synq-color-primary-ink);
1748
+ outline-offset: 2px;
1749
+ }
1750
+
1751
+ /*
1752
+ * <AvatarMoment>: a 2px ring 4px outside the avatar, a conic sweep of the
1753
+ * three moment colors, and embers off its upper arc.
1754
+ */
1755
+
1756
+ @property --synq-moment-sweep {
1757
+ syntax: '<angle>';
1758
+ inherits: false;
1759
+ initial-value: 360deg;
1760
+ }
1761
+
1762
+ :where(.synq-moment) {
1763
+ position: relative;
1764
+ display: inline-grid;
1765
+ flex: none;
1766
+ place-items: center;
1767
+ width: var(--synq-moment-size, 64px);
1768
+ height: var(--synq-moment-size, 64px);
1769
+ }
1770
+
1771
+ :where(.synq-moment-ring) {
1772
+ position: absolute;
1773
+ inset: -4px;
1774
+ border-radius: 50%;
1775
+ background: conic-gradient(
1776
+ from 210deg,
1777
+ var(--synq-moment-1),
1778
+ var(--synq-moment-2),
1779
+ var(--synq-moment-3),
1780
+ var(--synq-moment-1)
1781
+ );
1782
+ mask:
1783
+ radial-gradient(farthest-side, transparent calc(100% - 2px), #000 calc(100% - 2px)),
1784
+ conic-gradient(#000 var(--synq-moment-sweep, 360deg), transparent 0);
1785
+ mask-composite: intersect;
1786
+ pointer-events: none;
1787
+ }
1788
+
1789
+ :where(.synq-moment-ring[data-state='waiting']) {
1790
+ --synq-moment-sweep: 0deg;
1791
+ }
1792
+
1793
+ :where(.synq-moment-ring[data-state='play']) {
1794
+ animation: synq-moment-sweep 520ms cubic-bezier(0.33, 1, 0.68, 1) both;
1795
+ }
1796
+
1797
+ :where(.synq-moment-embers) {
1798
+ position: absolute;
1799
+ top: 50%;
1800
+ left: 50%;
1801
+ width: 0;
1802
+ height: 0;
1803
+ pointer-events: none;
1804
+ }
1805
+
1806
+ :where(.synq-moment-ember) {
1807
+ position: absolute;
1808
+ top: var(--synq-ember-y);
1809
+ left: var(--synq-ember-x);
1810
+ width: var(--synq-ember-size);
1811
+ height: var(--synq-ember-size);
1812
+ border-radius: 50%;
1813
+ background: var(--synq-ember-color);
1814
+ box-shadow: 0 0 6px var(--synq-ember-color);
1815
+ opacity: 0;
1816
+ animation: synq-ember 620ms ease-out var(--synq-ember-delay) forwards;
1817
+ }
1818
+
1819
+ @keyframes synq-moment-sweep {
1820
+ from {
1821
+ --synq-moment-sweep: 0deg;
1822
+ }
1823
+ to {
1824
+ --synq-moment-sweep: 360deg;
1825
+ }
1826
+ }
1827
+
1828
+ @keyframes synq-ember {
1829
+ from {
1830
+ opacity: 1;
1831
+ transform: translate(0, 0) scale(1);
1832
+ }
1833
+ to {
1834
+ opacity: 0;
1835
+ transform: translate(var(--synq-ember-dx), var(--synq-ember-dy)) scale(0.4);
1836
+ }
1837
+ }
1838
+
1839
+ @keyframes synq-dot {
1840
+ 50% {
1841
+ opacity: 1;
1842
+ }
1843
+ }
1844
+
1845
+ @keyframes synq-rise {
1846
+ from {
1847
+ opacity: 0;
1848
+ transform: translateY(8px);
1849
+ }
1850
+ }
1851
+
1852
+ @keyframes synq-fade-in {
1853
+ from {
1854
+ opacity: 0;
1855
+ }
1856
+ }
1857
+
1858
+ @keyframes synq-fade-out {
1859
+ to {
1860
+ opacity: 0;
1861
+ }
1862
+ }
1863
+
1864
+ @media (prefers-reduced-motion: reduce) {
1865
+ :where(.synq *) {
1866
+ transition: none;
1867
+ }
1868
+
1869
+ :where(.synq-account-panel-dots) > :where(i) {
1870
+ animation: none;
1871
+ opacity: 1;
1872
+ }
1873
+
1874
+ :where(.synq-account-panel-face) {
1875
+ animation: none;
1876
+ }
1877
+
1878
+ :where(.synq-account-panel-dialog[data-view='onboarding'])
1879
+ :where(.synq-account-panel-cards)
1880
+ > :where(*) {
1881
+ animation: none;
1882
+ }
1883
+
1884
+ :where(.synq-account-panel-backdrop) {
1885
+ animation-duration: 120ms;
1886
+ }
1887
+
1888
+ :where(.synq-moment-ring) {
1889
+ animation: none;
1890
+ }
1891
+
1892
+ :where(.synq-moment-embers) {
1893
+ display: none;
1894
+ }
1895
+ }
1896
+
1897
+ /*
1898
+ * Off (AERO-2737): every button reads as off and stays legible, whatever
1899
+ * it was (the primary's teal, a danger red, an outline): a flat grey with
1900
+ * its own edge and words, from --synq-color-disabled*, never the colour
1901
+ * faded, which on a dark surface turned the primary into a muddy teal with
1902
+ * dark words that looked broken. Last in the file, so it wins over each
1903
+ * variant, all inside :where().
1904
+ */
1905
+ :where(
1906
+ .synq-sign-in-button,
1907
+ .synq-button,
1908
+ .synq-icon-button,
1909
+ .synq-account-panel-pill,
1910
+ .synq-account-panel-row-button,
1911
+ .synq-account-panel-primary,
1912
+ .synq-account-panel-secondary,
1913
+ .synq-account-panel-small-button,
1914
+ .synq-account-panel-add
1915
+ ):disabled {
1916
+ border-color: var(--synq-color-disabled-border);
1917
+ /* Its edge, also where the button draws no border of its own. */
1918
+ box-shadow: inset 0 0 0 1px var(--synq-color-disabled-border);
1919
+ background: var(--synq-color-disabled);
1920
+ color: var(--synq-color-disabled-text);
1921
+ opacity: 1;
1922
+ filter: none;
1923
+ cursor: not-allowed;
1924
+ }