@synqauth/react 0.0.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,82 +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
- .synq-input
201
+ .synq-input,
202
+ .synq-link
77
203
  ):focus-visible {
78
- outline: 2px solid var(--synq-color-primary);
204
+ outline: 2px solid var(--synq-color-primary-ink);
79
205
  outline-offset: 2px;
80
206
  }
81
207
 
208
+ /* The user button and its menu. */
209
+
82
210
  :where(.synq-user-button) {
83
211
  position: relative;
84
212
  display: inline-block;
@@ -88,39 +216,77 @@
88
216
  display: inline-flex;
89
217
  align-items: center;
90
218
  gap: 0.5rem;
91
- padding: 0.25rem 0.625rem 0.25rem 0.25rem;
219
+ padding: 0.25rem 0.75rem 0.25rem 0.25rem;
92
220
  border: 1px solid var(--synq-color-border);
93
221
  border-radius: 999px;
94
- background: var(--synq-color-background);
222
+ background: var(--synq-color-surface);
95
223
  color: inherit;
96
224
  font: inherit;
225
+ font-weight: 500;
97
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);
98
232
  }
99
233
 
234
+ /* `<Avatar size>` sets --synq-avatar-size on the element itself. */
100
235
  :where(.synq-avatar) {
101
236
  display: inline-grid;
102
237
  place-items: center;
103
- width: 2rem;
104
- 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);
105
242
  border-radius: 999px;
106
- background: var(--synq-color-primary);
107
- 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);
108
245
  font-size: 0.8125rem;
109
- font-weight: 600;
246
+ font-weight: 700;
110
247
  object-fit: cover;
111
248
  }
112
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
+
113
276
  :where(.synq-menu) {
114
277
  position: absolute;
115
278
  right: 0;
116
279
  z-index: 50;
117
280
  display: grid;
118
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));
119
285
  margin-top: 0.375rem;
120
286
  padding: 0.25rem;
121
287
  border: 1px solid var(--synq-color-border);
122
- border-radius: var(--synq-radius);
123
- background: var(--synq-color-background);
288
+ border-radius: var(--synq-radius-control);
289
+ background: var(--synq-color-surface);
124
290
  box-shadow: var(--synq-shadow);
125
291
  }
126
292
 
@@ -128,19 +294,22 @@
128
294
  display: block;
129
295
  padding: 0.5rem 0.75rem;
130
296
  border: 0;
131
- border-radius: calc(var(--synq-radius) - 0.125rem);
297
+ border-radius: calc(var(--synq-radius-control) - 0.25rem);
132
298
  background: none;
133
299
  color: inherit;
134
300
  font: inherit;
135
301
  text-align: left;
136
302
  text-decoration: none;
137
303
  cursor: pointer;
304
+ transition: background-color 150ms;
138
305
  }
139
306
 
140
307
  :where(.synq-menu-item):hover {
141
- background: var(--synq-color-surface);
308
+ background: var(--synq-color-background);
142
309
  }
143
310
 
311
+ /* Sections: one card each, a heading with an action beside it. */
312
+
144
313
  :where(.synq-account-manager) {
145
314
  display: grid;
146
315
  gap: calc(var(--synq-spacing) * 2);
@@ -148,26 +317,163 @@
148
317
 
149
318
  :where(.synq-section, .synq-wallet-manager) {
150
319
  display: grid;
151
- gap: var(--synq-spacing);
152
- padding: calc(var(--synq-spacing) * 1.5);
320
+ gap: calc(var(--synq-spacing) * 1.5);
321
+ padding: calc(var(--synq-spacing) * 2);
153
322
  border: 1px solid var(--synq-color-border);
154
323
  border-radius: var(--synq-radius);
155
- 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;
156
347
  }
157
348
 
158
349
  :where(.synq-heading) {
350
+ margin: 0;
351
+ font-size: 1.25rem;
352
+ font-weight: 700;
353
+ }
354
+
355
+ :where(.synq-subheading) {
159
356
  margin: 0;
160
357
  font-size: 1rem;
161
- font-weight: 600;
358
+ font-weight: 700;
162
359
  }
163
360
 
164
- :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) {
165
369
  display: grid;
166
370
  gap: var(--synq-spacing);
167
371
  }
