viveworker 0.7.0-beta.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +33 -4
  2. package/package.json +7 -3
  3. package/scripts/lib/remote-pairing/README.md +164 -0
  4. package/scripts/lib/remote-pairing/_browser-bundle-entry.mjs +86 -0
  5. package/scripts/lib/remote-pairing/audit.mjs +122 -0
  6. package/scripts/lib/remote-pairing/bridge-relay-client.mjs +737 -0
  7. package/scripts/lib/remote-pairing/control.mjs +156 -0
  8. package/scripts/lib/remote-pairing/envelope.mjs +224 -0
  9. package/scripts/lib/remote-pairing/http-dispatch.mjs +530 -0
  10. package/scripts/lib/remote-pairing/keys-core.mjs +110 -0
  11. package/scripts/lib/remote-pairing/keys.mjs +181 -0
  12. package/scripts/lib/remote-pairing/noise.mjs +436 -0
  13. package/scripts/lib/remote-pairing/orchestrator.mjs +356 -0
  14. package/scripts/lib/remote-pairing/pairings.mjs +446 -0
  15. package/scripts/lib/remote-pairing/rpc.mjs +381 -0
  16. package/scripts/moltbook-scout-auto.sh +16 -8
  17. package/scripts/share-cli.mjs +14 -130
  18. package/scripts/viveworker-bridge.mjs +1696 -223
  19. package/scripts/viveworker.mjs +27 -6
  20. package/web/app.css +727 -9
  21. package/web/app.js +1810 -232
  22. package/web/i18n.js +207 -17
  23. package/web/index.html +115 -1
  24. package/web/remote-pairing/api-router.js +873 -0
  25. package/web/remote-pairing/keys.js +237 -0
  26. package/web/remote-pairing/pairing-state.js +313 -0
  27. package/web/remote-pairing/rpc-client.js +765 -0
  28. package/web/remote-pairing/transport.js +804 -0
  29. package/web/remote-pairing/wake.js +149 -0
  30. package/web/remote-pairing-test.html +400 -0
  31. package/web/remote-pairing.bundle.js +3 -0
  32. package/web/remote-pairing.bundle.js.LEGAL.txt +15 -0
  33. package/web/remote-pairing.bundle.js.map +7 -0
  34. package/web/sw.js +190 -20
package/web/app.css CHANGED
@@ -1,5 +1,7 @@
1
1
  :root {
2
2
  color-scheme: dark;
3
+ --visual-viewport-left: 0px;
4
+ --visual-viewport-width: 100vw;
3
5
  --font-ui: "Avenir Next", "SF Pro Rounded", "SF Pro Text", "Helvetica Neue", sans-serif;
4
6
  --bg: #091015;
5
7
  --bg-soft: #0f1921;
@@ -33,13 +35,23 @@
33
35
  }
34
36
 
35
37
  html {
38
+ width: 100%;
39
+ max-width: 100%;
40
+ overflow-x: hidden;
41
+ overscroll-behavior-x: none;
36
42
  background: var(--bg);
43
+ -webkit-text-size-adjust: 100%;
44
+ text-size-adjust: 100%;
37
45
  }
38
46
 
