@bakapiano/ccsm 0.18.6 → 0.19.1
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/lib/devices.js +19 -5
- package/lib/tunnel.js +151 -0
- package/package.json +1 -1
- package/public/css/feedback.css +72 -0
- package/public/css/responsive.css +9 -1
- package/public/css/sidebar.css +11 -5
- package/public/css/widgets.css +714 -1
- package/public/js/api.js +23 -7
- package/public/js/backend.js +26 -0
- package/public/js/components/App.js +2 -0
- package/public/js/components/OfflineBanner.js +9 -35
- package/public/js/components/PendingApprovalOverlay.js +44 -2
- package/public/js/components/RestartOverlay.js +36 -0
- package/public/js/components/Sidebar.js +2 -2
- package/public/js/icons.js +11 -6
- package/public/js/main.js +17 -0
- package/public/js/pages/ConfigurePage.js +43 -25
- package/public/js/pages/RemotePage.js +318 -152
- package/public/js/state.js +6 -0
- package/server.js +24 -2
package/public/css/widgets.css
CHANGED
|
@@ -1641,6 +1641,698 @@
|
|
|
1641
1641
|
input + action cluster, the URL row, the CLI log block, and the
|
|
1642
1642
|
bulleted security list. */
|
|
1643
1643
|
|
|
1644
|
+
/* Provider picker tiles — large clickable cards with the brand mark
|
|
1645
|
+
front and center, replacing the old chip-row radio pair. Two-wide
|
|
1646
|
+
on desktop, stacks at narrow widths. */
|
|
1647
|
+
.provider-tile-row {
|
|
1648
|
+
display: grid;
|
|
1649
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
1650
|
+
gap: var(--s-3);
|
|
1651
|
+
max-width: 560px;
|
|
1652
|
+
}
|
|
1653
|
+
@media (max-width: 560px) {
|
|
1654
|
+
.provider-tile-row { grid-template-columns: 1fr; }
|
|
1655
|
+
}
|
|
1656
|
+
.provider-tile {
|
|
1657
|
+
appearance: none;
|
|
1658
|
+
display: flex;
|
|
1659
|
+
align-items: center;
|
|
1660
|
+
gap: var(--s-3);
|
|
1661
|
+
padding: var(--s-3) var(--s-4);
|
|
1662
|
+
background: var(--bg-elev);
|
|
1663
|
+
border: 1px solid var(--border);
|
|
1664
|
+
border-radius: 10px;
|
|
1665
|
+
cursor: pointer;
|
|
1666
|
+
text-align: left;
|
|
1667
|
+
color: var(--ink);
|
|
1668
|
+
font: inherit;
|
|
1669
|
+
transition: border-color .12s, background-color .12s, box-shadow .12s;
|
|
1670
|
+
}
|
|
1671
|
+
.provider-tile:hover { border-color: var(--border-strong); }
|
|
1672
|
+
.provider-tile.is-selected {
|
|
1673
|
+
border-color: var(--ink);
|
|
1674
|
+
background: var(--bg-elev);
|
|
1675
|
+
box-shadow: 0 0 0 1px var(--ink);
|
|
1676
|
+
}
|
|
1677
|
+
.provider-tile.is-disabled,
|
|
1678
|
+
.provider-tile:disabled {
|
|
1679
|
+
cursor: not-allowed;
|
|
1680
|
+
opacity: 0.55;
|
|
1681
|
+
}
|
|
1682
|
+
.provider-tile.is-disabled:hover,
|
|
1683
|
+
.provider-tile:disabled:hover {
|
|
1684
|
+
border-color: var(--border);
|
|
1685
|
+
}
|
|
1686
|
+
.provider-tile:focus-visible {
|
|
1687
|
+
outline: 2px solid var(--ink);
|
|
1688
|
+
outline-offset: 2px;
|
|
1689
|
+
}
|
|
1690
|
+
.provider-tile-icon {
|
|
1691
|
+
flex: 0 0 32px;
|
|
1692
|
+
width: 32px;
|
|
1693
|
+
height: 32px;
|
|
1694
|
+
display: inline-flex;
|
|
1695
|
+
align-items: center;
|
|
1696
|
+
justify-content: center;
|
|
1697
|
+
}
|
|
1698
|
+
.provider-tile-body {
|
|
1699
|
+
display: flex;
|
|
1700
|
+
flex-direction: column;
|
|
1701
|
+
gap: 2px;
|
|
1702
|
+
min-width: 0;
|
|
1703
|
+
}
|
|
1704
|
+
.provider-tile-label {
|
|
1705
|
+
font-size: 14px;
|
|
1706
|
+
font-weight: 500;
|
|
1707
|
+
letter-spacing: -0.005em;
|
|
1708
|
+
}
|
|
1709
|
+
.provider-tile-hint {
|
|
1710
|
+
font-size: 11.5px;
|
|
1711
|
+
color: var(--ink-muted);
|
|
1712
|
+
}
|
|
1713
|
+
/* ── Provider status row + sign-in card ───────────────────────────
|
|
1714
|
+
Replaces the older devtunnel-login + .remote-status-line inline
|
|
1715
|
+
bag-of-spans with a single composable card vocabulary so the
|
|
1716
|
+
signed-in / signed-out / mid-sign-in states all read as parts of
|
|
1717
|
+
one design rather than three different debug widgets. */
|
|
1718
|
+
.provider-status {
|
|
1719
|
+
display: flex;
|
|
1720
|
+
align-items: center;
|
|
1721
|
+
flex-wrap: wrap;
|
|
1722
|
+
gap: var(--s-2) var(--s-3);
|
|
1723
|
+
}
|
|
1724
|
+
.provider-status.is-stack {
|
|
1725
|
+
flex-direction: column;
|
|
1726
|
+
align-items: stretch;
|
|
1727
|
+
gap: var(--s-2);
|
|
1728
|
+
}
|
|
1729
|
+
.provider-status.is-stack .provider-status-row {
|
|
1730
|
+
display: flex;
|
|
1731
|
+
align-items: center;
|
|
1732
|
+
gap: var(--s-2) var(--s-3);
|
|
1733
|
+
flex-wrap: wrap;
|
|
1734
|
+
}
|
|
1735
|
+
.provider-status-muted { color: var(--ink-muted); font-size: 13px; }
|
|
1736
|
+
.provider-status-state {
|
|
1737
|
+
display: inline-flex;
|
|
1738
|
+
align-items: center;
|
|
1739
|
+
gap: 6px;
|
|
1740
|
+
font-size: 12.5px;
|
|
1741
|
+
font-weight: 500;
|
|
1742
|
+
letter-spacing: -0.003em;
|
|
1743
|
+
color: var(--ink);
|
|
1744
|
+
}
|
|
1745
|
+
.provider-status-state.is-warn { color: #8b3a3a; }
|
|
1746
|
+
.provider-status-state.is-ok { color: #2f6e3a; }
|
|
1747
|
+
.provider-status-dot {
|
|
1748
|
+
width: 7px;
|
|
1749
|
+
height: 7px;
|
|
1750
|
+
border-radius: 50%;
|
|
1751
|
+
background: var(--ink-muted);
|
|
1752
|
+
display: inline-block;
|
|
1753
|
+
}
|
|
1754
|
+
.provider-status-dot.is-ok { background: #4a8a4a; }
|
|
1755
|
+
.provider-status-dot.is-warn { background: #b86a2a; }
|
|
1756
|
+
.provider-status-user {
|
|
1757
|
+
font-family: var(--mono);
|
|
1758
|
+
font-size: 12px;
|
|
1759
|
+
padding: 2px 8px;
|
|
1760
|
+
border-radius: 4px;
|
|
1761
|
+
background: var(--bg);
|
|
1762
|
+
color: var(--ink);
|
|
1763
|
+
border: 1px solid var(--border);
|
|
1764
|
+
max-width: 28ch;
|
|
1765
|
+
overflow: hidden;
|
|
1766
|
+
text-overflow: ellipsis;
|
|
1767
|
+
white-space: nowrap;
|
|
1768
|
+
}
|
|
1769
|
+
.provider-status-version {
|
|
1770
|
+
font-family: var(--mono);
|
|
1771
|
+
font-size: 11px;
|
|
1772
|
+
color: var(--ink-muted);
|
|
1773
|
+
}
|
|
1774
|
+
.provider-status-switch { margin-left: auto; }
|
|
1775
|
+
.provider-status-signin { margin-left: auto; }
|
|
1776
|
+
|
|
1777
|
+
/* ── Tunnel section: hero (idle) + live banner (running) ──────────
|
|
1778
|
+
Idle: a single horizontal card with the headline + start CTA.
|
|
1779
|
+
Running: a status banner (state · provider · uptime · stop link)
|
|
1780
|
+
followed by a copyable share URL block and an optional collapsed
|
|
1781
|
+
CLI log. */
|
|
1782
|
+
.tunnel-hero {
|
|
1783
|
+
display: flex;
|
|
1784
|
+
align-items: center;
|
|
1785
|
+
justify-content: space-between;
|
|
1786
|
+
gap: var(--s-4);
|
|
1787
|
+
padding: var(--s-4) var(--s-5);
|
|
1788
|
+
border: 1px solid var(--border);
|
|
1789
|
+
border-radius: 10px;
|
|
1790
|
+
background: var(--bg-elev);
|
|
1791
|
+
}
|
|
1792
|
+
.tunnel-hero-body {
|
|
1793
|
+
display: flex;
|
|
1794
|
+
flex-direction: column;
|
|
1795
|
+
gap: 4px;
|
|
1796
|
+
min-width: 0;
|
|
1797
|
+
}
|
|
1798
|
+
.tunnel-hero-title {
|
|
1799
|
+
font-size: 15px;
|
|
1800
|
+
font-weight: 600;
|
|
1801
|
+
letter-spacing: -0.01em;
|
|
1802
|
+
color: var(--ink);
|
|
1803
|
+
}
|
|
1804
|
+
.tunnel-hero-meta {
|
|
1805
|
+
font-size: 12.5px;
|
|
1806
|
+
color: var(--ink-mid);
|
|
1807
|
+
line-height: 1.5;
|
|
1808
|
+
}
|
|
1809
|
+
.tunnel-hero-meta code {
|
|
1810
|
+
font-family: var(--mono);
|
|
1811
|
+
font-size: 11.5px;
|
|
1812
|
+
padding: 1px 5px;
|
|
1813
|
+
border-radius: 3px;
|
|
1814
|
+
background: var(--bg);
|
|
1815
|
+
border: 1px solid var(--border-soft);
|
|
1816
|
+
}
|
|
1817
|
+
.tunnel-hero-cta {
|
|
1818
|
+
/* Pick up theme accent + match the default size of other `.action`
|
|
1819
|
+
buttons across the app. No `min-width` override (was 140px, too
|
|
1820
|
+
wide compared to the Copy/Open pair). */
|
|
1821
|
+
flex: 0 0 auto;
|
|
1822
|
+
background: var(--accent);
|
|
1823
|
+
border-color: var(--accent);
|
|
1824
|
+
color: #fff;
|
|
1825
|
+
}
|
|
1826
|
+
.tunnel-hero-cta:hover {
|
|
1827
|
+
background: var(--accent-deep, var(--accent));
|
|
1828
|
+
border-color: var(--accent-deep, var(--accent));
|
|
1829
|
+
}
|
|
1830
|
+
.tunnel-hero-cta:disabled {
|
|
1831
|
+
opacity: 0.6;
|
|
1832
|
+
cursor: wait;
|
|
1833
|
+
}
|
|
1834
|
+
|
|
1835
|
+
.tunnel-live {
|
|
1836
|
+
display: flex;
|
|
1837
|
+
flex-direction: column;
|
|
1838
|
+
gap: var(--s-3);
|
|
1839
|
+
}
|
|
1840
|
+
.tunnel-live-head {
|
|
1841
|
+
display: flex;
|
|
1842
|
+
align-items: center;
|
|
1843
|
+
flex-wrap: wrap;
|
|
1844
|
+
gap: 6px 8px;
|
|
1845
|
+
padding: 6px 10px 6px 12px;
|
|
1846
|
+
border-radius: 999px;
|
|
1847
|
+
background: rgba(74, 138, 74, 0.08);
|
|
1848
|
+
border: 1px solid rgba(74, 138, 74, 0.32);
|
|
1849
|
+
font-size: 12.5px;
|
|
1850
|
+
color: var(--ink);
|
|
1851
|
+
width: fit-content;
|
|
1852
|
+
max-width: 100%;
|
|
1853
|
+
}
|
|
1854
|
+
.tunnel-live-state {
|
|
1855
|
+
display: inline-flex;
|
|
1856
|
+
align-items: center;
|
|
1857
|
+
gap: 6px;
|
|
1858
|
+
font-weight: 600;
|
|
1859
|
+
letter-spacing: 0.02em;
|
|
1860
|
+
color: #2f6e3a;
|
|
1861
|
+
}
|
|
1862
|
+
.tunnel-live-dot {
|
|
1863
|
+
width: 8px;
|
|
1864
|
+
height: 8px;
|
|
1865
|
+
border-radius: 50%;
|
|
1866
|
+
background: #4a8a4a;
|
|
1867
|
+
box-shadow: 0 0 0 0 rgba(74, 138, 74, 0.6);
|
|
1868
|
+
animation: tunnel-live-pulse 2s ease-in-out infinite;
|
|
1869
|
+
}
|
|
1870
|
+
@keyframes tunnel-live-pulse {
|
|
1871
|
+
0% { box-shadow: 0 0 0 0 rgba(74, 138, 74, 0.55); }
|
|
1872
|
+
70% { box-shadow: 0 0 0 8px rgba(74, 138, 74, 0); }
|
|
1873
|
+
100% { box-shadow: 0 0 0 0 rgba(74, 138, 74, 0); }
|
|
1874
|
+
}
|
|
1875
|
+
.tunnel-live-divider { color: var(--ink-faint); }
|
|
1876
|
+
.tunnel-live-provider { color: var(--ink); font-weight: 500; }
|
|
1877
|
+
.tunnel-live-meta { color: var(--ink-mid); }
|
|
1878
|
+
.tunnel-stop-link {
|
|
1879
|
+
appearance: none;
|
|
1880
|
+
background: transparent;
|
|
1881
|
+
border: 0;
|
|
1882
|
+
padding: 0 4px 0 10px;
|
|
1883
|
+
margin-left: 4px;
|
|
1884
|
+
display: inline-flex;
|
|
1885
|
+
align-items: center;
|
|
1886
|
+
gap: 4px;
|
|
1887
|
+
font: inherit;
|
|
1888
|
+
font-size: 12px;
|
|
1889
|
+
font-weight: 500;
|
|
1890
|
+
color: #b73f3f;
|
|
1891
|
+
cursor: pointer;
|
|
1892
|
+
border-left: 1px solid rgba(74, 138, 74, 0.25);
|
|
1893
|
+
transition: color .12s;
|
|
1894
|
+
}
|
|
1895
|
+
.tunnel-stop-link:hover { color: #8b2a2a; }
|
|
1896
|
+
.tunnel-stop-link:disabled { opacity: 0.5; cursor: wait; }
|
|
1897
|
+
.tunnel-stop-link svg { width: 11px; height: 11px; }
|
|
1898
|
+
|
|
1899
|
+
.tunnel-share {
|
|
1900
|
+
display: flex;
|
|
1901
|
+
flex-direction: column;
|
|
1902
|
+
gap: 6px;
|
|
1903
|
+
padding: var(--s-3) var(--s-4);
|
|
1904
|
+
border: 1px solid var(--border);
|
|
1905
|
+
border-radius: 10px;
|
|
1906
|
+
background: var(--bg);
|
|
1907
|
+
}
|
|
1908
|
+
.tunnel-share.is-waiting {
|
|
1909
|
+
flex-direction: row;
|
|
1910
|
+
align-items: center;
|
|
1911
|
+
gap: var(--s-2);
|
|
1912
|
+
color: var(--ink-muted);
|
|
1913
|
+
font-size: 13px;
|
|
1914
|
+
}
|
|
1915
|
+
.tunnel-share-label {
|
|
1916
|
+
font-size: 10.5px;
|
|
1917
|
+
letter-spacing: 0.16em;
|
|
1918
|
+
text-transform: uppercase;
|
|
1919
|
+
color: var(--ink-muted);
|
|
1920
|
+
font-weight: 500;
|
|
1921
|
+
}
|
|
1922
|
+
.tunnel-share-url {
|
|
1923
|
+
display: flex;
|
|
1924
|
+
align-items: center;
|
|
1925
|
+
gap: var(--s-3);
|
|
1926
|
+
flex-wrap: wrap;
|
|
1927
|
+
}
|
|
1928
|
+
.tunnel-share-value {
|
|
1929
|
+
flex: 1;
|
|
1930
|
+
min-width: 0;
|
|
1931
|
+
font-family: var(--mono);
|
|
1932
|
+
font-size: 13px;
|
|
1933
|
+
color: var(--ink);
|
|
1934
|
+
padding: 6px 10px;
|
|
1935
|
+
border: 1px solid var(--border-soft);
|
|
1936
|
+
border-radius: 6px;
|
|
1937
|
+
background: var(--bg-elev);
|
|
1938
|
+
overflow: hidden;
|
|
1939
|
+
text-overflow: ellipsis;
|
|
1940
|
+
white-space: nowrap;
|
|
1941
|
+
user-select: all;
|
|
1942
|
+
}
|
|
1943
|
+
.tunnel-share-actions {
|
|
1944
|
+
display: inline-flex;
|
|
1945
|
+
gap: 6px;
|
|
1946
|
+
flex: 0 0 auto;
|
|
1947
|
+
}
|
|
1948
|
+
.tunnel-share-hint {
|
|
1949
|
+
font-size: 11.5px;
|
|
1950
|
+
color: var(--ink-muted);
|
|
1951
|
+
}
|
|
1952
|
+
.tunnel-log { font-size: 12px; }
|
|
1953
|
+
.tunnel-log summary {
|
|
1954
|
+
cursor: pointer;
|
|
1955
|
+
user-select: none;
|
|
1956
|
+
color: var(--ink-mid);
|
|
1957
|
+
padding: 4px 0;
|
|
1958
|
+
}
|
|
1959
|
+
.tunnel-log pre {
|
|
1960
|
+
margin: 6px 0 0;
|
|
1961
|
+
padding: var(--s-2) var(--s-3);
|
|
1962
|
+
background: var(--bg);
|
|
1963
|
+
border: 1px solid var(--border-soft);
|
|
1964
|
+
border-radius: 6px;
|
|
1965
|
+
font-family: var(--mono);
|
|
1966
|
+
font-size: 11.5px;
|
|
1967
|
+
line-height: 1.45;
|
|
1968
|
+
color: var(--ink-mid);
|
|
1969
|
+
max-height: 220px;
|
|
1970
|
+
overflow: auto;
|
|
1971
|
+
white-space: pre-wrap;
|
|
1972
|
+
word-break: break-word;
|
|
1973
|
+
}
|
|
1974
|
+
|
|
1975
|
+
/* Version-update card — Configure → Version field. Idle state is a
|
|
1976
|
+
muted "you're on the latest" pill; update-available flips a subtle
|
|
1977
|
+
blue tint and surfaces a primary upgrade CTA. */
|
|
1978
|
+
.version-card {
|
|
1979
|
+
display: flex;
|
|
1980
|
+
align-items: center;
|
|
1981
|
+
justify-content: space-between;
|
|
1982
|
+
gap: var(--s-4);
|
|
1983
|
+
padding: var(--s-3) var(--s-4);
|
|
1984
|
+
border: 1px solid var(--border);
|
|
1985
|
+
border-radius: 10px;
|
|
1986
|
+
background: var(--bg-elev);
|
|
1987
|
+
flex-wrap: wrap;
|
|
1988
|
+
}
|
|
1989
|
+
.version-card.has-update {
|
|
1990
|
+
border-color: rgba(0, 120, 212, 0.35);
|
|
1991
|
+
background: linear-gradient(180deg, rgba(0, 120, 212, 0.04) 0%, var(--bg-elev) 100%);
|
|
1992
|
+
}
|
|
1993
|
+
.version-card.has-error {
|
|
1994
|
+
border-color: rgba(183, 63, 63, 0.30);
|
|
1995
|
+
background: rgba(183, 63, 63, 0.03);
|
|
1996
|
+
}
|
|
1997
|
+
.version-card-main {
|
|
1998
|
+
display: flex;
|
|
1999
|
+
flex-direction: column;
|
|
2000
|
+
gap: 4px;
|
|
2001
|
+
min-width: 0;
|
|
2002
|
+
flex: 1;
|
|
2003
|
+
}
|
|
2004
|
+
.version-card-current {
|
|
2005
|
+
display: flex;
|
|
2006
|
+
align-items: baseline;
|
|
2007
|
+
gap: 8px;
|
|
2008
|
+
flex-wrap: wrap;
|
|
2009
|
+
}
|
|
2010
|
+
.version-card-label {
|
|
2011
|
+
font-size: 10.5px;
|
|
2012
|
+
letter-spacing: 0.16em;
|
|
2013
|
+
text-transform: uppercase;
|
|
2014
|
+
color: var(--ink-muted);
|
|
2015
|
+
font-weight: 500;
|
|
2016
|
+
}
|
|
2017
|
+
.version-card-version {
|
|
2018
|
+
font-family: var(--mono);
|
|
2019
|
+
font-size: 18px;
|
|
2020
|
+
font-weight: 600;
|
|
2021
|
+
letter-spacing: -0.01em;
|
|
2022
|
+
color: var(--ink);
|
|
2023
|
+
font-variant-numeric: tabular-nums;
|
|
2024
|
+
}
|
|
2025
|
+
.version-card-badge {
|
|
2026
|
+
font-size: 10.5px;
|
|
2027
|
+
letter-spacing: 0.08em;
|
|
2028
|
+
text-transform: uppercase;
|
|
2029
|
+
font-weight: 600;
|
|
2030
|
+
padding: 1px 8px;
|
|
2031
|
+
border-radius: 999px;
|
|
2032
|
+
background: rgba(74, 138, 74, 0.12);
|
|
2033
|
+
color: #2f6e3a;
|
|
2034
|
+
border: 1px solid rgba(74, 138, 74, 0.3);
|
|
2035
|
+
}
|
|
2036
|
+
.version-card.has-update .version-card-badge {
|
|
2037
|
+
background: rgba(0, 120, 212, 0.12);
|
|
2038
|
+
color: #005a9e;
|
|
2039
|
+
border-color: rgba(0, 120, 212, 0.35);
|
|
2040
|
+
}
|
|
2041
|
+
.version-card-meta {
|
|
2042
|
+
font-size: 12.5px;
|
|
2043
|
+
color: var(--ink-mid);
|
|
2044
|
+
line-height: 1.5;
|
|
2045
|
+
}
|
|
2046
|
+
.version-card-meta .mono {
|
|
2047
|
+
font-family: var(--mono);
|
|
2048
|
+
font-size: 12px;
|
|
2049
|
+
color: var(--ink);
|
|
2050
|
+
}
|
|
2051
|
+
.version-card-error {
|
|
2052
|
+
color: #8b3a3a;
|
|
2053
|
+
}
|
|
2054
|
+
.version-card-error code {
|
|
2055
|
+
font-family: var(--mono);
|
|
2056
|
+
font-size: 11px;
|
|
2057
|
+
}
|
|
2058
|
+
.version-card-actions {
|
|
2059
|
+
display: inline-flex;
|
|
2060
|
+
align-items: center;
|
|
2061
|
+
gap: var(--s-2);
|
|
2062
|
+
flex-shrink: 0;
|
|
2063
|
+
flex-wrap: wrap;
|
|
2064
|
+
justify-content: flex-end;
|
|
2065
|
+
}
|
|
2066
|
+
.version-card-check {
|
|
2067
|
+
background: var(--accent);
|
|
2068
|
+
border-color: var(--accent);
|
|
2069
|
+
color: #fff;
|
|
2070
|
+
}
|
|
2071
|
+
.version-card-check:hover {
|
|
2072
|
+
background: var(--accent-deep, var(--accent));
|
|
2073
|
+
border-color: var(--accent-deep, var(--accent));
|
|
2074
|
+
}
|
|
2075
|
+
.version-card-check:disabled { opacity: 0.6; cursor: wait; }
|
|
2076
|
+
.version-card-check svg { stroke: #fff; }
|
|
2077
|
+
|
|
2078
|
+
/* Cards inside the Configure → General config-grid would otherwise
|
|
2079
|
+
stretch full row width (flex column → align-stretch). For the
|
|
2080
|
+
Restart button we still want it to shrink to the text — keep the
|
|
2081
|
+
inline wrapper. The Version card stays full-width to read like the
|
|
2082
|
+
other settings rows. */
|
|
2083
|
+
.config-grid .field .restart-button-wrap {
|
|
2084
|
+
align-self: stretch;
|
|
2085
|
+
}
|
|
2086
|
+
.restart-button-wrap { display: inline-flex; }
|
|
2087
|
+
|
|
2088
|
+
/* Microsoft brand-style sign-in button. Microsoft's published guidance
|
|
2089
|
+
is a white pill with the 4-square logo on the left and "Sign in
|
|
2090
|
+
with Microsoft" in Segoe-ish type. We can't ship Segoe in a web
|
|
2091
|
+
font here so the body family takes over — the visual still reads
|
|
2092
|
+
correctly thanks to the logo + spacing. White surface + thin
|
|
2093
|
+
border keeps it distinct from our own black `.action.primary`
|
|
2094
|
+
slab (which the user found too heavy for an external-auth CTA). */
|
|
2095
|
+
.btn-signin-microsoft {
|
|
2096
|
+
appearance: none;
|
|
2097
|
+
display: inline-flex;
|
|
2098
|
+
align-items: center;
|
|
2099
|
+
gap: 10px;
|
|
2100
|
+
align-self: flex-start;
|
|
2101
|
+
padding: 8px 16px;
|
|
2102
|
+
min-height: 36px;
|
|
2103
|
+
background: #ffffff;
|
|
2104
|
+
color: #1a1815;
|
|
2105
|
+
border: 1px solid #d3d3d3;
|
|
2106
|
+
border-radius: 4px; /* MS guidance: rectangular, ~2-4px radius */
|
|
2107
|
+
font: inherit;
|
|
2108
|
+
font-size: 13.5px;
|
|
2109
|
+
font-weight: 500;
|
|
2110
|
+
letter-spacing: -0.005em;
|
|
2111
|
+
cursor: pointer;
|
|
2112
|
+
transition: background-color .12s, border-color .12s, box-shadow .12s;
|
|
2113
|
+
}
|
|
2114
|
+
.btn-signin-microsoft:hover {
|
|
2115
|
+
background: #f3f3f3;
|
|
2116
|
+
border-color: #b8b8b8;
|
|
2117
|
+
}
|
|
2118
|
+
.btn-signin-microsoft:active { background: #ebebeb; }
|
|
2119
|
+
.btn-signin-microsoft:focus-visible {
|
|
2120
|
+
outline: 2px solid #2f6fa3;
|
|
2121
|
+
outline-offset: 2px;
|
|
2122
|
+
}
|
|
2123
|
+
.btn-signin-microsoft img { display: block; }
|
|
2124
|
+
|
|
2125
|
+
/* The mid-sign-in "card" — replaces .devtunnel-login. Bigger device
|
|
2126
|
+
code, primary CTA, slimmer chrome. */
|
|
2127
|
+
.signin-card {
|
|
2128
|
+
margin-top: var(--s-3);
|
|
2129
|
+
padding: var(--s-5);
|
|
2130
|
+
border: 1px solid var(--border);
|
|
2131
|
+
border-radius: 10px;
|
|
2132
|
+
background: var(--bg-elev);
|
|
2133
|
+
display: flex;
|
|
2134
|
+
flex-direction: column;
|
|
2135
|
+
gap: var(--s-4);
|
|
2136
|
+
font-size: 13px;
|
|
2137
|
+
}
|
|
2138
|
+
.signin-card.is-done { border-color: rgba(74, 138, 74, 0.4); }
|
|
2139
|
+
.signin-card.is-error { border-color: rgba(183, 63, 63, 0.4); }
|
|
2140
|
+
.signin-card-header {
|
|
2141
|
+
display: flex;
|
|
2142
|
+
align-items: center;
|
|
2143
|
+
gap: var(--s-2);
|
|
2144
|
+
color: var(--ink-mid);
|
|
2145
|
+
}
|
|
2146
|
+
.signin-card-cancel {
|
|
2147
|
+
margin-left: auto;
|
|
2148
|
+
appearance: none;
|
|
2149
|
+
display: inline-flex;
|
|
2150
|
+
align-items: center;
|
|
2151
|
+
gap: 4px;
|
|
2152
|
+
padding: 4px 10px;
|
|
2153
|
+
border-radius: 6px;
|
|
2154
|
+
border: 1px solid rgba(183, 63, 63, 0.35);
|
|
2155
|
+
background: transparent;
|
|
2156
|
+
color: #b73f3f;
|
|
2157
|
+
font: inherit;
|
|
2158
|
+
font-size: 12px;
|
|
2159
|
+
font-weight: 500;
|
|
2160
|
+
letter-spacing: 0.02em;
|
|
2161
|
+
cursor: pointer;
|
|
2162
|
+
transition: background-color .12s, border-color .12s, color .12s;
|
|
2163
|
+
}
|
|
2164
|
+
.signin-card-cancel:hover {
|
|
2165
|
+
background: rgba(183, 63, 63, 0.08);
|
|
2166
|
+
border-color: rgba(183, 63, 63, 0.55);
|
|
2167
|
+
color: #8b2a2a;
|
|
2168
|
+
}
|
|
2169
|
+
.signin-card-cancel svg { width: 12px; height: 12px; }
|
|
2170
|
+
.signin-card-eyebrow {
|
|
2171
|
+
font-size: 11px;
|
|
2172
|
+
letter-spacing: 0.14em;
|
|
2173
|
+
text-transform: uppercase;
|
|
2174
|
+
font-weight: 600;
|
|
2175
|
+
}
|
|
2176
|
+
.signin-card-spinner {
|
|
2177
|
+
width: 12px;
|
|
2178
|
+
height: 12px;
|
|
2179
|
+
border-radius: 50%;
|
|
2180
|
+
border: 2px solid var(--border-strong);
|
|
2181
|
+
border-top-color: var(--ink);
|
|
2182
|
+
animation: remote-spin 0.7s linear infinite;
|
|
2183
|
+
}
|
|
2184
|
+
.signin-card-code-block {
|
|
2185
|
+
display: flex;
|
|
2186
|
+
flex-direction: column;
|
|
2187
|
+
gap: 6px;
|
|
2188
|
+
padding: var(--s-3) var(--s-4);
|
|
2189
|
+
background: var(--bg);
|
|
2190
|
+
border: 1px solid var(--border);
|
|
2191
|
+
border-radius: 8px;
|
|
2192
|
+
}
|
|
2193
|
+
.signin-card-code-label {
|
|
2194
|
+
font-size: 10.5px;
|
|
2195
|
+
letter-spacing: 0.16em;
|
|
2196
|
+
text-transform: uppercase;
|
|
2197
|
+
color: var(--ink-muted);
|
|
2198
|
+
}
|
|
2199
|
+
.signin-card-code-row {
|
|
2200
|
+
display: flex;
|
|
2201
|
+
align-items: center;
|
|
2202
|
+
gap: var(--s-2);
|
|
2203
|
+
}
|
|
2204
|
+
.signin-card-code {
|
|
2205
|
+
font-family: var(--mono);
|
|
2206
|
+
font-size: 22px;
|
|
2207
|
+
font-weight: 600;
|
|
2208
|
+
letter-spacing: 0.12em;
|
|
2209
|
+
color: var(--ink);
|
|
2210
|
+
user-select: all;
|
|
2211
|
+
font-variant-numeric: tabular-nums;
|
|
2212
|
+
}
|
|
2213
|
+
.signin-card-code-pending {
|
|
2214
|
+
font-size: 13px;
|
|
2215
|
+
color: var(--ink-muted);
|
|
2216
|
+
font-style: italic;
|
|
2217
|
+
}
|
|
2218
|
+
.signin-card-code-copy { margin-left: 4px; }
|
|
2219
|
+
.signin-card-steps {
|
|
2220
|
+
margin: 0;
|
|
2221
|
+
padding-left: var(--s-5);
|
|
2222
|
+
display: flex;
|
|
2223
|
+
flex-direction: column;
|
|
2224
|
+
gap: 6px;
|
|
2225
|
+
color: var(--ink-mid);
|
|
2226
|
+
font-size: 13px;
|
|
2227
|
+
line-height: 1.5;
|
|
2228
|
+
}
|
|
2229
|
+
.signin-card-steps li::marker {
|
|
2230
|
+
color: var(--ink-faint);
|
|
2231
|
+
font-variant-numeric: tabular-nums;
|
|
2232
|
+
}
|
|
2233
|
+
.signin-card-step-muted { color: var(--ink-muted); }
|
|
2234
|
+
.signin-card-open {
|
|
2235
|
+
display: inline-flex;
|
|
2236
|
+
align-items: center;
|
|
2237
|
+
gap: 6px;
|
|
2238
|
+
color: #0067b8;
|
|
2239
|
+
font-weight: 500;
|
|
2240
|
+
text-decoration: underline;
|
|
2241
|
+
text-decoration-color: rgba(0, 103, 184, 0.4);
|
|
2242
|
+
text-underline-offset: 3px;
|
|
2243
|
+
transition: color .12s, text-decoration-color .12s;
|
|
2244
|
+
}
|
|
2245
|
+
.signin-card-open:hover {
|
|
2246
|
+
color: #005a9e;
|
|
2247
|
+
text-decoration-color: #005a9e;
|
|
2248
|
+
}
|
|
2249
|
+
.signin-card-open svg { width: 13px; height: 13px; }
|
|
2250
|
+
.signin-card-host {
|
|
2251
|
+
font-family: var(--mono);
|
|
2252
|
+
font-size: 12.5px;
|
|
2253
|
+
}
|
|
2254
|
+
.signin-card-actions {
|
|
2255
|
+
display: flex;
|
|
2256
|
+
gap: var(--s-2);
|
|
2257
|
+
flex-wrap: wrap;
|
|
2258
|
+
justify-content: flex-end;
|
|
2259
|
+
}
|
|
2260
|
+
.signin-card-result {
|
|
2261
|
+
display: flex;
|
|
2262
|
+
align-items: flex-start;
|
|
2263
|
+
gap: var(--s-3);
|
|
2264
|
+
padding: var(--s-3) var(--s-4);
|
|
2265
|
+
border-radius: 8px;
|
|
2266
|
+
background: var(--bg);
|
|
2267
|
+
border: 1px solid var(--border);
|
|
2268
|
+
}
|
|
2269
|
+
.signin-card-result.is-ok { border-color: rgba(74, 138, 74, 0.35); background: #f1f6f0; }
|
|
2270
|
+
.signin-card-result.is-error { border-color: rgba(183, 63, 63, 0.35); background: #faf0f0; }
|
|
2271
|
+
.signin-card-result.is-muted { background: var(--bg); }
|
|
2272
|
+
.signin-card-result-icon {
|
|
2273
|
+
flex: 0 0 24px;
|
|
2274
|
+
width: 24px;
|
|
2275
|
+
height: 24px;
|
|
2276
|
+
border-radius: 50%;
|
|
2277
|
+
display: inline-flex;
|
|
2278
|
+
align-items: center;
|
|
2279
|
+
justify-content: center;
|
|
2280
|
+
font-weight: 700;
|
|
2281
|
+
color: #fff;
|
|
2282
|
+
background: var(--ink-muted);
|
|
2283
|
+
font-size: 13px;
|
|
2284
|
+
}
|
|
2285
|
+
.signin-card-result.is-ok .signin-card-result-icon { background: #4a8a4a; }
|
|
2286
|
+
.signin-card-result.is-error .signin-card-result-icon { background: #b73f3f; }
|
|
2287
|
+
.signin-card-result-body {
|
|
2288
|
+
flex: 1;
|
|
2289
|
+
min-width: 0;
|
|
2290
|
+
display: flex;
|
|
2291
|
+
flex-direction: column;
|
|
2292
|
+
gap: 2px;
|
|
2293
|
+
}
|
|
2294
|
+
.signin-card-result-title {
|
|
2295
|
+
font-weight: 600;
|
|
2296
|
+
color: var(--ink);
|
|
2297
|
+
letter-spacing: -0.005em;
|
|
2298
|
+
}
|
|
2299
|
+
.signin-card-result-meta {
|
|
2300
|
+
font-size: 12.5px;
|
|
2301
|
+
color: var(--ink-mid);
|
|
2302
|
+
line-height: 1.45;
|
|
2303
|
+
}
|
|
2304
|
+
.signin-card-result-actions {
|
|
2305
|
+
display: flex;
|
|
2306
|
+
gap: var(--s-2);
|
|
2307
|
+
flex-wrap: wrap;
|
|
2308
|
+
}
|
|
2309
|
+
.signin-card-log {
|
|
2310
|
+
font-size: 11.5px;
|
|
2311
|
+
color: var(--ink-muted);
|
|
2312
|
+
border-top: 1px solid var(--border);
|
|
2313
|
+
padding-top: var(--s-3);
|
|
2314
|
+
}
|
|
2315
|
+
.signin-card-log summary {
|
|
2316
|
+
cursor: pointer;
|
|
2317
|
+
user-select: none;
|
|
2318
|
+
padding: 2px 0;
|
|
2319
|
+
}
|
|
2320
|
+
.signin-card-log pre {
|
|
2321
|
+
margin: var(--s-2) 0 0;
|
|
2322
|
+
padding: var(--s-2) var(--s-3);
|
|
2323
|
+
background: var(--bg);
|
|
2324
|
+
border: 1px solid var(--border-soft);
|
|
2325
|
+
border-radius: 4px;
|
|
2326
|
+
font-family: var(--mono);
|
|
2327
|
+
font-size: 11px;
|
|
2328
|
+
line-height: 1.45;
|
|
2329
|
+
color: var(--ink-mid);
|
|
2330
|
+
max-height: 180px;
|
|
2331
|
+
overflow: auto;
|
|
2332
|
+
white-space: pre-wrap;
|
|
2333
|
+
word-break: break-word;
|
|
2334
|
+
}
|
|
2335
|
+
|
|
1644
2336
|
.remote-status-line {
|
|
1645
2337
|
display: flex;
|
|
1646
2338
|
align-items: center;
|
|
@@ -1730,7 +2422,12 @@
|
|
|
1730
2422
|
align-items: center;
|
|
1731
2423
|
justify-content: center;
|
|
1732
2424
|
gap: var(--s-3);
|
|
1733
|
-
|
|
2425
|
+
/* Fill the entire scroll container so the spinner sits dead-center
|
|
2426
|
+
of the visible Remote panel — both axes — instead of pinning to a
|
|
2427
|
+
fixed 260px box near the top. flex:1 makes us claim all remaining
|
|
2428
|
+
space inside .settings-scroll (column flex). */
|
|
2429
|
+
flex: 1;
|
|
2430
|
+
min-height: 0;
|
|
1734
2431
|
color: var(--ink-muted);
|
|
1735
2432
|
font-size: 13px;
|
|
1736
2433
|
}
|
|
@@ -1831,6 +2528,22 @@
|
|
|
1831
2528
|
align-items: center;
|
|
1832
2529
|
}
|
|
1833
2530
|
.remote-device-label .icon-btn:hover { color: var(--ink); background: var(--bg); }
|
|
2531
|
+
/* 4-digit identification code rendered as a small pill before the
|
|
2532
|
+
device label. Distinct background so the operator's eye lands on
|
|
2533
|
+
it first — that's the thing they're cross-referencing against what
|
|
2534
|
+
the requesting user reads off their own screen. */
|
|
2535
|
+
.remote-device-code {
|
|
2536
|
+
font-family: var(--mono);
|
|
2537
|
+
font-size: 12px;
|
|
2538
|
+
font-weight: 600;
|
|
2539
|
+
letter-spacing: 0.08em;
|
|
2540
|
+
padding: 1px 7px;
|
|
2541
|
+
border-radius: 999px;
|
|
2542
|
+
background: var(--ink);
|
|
2543
|
+
color: #fff;
|
|
2544
|
+
font-variant-numeric: tabular-nums;
|
|
2545
|
+
}
|
|
2546
|
+
.remote-device-name { min-width: 0; }
|
|
1834
2547
|
.remote-device-meta {
|
|
1835
2548
|
font-size: 11.5px;
|
|
1836
2549
|
color: var(--ink-mid);
|