168
372
 
373
+ :where(.synq-cards-grid) {
374
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
375
+ }
376
+
377
+ :where(.synq-card) {
378
+ display: grid;
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);
472
+ }
473
+
169
474
  :where(.synq-form-inline) {
170
475
  display: flex;
476
+ flex: 1 1 auto;
171
477
  flex-wrap: wrap;
172
478
  align-items: end;
173
479
  gap: 0.5rem;
@@ -175,29 +481,53 @@
175
481
 
176
482
  :where(.synq-field) {
177
483
  display: grid;
178
- gap: 0.25rem;
484
+ gap: 0.375rem;
179
485
  }
180
486
 
181
487
  :where(.synq-label) {
182
488
  color: var(--synq-color-muted);
183
489
  font-size: 0.8125rem;
490
+ font-weight: 500;
184
491
  }
185
492
 
186
493
  :where(.synq-input) {
187
- padding: 0.5rem 0.625rem;
494
+ min-height: 2.75rem;
495
+ padding: 0.5rem 0.875rem;
188
496
  border: 1px solid var(--synq-color-border);
189
- border-radius: var(--synq-radius);
497
+ border-radius: var(--synq-radius-control);
190
498
  background: var(--synq-color-background);
191
499
  color: inherit;
192
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;
193
511
  }
194
512
 
195
513
  :where(.synq-actions) {
196
514
  display: flex;
515
+ flex-wrap: wrap;
197
516
  align-items: center;
517
+ gap: 0.5rem;
518
+ }
519
+
520
+ :where(.synq-actions-split) {
521
+ justify-content: space-between;
198
522
  gap: var(--synq-spacing);
199
523
  }
200
524
 
525
+ :where(.synq-actions-split) > :where(p) {
526
+ flex: 1 1 18rem;
527
+ }
528
+
529
+ /* Lists of rows: passkeys, devices. */
530
+
201
531
  :where(.synq-list) {
202
532
  display: grid;
203
533
  margin: 0;
@@ -210,12 +540,13 @@
210
540
  flex-wrap: wrap;
211
541
  align-items: center;
212
542
  gap: 0.5rem;
213
- padding: 0.625rem 0;
543
+ padding: 0.75rem 0;
214
544
  border-top: 1px solid var(--synq-color-border);
215
545
  }
216
546
 
217
547
  :where(.synq-row):first-child {
218
548
  border-top: 0;
549
+ padding-top: 0;
219
550
  }
220
551
 
221
552
  :where(.synq-row-title) {
@@ -223,13 +554,22 @@
223
554
  font-weight: 500;
224
555
  }
225
556
 
557
+ /* Marks: teal for status, coral for the primary wallet. */
558
+
226
559
  :where(.synq-badge) {
227
- 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);
228
562
  border-radius: 999px;
229
- background: var(--synq-color-surface);
230
- color: var(--synq-color-primary);
563
+ background: color-mix(in srgb, var(--synq-color-primary) 8%, transparent);
564
+ color: var(--synq-color-primary-ink);
231
565
  font-size: 0.75rem;
232
- 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);
233
573
  }
234
574
 
235
575
  :where(.synq-muted) {
@@ -237,8 +577,1348 @@
237
577
  color: var(--synq-color-muted);
238
578
  }
239
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
+
240
587
  :where(.synq-error) {
241
588
  flex-basis: 100%;
242
589
  margin: 0;
243
590
  color: var(--synq-color-danger);
244
591
  }
592
+
593
+ :where(.synq-sign-in-form) {
594
+ max-width: 24rem;
595
+ }
596
+
597
+ :where(.synq-sign-in-form .synq-button) {
598
+ justify-content: center;
599
+ }
600
+
601
+ :where(.synq-code-input) {
602
+ font-variant-numeric: tabular-nums;
603
+ letter-spacing: 0.25em;
604
+ }
605
+
606
+ :where(.synq-link) {
607
+ padding: 0;
608
+ border: 0;
609
+ background: none;
610
+ color: var(--synq-color-primary-ink);
611
+ font: inherit;
612
+ font-weight: 500;
613
+ cursor: pointer;
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
+ }