viveworker 0.7.0-beta.1 → 0.7.0-beta.3

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
  }
@@ -853,160 +952,748 @@ code {
853
952
  gap: 0.9rem;
854
953
  }
855
954
 
856
- .settings-copy-block p {
955
+ .settings-copy-block p {
956
+ margin: 0;
957
+ }
958
+
959
+ .settings-action-panel {
960
+ padding: 1rem;
961
+ }
962
+
963
+ .settings-list--compact .settings-info-row,
964
+ .settings-list--compact .settings-choice-row {
965
+ padding-top: 0.78rem;
966
+ padding-bottom: 0.78rem;
967
+ }
968
+
969
+ .settings-list--compact .settings-info-row:last-child,
970
+ .settings-list--compact .settings-choice-row:last-child {
971
+ padding-bottom: 0.56rem;
972
+ }
973
+
974
+ .settings-command-card {
975
+ display: grid;
976
+ gap: 0.35rem;
977
+ padding: 0.85rem 0.95rem;
978
+ border: 1px solid rgba(156, 181, 197, 0.12);
979
+ border-radius: 16px;
980
+ background: rgba(255, 255, 255, 0.035);
981
+ }
982
+
983
+ .settings-command-card__label {
984
+ color: var(--muted);
985
+ font-size: 0.8rem;
986
+ line-height: 1.35;
987
+ }
988
+
989
+ .settings-command-card__value {
990
+ display: block;
991
+ font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
992
+ font-size: 0.86rem;
993
+ line-height: 1.5;
994
+ color: var(--text);
995
+ overflow-wrap: anywhere;
996
+ }
997
+
998
+ .device-list {
999
+ display: grid;
1000
+ gap: 0.8rem;
1001
+ }
1002
+
1003
+ .device-card {
1004
+ padding: 0.95rem;
1005
+ border: 1px solid rgba(156, 181, 197, 0.08);
1006
+ border-radius: 18px;
1007
+ background: rgba(22, 28, 35, 0.96);
1008
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.1);
1009
+ }
1010
+
1011
+ .device-card__header {
1012
+ display: flex;
1013
+ justify-content: space-between;
1014
+ gap: 0.75rem;
1015
+ align-items: flex-start;
1016
+ }
1017
+
1018
+ .device-card__title-wrap {
1019
+ min-width: 0;
1020
+ display: grid;
1021
+ gap: 0.34rem;
1022
+ }
1023
+
1024
+ .device-card__headline {
1025
+ display: flex;
1026
+ align-items: center;
1027
+ gap: 0.55rem;
1028
+ min-width: 0;
1029
+ }
1030
+
1031
+ .device-card__icon {
1032
+ width: 1.9rem;
1033
+ height: 1.9rem;
1034
+ display: inline-flex;
1035
+ align-items: center;
1036
+ justify-content: center;
1037
+ border-radius: 11px;
1038
+ background: rgba(123, 195, 255, 0.12);
1039
+ color: #e9f7ff;
1040
+ flex: 0 0 auto;
1041
+ }
1042
+
1043
+ .device-card__icon svg {
1044
+ width: 1rem;
1045
+ height: 1rem;
1046
+ }
1047
+
1048
+ .device-card__title {
1049
+ margin: 0;
1050
+ font-size: 1rem;
1051
+ line-height: 1.3;
1052
+ overflow-wrap: anywhere;
1053
+ }
1054
+
1055
+ .device-card__subtitle {
1056
+ margin: 0;
1057
+ color: rgba(231, 243, 250, 0.62);
1058
+ font-size: 0.78rem;
1059
+ line-height: 1.45;
1060
+ font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1061
+ overflow-wrap: anywhere;
1062
+ }
1063
+
1064
+ .device-card__badge {
1065
+ flex: 0 0 auto;
1066
+ display: inline-flex;
1067
+ align-items: center;
1068
+ justify-content: center;
1069
+ min-height: 1.75rem;
1070
+ padding: 0.2rem 0.68rem;
1071
+ border-radius: 999px;
1072
+ border: 1px solid rgba(121, 196, 255, 0.24);
1073
+ background: rgba(121, 196, 255, 0.12);
1074
+ color: #dcf1ff;
1075
+ font-size: 0.78rem;
1076
+ font-weight: 600;
1077
+ white-space: nowrap;
1078
+ }
1079
+
1080
+ .device-card__meta {
1081
+ margin-top: 0.85rem;
1082
+ display: grid;
1083
+ gap: 0.48rem;
1084
+ }
1085
+
1086
+ .device-card__meta-row {
1087
+ display: grid;
1088
+ grid-template-columns: minmax(0, 1fr) auto;
1089
+ gap: 0.75rem;
1090
+ align-items: start;
1091
+ }
1092
+
1093
+ .device-card__meta-label {
1094
+ color: var(--muted);
1095
+ font-size: 0.82rem;
1096
+ line-height: 1.35;
1097
+ }
1098
+
1099
+ .device-card__meta-value {
1100
+ color: rgba(231, 243, 250, 0.9);
1101
+ font-size: 0.84rem;
1102
+ line-height: 1.35;
1103
+ text-align: right;
1104
+ overflow-wrap: anywhere;
1105
+ }
1106
+
1107
+ .device-card__actions {
1108
+ margin-top: 0.95rem;
1109
+ }
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--session-expired {
1121
+ border-color: rgba(255, 190, 92, 0.28);
1122
+ background: linear-gradient(180deg, rgba(49, 39, 28, 0.98), rgba(24, 28, 30, 0.96));
1123
+ }
1124
+
1125
+ .wallet-flow-banner__eyebrow {
1126
+ margin: 0;
1127
+ font-size: 0.72rem;
1128
+ letter-spacing: 0.05em;
1129
+ text-transform: uppercase;
1130
+ color: rgba(121, 196, 255, 0.82);
1131
+ }
1132
+
1133
+ .wallet-flow-banner__title {
1134
+ margin: 0;
1135
+ font-size: 1rem;
1136
+ line-height: 1.35;
1137
+ color: var(--text);
1138
+ }
1139
+
1140
+ .wallet-flow-banner__copy {
1141
+ margin: 0;
1142
+ }
1143
+
1144
+ /* The agent-payout address is the single most actionable fact in the ready
1145
+ banner — rendered larger than copy, in a mono font, with a subtle
1146
+ highlight so it's unmistakable as "the wallet agents will use". Rendered
1147
+ as a <button> so a single tap copies it; the clipboard icon swaps to a
1148
+ check mark for ~1.5s via the `.is-copied` class (applied from JS). No
1149
+ hover / focus-ring styling on the button itself — on iOS the sticky
1150
+ hover state + focus-visible kept flashing the border each tap, so we
1151
+ leave the box static and let only the icon transition give feedback. */
1152
+ .wallet-flow-banner__address {
1153
+ display: flex;
1154
+ align-items: center;
1155
+ gap: 0.55rem;
1156
+ width: 100%;
1157
+ margin: 0.25rem 0 0;
1158
+ padding: 0.55rem 0.7rem;
1159
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1160
+ font-size: 0.88rem;
1161
+ letter-spacing: 0.03em;
1162
+ line-height: 1.35;
1163
+ color: #e9f7ff;
1164
+ background: rgba(121, 196, 255, 0.08);
1165
+ border: 1px solid rgba(121, 196, 255, 0.18);
1166
+ border-radius: 10px;
1167
+ cursor: pointer;
1168
+ text-align: left;
1169
+ -webkit-tap-highlight-color: transparent;
1170
+ outline: none;
1171
+ /* Tap copies via the clipboard API — we don't need the browser to also
1172
+ range-select the text on tap (previously `user-select: all` on the
1173
+ inner span, which caused an ugly blue highlight to flash every tap
1174
+ on iOS). Copy works without any selection. */
1175
+ user-select: none;
1176
+ -webkit-user-select: none;
1177
+ }
1178
+
1179
+ .wallet-flow-banner__address:focus {
1180
+ outline: none;
1181
+ }
1182
+
1183
+ .wallet-flow-banner__address-text {
1184
+ flex: 1;
1185
+ overflow-wrap: anywhere;
1186
+ }
1187
+
1188
+ /* Stack both icons in the same slot (one is absolutely-positioned on top)
1189
+ and cross-fade via the `.is-copied` toggle so the button layout doesn't
1190
+ jump when the mark flips. */
1191
+ .wallet-flow-banner__address-icon-slot {
1192
+ position: relative;
1193
+ width: 1.1rem;
1194
+ height: 1.1rem;
1195
+ flex-shrink: 0;
1196
+ }
1197
+
1198
+ .wallet-flow-banner__address-icon {
1199
+ position: absolute;
1200
+ inset: 0;
1201
+ display: inline-flex;
1202
+ align-items: center;
1203
+ justify-content: center;
1204
+ color: rgba(233, 247, 255, 0.78);
1205
+ transition: opacity 0.18s ease;
1206
+ }
1207
+
1208
+ .wallet-flow-banner__address-icon svg {
1209
+ width: 100%;
1210
+ height: 100%;
1211
+ }
1212
+
1213
+ .wallet-flow-banner__address-icon--check {
1214
+ opacity: 0;
1215
+ color: #7fe0a8;
1216
+ pointer-events: none;
1217
+ }
1218
+
1219
+ .wallet-flow-banner__address.is-copied .wallet-flow-banner__address-icon--copy {
1220
+ opacity: 0;
1221
+ }
1222
+
1223
+ .wallet-flow-banner__address.is-copied .wallet-flow-banner__address-icon--check {
1224
+ opacity: 1;
1225
+ }
1226
+
1227
+ .wallet-flow-message {
1228
+ border-color: rgba(156, 181, 197, 0.14);
1229
+ }
1230
+
1231
+ .wallet-flow-message--notice {
1232
+ background: rgba(31, 41, 50, 0.96);
1233
+ }
1234
+
1235
+ .wallet-flow-message--error {
1236
+ border-color: rgba(255, 140, 140, 0.18);
1237
+ background: rgba(53, 26, 29, 0.96);
1238
+ }
1239
+
1240
+ .settings-update-notice {
1241
+ margin-top: 0.85rem;
1242
+ border-color: rgba(121, 196, 255, 0.22);
1243
+ background: linear-gradient(180deg, rgba(28, 40, 49, 0.98), rgba(20, 27, 34, 0.96));
1244
+ }
1245
+
1246
+ .settings-update-notice__title {
1247
+ margin: 0;
1248
+ font-weight: 700;
1249
+ color: var(--text);
1250
+ }
1251
+
1252
+ .settings-update-notice__command {
1253
+ display: block;
1254
+ width: fit-content;
1255
+ max-width: 100%;
1256
+ margin-top: 0.35rem;
1257
+ padding: 0.32rem 0.5rem;
1258
+ border-radius: 10px;
1259
+ background: rgba(3, 10, 16, 0.38);
1260
+ color: rgba(233, 247, 255, 0.92);
1261
+ overflow-wrap: anywhere;
1262
+ }
1263
+
1264
+ /* Brand attribution at the very bottom of the wallet settings page.
1265
+ Sits below the advanced-actions panel as plain small text so it reads
1266
+ as a credit, not another card. The link inherits the muted color and
1267
+ only brightens on hover/focus so it doesn't compete with the Sign out
1268
+ button for attention. */
1269
+ .wallet-powered-by {
1270
+ margin: 0.75rem 0 0;
1271
+ text-align: center;
1272
+ font-size: 0.75rem;
1273
+ letter-spacing: 0.02em;
1274
+ color: rgba(233, 247, 255, 0.45);
1275
+ }
1276
+
1277
+ .wallet-powered-by a {
1278
+ color: inherit;
1279
+ text-decoration: underline;
1280
+ text-decoration-color: rgba(233, 247, 255, 0.22);
1281
+ text-underline-offset: 2px;
1282
+ transition: color 0.15s ease, text-decoration-color 0.15s ease;
1283
+ }
1284
+
1285
+ .wallet-powered-by a:hover,
1286
+ .wallet-powered-by a:focus-visible {
1287
+ color: rgba(233, 247, 255, 0.85);
1288
+ text-decoration-color: rgba(233, 247, 255, 0.6);
1289
+ outline: none;
1290
+ }
1291
+
1292
+ /* Wraps the banner + notice + step list on the wallet settings page.
1293
+ Pulled out of `renderSettingsGroup`'s `.settings-list` so each child card
1294
+ renders on the page background instead of nested inside another frame. */
1295
+ .wallet-setup-stack {
1296
+ display: grid;
1297
+ gap: 0.85rem;
1298
+ }
1299
+
1300
+ .wallet-step-list {
1301
+ display: grid;
1302
+ gap: 0.85rem;
1303
+ }
1304
+
1305
+ .wallet-step-card {
1306
+ display: grid;
1307
+ gap: 0.8rem;
1308
+ padding: 0.95rem;
1309
+ border: 1px solid rgba(156, 181, 197, 0.08);
1310
+ border-radius: 18px;
1311
+ background: rgba(22, 28, 35, 0.96);
1312
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.1);
1313
+ }
1314
+
1315
+ .wallet-step-card--current {
1316
+ border-color: rgba(121, 196, 255, 0.28);
1317
+ box-shadow: 0 12px 26px rgba(0, 0, 0, 0.16);
1318
+ }
1319
+
1320
+ .wallet-step-card--complete {
1321
+ border-color: rgba(112, 202, 157, 0.16);
1322
+ }
1323
+
1324
+ .wallet-step-card--locked {
1325
+ opacity: 0.78;
1326
+ }
1327
+
1328
+ .wallet-step-card__header {
1329
+ display: flex;
1330
+ justify-content: space-between;
1331
+ gap: 0.8rem;
1332
+ align-items: flex-start;
1333
+ }
1334
+
1335
+ .wallet-step-card__headline {
1336
+ min-width: 0;
1337
+ display: flex;
1338
+ gap: 0.62rem;
1339
+ align-items: flex-start;
1340
+ }
1341
+
1342
+ .wallet-step-card__icon {
1343
+ width: 2rem;
1344
+ height: 2rem;
1345
+ display: inline-flex;
1346
+ align-items: center;
1347
+ justify-content: center;
1348
+ border-radius: 12px;
1349
+ background: rgba(121, 196, 255, 0.11);
1350
+ color: #e9f7ff;
1351
+ flex: 0 0 auto;
1352
+ }
1353
+
1354
+ .wallet-step-card__icon svg {
1355
+ width: 1rem;
1356
+ height: 1rem;
1357
+ }
1358
+
1359
+ .wallet-step-card__title-wrap {
1360
+ min-width: 0;
1361
+ display: grid;
1362
+ gap: 0.18rem;
1363
+ }
1364
+
1365
+ .wallet-step-card__eyebrow {
1366
+ margin: 0;
1367
+ font-size: 0.72rem;
1368
+ letter-spacing: 0.05em;
1369
+ text-transform: uppercase;
1370
+ color: rgba(205, 220, 231, 0.5);
1371
+ }
1372
+
1373
+ .wallet-step-card__title {
1374
+ margin: 0;
1375
+ font-size: 1rem;
1376
+ line-height: 1.3;
1377
+ color: var(--text);
1378
+ }
1379
+
1380
+ .wallet-step-card__status {
1381
+ display: inline-flex;
1382
+ align-items: center;
1383
+ gap: 0.36rem;
1384
+ min-height: 1.75rem;
1385
+ padding: 0.22rem 0.68rem;
1386
+ border-radius: 999px;
1387
+ border: 1px solid rgba(156, 181, 197, 0.12);
1388
+ background: rgba(255, 255, 255, 0.05);
1389
+ color: rgba(231, 243, 250, 0.82);
1390
+ font-size: 0.76rem;
1391
+ font-weight: 600;
1392
+ white-space: nowrap;
1393
+ }
1394
+
1395
+ .wallet-step-card__status--current {
1396
+ border-color: rgba(121, 196, 255, 0.24);
1397
+ background: rgba(121, 196, 255, 0.12);
1398
+ color: #dcf1ff;
1399
+ }
1400
+
1401
+ .wallet-step-card__status--complete {
1402
+ border-color: rgba(112, 202, 157, 0.24);
1403
+ background: rgba(112, 202, 157, 0.12);
1404
+ color: #ddfbea;
1405
+ }
1406
+
1407
+ .wallet-step-card__status--locked {
1408
+ color: rgba(205, 220, 231, 0.6);
1409
+ }
1410
+
1411
+ .wallet-step-card__status--optional {
1412
+ border-color: rgba(240, 180, 40, 0.22);
1413
+ background: rgba(240, 180, 40, 0.12);
1414
+ color: rgba(255, 220, 140, 0.96);
1415
+ }
1416
+
1417
+ .wallet-step-card__status-icon {
1418
+ width: 0.82rem;
1419
+ height: 0.82rem;
1420
+ display: inline-flex;
1421
+ align-items: center;
1422
+ justify-content: center;
1423
+ }
1424
+
1425
+ .wallet-step-card__status-icon svg {
1426
+ width: 0.82rem;
1427
+ height: 0.82rem;
1428
+ }
1429
+
1430
+ .wallet-step-card__copy,
1431
+ .wallet-step-card__detail {
1432
+ margin: 0;
1433
+ }
1434
+
1435
+ .wallet-step-card__copy {
1436
+ color: var(--muted);
1437
+ font-size: 0.88rem;
1438
+ line-height: 1.5;
1439
+ }
1440
+
1441
+ .wallet-step-card__detail {
1442
+ padding: 0.78rem 0.85rem;
1443
+ border-radius: 14px;
1444
+ background: rgba(255, 255, 255, 0.035);
1445
+ border: 1px solid rgba(156, 181, 197, 0.08);
1446
+ color: rgba(231, 243, 250, 0.82);
1447
+ font-size: 0.83rem;
1448
+ line-height: 1.45;
1449
+ overflow-wrap: anywhere;
1450
+ }
1451
+
1452
+ .wallet-step-card__detail--mono {
1453
+ font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1454
+ font-size: 0.8rem;
1455
+ }
1456
+
1457
+ /* Inline input form placed above the action button (e.g. email + OTP code
1458
+ during wallet sign-in). Progressive disclosure: the OTP field is only
1459
+ rendered once the send step succeeds, so the grid just grows. */
1460
+ .wallet-step-card__form {
1461
+ display: grid;
1462
+ gap: 0.65rem;
1463
+ }
1464
+
1465
+ .wallet-step-card__field {
1466
+ display: grid;
1467
+ gap: 0.3rem;
1468
+ }
1469
+
1470
+ /* Row variant: label on the left, inline action link (e.g. "Change email")
1471
+ on the right. Used when the field is locked but still editable via an
1472
+ explicit escape hatch. */
1473
+ .wallet-step-card__field-label-row {
1474
+ display: flex;
1475
+ align-items: baseline;
1476
+ justify-content: space-between;
1477
+ gap: 0.6rem;
1478
+ }
1479
+
1480
+ .wallet-step-card__field-label {
1481
+ font-size: 0.72rem;
1482
+ font-weight: 600;
1483
+ letter-spacing: 0.04em;
1484
+ color: var(--muted);
1485
+ text-transform: uppercase;
1486
+ }
1487
+
1488
+ .wallet-step-card__field-link {
1489
+ border: 0;
1490
+ background: transparent;
1491
+ padding: 0;
857
1492
  margin: 0;
1493
+ color: rgba(147, 220, 182, 0.92);
1494
+ font: inherit;
1495
+ font-size: 0.78rem;
1496
+ font-weight: 500;
1497
+ letter-spacing: 0.01em;
1498
+ cursor: pointer;
1499
+ text-decoration: underline;
1500
+ text-underline-offset: 2px;
1501
+ text-decoration-thickness: 1px;
1502
+ text-decoration-color: rgba(147, 220, 182, 0.45);
1503
+ transition: color 0.12s ease, text-decoration-color 0.12s ease;
858
1504
  }
