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/README.md +29 -0
- package/package.json +2 -1
- package/scripts/share-cli.mjs +1 -0
- package/scripts/viveworker-bridge.mjs +2576 -146
- package/viveworker.env.example +4 -0
- package/web/app.css +787 -9
- package/web/app.js +1664 -61
- package/web/hazbase-passkey.js +107 -0
- package/web/i18n.js +254 -0
- package/web/sw.js +33 -15
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
|
|
3646
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
2926
3647
|
gap: 0.78rem;
|
|
2927
|
-
align-items:
|
|
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.
|
|
3697
|
+
gap: 0.22rem;
|
|
2976
3698
|
}
|
|
2977
3699
|
|
|
2978
3700
|
.reply-mode-switch__title {
|
|
2979
|
-
display:
|
|
2980
|
-
|
|
2981
|
-
|
|
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
|
-
/*
|
|
3848
|
-
|
|
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[
|
|
4634
|
+
button[aria-busy="true"]:not(.is-loading) {
|
|
3857
4635
|
opacity: 0.5;
|
|
3858
4636
|
cursor: not-allowed;
|
|
3859
4637
|
}
|