39
47
  body {
48
+ width: 100%;
49
+ max-width: 100%;
50
+ min-width: 0;
40
51
  margin: 0;
41
52
  min-height: 100vh;
42
53
  overflow-x: hidden;
54
+ overscroll-behavior-x: none;
43
55
  font-family: var(--font-ui);
44
56
  color: var(--text);
45
57
  background:
@@ -53,7 +65,9 @@ a {
53
65
  }
54
66
 
55
67
  button,
56
- input {
68
+ input,
69
+ textarea,
70
+ select {
57
71
  font: inherit;
58
72
  }
59
73
 
@@ -63,8 +77,19 @@ code {
63
77
  background: rgba(156, 181, 197, 0.12);
64
78
  }
65
79
 
80
+ #app {
81
+ width: 100vw;
82
+ max-width: 100vw;
83
+ min-width: 0;
84
+ overflow-x: clip;
85
+ }
86
+
66
87
  .app-shell {
88
+ width: 100vw;
89
+ max-width: 100vw;
90
+ min-width: 0;
67
91
  min-height: 100vh;
92
+ overflow-x: clip;
68
93
  padding:
69
94
  max(1rem, env(safe-area-inset-top))
70
95
  1rem
@@ -72,6 +97,14 @@ code {
72
97
  1rem;
73
98
  }
74
99
 
100
+ @supports (width: 100dvw) {
101
+ #app,
102
+ .app-shell {
103
+ width: 100dvw;
104
+ max-width: 100dvw;
105
+ }
106
+ }
107
+
75
108
  .app-shell--mobile:not(.app-shell--detail)::after {
76
109
  content: "";
77
110
  position: fixed;
@@ -96,6 +129,9 @@ code {
96
129
  }
97
130
 
98
131
  .app-shell--detail {
132
+ width: 100%;
133
+ max-width: 100%;
134
+ min-width: 0;
99
135
  padding-bottom: max(1rem, env(safe-area-inset-bottom));
100
136
  }
101
137
 
@@ -389,6 +425,8 @@ code {
389
425
  }
390
426
 
391
427
  .app-main {
428
+ width: 100%;
429
+ max-width: 100%;
392
430
  display: grid;
393
431
  gap: 1rem;
394
432
  min-width: 0;
@@ -401,8 +439,19 @@ code {
401
439
  .settings-stack,
402
440
  .stack,
403
441
  .choice-stack {
442
+ width: 100%;
404
443
  display: grid;
405
444
  gap: 1rem;
445
+ min-width: 0;
446
+ max-width: 100%;
447
+ }
448
+
449
+ .timeline-shell,
450
+ .timeline-list,
451
+ .timeline-thread-filter,
452
+ .timeline-thread-filter__row {
453
+ min-width: 0;
454
+ max-width: 100%;
406
455
  }
407
456
 
408
457
  .detail-shell,
@@ -415,6 +464,7 @@ code {
415
464
  }
416
465
 
417
466
  .screen-block--detail {
467
+ width: 100%;
418
468
  min-height: calc(100dvh - 8rem);
419
469
  }
420
470
 
@@ -892,12 +942,37 @@ code {
892
942
  gap: 0.18rem;
893
943
  }
894
944
 
945
+ .settings-row__title-line {
946
+ min-width: 0;
947
+ display: inline-flex;
948
+ align-items: center;
949
+ gap: 0.42rem;
950
+ }
951
+
895
952
  .settings-row__title,
896
953
  .settings-info-row__label {
954
+ min-width: 0;
897
955
  font-size: 1rem;
898
956
  line-height: 1.3;
899
957
  }
900
958
 
959
+ .settings-row__badge {
960
+ flex: 0 0 auto;
961
+ display: inline-flex;
962
+ align-items: center;
963
+ min-height: 1.18rem;
964
+ padding: 0.08rem 0.42rem 0.1rem;
965
+ border-radius: 999px;
966
+ border: 1px solid rgba(240, 180, 40, 0.26);
967
+ background: rgba(240, 180, 40, 0.11);
968
+ color: rgba(255, 220, 140, 0.96);
969
+ font-size: 0.66rem;
970
+ font-weight: 800;
971
+ letter-spacing: 0.04em;
972
+ line-height: 1;
973
+ text-transform: uppercase;
974
+ }
975
+
901
976
  .settings-row__subtitle {
902
977
  color: var(--muted);
903
978
  font-size: 0.84rem;
@@ -916,6 +991,58 @@ code {
916
991
  overflow-wrap: anywhere;
917
992
  }
918
993
 
994
+ .settings-row__value--enabled,
995
+ .settings-info-row__value--enabled {
996
+ display: inline-flex;
997
+ align-items: center;
998
+ justify-content: center;
999
+ min-height: 1.62rem;
1000
+ padding: 0.16rem 0.52rem;
1001
+ border-radius: 999px;
1002
+ font-size: 0.74rem;
1003
+ font-weight: 800;
1004
+ letter-spacing: 0.04em;
1005
+ line-height: 1;
1006
+ text-transform: uppercase;
1007
+ white-space: nowrap;
1008
+ }
1009
+
1010
+ .settings-row__value--enabled,
1011
+ .settings-info-row__value--enabled {
1012
+ border: 1px solid rgba(112, 202, 157, 0.24);
1013
+ background: rgba(112, 202, 157, 0.12);
1014
+ color: rgba(185, 239, 208, 0.96);
1015
+ }
1016
+
1017
+ .settings-row__value--disabled,
1018
+ .settings-info-row__value--disabled {
1019
+ color: rgba(231, 243, 250, 0.68);
1020
+ }
1021
+
1022
+ .settings-row__value--attention,
1023
+ .settings-info-row__value--attention {
1024
+ display: inline-flex;
1025
+ align-items: center;
1026
+ justify-content: center;
1027
+ min-height: 1.62rem;
1028
+ padding: 0.16rem 0.52rem;
1029
+ border-radius: 999px;
1030
+ border: 1px solid rgba(240, 180, 40, 0.26);
1031
+ background: rgba(240, 180, 40, 0.11);
1032
+ color: rgba(255, 220, 140, 0.96);
1033
+ font-size: 0.74rem;
1034
+ font-weight: 800;
1035
+ letter-spacing: 0.04em;
1036
+ line-height: 1;
1037
+ text-transform: uppercase;
1038
+ white-space: nowrap;
1039
+ }
1040
+
1041
+ .settings-row__value--disconnected,
1042
+ .settings-info-row__value--disconnected {
1043
+ color: rgba(205, 220, 231, 0.54);
1044
+ }
1045
+
919
1046
  .settings-info-row--stacked .settings-info-row__value {
920
1047
  text-align: left;
921
1048
  }
@@ -1077,6 +1204,25 @@ code {
1077
1204
  white-space: nowrap;
1078
1205
  }
1079
1206
 
1207
+ .device-card__badges {
1208
+ display: inline-flex;
1209
+ flex-wrap: wrap;
1210
+ justify-content: flex-end;
1211
+ gap: 0.35rem;
1212
+ }
1213
+
1214
+ .device-card__badge--live {
1215
+ border-color: rgba(112, 202, 157, 0.28);
1216
+ background: rgba(112, 202, 157, 0.14);
1217
+ color: #c8f3d9;
1218
+ }
1219
+
1220
+ .device-card__badge--offline {
1221
+ border-color: rgba(156, 181, 197, 0.14);
1222
+ background: rgba(156, 181, 197, 0.1);
1223
+ color: var(--muted);
1224
+ }
1225
+
1080
1226
  .device-card__meta {
1081
1227
  margin-top: 0.85rem;
1082
1228
  display: grid;
@@ -1237,6 +1383,18 @@ code {
1237
1383
  background: rgba(53, 26, 29, 0.96);
1238
1384
  }
1239
1385
 
1386
+ .wallet-beta-notice {
1387
+ border-color: rgba(240, 180, 40, 0.18);
1388
+ background: rgba(42, 34, 22, 0.78);
1389
+ }
1390
+
1391
+ .wallet-beta-notice p {
1392
+ margin: 0;
1393
+ color: rgba(255, 220, 140, 0.9);
1394
+ font-size: 0.84rem;
1395
+ line-height: 1.5;
1396
+ }
1397
+
1240
1398
  .settings-update-notice {
1241
1399
  margin-top: 0.85rem;
1242
1400
  border-color: rgba(121, 196, 255, 0.22);
@@ -1321,7 +1479,8 @@ code {
1321
1479
  border-color: rgba(112, 202, 157, 0.16);
1322
1480
  }
1323
1481
 
1324
- .wallet-step-card--locked {
1482
+ .wallet-step-card--locked,
1483
+ .wallet-step-card--comingSoon {
1325
1484
  opacity: 0.78;
1326
1485
  }
1327
1486
 
@@ -1408,7 +1567,8 @@ code {
1408
1567
  color: rgba(205, 220, 231, 0.6);
1409
1568
  }
1410
1569
 
1411
- .wallet-step-card__status--optional {
1570
+ .wallet-step-card__status--optional,
1571
+ .wallet-step-card__status--comingSoon {
1412
1572
  border-color: rgba(240, 180, 40, 0.22);
1413
1573
  background: rgba(240, 180, 40, 0.12);
1414
1574
  color: rgba(255, 220, 140, 0.96);
@@ -1675,6 +1835,12 @@ code {
1675
1835
  }
1676
1836
 
1677
1837
  @media (max-width: 640px) {
1838
+ input,
1839
+ textarea,
1840
+ select {
1841
+ font-size: 16px;
1842
+ }
1843
+
1678
1844
  .wallet-step-card__header {
1679
1845
  flex-direction: column;
1680
1846
  }
@@ -1735,12 +1901,17 @@ code {
1735
1901
  }
1736
1902
 
1737
1903
  .card-list {
1904
+ width: 100%;
1905
+ max-width: 100%;
1906
+ min-width: 0;
1738
1907
  display: grid;
1739
1908
  gap: 0.85rem;
1740
1909
  }
1741
1910
 
1742
1911
  .item-card {
1743
1912
  width: 100%;
1913
+ min-width: 0;
1914
+ overflow: hidden;
1744
1915
  display: grid;
1745
1916
  gap: 0.8rem;
1746
1917
  padding: 0.95rem;
@@ -1754,6 +1925,7 @@ code {
1754
1925
  }
1755
1926
 
1756
1927
  .item-card__header {
1928
+ min-width: 0;
1757
1929
  display: flex;
1758
1930
  justify-content: space-between;
1759
1931
  gap: 0.8rem;
@@ -1761,11 +1933,12 @@ code {
1761
1933
  }
1762
1934
 
1763
1935
  .item-card__header-right {
1936
+ flex: 0 0 auto;
1764
1937
  display: inline-flex;
1765
1938
  align-items: center;
1766
1939
  justify-content: flex-end;
1767
1940
  gap: 0.55rem;
1768
- min-width: fit-content;
1941
+ min-width: 0;
1769
1942
  }
1770
1943
 
1771
1944
  .item-card__header--completion-readonly {
@@ -1775,18 +1948,21 @@ code {
1775
1948
 
1776
1949
  .item-card__meta,
1777
1950
  .detail-pills {
1951
+ min-width: 0;
1778
1952
  display: flex;
1779
1953
  flex-wrap: wrap;
1780
1954
  gap: 0.55rem;
1781
1955
  }
1782
1956
 
1783
1957
  .item-card__content {
1958
+ min-width: 0;
1784
1959
  display: grid;
1785
1960
  gap: 0.38rem;
1786
1961
  }
1787
1962
 
1788
1963
  .item-card__intent,
1789
1964
  .detail-intent {
1965
+ min-width: 0;
1790
1966
  margin: 0;
1791
1967
  display: inline-flex;
1792
1968
  align-items: center;
@@ -1794,6 +1970,7 @@ code {
1794
1970
  color: rgba(236, 248, 255, 0.86);
1795
1971
  font-size: 0.84rem;
1796
1972
  line-height: 1.35;
1973
+ overflow-wrap: anywhere;
1797
1974
  }
1798
1975
 
1799
1976
  .item-card__intent {
@@ -1810,6 +1987,7 @@ code {
1810
1987
  }
1811
1988
 
1812
1989
  .item-card__title {
1990
+ min-width: 0;
1813
1991
  margin: 0;
1814
1992
  font-size: 1.08rem;
1815
1993
  line-height: 1.35;
@@ -1817,6 +1995,7 @@ code {
1817
1995
  }
1818
1996
 
1819
1997
  .item-card__summary {
1998
+ min-width: 0;
1820
1999
  margin: 0;
1821
2000
  color: var(--muted);
1822
2001
  line-height: 1.45;
@@ -1828,6 +2007,7 @@ code {
1828
2007
  }
1829
2008
 
1830
2009
  .item-card__thread {
2010
+ min-width: 0;
1831
2011
  margin: 0;
1832
2012
  color: var(--muted);
1833
2013
  font-size: 0.82rem;
@@ -2101,6 +2281,8 @@ code {
2101
2281
 
2102
2282
  .timeline-entry {
2103
2283
  width: 100%;
2284
+ min-width: 0;
2285
+ overflow: hidden;
2104
2286
  display: grid;
2105
2287
  gap: 0.55rem;
2106
2288
  padding: 0.92rem;
@@ -2288,6 +2470,7 @@ code {
2288
2470
  }
2289
2471
 
2290
2472
  .timeline-entry__meta {
2473
+ min-width: 0;
2291
2474
  display: grid;
2292
2475
  grid-template-columns: minmax(0, 1fr) auto;
2293
2476
  gap: 0.75rem;
@@ -2305,6 +2488,7 @@ code {
2305
2488
  min-width: 0;
2306
2489
  display: inline-flex;
2307
2490
  align-items: center;
2491
+ flex-wrap: wrap;
2308
2492
  gap: 0.42rem;
2309
2493
  color: #edf8ff;
2310
2494
  font-size: 0.8rem;
@@ -2338,6 +2522,7 @@ code {
2338
2522
  }
2339
2523
 
2340
2524
  .timeline-entry__body {
2525
+ min-width: 0;
2341
2526
  display: grid;
2342
2527
  gap: 0.34rem;
2343
2528
  }
@@ -2408,6 +2593,7 @@ code {
2408
2593
 
2409
2594
  .timeline-entry__title,
2410
2595
  .timeline-entry__summary {
2596
+ min-width: 0;
2411
2597
  margin: 0;
2412
2598
  overflow-wrap: anywhere;
2413
2599
  }
@@ -2523,6 +2709,8 @@ code {
2523
2709
  }
2524
2710
 
2525
2711
  .detail-shell--mobile {
2712
+ width: 100%;
2713
+ max-width: 100%;
2526
2714
  display: grid;
2527
2715
  grid-template-rows: minmax(0, 1fr) auto;
2528
2716
  min-height: calc(100dvh - 5.6rem);
@@ -2536,6 +2724,8 @@ code {
2536
2724
  }
2537
2725
 
2538
2726
  .mobile-detail-screen {
2727
+ width: 100%;
2728
+ max-width: 100%;
2539
2729
  display: flex;
2540
2730
  flex-direction: column;
2541
2731
  gap: 0;
@@ -2543,8 +2733,11 @@ code {
2543
2733
  }
2544
2734
 
2545
2735
  .mobile-detail-scroll {
2736
+ width: 100%;
2737
+ max-width: 100%;
2546
2738
  min-height: 0;
2547
- overflow: auto;
2739
+ overflow-y: auto;
2740
+ overflow-x: hidden;
2548
2741
  -webkit-overflow-scrolling: touch;
2549
2742
  padding: 0 0.42rem 0.78rem;
2550
2743
  display: flex;
@@ -2558,6 +2751,10 @@ code {
2558
2751
  gap: 0.14rem;
2559
2752
  }
2560
2753
 
2754
+ .mobile-detail-screen--has-reply-dock .mobile-detail-scroll--detail {
2755
+ padding-bottom: calc(6rem + env(safe-area-inset-bottom));
2756
+ }
2757
+
2561
2758
  .detail-action-bar {
2562
2759
  display: grid;
2563
2760
  gap: 0.75rem;
@@ -2637,6 +2834,8 @@ code {
2637
2834
  .detail-body {
2638
2835
  overflow-wrap: anywhere;
2639
2836
  width: 100%;
2837
+ min-width: 0;
2838
+ max-width: 100%;
2640
2839
  }
2641
2840
 
2642
2841
  .detail-card--body .detail-body {
@@ -2652,6 +2851,8 @@ code {
2652
2851
  }
2653
2852
 
2654
2853
  .detail-body.markdown {
2854
+ min-width: 0;
2855
+ max-width: 100%;
2655
2856
  line-height: 1.62;
2656
2857
  color: #f3fbff;
2657
2858
  }
@@ -2691,6 +2892,7 @@ code {
2691
2892
  }
2692
2893
 
2693
2894
  .detail-body.markdown pre {
2895
+ max-width: 100%;
2694
2896
  overflow: auto;
2695
2897
  padding: 0.82rem 0.88rem;
2696
2898
  border: 1px solid var(--line);
@@ -2699,6 +2901,7 @@ code {
2699
2901
  }
2700
2902
 
2701
2903
  .detail-body.markdown table {
2904
+ max-width: 100%;
2702
2905
  display: block;
2703
2906
  overflow-x: auto;
2704
2907
  }
@@ -2717,10 +2920,17 @@ code {
2717
2920
  align-items: stretch;
2718
2921
  gap: 0.52rem;
2719
2922
  width: 100%;
2923
+ min-width: 0;
2924
+ max-width: 100%;
2720
2925
  align-self: start;
2721
2926
  padding: 0.68rem 0.78rem;
2722
2927
  }
2723
2928
 
2929
+ .detail-card > * {
2930
+ min-width: 0;
2931
+ max-width: 100%;
2932
+ }
2933
+
2724
2934
  .detail-card--mobile {
2725
2935
  padding: 0.42rem 0.5rem;
2726
2936
  gap: 0.4rem;
@@ -3331,6 +3541,8 @@ code {
3331
3541
  .reply-composer {
3332
3542
  display: grid;
3333
3543
  gap: 0.78rem;
3544
+ min-width: 0;
3545
+ max-width: 100%;
3334
3546
  }
3335
3547
 
3336
3548
  .reply-composer--readonly {
@@ -3339,6 +3551,8 @@ code {
3339
3551
  .reply-composer__copy {
3340
3552
  display: grid;
3341
3553
  gap: 0.34rem;
3554
+ min-width: 0;
3555
+ max-width: 100%;
3342
3556
  }
3343
3557
 
3344
3558
  .reply-composer__title {
@@ -3355,6 +3569,8 @@ code {
3355
3569
  .reply-composer__form {
3356
3570
  display: grid;
3357
3571
  gap: 0.8rem;
3572
+ min-width: 0;
3573
+ max-width: 100%;
3358
3574
  }
3359
3575
 
3360
3576
  .reply-composer__context {
@@ -3412,6 +3628,7 @@ code {
3412
3628
  }
3413
3629
  .reply-composer__textarea {
3414
3630
  width: 100%;
3631
+ min-width: 0;
3415
3632
  min-height: 14rem;
3416
3633
  padding: 0.85rem 0.95rem;
3417
3634
  border-radius: 14px;
@@ -3419,7 +3636,7 @@ code {
3419
3636
  background: rgba(7, 12, 16, 0.96);
3420
3637
  color: var(--text);
3421
3638
  font: inherit;
3422
- font-size: 1rem;
3639
+ font-size: max(1rem, 16px);
3423
3640
  line-height: 1.55;
3424
3641
  resize: vertical;
3425
3642
  }
@@ -3429,6 +3646,166 @@ code {
3429
3646
  border-color: var(--accent, #6ea8ff);
3430
3647
  }
3431
3648
 
3649
+ .reply-dock {
3650
+ position: fixed;
3651
+ left: calc(var(--visual-viewport-left, 0px) + max(1rem, env(safe-area-inset-left)));
3652
+ bottom: calc(0.88rem + env(safe-area-inset-bottom));
3653
+ z-index: 36;
3654
+ width: calc(var(--visual-viewport-width, 100vw) - max(1rem, env(safe-area-inset-left)) - max(1rem, env(safe-area-inset-right)));
3655
+ max-width: calc(var(--visual-viewport-width, 100vw) - max(1rem, env(safe-area-inset-left)) - max(1rem, env(safe-area-inset-right)));
3656
+ pointer-events: none;
3657
+ }
3658
+
3659
+ .reply-dock__button {
3660
+ width: 100%;
3661
+ min-height: 3.45rem;
3662
+ display: grid;
3663
+ align-content: center;
3664
+ justify-items: center;
3665
+ padding: 0.82rem 1rem;
3666
+ border: 1px solid rgba(156, 181, 197, 0.18);
3667
+ border-radius: 20px;
3668
+ background:
3669
+ linear-gradient(180deg, rgba(28, 42, 52, 0.96), rgba(17, 28, 36, 0.96)),
3670
+ rgba(20, 31, 40, 0.94);
3671
+ color: rgba(236, 248, 255, 0.94);
3672
+ box-shadow:
3673
+ 0 18px 44px rgba(0, 0, 0, 0.3),
3674
+ inset 0 1px 0 rgba(255, 255, 255, 0.08);
3675
+ pointer-events: auto;
3676
+ text-align: center;
3677
+ }
3678
+
3679
+ .reply-dock__label {
3680
+ font-size: 1rem;
3681
+ font-weight: 800;
3682
+ line-height: 1.2;
3683
+ }
3684
+
3685
+ .reply-dock__hint {
3686
+ color: rgba(244, 255, 248, 0.74);
3687
+ font-size: 0.78rem;
3688
+ font-weight: 650;
3689
+ line-height: 1.25;
3690
+ }
3691
+
3692
+ .reply-sheet-backdrop {
3693
+ position: fixed;
3694
+ top: 0;
3695
+ right: auto;
3696
+ bottom: 0;
3697
+ left: var(--visual-viewport-left, 0px);
3698
+ width: var(--visual-viewport-width, 100vw);
3699
+ max-width: var(--visual-viewport-width, 100vw);
3700
+ z-index: 44;
3701
+ background: rgba(2, 7, 10, 0.56);
3702
+ -webkit-backdrop-filter: blur(10px);
3703
+ backdrop-filter: blur(10px);
3704
+ animation: reply-sheet-backdrop-in 160ms ease-out both;
3705
+ }
3706
+
3707
+ .reply-sheet {
3708
+ position: fixed;
3709
+ left: var(--visual-viewport-left, 0px);
3710
+ right: auto;
3711
+ bottom: 0;
3712
+ z-index: 45;
3713
+ width: var(--visual-viewport-width, 100vw);
3714
+ min-width: 0;
3715
+ max-width: var(--visual-viewport-width, 100vw);
3716
+ max-height: min(82dvh, 42rem);
3717
+ display: grid;
3718
+ gap: 0.72rem;
3719
+ padding:
3720
+ 0.78rem
3721
+ max(0.9rem, env(safe-area-inset-right))
3722
+ calc(0.9rem + env(safe-area-inset-bottom))
3723
+ max(0.9rem, env(safe-area-inset-left));
3724
+ overflow-x: hidden;
3725
+ overflow-y: auto;
3726
+ -webkit-overflow-scrolling: touch;
3727
+ border: 1px solid rgba(156, 181, 197, 0.18);
3728
+ border-bottom: 0;
3729
+ border-radius: 28px 28px 0 0;
3730
+ background:
3731
+ linear-gradient(180deg, rgba(28, 42, 52, 0.98), rgba(13, 22, 29, 0.98)),
3732
+ var(--panel-strong);
3733
+ box-shadow: 0 -22px 58px rgba(0, 0, 0, 0.42);
3734
+ animation: reply-sheet-in 190ms cubic-bezier(0.2, 0.9, 0.24, 1) both;
3735
+ }
3736
+
3737
+ .reply-sheet > * {
3738
+ min-width: 0;
3739
+ max-width: 100%;
3740
+ }
3741
+
3742
+ .reply-sheet__handle {
3743
+ justify-self: center;
3744
+ width: 2.75rem;
3745
+ height: 0.28rem;
3746
+ border-radius: 999px;
3747
+ background: rgba(205, 220, 231, 0.28);
3748
+ }
3749
+
3750
+ .reply-sheet__close {
3751
+ position: absolute;
3752
+ top: 0.82rem;
3753
+ right: max(0.9rem, env(safe-area-inset-right));
3754
+ width: 2.45rem;
3755
+ height: 2.45rem;
3756
+ display: inline-flex;
3757
+ align-items: center;
3758
+ justify-content: center;
3759
+ border: 1px solid rgba(156, 181, 197, 0.16);
3760
+ border-radius: 999px;
3761
+ background: rgba(255, 255, 255, 0.06);
3762
+ color: rgba(236, 248, 255, 0.9);
3763
+ }
3764
+
3765
+ .reply-sheet__close span {
3766
+ display: block;
3767
+ transform: translateY(-0.03em);
3768
+ font-size: 1.45rem;
3769
+ line-height: 1;
3770
+ }
3771
+
3772
+ .reply-sheet .detail-card--reply {
3773
+ width: 100%;
3774
+ max-width: 100%;
3775
+ margin-top: 0;
3776
+ padding: 0.58rem 0 0;
3777
+ border: 0;
3778
+ border-radius: 0;
3779
+ background: transparent;
3780
+ box-shadow: none;
3781
+ }
3782
+
3783
+ .reply-sheet .reply-composer__description {
3784
+ padding: 0.5rem 0.12rem;
3785
+ }
3786
+
3787
+ .reply-sheet .reply-field__input {
3788
+ min-height: 9rem;
3789
+ }
3790
+
3791
+ @keyframes reply-sheet-in {
3792
+ from {
3793
+ transform: translateY(100%);
3794
+ }
3795
+ to {
3796
+ transform: translateY(0);
3797
+ }
3798
+ }
3799
+
3800
+ @keyframes reply-sheet-backdrop-in {
3801
+ from {
3802
+ opacity: 0;
3803
+ }
3804
+ to {
3805
+ opacity: 1;
3806
+ }
3807
+ }
3808
+
3432
3809
  .a2a-task-response {
3433
3810
  width: 100%;
3434
3811
  padding: 0.85rem 0.95rem;
@@ -3486,11 +3863,15 @@ code {
3486
3863
 
3487
3864
  .reply-field {
3488
3865
  gap: 0.5rem;
3866
+ min-width: 0;
3867
+ max-width: 100%;
3489
3868
  }
3490
3869
 
3491
3870
  .reply-field__shell {
3492
3871
  display: grid;
3493
3872
  gap: 0.52rem;
3873
+ min-width: 0;
3874
+ max-width: 100%;
3494
3875
  padding: 0.82rem 0.9rem 0.76rem;
3495
3876
  border-radius: 18px;
3496
3877
  border: 1px solid var(--line);
@@ -3500,6 +3881,7 @@ code {
3500
3881
  .reply-field__input {
3501
3882
  width: 100%;
3502
3883
  min-height: 7.4rem;
3884
+ min-width: 0;
3503
3885
  padding: 0;
3504
3886
  border-radius: 0;
3505
3887
  border: 0;
@@ -3507,6 +3889,7 @@ code {
3507
3889
  color: var(--text);
3508
3890
  resize: vertical;
3509
3891
  font: inherit;
3892
+ font-size: max(1rem, 16px);
3510
3893
  line-height: 1.58;
3511
3894
  }
3512
3895
 
@@ -3520,9 +3903,11 @@ code {
3520
3903
 
3521
3904
  .reply-field__toolbar {
3522
3905
  display: grid;
3523
- grid-template-columns: auto 1fr;
3906
+ grid-template-columns: auto minmax(0, 1fr);
3524
3907
  align-items: end;
3525
3908
  gap: 0.72rem;
3909
+ min-width: 0;
3910
+ max-width: 100%;
3526
3911
  }
3527
3912
 
3528
3913
  .reply-attachment-trigger {
@@ -3623,6 +4008,7 @@ code {
3623
4008
  align-items: center;
3624
4009
  gap: 0.62rem;
3625
4010
  min-width: 0;
4011
+ max-width: 100%;
3626
4012
  cursor: pointer;
3627
4013
  }
3628
4014
 
@@ -3766,7 +4152,12 @@ code {
3766
4152
  gap: 0.32rem;
3767
4153
  }
3768
4154
 
3769
- .reply-mode-switch--settings .reply-mode-switch__hint {
4155
+ .reply-mode-switch--settings > .reply-mode-switch__copy {
4156
+ grid-column: 1;
4157
+ grid-row: 1;
4158
+ }
4159
+
4160
+ .reply-mode-switch--settings > .reply-mode-switch__hint {
3770
4161
  grid-column: 1;
3771
4162
  grid-row: 1;
3772
4163
  }
@@ -4721,7 +5112,9 @@ button[aria-busy="true"]:not(.is-loading) {
4721
5112
  }
4722
5113
 
4723
5114
  .provider-filter {
4724
- display: inline-flex;
5115
+ width: 100%;
5116
+ min-width: 0;
5117
+ display: flex;
4725
5118
  align-items: center;
4726
5119
  gap: 0.25rem;
4727
5120
  padding: 0.2rem;
@@ -4732,8 +5125,13 @@ button[aria-busy="true"]:not(.is-loading) {
4732
5125
  max-width: 100%;
4733
5126
  overflow-x: auto;
4734
5127
  -webkit-overflow-scrolling: touch;
5128
+ scrollbar-width: none;
5129
+ }
5130
+ .provider-filter::-webkit-scrollbar {
5131
+ display: none;
4735
5132
  }
4736
5133
  .provider-filter__button {
5134
+ min-width: 0;
4737
5135
  appearance: none;
4738
5136
  background: transparent;
4739
5137
  color: var(--text-muted, #9aa6b2);
@@ -4833,3 +5231,323 @@ button[aria-busy="true"]:not(.is-loading) {
4833
5231
  font-size: 0.85rem;
4834
5232
  color: #ff8a8a;
4835
5233
  }
5234
+
5235
+ /* ─── Remote connection settings ────────────────────────────────────── */
5236
+ .settings-remote-connection {
5237
+ display: grid;
5238
+ gap: 0.8rem;
5239
+ padding: 0.92rem 1rem 1rem;
5240
+ border: 1px solid rgba(112, 202, 157, 0.16);
5241
+ border-radius: 20px;
5242
+ background:
5243
+ linear-gradient(180deg, rgba(47, 143, 103, 0.12), rgba(22, 28, 35, 0.96)),
5244
+ rgba(22, 28, 35, 0.96);
5245
+ box-shadow: 0 12px 28px rgba(0, 0, 0, 0.16);
5246
+ }
5247
+
5248
+ .settings-remote-connection__header {
5249
+ display: flex;
5250
+ align-items: flex-start;
5251
+ justify-content: space-between;
5252
+ gap: 0.8rem;
5253
+ }
5254
+
5255
+ .settings-remote-connection__copy {
5256
+ display: grid;
5257
+ gap: 0.32rem;
5258
+ min-width: 0;
5259
+ }
5260
+
5261
+ .settings-remote-connection__title {
5262
+ margin: 0;
5263
+ color: var(--text);
5264
+ font-size: 1rem;
5265
+ font-weight: 800;
5266
+ line-height: 1.25;
5267
+ }
5268
+
5269
+ .settings-remote-connection__trust {
5270
+ margin: 0;
5271
+ padding: 0 0.2rem;
5272
+ color: var(--muted);
5273
+ font-size: 0.83rem;
5274
+ line-height: 1.48;
5275
+ }
5276
+
5277
+ .settings-remote-status {
5278
+ display: inline-flex;
5279
+ align-items: center;
5280
+ justify-content: center;
5281
+ flex: 0 0 auto;
5282
+ min-height: 1.85rem;
5283
+ padding: 0.24rem 0.66rem;
5284
+ border-radius: 999px;
5285
+ font-size: 0.72rem;
5286
+ font-weight: 800;
5287
+ letter-spacing: 0.04em;
5288
+ text-transform: uppercase;
5289
+ white-space: nowrap;
5290
+ }
5291
+
5292
+ .settings-remote-status--success {
5293
+ background: rgba(112, 202, 157, 0.16);
5294
+ color: #b9efd0;
5295
+ }
5296
+
5297
+ .settings-remote-status--warning {
5298
+ background: rgba(210, 170, 99, 0.16);
5299
+ color: #f5ddb1;
5300
+ }
5301
+
5302
+ .settings-remote-status--muted {
5303
+ background: rgba(156, 181, 197, 0.12);
5304
+ color: var(--muted);
5305
+ }
5306
+
5307
+ .settings-remote-device-card {
5308
+ gap: 0.55rem;
5309
+ }
5310
+
5311
+ .settings-remote-device-hint {
5312
+ margin-top: 0.78rem;
5313
+ padding: 0;
5314
+ }
5315
+
5316
+ .settings-remote-audit-list {
5317
+ display: grid;
5318
+ gap: 0.55rem;
5319
+ }
5320
+
5321
+ .settings-remote-audit-item {
5322
+ display: grid;
5323
+ grid-template-columns: auto minmax(0, 1fr) auto;
5324
+ align-items: start;
5325
+ gap: 0.65rem;
5326
+ padding: 0.72rem 0.78rem;
5327
+ border: 1px solid rgba(156, 181, 197, 0.08);
5328
+ border-radius: 15px;
5329
+ background: rgba(14, 21, 27, 0.62);
5330
+ }
5331
+
5332
+ .settings-remote-audit-dot {
5333
+ width: 0.58rem;
5334
+ height: 0.58rem;
5335
+ margin-top: 0.32rem;
5336
+ border-radius: 999px;
5337
+ background: rgba(156, 181, 197, 0.44);
5338
+ box-shadow: 0 0 0 4px rgba(156, 181, 197, 0.08);
5339
+ }
5340
+
5341
+ .settings-remote-audit-dot--success {
5342
+ background: #70ca9d;
5343
+ box-shadow: 0 0 0 4px rgba(112, 202, 157, 0.12);
5344
+ }
5345
+
5346
+ .settings-remote-audit-dot--danger {
5347
+ background: #e98686;
5348
+ box-shadow: 0 0 0 4px rgba(233, 134, 134, 0.12);
5349
+ }
5350
+
5351
+ .settings-remote-audit-body {
5352
+ min-width: 0;
5353
+ }
5354
+
5355
+ .settings-remote-audit-title {
5356
+ margin: 0;
5357
+ color: rgba(231, 243, 250, 0.9);
5358
+ font-size: 0.86rem;
5359
+ font-weight: 760;
5360
+ line-height: 1.35;
5361
+ }
5362
+
5363
+ .settings-remote-audit-meta {
5364
+ margin: 0.18rem 0 0;
5365
+ color: var(--muted);
5366
+ font-size: 0.76rem;
5367
+ line-height: 1.42;
5368
+ overflow-wrap: anywhere;
5369
+ }
5370
+
5371
+ .settings-remote-audit-time {
5372
+ color: rgba(173, 194, 207, 0.72);
5373
+ font-size: 0.72rem;
5374
+ line-height: 1.35;
5375
+ white-space: nowrap;
5376
+ }
5377
+
5378
+ .settings-remote-details {
5379
+ padding: 0.92rem 1rem;
5380
+ border: 1px solid rgba(156, 181, 197, 0.08);
5381
+ border-radius: 18px;
5382
+ background: rgba(22, 28, 35, 0.78);
5383
+ }
5384
+
5385
+ .settings-remote-details summary {
5386
+ color: rgba(205, 220, 231, 0.72);
5387
+ font-size: 0.86rem;
5388
+ }
5389
+
5390
+ .settings-remote-details[open] summary {
5391
+ margin-bottom: 0.85rem;
5392
+ color: var(--text);
5393
+ }
5394
+
5395
+ .settings-input-row {
5396
+ display: flex;
5397
+ flex-wrap: wrap;
5398
+ gap: 0.5rem;
5399
+ align-items: center;
5400
+ }
5401
+
5402
+ .settings-input {
5403
+ flex: 1 1 0;
5404
+ min-width: 0;
5405
+ width: 100%;
5406
+ padding: 0.58rem 0.75rem;
5407
+ border-radius: 0.55rem;
5408
+ border: 1px solid var(--line-strong);
5409
+ background: rgba(7, 12, 16, 0.72);
5410
+ color: var(--text);
5411
+ font: inherit;
5412
+ line-height: 1.4;
5413
+ transition: border-color 0.12s ease, box-shadow 0.12s ease, background 0.12s ease;
5414
+ }
5415
+
5416
+ .settings-input::placeholder {
5417
+ color: rgba(205, 220, 231, 0.38);
5418
+ }
5419
+
5420
+ .settings-input:focus {
5421
+ outline: none;
5422
+ border-color: rgba(112, 202, 157, 0.55);
5423
+ background: rgba(7, 12, 16, 0.92);
5424
+ box-shadow: 0 0 0 3px rgba(47, 143, 103, 0.22);
5425
+ }
5426
+
5427
+ .settings-input:disabled {
5428
+ opacity: 0.6;
5429
+ cursor: not-allowed;
5430
+ }
5431
+
5432
+ .settings-card {
5433
+ display: grid;
5434
+ gap: 0.6rem;
5435
+ padding: 0.85rem 1rem;
5436
+ border-radius: 14px;
5437
+ background: rgba(255, 255, 255, 0.03);
5438
+ border: 1px solid rgba(156, 181, 197, 0.16);
5439
+ }
5440
+
5441
+ .settings-card + .settings-card {
5442
+ margin-top: 0.55rem;
5443
+ }
5444
+
5445
+ .settings-card__header {
5446
+ display: flex;
5447
+ align-items: flex-start;
5448
+ justify-content: space-between;
5449
+ gap: 0.6rem;
5450
+ }
5451
+
5452
+ .settings-card__title {
5453
+ margin: 0;
5454
+ font-size: 0.95rem;
5455
+ font-weight: 600;
5456
+ color: var(--text);
5457
+ word-break: break-all;
5458
+ }
5459
+
5460
+ .settings-card__subtitle {
5461
+ margin: 0.15rem 0 0 0;
5462
+ font-size: 0.72rem;
5463
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
5464
+ color: var(--muted);
5465
+ word-break: break-all;
5466
+ }
5467
+
5468
+ .settings-card__badge {
5469
+ display: inline-flex;
5470
+ align-items: center;
5471
+ flex-shrink: 0;
5472
+ padding: 0.18rem 0.55rem;
5473
+ border-radius: 999px;
5474
+ font-size: 0.68rem;
5475
+ font-weight: 600;
5476
+ letter-spacing: 0.04em;
5477
+ text-transform: uppercase;
5478
+ }
5479
+
5480
+ .settings-card__badge--live {
5481
+ background: rgba(112, 202, 157, 0.18);
5482
+ color: #b5e6cc;
5483
+ }
5484
+
5485
+ .settings-card__badge--offline {
5486
+ background: rgba(156, 181, 197, 0.14);
5487
+ color: var(--muted);
5488
+ }
5489
+
5490
+ /* "This device" badge — accent border + indigo tint to draw the eye to the
5491
+ row representing the phone the user is currently looking at. Placed
5492
+ alongside the live/offline badge inside .settings-card__badges. */
5493
+ .settings-card__badge--self {
5494
+ background: rgba(120, 144, 240, 0.18);
5495
+ color: #c2cdfa;
5496
+ border: 1px solid rgba(120, 144, 240, 0.45);
5497
+ }
5498
+
5499
+ /* Container for stacked badges — vertical stack on mobile keeps each badge
5500
+ on its own line so labels stay legible regardless of width. */
5501
+ .settings-card__badges {
5502
+ display: inline-flex;
5503
+ flex-wrap: wrap;
5504
+ align-items: flex-end;
5505
+ justify-content: flex-end;
5506
+ gap: 0.35rem;
5507
+ }
5508
+
5509
+ /* Subtle frame upgrade for the "this device" pairing card so the user can
5510
+ spot themselves in the list at a glance. */
5511
+ .settings-card--self {
5512
+ border-color: rgba(120, 144, 240, 0.45);
5513
+ background: rgba(120, 144, 240, 0.07);
5514
+ }
5515
+
5516
+ .settings-card__rows {
5517
+ display: grid;
5518
+ grid-template-columns: max-content 1fr;
5519
+ column-gap: 0.85rem;
5520
+ row-gap: 0.25rem;
5521
+ margin: 0;
5522
+ }
5523
+
5524
+ .settings-card__rows > div {
5525
+ display: contents;
5526
+ }
5527
+
5528
+ .settings-card__rows dt {
5529
+ font-size: 0.7rem;
5530
+ font-weight: 600;
5531
+ letter-spacing: 0.04em;
5532
+ color: var(--muted);
5533
+ text-transform: uppercase;
5534
+ align-self: center;
5535
+ }
5536
+
5537
+ .settings-card__rows dd {
5538
+ margin: 0;
5539
+ font-size: 0.82rem;
5540
+ color: var(--text);
5541
+ align-self: center;
5542
+ }
5543
+
5544
+ .settings-card__actions {
5545
+ display: flex;
5546
+ justify-content: flex-end;
5547
+ gap: 0.5rem;
5548
+ margin-top: 0.15rem;
5549
+ }
5550
+
5551
+ .settings-page-copy.danger {
5552
+ color: #ff8a8a;
5553
+ }