859
1505
 
860
- .settings-action-panel {
861
- padding: 1rem;
862
- }
863
-
864
- .settings-list--compact .settings-info-row,
865
- .settings-list--compact .settings-choice-row {
866
- padding-top: 0.78rem;
867
- padding-bottom: 0.78rem;
868
- }
869
-
870
- .settings-list--compact .settings-info-row:last-child,
871
- .settings-list--compact .settings-choice-row:last-child {
872
- padding-bottom: 0.56rem;
1506
+ .wallet-step-card__field-link:hover,
1507
+ .wallet-step-card__field-link:focus-visible {
1508
+ color: #ddfbea;
1509
+ text-decoration-color: rgba(221, 251, 234, 0.85);
1510
+ outline: none;
873
1511
  }
874
1512
 
875
- .settings-command-card {
876
- display: grid;
877
- gap: 0.35rem;
878
- padding: 0.85rem 0.95rem;
879
- border: 1px solid rgba(156, 181, 197, 0.12);
880
- border-radius: 16px;
881
- background: rgba(255, 255, 255, 0.035);
1513
+ .wallet-step-card__field-input {
1514
+ width: 100%;
1515
+ padding: 0.58rem 0.75rem;
1516
+ border-radius: 0.55rem;
1517
+ border: 1px solid var(--line-strong);
1518
+ background: rgba(7, 12, 16, 0.72);
1519
+ color: var(--text);
1520
+ font: inherit;
1521
+ line-height: 1.4;
1522
+ transition: border-color 0.12s ease, box-shadow 0.12s ease, background 0.12s ease;
882
1523
  }
883
1524
 
884
- .settings-command-card__label {
885
- color: var(--muted);
886
- font-size: 0.8rem;
887
- line-height: 1.35;
1525
+ .wallet-step-card__field-input::placeholder {
1526
+ color: rgba(205, 220, 231, 0.38);
888
1527
  }
889
1528
 
890
- .settings-command-card__value {
891
- display: block;
892
- font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
893
- font-size: 0.86rem;
894
- line-height: 1.5;
895
- color: var(--text);
896
- overflow-wrap: anywhere;
1529
+ .wallet-step-card__field-input:focus {
1530
+ outline: none;
1531
+ border-color: rgba(112, 202, 157, 0.55);
1532
+ background: rgba(7, 12, 16, 0.92);
1533
+ box-shadow: 0 0 0 3px rgba(47, 143, 103, 0.22);
897
1534
  }
898
1535
 
899
- .device-list {
900
- display: grid;
901
- gap: 0.8rem;
1536
+ .wallet-step-card__field-input--mono {
1537
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1538
+ letter-spacing: 0.14em;
1539
+ font-size: 0.95rem;
902
1540
  }
903
1541
 
904
- .device-card {
905
- padding: 0.95rem;
906
- border: 1px solid rgba(156, 181, 197, 0.08);
907
- border-radius: 18px;
908
- background: rgba(22, 28, 35, 0.96);
909
- box-shadow: 0 8px 18px rgba(0, 0, 0, 0.1);
1542
+ /* Locked variant: the email field becomes read-only after the OTP has been
1543
+ sent. We dim it (not fully grayed out, so the address stays readable),
1544
+ flatten the interactive affordances, and let the sibling "Change email"
1545
+ link carry the edit affordance instead. Using `disabled` on the input
1546
+ also short-circuits the `shouldDeferRenderForActiveInteraction` guard
1547
+ since the field can't accept focus while locked. */
1548
+ .wallet-step-card__field-input--locked,
1549
+ .wallet-step-card__field-input[disabled] {
1550
+ background: rgba(7, 12, 16, 0.38);
1551
+ border-color: var(--line);
1552
+ color: rgba(205, 220, 231, 0.72);
1553
+ cursor: not-allowed;
910
1554
  }
911
1555
 
912
- .device-card__header {
913
- display: flex;
914
- justify-content: space-between;
915
- gap: 0.75rem;
916
- align-items: flex-start;
1556
+ .wallet-step-card__field-input[disabled]:focus {
1557
+ border-color: var(--line);
1558
+ box-shadow: none;
917
1559
  }
918
1560
 
919
- .device-card__title-wrap {
920
- min-width: 0;
1561
+ .wallet-step-card__actions {
921
1562
  display: grid;
922
- gap: 0.34rem;
1563
+ gap: 0.65rem;
923
1564
  }
924
1565
 
925
- .device-card__headline {
1566
+ /* Compact variant: used for finished steps so the current step dominates the
1567
+ page. One row tall, icon + title + detail visible, no copy/actions. */
1568
+ .wallet-step-card--compact {
926
1569
  display: flex;
1570
+ gap: 0.7rem;
927
1571
  align-items: center;
928
- gap: 0.55rem;
929
- min-width: 0;
1572
+ padding: 0.68rem 0.85rem;
1573
+ border-color: rgba(112, 202, 157, 0.14);
1574
+ background: rgba(22, 28, 35, 0.72);
1575
+ box-shadow: none;
930
1576
  }
931
1577
 
932
- .device-card__icon {
933
- width: 1.9rem;
934
- height: 1.9rem;
1578
+ .wallet-step-card__compact-icon {
1579
+ width: 1.4rem;
1580
+ height: 1.4rem;
935
1581
  display: inline-flex;
936
1582
  align-items: center;
937
1583
  justify-content: center;
938
- border-radius: 11px;
939
- background: rgba(123, 195, 255, 0.12);
940
- color: #e9f7ff;
1584
+ border-radius: 999px;
1585
+ background: rgba(112, 202, 157, 0.16);
1586
+ color: #ddfbea;
941
1587
  flex: 0 0 auto;
942
1588
  }
943
1589
 
944
- .device-card__icon svg {
945
- width: 1rem;
946
- height: 1rem;
1590
+ .wallet-step-card__compact-icon svg {
1591
+ width: 0.78rem;
1592
+ height: 0.78rem;
947
1593
  }
948
1594
 
949
- .device-card__title {
1595
+ .wallet-step-card__compact-body {
1596
+ min-width: 0;
1597
+ flex: 1 1 auto;
1598
+ display: grid;
1599
+ gap: 0.1rem;
1600
+ }
1601
+
1602
+ .wallet-step-card__compact-title {
950
1603
  margin: 0;
951
- font-size: 1rem;
1604
+ font-size: 0.92rem;
952
1605
  line-height: 1.3;
953
- overflow-wrap: anywhere;
1606
+ color: var(--text);
954
1607
  }
955
1608
 
956
- .device-card__subtitle {
1609
+ .wallet-step-card__compact-detail {
957
1610
  margin: 0;
958
- color: rgba(231, 243, 250, 0.62);
959
1611
  font-size: 0.78rem;
960
- line-height: 1.45;
961
- font-family: ui-monospace, SFMono-Regular, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1612
+ line-height: 1.4;
1613
+ color: rgba(205, 220, 231, 0.62);
962
1614
  overflow-wrap: anywhere;
963
1615
  }
964
1616
 
965
- .device-card__badge {
1617
+ .wallet-step-card__compact-detail--mono {
1618
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1619
+ font-size: 0.75rem;
1620
+ }
1621
+
1622
+ .wallet-step-card__compact-status {
1623
+ font-size: 0.72rem;
1624
+ font-weight: 600;
1625
+ letter-spacing: 0.02em;
1626
+ color: rgba(112, 202, 157, 0.92);
966
1627
  flex: 0 0 auto;
967
- display: inline-flex;
1628
+ }
1629
+
1630
+ /* Mainnet opt-in link: behaves like a row-shaped button so it sits naturally
1631
+ among the step cards but reads as a disclosure, not a primary action. */
1632
+ .wallet-mainnet-optin {
1633
+ display: flex;
1634
+ gap: 0.7rem;
968
1635
  align-items: center;
969
- justify-content: center;
970
- min-height: 1.75rem;
971
- padding: 0.2rem 0.68rem;
972
- border-radius: 999px;
973
- border: 1px solid rgba(121, 196, 255, 0.24);
974
- background: rgba(121, 196, 255, 0.12);
975
- color: #dcf1ff;
976
- font-size: 0.78rem;
977
- font-weight: 600;
978
- white-space: nowrap;
1636
+ width: 100%;
1637
+ padding: 0.75rem 0.9rem;
1638
+ border-radius: 16px;
1639
+ border: 1px dashed rgba(240, 180, 40, 0.28);
1640
+ background: rgba(240, 180, 40, 0.04);
1641
+ color: rgba(255, 220, 140, 0.96);
1642
+ text-align: left;
1643
+ cursor: pointer;
1644
+ font: inherit;
1645
+ transition: background 0.15s ease, border-color 0.15s ease;
979
1646
  }
980
1647
 
981
- .device-card__meta {
982
- margin-top: 0.85rem;
983
- display: grid;
984
- gap: 0.48rem;
1648
+ .wallet-mainnet-optin:hover,
1649
+ .wallet-mainnet-optin:focus-visible {
1650
+ background: rgba(240, 180, 40, 0.09);
1651
+ border-color: rgba(240, 180, 40, 0.44);
1652
+ outline: none;
985
1653
  }
986
1654
 
987
- .device-card__meta-row {
1655
+ .wallet-mainnet-optin__body {
1656
+ flex: 1 1 auto;
988
1657
  display: grid;
989
- grid-template-columns: minmax(0, 1fr) auto;
990
- gap: 0.75rem;
991
- align-items: start;
1658
+ gap: 0.14rem;
992
1659
  }
993
1660
 
994
- .device-card__meta-label {
995
- color: var(--muted);
996
- font-size: 0.82rem;
997
- line-height: 1.35;
1661
+ .wallet-mainnet-optin__label {
1662
+ font-size: 0.9rem;
1663
+ font-weight: 600;
998
1664
  }
999
1665
 
1000
- .device-card__meta-value {
1001
- color: rgba(231, 243, 250, 0.9);
1002
- font-size: 0.84rem;
1003
- line-height: 1.35;
1004
- text-align: right;
1005
- overflow-wrap: anywhere;
1666
+ .wallet-mainnet-optin__hint {
1667
+ font-size: 0.78rem;
1668
+ line-height: 1.4;
1006
1669
  }
1007
1670
 
1008
- .device-card__actions {
1009
- margin-top: 0.95rem;
1671
+ .wallet-mainnet-optin__chevron {
1672
+ flex: 0 0 auto;
1673
+ font-size: 1rem;
1674
+ opacity: 0.7;
1675
+ }
1676
+
1677
+ @media (max-width: 640px) {
1678
+ .wallet-step-card__header {
1679
+ flex-direction: column;
1680
+ }
1681
+
1682
+ .wallet-step-card__status {
1683
+ align-self: flex-start;
1684
+ }
1685
+
1686
+ .wallet-step-card--compact {
1687
+ /* Stay single-line even on narrow phones — dropping to column here
1688
+ would negate the point of the compact variant. */
1689
+ flex-direction: row;
1690
+ }
1691
+ }
1692
+
1693
+ @media (min-width: 720px) {
1694
+ .wallet-step-card__actions {
1695
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1696
+ }
1010
1697
  }
1011
1698
 
1012
1699
  .screen-header {
@@ -1552,6 +2239,54 @@ code {
1552
2239
  flex: 0 0 auto;
1553
2240
  }
1554
2241
 
2242
+ /* Skeleton shimmer for the Code tab while /api/inbox/diff is in flight.
2243
+ Reuses the detail-loading-pulse keyframes so we don't duplicate the
2244
+ animation. Cards are non-interactive (no cursor change, hidden from
2245
+ assistive tech via aria-hidden on the card). */
2246
+ .diff-entry--skeleton {
2247
+ cursor: default;
2248
+ gap: 0.6rem;
2249
+ pointer-events: none;
2250
+ }
2251
+
2252
+ .diff-skeleton-line,
2253
+ .diff-skeleton-chip {
2254
+ display: block;
2255
+ height: 0.78rem;
2256
+ border-radius: 999px;
2257
+ background:
2258
+ linear-gradient(90deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.08)),
2259
+ rgba(255, 255, 255, 0.08);
2260
+ background-size: 200% 100%;
2261
+ animation: detail-loading-pulse 1.25s ease-in-out infinite;
2262
+ }
2263
+
2264
+ .diff-skeleton-line--thread {
2265
+ width: 42%;
2266
+ height: 0.7rem;
2267
+ }
2268
+
2269
+ .diff-skeleton-line--time {
2270
+ width: 3.6rem;
2271
+ height: 0.7rem;
2272
+ justify-self: end;
2273
+ }
2274
+
2275
+ .diff-skeleton-line--title {
2276
+ width: 78%;
2277
+ height: 0.96rem;
2278
+ }
2279
+
2280
+ .diff-skeleton-chip {
2281
+ width: 5.2rem;
2282
+ height: 1.1rem;
2283
+ border-radius: 10px;
2284
+ }
2285
+
2286
+ .diff-skeleton-chip--narrow {
2287
+ width: 3.4rem;
2288
+ }
2289
+
1555
2290
  .timeline-entry__meta {
1556
2291
  display: grid;
1557
2292
  grid-template-columns: minmax(0, 1fr) auto;
@@ -2053,6 +2788,14 @@ code {
2053
2788
  rgba(21, 28, 33, 0.92);
2054
2789
  }
2055
2790
 
2791
+ .detail-card--autopilot {
2792
+ margin-top: 0.24rem;
2793
+ gap: 0.32rem;
2794
+ background:
2795
+ linear-gradient(180deg, rgba(101, 207, 159, 0.10), rgba(255, 255, 255, 0.02)),
2796
+ rgba(14, 24, 27, 0.92);
2797
+ }
2798
+
2056
2799
  .detail-card--images {
2057
2800
  margin-top: 0.24rem;
2058
2801
  gap: 0;
@@ -2552,6 +3295,13 @@ code {
2552
3295
  line-height: 1.4;
2553
3296
  }
2554
3297
 
3298
+ .detail-autopilot-copy {
3299
+ margin: 0;
3300
+ color: rgba(243, 251, 255, 0.88);
3301
+ font-size: 0.92rem;
3302
+ line-height: 1.5;
3303
+ }
3304
+
2555
3305
  .detail-body--context {
2556
3306
  color: rgba(243, 251, 255, 0.88);
2557
3307
  }
@@ -2922,9 +3672,9 @@ code {
2922
3672
 
2923
3673
  .reply-mode-switch {
2924
3674
  display: grid;
2925
- grid-template-columns: auto auto minmax(0, 1fr);
3675
+ grid-template-columns: auto minmax(0, 1fr);
2926
3676
  gap: 0.78rem;
2927
- align-items: center;
3677
+ align-items: start;
2928
3678
  padding: 0.82rem 0.92rem;
2929
3679
  border: 1px solid rgba(156, 181, 197, 0.1);
2930
3680
  border-radius: 18px;
@@ -2948,6 +3698,7 @@ code {
2948
3698
  display: flex;
2949
3699
  align-items: center;
2950
3700
  transition: background 160ms ease, border-color 160ms ease;
3701
+ margin-top: 0.14rem;
2951
3702
  }
2952
3703
 
2953
3704
  .reply-mode-switch__thumb {
@@ -2972,13 +3723,13 @@ code {
2972
3723
  .reply-mode-switch__copy {
2973
3724
  min-width: 0;
2974
3725
  display: grid;
2975
- gap: 0.16rem;
3726
+ gap: 0.22rem;
2976
3727
  }
2977
3728
 
2978
3729
  .reply-mode-switch__title {
2979
- display: flex;
2980
- align-items: center;
2981
- justify-content: space-between;
3730
+ display: grid;
3731
+ grid-template-columns: minmax(0, 1fr) auto;
3732
+ align-items: start;
2982
3733
  gap: 0.65rem;
2983
3734
  font-size: 0.94rem;
2984
3735
  font-weight: 700;
@@ -2986,10 +3737,13 @@ code {
2986
3737
  }
2987
3738
 
2988
3739
  .reply-mode-switch__state {
3740
+ display: inline-flex;
3741
+ align-items: center;
2989
3742
  color: rgba(121, 196, 255, 0.92);
2990
3743
  font-size: 0.78rem;
2991
3744
  letter-spacing: 0.04em;
2992
3745
  text-transform: uppercase;
3746
+ white-space: nowrap;
2993
3747
  }
2994
3748
 
2995
3749
  .reply-mode-switch__hint {
@@ -3017,6 +3771,56 @@ code {
3017
3771
  grid-row: 1;
3018
3772
  }
3019
3773
 
3774
+ .settings-list--toggle-group {
3775
+ display: grid;
3776
+ gap: 0;
3777
+ }
3778
+
3779
+ .settings-list--toggle-group .reply-mode-switch--grouped {
3780
+ border: 0;
3781
+ border-radius: 0;
3782
+ background: transparent;
3783
+ padding: 0.95rem 1rem;
3784
+ }
3785
+
3786
+ .settings-list--toggle-group .reply-mode-switch--grouped + .reply-mode-switch--grouped {
3787
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
3788
+ }
3789
+
3790
+ .settings-list--toggle-group .reply-mode-switch--grouped + .settings-toggle-subhead,
3791
+ .settings-list--toggle-group .settings-toggle-subcopy + .reply-mode-switch--grouped {
3792
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
3793
+ }
3794
+
3795
+ .settings-toggle-subhead {
3796
+ display: grid;
3797
+ grid-template-columns: minmax(0, 1fr) auto;
3798
+ align-items: end;
3799
+ gap: 0.6rem;
3800
+ padding: 0.95rem 1rem 0.32rem;
3801
+ }
3802
+
3803
+ .settings-toggle-subhead__title {
3804
+ font-size: 0.9rem;
3805
+ font-weight: 700;
3806
+ line-height: 1.25;
3807
+ color: var(--text);
3808
+ }
3809
+
3810
+ .settings-toggle-subhead__state {
3811
+ color: rgba(121, 196, 255, 0.92);
3812
+ font-size: 0.78rem;
3813
+ letter-spacing: 0.04em;
3814
+ text-transform: uppercase;
3815
+ white-space: nowrap;
3816
+ }
3817
+
3818
+ .settings-toggle-subcopy {
3819
+ padding: 0 1rem 0.78rem;
3820
+ font-size: 0.83rem;
3821
+ line-height: 1.45;
3822
+ }
3823
+
3020
3824
  .reply-mode-switch__input:checked ~ .reply-mode-switch--settings__toggle .reply-mode-switch__track {
3021
3825
  background: rgba(67, 160, 255, 0.28);
3022
3826
  border-color: rgba(121, 196, 255, 0.34);
@@ -3844,8 +4648,11 @@ button:disabled {
3844
4648
  }
3845
4649
  }
3846
4650
 
3847
- /* Action button busy/loading state */
3848
- button[data-action-url].is-loading {
4651
+ /* Async button busy/loading state. Applies to any button marked
4652
+ .is-loading / aria-busy (approval actions, push notification toggle,
4653
+ etc.) so the tap gets immediate visual feedback while the async
4654
+ work (Web Push subscribe, server POST, …) is in flight. */
4655
+ button.is-loading {
3849
4656
  display: inline-flex;
3850
4657
  align-items: center;
3851
4658
  justify-content: center;
@@ -3853,7 +4660,7 @@ button[data-action-url].is-loading {
3853
4660
  cursor: wait;
3854
4661
  opacity: 0.9;
3855
4662
  }
3856
- button[data-action-url][aria-busy="true"]:not(.is-loading) {
4663
+ button[aria-busy="true"]:not(.is-loading) {
3857
4664
  opacity: 0.5;
3858
4665
  cursor: not-allowed;
3859
4666
  }