viveworker 0.7.0-beta.1 → 0.7.0-beta.2

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/web/app.css CHANGED
@@ -653,6 +653,22 @@ code {
653
653
  color: rgba(255, 210, 110, 0.95);
654
654
  }
655
655
 
656
+ .settings-compose-badge--read {
657
+ background: rgba(91, 203, 255, 0.16);
658
+ color: rgba(162, 230, 255, 0.95);
659
+ }
660
+
661
+ .settings-compose-badge--write {
662
+ background: rgba(112, 229, 164, 0.16);
663
+ color: rgba(176, 244, 207, 0.94);
664
+ }
665
+
666
+ .settings-compose-badge--lane {
667
+ background: rgba(255, 255, 255, 0.05);
668
+ color: rgba(220, 232, 240, 0.9);
669
+ box-shadow: inset 0 0 0 1px rgba(156, 181, 197, 0.12);
670
+ }
671
+
656
672
  .settings-compose-entry {
657
673
  display: flex;
658
674
  flex-direction: column;
@@ -699,6 +715,18 @@ code {
699
715
  box-shadow: inset 0 0 0 1px rgba(121, 196, 255, 0.14);
700
716
  }
701
717
 
718
+ .settings-icon-entry__icon--read {
719
+ color: rgba(91, 203, 255, 0.92);
720
+ background: rgba(91, 203, 255, 0.11);
721
+ box-shadow: inset 0 0 0 1px rgba(91, 203, 255, 0.14);
722
+ }
723
+
724
+ .settings-icon-entry__icon--write {
725
+ color: rgba(112, 229, 164, 0.92);
726
+ background: rgba(112, 229, 164, 0.11);
727
+ box-shadow: inset 0 0 0 1px rgba(112, 229, 164, 0.16);
728
+ }
729
+
702
730
  .settings-icon-entry__icon svg,
703
731
  .settings-share-file-entry__icon svg {
704
732
  width: 0.95rem;
@@ -732,6 +760,77 @@ code {
732
760
  margin-left: auto;
733
761
  }
734
762
 
763
+ .settings-icon-entry__title-row .settings-compose-badge + .settings-compose-badge,
764
+ .settings-share-file-entry__title-row .settings-compose-badge + .settings-compose-badge {
765
+ margin-left: 0;
766
+ }
767
+
768
+ .settings-autopilot-entry {
769
+ width: 100%;
770
+ border: 0;
771
+ background: transparent;
772
+ color: inherit;
773
+ text-align: left;
774
+ cursor: pointer;
775
+ -webkit-tap-highlight-color: transparent;
776
+ }
777
+
778
+ .settings-autopilot-entry:active {
779
+ background: rgba(255, 255, 255, 0.035);
780
+ }
781
+
782
+ .settings-autopilot-entry__meta,
783
+ .settings-autopilot-entry__thread {
784
+ color: rgba(231, 243, 250, 0.62);
785
+ font-size: 0.79rem;
786
+ line-height: 1.4;
787
+ }
788
+
789
+ .settings-autopilot-entry__thread {
790
+ color: rgba(231, 243, 250, 0.48);
791
+ }
792
+
793
+ .settings-suggestion-card {
794
+ display: grid;
795
+ gap: 0.72rem;
796
+ padding: 0.95rem 1rem;
797
+ border-radius: 18px;
798
+ background: rgba(255, 255, 255, 0.035);
799
+ border: 1px solid rgba(156, 181, 197, 0.1);
800
+ }
801
+
802
+ .settings-suggestion-card__header {
803
+ display: grid;
804
+ grid-template-columns: minmax(0, 1fr) auto;
805
+ gap: 0.7rem;
806
+ align-items: start;
807
+ }
808
+
809
+ .settings-suggestion-card__title,
810
+ .settings-suggestion-card__body {
811
+ margin: 0;
812
+ }
813
+
814
+ .settings-suggestion-card__title {
815
+ font-size: 0.95rem;
816
+ line-height: 1.35;
817
+ color: var(--text);
818
+ }
819
+
820
+ .settings-suggestion-card__body {
821
+ color: var(--muted);
822
+ font-size: 0.84rem;
823
+ line-height: 1.5;
824
+ }
825
+
826
+ .settings-suggestion-card__action {
827
+ min-height: 2.2rem;
828
+ padding: 0.55rem 0.85rem;
829
+ border-radius: 14px;
830
+ font-size: 0.84rem;
831
+ white-space: nowrap;
832
+ }
833
+
735
834
  .settings-compose-entry + .settings-compose-entry {
736
835
  border-top: 1px solid rgba(255, 255, 255, 0.06);
737
836
  }
@@ -1009,6 +1108,565 @@ code {
1009
1108
  margin-top: 0.95rem;
1010
1109
  }
1011
1110
 
1111
+ .wallet-flow-banner {
1112
+ gap: 0.35rem;
1113
+ }
1114
+
1115
+ .wallet-flow-banner--ready {
1116
+ border-color: rgba(121, 196, 255, 0.2);
1117
+ background: linear-gradient(180deg, rgba(28, 40, 49, 0.98), rgba(20, 27, 34, 0.96));
1118
+ }
1119
+
1120
+ .wallet-flow-banner__eyebrow {
1121
+ margin: 0;
1122
+ font-size: 0.72rem;
1123
+ letter-spacing: 0.05em;
1124
+ text-transform: uppercase;
1125
+ color: rgba(121, 196, 255, 0.82);
1126
+ }
1127
+
1128
+ .wallet-flow-banner__title {
1129
+ margin: 0;
1130
+ font-size: 1rem;
1131
+ line-height: 1.35;
1132
+ color: var(--text);
1133
+ }
1134
+
1135
+ .wallet-flow-banner__copy {
1136
+ margin: 0;
1137
+ }
1138
+
1139
+ /* The agent-payout address is the single most actionable fact in the ready
1140
+ banner — rendered larger than copy, in a mono font, with a subtle
1141
+ highlight so it's unmistakable as "the wallet agents will use". Rendered
1142
+ as a <button> so a single tap copies it; the clipboard icon swaps to a
1143
+ check mark for ~1.5s via the `.is-copied` class (applied from JS). No
1144
+ hover / focus-ring styling on the button itself — on iOS the sticky
1145
+ hover state + focus-visible kept flashing the border each tap, so we
1146
+ leave the box static and let only the icon transition give feedback. */
1147
+ .wallet-flow-banner__address {
1148
+ display: flex;
1149
+ align-items: center;
1150
+ gap: 0.55rem;
1151
+ width: 100%;
1152
+ margin: 0.25rem 0 0;
1153
+ padding: 0.55rem 0.7rem;
1154
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1155
+ font-size: 0.88rem;
1156
+ letter-spacing: 0.03em;
1157
+ line-height: 1.35;
1158
+ color: #e9f7ff;
1159
+ background: rgba(121, 196, 255, 0.08);
1160
+ border: 1px solid rgba(121, 196, 255, 0.18);
1161
+ border-radius: 10px;
1162
+ cursor: pointer;
1163
+ text-align: left;
1164
+ -webkit-tap-highlight-color: transparent;
1165
+ outline: none;
1166
+ /* Tap copies via the clipboard API — we don't need the browser to also
1167
+ range-select the text on tap (previously `user-select: all` on the
1168
+ inner span, which caused an ugly blue highlight to flash every tap
1169
+ on iOS). Copy works without any selection. */
1170
+ user-select: none;
1171
+ -webkit-user-select: none;
1172
+ }
1173
+
1174
+ .wallet-flow-banner__address:focus {
1175
+ outline: none;
1176
+ }
1177
+
1178
+ .wallet-flow-banner__address-text {
1179
+ flex: 1;
1180
+ overflow-wrap: anywhere;
1181
+ }
1182
+
1183
+ /* Stack both icons in the same slot (one is absolutely-positioned on top)
1184
+ and cross-fade via the `.is-copied` toggle so the button layout doesn't
1185
+ jump when the mark flips. */
1186
+ .wallet-flow-banner__address-icon-slot {
1187
+ position: relative;
1188
+ width: 1.1rem;
1189
+ height: 1.1rem;
1190
+ flex-shrink: 0;
1191
+ }
1192
+
1193
+ .wallet-flow-banner__address-icon {
1194
+ position: absolute;
1195
+ inset: 0;
1196
+ display: inline-flex;
1197
+ align-items: center;
1198
+ justify-content: center;
1199
+ color: rgba(233, 247, 255, 0.78);
1200
+ transition: opacity 0.18s ease;
1201
+ }
1202
+
1203
+ .wallet-flow-banner__address-icon svg {
1204
+ width: 100%;
1205
+ height: 100%;
1206
+ }
1207
+
1208
+ .wallet-flow-banner__address-icon--check {
1209
+ opacity: 0;
1210
+ color: #7fe0a8;
1211
+ pointer-events: none;
1212
+ }
1213
+
1214
+ .wallet-flow-banner__address.is-copied .wallet-flow-banner__address-icon--copy {
1215
+ opacity: 0;
1216
+ }
1217
+
1218
+ .wallet-flow-banner__address.is-copied .wallet-flow-banner__address-icon--check {
1219
+ opacity: 1;
1220
+ }
1221
+
1222
+ .wallet-flow-message {
1223
+ border-color: rgba(156, 181, 197, 0.14);
1224
+ }
1225
+
1226
+ .wallet-flow-message--notice {
1227
+ background: rgba(31, 41, 50, 0.96);
1228
+ }
1229
+
1230
+ .wallet-flow-message--error {
1231
+ border-color: rgba(255, 140, 140, 0.18);
1232
+ background: rgba(53, 26, 29, 0.96);
1233
+ }
1234
+
1235
+ /* Brand attribution at the very bottom of the wallet settings page.
1236
+ Sits below the advanced-actions panel as plain small text so it reads
1237
+ as a credit, not another card. The link inherits the muted color and
1238
+ only brightens on hover/focus so it doesn't compete with the Sign out
1239
+ button for attention. */
1240
+ .wallet-powered-by {
1241
+ margin: 0.75rem 0 0;
1242
+ text-align: center;
1243
+ font-size: 0.75rem;
1244
+ letter-spacing: 0.02em;
1245
+ color: rgba(233, 247, 255, 0.45);
1246
+ }
1247
+
1248
+ .wallet-powered-by a {
1249
+ color: inherit;
1250
+ text-decoration: underline;
1251
+ text-decoration-color: rgba(233, 247, 255, 0.22);
1252
+ text-underline-offset: 2px;
1253
+ transition: color 0.15s ease, text-decoration-color 0.15s ease;
1254
+ }
1255
+
1256
+ .wallet-powered-by a:hover,
1257
+ .wallet-powered-by a:focus-visible {
1258
+ color: rgba(233, 247, 255, 0.85);
1259
+ text-decoration-color: rgba(233, 247, 255, 0.6);
1260
+ outline: none;
1261
+ }
1262
+
1263
+ /* Wraps the banner + notice + step list on the wallet settings page.
1264
+ Pulled out of `renderSettingsGroup`'s `.settings-list` so each child card
1265
+ renders on the page background instead of nested inside another frame. */
1266
+ .wallet-setup-stack {
1267
+ display: grid;
1268
+ gap: 0.85rem;
1269
+ }
1270
+
1271
+ .wallet-step-list {
1272
+ display: grid;
1273
+ gap: 0.85rem;
1274
+ }
1275
+
1276
+ .wallet-step-card {
1277
+ display: grid;
1278
+ gap: 0.8rem;
1279
+ padding: 0.95rem;
1280
+ border: 1px solid rgba(156, 181, 197, 0.08);
1281
+ border-radius: 18px;
1282
+ background: rgba(22, 28, 35, 0.96);
1283
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.1);
1284
+ }
1285
+
1286
+ .wallet-step-card--current {
1287
+ border-color: rgba(121, 196, 255, 0.28);
1288
+ box-shadow: 0 12px 26px rgba(0, 0, 0, 0.16);
1289
+ }
1290
+
1291
+ .wallet-step-card--complete {
1292
+ border-color: rgba(112, 202, 157, 0.16);
1293
+ }
1294
+
1295
+ .wallet-step-card--locked {
1296
+ opacity: 0.78;
1297
+ }
1298
+
1299
+ .wallet-step-card__header {
1300
+ display: flex;
1301
+ justify-content: space-between;
1302
+ gap: 0.8rem;
1303
+ align-items: flex-start;
1304
+ }
1305
+
1306
+ .wallet-step-card__headline {
1307
+ min-width: 0;
1308
+ display: flex;
1309
+ gap: 0.62rem;
1310
+ align-items: flex-start;
1311
+ }
1312
+
1313
+ .wallet-step-card__icon {
1314
+ width: 2rem;
1315
+ height: 2rem;
1316
+ display: inline-flex;
1317
+ align-items: center;
1318
+ justify-content: center;
1319
+ border-radius: 12px;
1320
+ background: rgba(121, 196, 255, 0.11);
1321
+ color: #e9f7ff;
1322
+ flex: 0 0 auto;
1323
+ }
1324
+
1325
+ .wallet-step-card__icon svg {
1326
+ width: 1rem;
1327
+ height: 1rem;
1328
+ }
1329
+
1330
+ .wallet-step-card__title-wrap {
1331
+ min-width: 0;
1332
+ display: grid;
1333
+ gap: 0.18rem;
1334
+ }
1335
+
1336
+ .wallet-step-card__eyebrow {
1337
+ margin: 0;
1338
+ font-size: 0.72rem;
1339
+ letter-spacing: 0.05em;
1340
+ text-transform: uppercase;
1341
+ color: rgba(205, 220, 231, 0.5);
1342
+ }
1343
+
1344
+ .wallet-step-card__title {
1345
+ margin: 0;
1346
+ font-size: 1rem;
1347
+ line-height: 1.3;
1348
+ color: var(--text);
1349
+ }
1350
+
1351
+ .wallet-step-card__status {
1352
+ display: inline-flex;
1353
+ align-items: center;
1354
+ gap: 0.36rem;
1355
+ min-height: 1.75rem;
1356
+ padding: 0.22rem 0.68rem;
1357
+ border-radius: 999px;
1358
+ border: 1px solid rgba(156, 181, 197, 0.12);
1359
+ background: rgba(255, 255, 255, 0.05);
1360
+ color: rgba(231, 243, 250, 0.82);
1361
+ font-size: 0.76rem;
1362
+ font-weight: 600;
1363
+ white-space: nowrap;
1364
+ }
1365
+
1366
+ .wallet-step-card__status--current {
1367
+ border-color: rgba(121, 196, 255, 0.24);
1368
+ background: rgba(121, 196, 255, 0.12);
1369
+ color: #dcf1ff;
1370
+ }
1371
+
1372
+ .wallet-step-card__status--complete {
1373
+ border-color: rgba(112, 202, 157, 0.24);
1374
+ background: rgba(112, 202, 157, 0.12);
1375
+ color: #ddfbea;
1376
+ }
1377
+
1378
+ .wallet-step-card__status--locked {
1379
+ color: rgba(205, 220, 231, 0.6);
1380
+ }
1381
+
1382
+ .wallet-step-card__status--optional {
1383
+ border-color: rgba(240, 180, 40, 0.22);
1384
+ background: rgba(240, 180, 40, 0.12);
1385
+ color: rgba(255, 220, 140, 0.96);
1386
+ }
1387
+
1388
+ .wallet-step-card__status-icon {
1389
+ width: 0.82rem;
1390
+ height: 0.82rem;
1391
+ display: inline-flex;
1392
+ align-items: center;
1393
+ justify-content: center;
1394
+ }
1395
+
1396
+ .wallet-step-card__status-icon svg {
1397
+ width: 0.82rem;
1398
+ height: 0.82rem;
1399
+ }
1400
+
1401
+ .wallet-step-card__copy,
1402
+ .wallet-step-card__detail {
1403
+ margin: 0;
1404
+ }
1405
+
1406
+ .wallet-step-card__copy {
1407
+ color: var(--muted);
1408
+ font-size: 0.88rem;
1409
+ line-height: 1.5;
1410
+ }
1411
+
1412
+ .wallet-step-card__detail {
1413
+ padding: 0.78rem 0.85rem;
1414
+ border-radius: 14px;
1415
+ background: rgba(255, 255, 255, 0.035);
1416
+ border: 1px solid rgba(156, 181, 197, 0.08);
1417
+ color: rgba(231, 243, 250, 0.82);
1418
+ font-size: 0.83rem;
1419
+ line-height: 1.45;
1420
+ overflow-wrap: anywhere;
1421
+ }
1422
+
1423
+ .wallet-step-card__detail--mono {
1424
+ font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1425
+ font-size: 0.8rem;
1426
+ }
1427
+
1428
+ /* Inline input form placed above the action button (e.g. email + OTP code
1429
+ during wallet sign-in). Progressive disclosure: the OTP field is only
1430
+ rendered once the send step succeeds, so the grid just grows. */
1431
+ .wallet-step-card__form {
1432
+ display: grid;
1433
+ gap: 0.65rem;
1434
+ }
1435
+
1436
+ .wallet-step-card__field {
1437
+ display: grid;
1438
+ gap: 0.3rem;
1439
+ }
1440
+
1441
+ /* Row variant: label on the left, inline action link (e.g. "Change email")
1442
+ on the right. Used when the field is locked but still editable via an
1443
+ explicit escape hatch. */
1444
+ .wallet-step-card__field-label-row {
1445
+ display: flex;
1446
+ align-items: baseline;
1447
+ justify-content: space-between;
1448
+ gap: 0.6rem;
1449
+ }
1450
+
1451
+ .wallet-step-card__field-label {
1452
+ font-size: 0.72rem;
1453
+ font-weight: 600;
1454
+ letter-spacing: 0.04em;
1455
+ color: var(--muted);
1456
+ text-transform: uppercase;
1457
+ }
1458
+
1459
+ .wallet-step-card__field-link {
1460
+ border: 0;
1461
+ background: transparent;
1462
+ padding: 0;
1463
+ margin: 0;
1464
+ color: rgba(147, 220, 182, 0.92);
1465
+ font: inherit;
1466
+ font-size: 0.78rem;
1467
+ font-weight: 500;
1468
+ letter-spacing: 0.01em;
1469
+ cursor: pointer;
1470
+ text-decoration: underline;
1471
+ text-underline-offset: 2px;
1472
+ text-decoration-thickness: 1px;
1473
+ text-decoration-color: rgba(147, 220, 182, 0.45);
1474
+ transition: color 0.12s ease, text-decoration-color 0.12s ease;
1475
+ }
1476
+
1477
+ .wallet-step-card__field-link:hover,
1478
+ .wallet-step-card__field-link:focus-visible {
1479
+ color: #ddfbea;
1480
+ text-decoration-color: rgba(221, 251, 234, 0.85);
1481
+ outline: none;
1482
+ }
1483
+
1484
+ .wallet-step-card__field-input {
1485
+ width: 100%;
1486
+ padding: 0.58rem 0.75rem;
1487
+ border-radius: 0.55rem;
1488
+ border: 1px solid var(--line-strong);
1489
+ background: rgba(7, 12, 16, 0.72);
1490
+ color: var(--text);
1491
+ font: inherit;
1492
+ line-height: 1.4;
1493
+ transition: border-color 0.12s ease, box-shadow 0.12s ease, background 0.12s ease;
1494
+ }
1495
+
1496
+ .wallet-step-card__field-input::placeholder {
1497
+ color: rgba(205, 220, 231, 0.38);
1498
+ }
1499
+
1500
+ .wallet-step-card__field-input:focus {
1501
+ outline: none;
1502
+ border-color: rgba(112, 202, 157, 0.55);
1503
+ background: rgba(7, 12, 16, 0.92);
1504
+ box-shadow: 0 0 0 3px rgba(47, 143, 103, 0.22);
1505
+ }
1506
+
1507
+ .wallet-step-card__field-input--mono {
1508
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1509
+ letter-spacing: 0.14em;
1510
+ font-size: 0.95rem;
1511
+ }
1512
+
1513
+ /* Locked variant: the email field becomes read-only after the OTP has been
1514
+ sent. We dim it (not fully grayed out, so the address stays readable),
1515
+ flatten the interactive affordances, and let the sibling "Change email"
1516
+ link carry the edit affordance instead. Using `disabled` on the input
1517
+ also short-circuits the `shouldDeferRenderForActiveInteraction` guard
1518
+ since the field can't accept focus while locked. */
1519
+ .wallet-step-card__field-input--locked,
1520
+ .wallet-step-card__field-input[disabled] {
1521
+ background: rgba(7, 12, 16, 0.38);
1522
+ border-color: var(--line);
1523
+ color: rgba(205, 220, 231, 0.72);
1524
+ cursor: not-allowed;
1525
+ }
1526
+
1527
+ .wallet-step-card__field-input[disabled]:focus {
1528
+ border-color: var(--line);
1529
+ box-shadow: none;
1530
+ }
1531
+
1532
+ .wallet-step-card__actions {
1533
+ display: grid;
1534
+ gap: 0.65rem;
1535
+ }
1536
+
1537
+ /* Compact variant: used for finished steps so the current step dominates the
1538
+ page. One row tall, icon + title + detail visible, no copy/actions. */
1539
+ .wallet-step-card--compact {
1540
+ display: flex;
1541
+ gap: 0.7rem;
1542
+ align-items: center;
1543
+ padding: 0.68rem 0.85rem;
1544
+ border-color: rgba(112, 202, 157, 0.14);
1545
+ background: rgba(22, 28, 35, 0.72);
1546
+ box-shadow: none;
1547
+ }
1548
+
1549
+ .wallet-step-card__compact-icon {
1550
+ width: 1.4rem;
1551
+ height: 1.4rem;
1552
+ display: inline-flex;
1553
+ align-items: center;
1554
+ justify-content: center;
1555
+ border-radius: 999px;
1556
+ background: rgba(112, 202, 157, 0.16);
1557
+ color: #ddfbea;
1558
+ flex: 0 0 auto;
1559
+ }
1560
+
1561
+ .wallet-step-card__compact-icon svg {
1562
+ width: 0.78rem;
1563
+ height: 0.78rem;
1564
+ }
1565
+
1566
+ .wallet-step-card__compact-body {
1567
+ min-width: 0;
1568
+ flex: 1 1 auto;
1569
+ display: grid;
1570
+ gap: 0.1rem;
1571
+ }
1572
+
1573
+ .wallet-step-card__compact-title {
1574
+ margin: 0;
1575
+ font-size: 0.92rem;
1576
+ line-height: 1.3;
1577
+ color: var(--text);
1578
+ }
1579
+
1580
+ .wallet-step-card__compact-detail {
1581
+ margin: 0;
1582
+ font-size: 0.78rem;
1583
+ line-height: 1.4;
1584
+ color: rgba(205, 220, 231, 0.62);
1585
+ overflow-wrap: anywhere;
1586
+ }
1587
+
1588
+ .wallet-step-card__compact-detail--mono {
1589
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1590
+ font-size: 0.75rem;
1591
+ }
1592
+
1593
+ .wallet-step-card__compact-status {
1594
+ font-size: 0.72rem;
1595
+ font-weight: 600;
1596
+ letter-spacing: 0.02em;
1597
+ color: rgba(112, 202, 157, 0.92);
1598
+ flex: 0 0 auto;
1599
+ }
1600
+
1601
+ /* Mainnet opt-in link: behaves like a row-shaped button so it sits naturally
1602
+ among the step cards but reads as a disclosure, not a primary action. */
1603
+ .wallet-mainnet-optin {
1604
+ display: flex;
1605
+ gap: 0.7rem;
1606
+ align-items: center;
1607
+ width: 100%;
1608
+ padding: 0.75rem 0.9rem;
1609
+ border-radius: 16px;
1610
+ border: 1px dashed rgba(240, 180, 40, 0.28);
1611
+ background: rgba(240, 180, 40, 0.04);
1612
+ color: rgba(255, 220, 140, 0.96);
1613
+ text-align: left;
1614
+ cursor: pointer;
1615
+ font: inherit;
1616
+ transition: background 0.15s ease, border-color 0.15s ease;
1617
+ }
1618
+
1619
+ .wallet-mainnet-optin:hover,
1620
+ .wallet-mainnet-optin:focus-visible {
1621
+ background: rgba(240, 180, 40, 0.09);
1622
+ border-color: rgba(240, 180, 40, 0.44);
1623
+ outline: none;
1624
+ }
1625
+
1626
+ .wallet-mainnet-optin__body {
1627
+ flex: 1 1 auto;
1628
+ display: grid;
1629
+ gap: 0.14rem;
1630
+ }
1631
+
1632
+ .wallet-mainnet-optin__label {
1633
+ font-size: 0.9rem;
1634
+ font-weight: 600;
1635
+ }
1636
+
1637
+ .wallet-mainnet-optin__hint {
1638
+ font-size: 0.78rem;
1639
+ line-height: 1.4;
1640
+ }
1641
+
1642
+ .wallet-mainnet-optin__chevron {
1643
+ flex: 0 0 auto;
1644
+ font-size: 1rem;
1645
+ opacity: 0.7;
1646
+ }
1647
+
1648
+ @media (max-width: 640px) {
1649
+ .wallet-step-card__header {
1650
+ flex-direction: column;
1651
+ }
1652
+
1653
+ .wallet-step-card__status {
1654
+ align-self: flex-start;
1655
+ }
1656
+
1657
+ .wallet-step-card--compact {
1658
+ /* Stay single-line even on narrow phones — dropping to column here
1659
+ would negate the point of the compact variant. */
1660
+ flex-direction: row;
1661
+ }
1662
+ }
1663
+
1664
+ @media (min-width: 720px) {
1665
+ .wallet-step-card__actions {
1666
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1667
+ }
1668
+ }
1669
+
1012
1670
  .screen-header {
1013
1671
  display: flex;
1014
1672
  justify-content: space-between;
@@ -1552,6 +2210,54 @@ code {
1552
2210
  flex: 0 0 auto;
1553
2211
  }
1554
2212
 
2213
+ /* Skeleton shimmer for the Code tab while /api/inbox/diff is in flight.
2214
+ Reuses the detail-loading-pulse keyframes so we don't duplicate the
2215
+ animation. Cards are non-interactive (no cursor change, hidden from
2216
+ assistive tech via aria-hidden on the card). */
2217
+ .diff-entry--skeleton {
2218
+ cursor: default;
2219
+ gap: 0.6rem;
2220
+ pointer-events: none;
2221
+ }
2222
+
2223
+ .diff-skeleton-line,
2224
+ .diff-skeleton-chip {
2225
+ display: block;
2226
+ height: 0.78rem;
2227
+ border-radius: 999px;
2228
+ background:
2229
+ linear-gradient(90deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.08)),
2230
+ rgba(255, 255, 255, 0.08);
2231
+ background-size: 200% 100%;
2232
+ animation: detail-loading-pulse 1.25s ease-in-out infinite;
2233
+ }
2234
+
2235
+ .diff-skeleton-line--thread {
2236
+ width: 42%;
2237
+ height: 0.7rem;
2238
+ }
2239
+
2240
+ .diff-skeleton-line--time {
2241
+ width: 3.6rem;
2242
+ height: 0.7rem;
2243
+ justify-self: end;
2244
+ }
2245
+
2246
+ .diff-skeleton-line--title {
2247
+ width: 78%;
2248
+ height: 0.96rem;
2249
+ }
2250
+
2251
+ .diff-skeleton-chip {
2252
+ width: 5.2rem;
2253
+ height: 1.1rem;
2254
+ border-radius: 10px;
2255
+ }
2256
+
2257
+ .diff-skeleton-chip--narrow {
2258
+ width: 3.4rem;
2259
+ }
2260
+
1555
2261
  .timeline-entry__meta {
1556
2262
  display: grid;
1557
2263
  grid-template-columns: minmax(0, 1fr) auto;
@@ -2053,6 +2759,14 @@ code {
2053
2759
  rgba(21, 28, 33, 0.92);
2054
2760
  }
2055
2761
 
2762
+ .detail-card--autopilot {
2763
+ margin-top: 0.24rem;
2764
+ gap: 0.32rem;
2765
+ background:
2766
+ linear-gradient(180deg, rgba(101, 207, 159, 0.10), rgba(255, 255, 255, 0.02)),
2767
+ rgba(14, 24, 27, 0.92);
2768
+ }
2769
+
2056
2770
  .detail-card--images {
2057
2771
  margin-top: 0.24rem;
2058
2772
  gap: 0;
@@ -2552,6 +3266,13 @@ code {
2552
3266
  line-height: 1.4;
2553
3267
  }
2554
3268
 
3269
+ .detail-autopilot-copy {
3270
+ margin: 0;
3271
+ color: rgba(243, 251, 255, 0.88);
3272
+ font-size: 0.92rem;
3273
+ line-height: 1.5;
3274
+ }
3275
+
2555
3276
  .detail-body--context {
2556
3277
  color: rgba(243, 251, 255, 0.88);
2557
3278
  }
@@ -2922,9 +3643,9 @@ code {
2922
3643
 
2923
3644
  .reply-mode-switch {
2924
3645
  display: grid;
2925
- grid-template-columns: auto auto minmax(0, 1fr);
3646
+ grid-template-columns: auto minmax(0, 1fr);
2926
3647
  gap: 0.78rem;
2927
- align-items: center;
3648
+ align-items: start;
2928
3649
  padding: 0.82rem 0.92rem;
2929
3650
  border: 1px solid rgba(156, 181, 197, 0.1);
2930
3651
  border-radius: 18px;
@@ -2948,6 +3669,7 @@ code {
2948
3669
  display: flex;
2949
3670
  align-items: center;
2950
3671
  transition: background 160ms ease, border-color 160ms ease;
3672
+ margin-top: 0.14rem;
2951
3673
  }
2952
3674
 
2953
3675
  .reply-mode-switch__thumb {
@@ -2972,13 +3694,13 @@ code {
2972
3694
  .reply-mode-switch__copy {
2973
3695
  min-width: 0;
2974
3696
  display: grid;
2975
- gap: 0.16rem;
3697
+ gap: 0.22rem;
2976
3698
  }
2977
3699
 
2978
3700
  .reply-mode-switch__title {
2979
- display: flex;
2980
- align-items: center;
2981
- justify-content: space-between;
3701
+ display: grid;
3702
+ grid-template-columns: minmax(0, 1fr) auto;
3703
+ align-items: start;
2982
3704
  gap: 0.65rem;
2983
3705
  font-size: 0.94rem;
2984
3706
  font-weight: 700;
@@ -2986,10 +3708,13 @@ code {
2986
3708
  }
2987
3709
 
2988
3710
  .reply-mode-switch__state {
3711
+ display: inline-flex;
3712
+ align-items: center;
2989
3713
  color: rgba(121, 196, 255, 0.92);
2990
3714
  font-size: 0.78rem;
2991
3715
  letter-spacing: 0.04em;
2992
3716
  text-transform: uppercase;
3717
+ white-space: nowrap;
2993
3718
  }
2994
3719
 
2995
3720
  .reply-mode-switch__hint {
@@ -3017,6 +3742,56 @@ code {
3017
3742
  grid-row: 1;
3018
3743
  }
3019
3744
 
3745
+ .settings-list--toggle-group {
3746
+ display: grid;
3747
+ gap: 0;
3748
+ }
3749
+
3750
+ .settings-list--toggle-group .reply-mode-switch--grouped {
3751
+ border: 0;
3752
+ border-radius: 0;
3753
+ background: transparent;
3754
+ padding: 0.95rem 1rem;
3755
+ }
3756
+
3757
+ .settings-list--toggle-group .reply-mode-switch--grouped + .reply-mode-switch--grouped {
3758
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
3759
+ }
3760
+
3761
+ .settings-list--toggle-group .reply-mode-switch--grouped + .settings-toggle-subhead,
3762
+ .settings-list--toggle-group .settings-toggle-subcopy + .reply-mode-switch--grouped {
3763
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
3764
+ }
3765
+
3766
+ .settings-toggle-subhead {
3767
+ display: grid;
3768
+ grid-template-columns: minmax(0, 1fr) auto;
3769
+ align-items: end;
3770
+ gap: 0.6rem;
3771
+ padding: 0.95rem 1rem 0.32rem;
3772
+ }
3773
+
3774
+ .settings-toggle-subhead__title {
3775
+ font-size: 0.9rem;
3776
+ font-weight: 700;
3777
+ line-height: 1.25;
3778
+ color: var(--text);
3779
+ }
3780
+
3781
+ .settings-toggle-subhead__state {
3782
+ color: rgba(121, 196, 255, 0.92);
3783
+ font-size: 0.78rem;
3784
+ letter-spacing: 0.04em;
3785
+ text-transform: uppercase;
3786
+ white-space: nowrap;
3787
+ }
3788
+
3789
+ .settings-toggle-subcopy {
3790
+ padding: 0 1rem 0.78rem;
3791
+ font-size: 0.83rem;
3792
+ line-height: 1.45;
3793
+ }
3794
+
3020
3795
  .reply-mode-switch__input:checked ~ .reply-mode-switch--settings__toggle .reply-mode-switch__track {
3021
3796
  background: rgba(67, 160, 255, 0.28);
3022
3797
  border-color: rgba(121, 196, 255, 0.34);
@@ -3844,8 +4619,11 @@ button:disabled {
3844
4619
  }
3845
4620
  }
3846
4621
 
3847
- /* Action button busy/loading state */
3848
- button[data-action-url].is-loading {
4622
+ /* Async button busy/loading state. Applies to any button marked
4623
+ .is-loading / aria-busy (approval actions, push notification toggle,
4624
+ etc.) so the tap gets immediate visual feedback while the async
4625
+ work (Web Push subscribe, server POST, …) is in flight. */
4626
+ button.is-loading {
3849
4627
  display: inline-flex;
3850
4628
  align-items: center;
3851
4629
  justify-content: center;
@@ -3853,7 +4631,7 @@ button[data-action-url].is-loading {
3853
4631
  cursor: wait;
3854
4632
  opacity: 0.9;
3855
4633
  }
3856
- button[data-action-url][aria-busy="true"]:not(.is-loading) {
4634
+ button[aria-busy="true"]:not(.is-loading) {
3857
4635
  opacity: 0.5;
3858
4636
  cursor: not-allowed;
3859
4637
  }