| /* WeChat QR login dialog content. */ |
| |
| .settingsWechatQrCaption { |
| font: var(--maka-text-body); |
| margin: 0; |
| color: var(--muted-foreground); |
| } |
| |
| .settingsWechatQrBody { |
| display: grid; |
| place-items: center; |
| align-content: center; |
| gap: var(--space-3); |
| text-align: center; |
| /* Deep-review fix: the retired `.settingsWechatQrState` pane carried a |
| 180px floor; without one the dialog collapses in the generating/expired/ |
| error states and snaps taller when the QR frame arrives — the floor |
| tracks the frame token so the two cannot drift. */ |
| min-height: var(--qr-frame-size); |
| } |
| |
| .settingsWechatQrFrame { |
| /* Shared with the bot onboarding QR frame (settings/bot.css): both read |
| --qr-frame-size so the paired dialogs present one QR spec. */ |
| width: var(--qr-frame-size); |
| height: var(--qr-frame-size); |
| display: grid; |
| place-items: center; |
| border: var(--border-width-hairline) solid color-mix(in srgb, var(--brand-wechat) 20%, var(--border)); |
| border-radius: var(--radius-surface); |
| /* Paper, not a ladder tier: a QR code has to stay dark-on-light to be |
| scannable at all. See --surface-paper in maka-tokens.css. */ |
| background: var(--surface-paper); |
| padding: var(--space-3); |
| } |
| |
| .settingsWechatQrFrame img { |
| width: 100%; |
| height: 100%; |
| object-fit: contain; |
| image-rendering: pixelated; |
| } |
| |
| /* Astryx convergence (task #136): the `.settingsWechatQrState` placeholder |
| pane and its four hand-tinted `data-tone` variants are EmptyState / Spinner |
| now; only the QR frame plate and caption remain bespoke. */ |