@xingjisoft/neutrino 0.2.0 → 0.3.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.
package/web/style.css CHANGED
@@ -746,7 +746,7 @@ svg {
746
746
  background: var(--surface-2);
747
747
  color: var(--text);
748
748
  line-height: 1.65;
749
- white-space: pre-wrap;
749
+ white-space: normal;
750
750
  }
751
751
 
752
752
  .message .body p {
@@ -812,6 +812,161 @@ svg {
812
812
  color: var(--accent);
813
813
  }
814
814
 
815
+ .message del {
816
+ color: var(--text-caption);
817
+ }
818
+
819
+ .message .body h1,
820
+ .message .body h2,
821
+ .message .body h3,
822
+ .message .body h4,
823
+ .message .body h5,
824
+ .message .body h6 {
825
+ margin: 18px 0 8px;
826
+ color: var(--text);
827
+ font-weight: 600;
828
+ line-height: 1.35;
829
+ }
830
+
831
+ .message .body h1 {
832
+ font-size: 1.35em;
833
+ letter-spacing: -0.015em;
834
+ }
835
+
836
+ .message .body h2 {
837
+ font-size: 1.22em;
838
+ letter-spacing: -0.01em;
839
+ }
840
+
841
+ .message .body h3 {
842
+ font-size: 1.1em;
843
+ }
844
+
845
+ .message .body h4,
846
+ .message .body h5,
847
+ .message .body h6 {
848
+ font-size: 1em;
849
+ color: var(--text-secondary);
850
+ }
851
+
852
+ .message .body > h1:first-child,
853
+ .message .body > h2:first-child,
854
+ .message .body > h3:first-child,
855
+ .message .body > h4:first-child,
856
+ .message .body > h5:first-child,
857
+ .message .body > h6:first-child {
858
+ margin-top: 0;
859
+ }
860
+
861
+ .message .body ul,
862
+ .message .body ol {
863
+ padding-left: 24px;
864
+ }
865
+
866
+ .message .body li {
867
+ margin: 3px 0;
868
+ }
869
+
870
+ .message .body li > p {
871
+ margin: 0 0 5px;
872
+ }
873
+
874
+ .message .body li > p:last-child {
875
+ margin-bottom: 0;
876
+ }
877
+
878
+ .message .body li > ul,
879
+ .message .body li > ol {
880
+ margin: 4px 0 6px;
881
+ }
882
+
883
+ .message .body li.task-item {
884
+ list-style: none;
885
+ margin-left: -20px;
886
+ }
887
+
888
+ .message .body .task-checkbox {
889
+ width: 14px;
890
+ height: 14px;
891
+ margin: 0 5px 0 0;
892
+ accent-color: var(--accent-strong);
893
+ vertical-align: -2px;
894
+ cursor: default;
895
+ }
896
+
897
+ .message .body hr {
898
+ margin: 18px 0;
899
+ border: 0;
900
+ border-top: 1px solid var(--border);
901
+ }
902
+
903
+ .message .body blockquote > :last-child {
904
+ margin-bottom: 0;
905
+ }
906
+
907
+ .message .body blockquote p {
908
+ margin-bottom: 8px;
909
+ }
910
+
911
+ .message .body .table-wrap {
912
+ margin: 13px 0;
913
+ overflow-x: auto;
914
+ border: 1px solid var(--border-soft);
915
+ border-radius: var(--radius-md);
916
+ }
917
+
918
+ .message .body table {
919
+ width: 100%;
920
+ border-collapse: collapse;
921
+ font-size: 12.8px;
922
+ line-height: 1.55;
923
+ }
924
+
925
+ .message .body th,
926
+ .message .body td {
927
+ padding: 7px 11px;
928
+ border-bottom: 1px solid var(--border-soft);
929
+ border-right: 1px solid var(--border-soft);
930
+ text-align: left;
931
+ vertical-align: top;
932
+ }
933
+
934
+ .message .body th:last-child,
935
+ .message .body td:last-child {
936
+ border-right: 0;
937
+ }
938
+
939
+ .message .body tbody tr:last-child td {
940
+ border-bottom: 0;
941
+ }
942
+
943
+ .message .body th {
944
+ background: var(--surface-1);
945
+ color: var(--text-secondary);
946
+ font-weight: 600;
947
+ }
948
+
949
+ .message .body .align-center {
950
+ text-align: center;
951
+ }
952
+
953
+ .message .body .align-right {
954
+ text-align: right;
955
+ }
956
+
957
+ .message .body img {
958
+ display: block;
959
+ max-width: 100%;
960
+ height: auto;
961
+ margin: 12px 0;
962
+ border: 1px solid var(--border-soft);
963
+ border-radius: var(--radius-md);
964
+ }
965
+
966
+ .message .body pre.code code {
967
+ white-space: pre;
968
+ }
969
+
815
970
  .message.streaming .body::after {
816
971
  content: "";
817
972
  display: inline-block;
@@ -1744,119 +1899,931 @@ select option {
1744
1899
  padding: 0 18px;
1745
1900
  }
1746
1901
 
1747
- /* --------------------------------------------------------------- scrollbar */
1902
+ /* ---------------------------------------------------- workspaces & sheets */
1748
1903
 
1749
- * {
1750
- scrollbar-width: thin;
1751
- scrollbar-color: #3c3c3d transparent;
1904
+ .sidebar-tools {
1905
+ display: flex;
1906
+ flex-direction: column;
1907
+ gap: 5px;
1908
+ flex: none;
1909
+ padding: 10px 10px 2px;
1752
1910
  }
1753
1911
 
1754
- *::-webkit-scrollbar {
1755
- width: 8px;
1756
- height: 8px;
1912
+ .new-chat {
1913
+ display: flex;
1914
+ align-items: center;
1915
+ gap: 8px;
1916
+ width: 100%;
1917
+ height: 36px;
1918
+ padding: 0 12px;
1919
+ background: var(--surface-1);
1920
+ border: 1px solid var(--border);
1921
+ border-radius: 10px;
1922
+ color: var(--text);
1923
+ font-size: 12.5px;
1924
+ font-weight: 500;
1925
+ text-align: left;
1926
+ transition: background var(--fast), border-color var(--fast);
1757
1927
  }
1758
1928
 
1759
- *::-webkit-scrollbar-track {
1929
+ .new-chat:hover {
1930
+ background: var(--surface-2);
1931
+ border-color: var(--border-strong);
1932
+ }
1933
+
1934
+ .new-chat svg {
1935
+ flex: none;
1936
+ width: 16px;
1937
+ height: 16px;
1938
+ color: var(--accent);
1939
+ }
1940
+
1941
+ .workspace-button {
1942
+ display: flex;
1943
+ align-items: center;
1944
+ gap: 7px;
1945
+ width: 100%;
1946
+ height: 30px;
1947
+ padding: 0 8px;
1760
1948
  background: transparent;
1949
+ border: 1px solid transparent;
1950
+ border-radius: 8px;
1951
+ color: var(--text-caption);
1952
+ font-size: 11.5px;
1953
+ text-align: left;
1954
+ transition: background var(--fast), color var(--fast);
1761
1955
  }
1762
1956
 
1763
- *::-webkit-scrollbar-thumb {
1764
- border: 2px solid transparent;
1765
- border-radius: 999px;
1766
- background: #3c3c3d;
1767
- background-clip: content-box;
1957
+ .workspace-button:hover {
1958
+ background: var(--surface-1);
1959
+ color: var(--text-secondary);
1768
1960
  }
1769
1961
 
1770
- *::-webkit-scrollbar-thumb:hover {
1771
- background: #545557;
1772
- background-clip: content-box;
1962
+ .workspace-button.active {
1963
+ color: var(--text-secondary);
1773
1964
  }
1774
1965
 
1775
- *::-webkit-scrollbar-corner {
1776
- background: transparent;
1966
+ .workspace-button > svg:first-child {
1967
+ flex: none;
1968
+ width: 14px;
1969
+ height: 14px;
1777
1970
  }
1778
1971
 
1779
- /* -------------------------------------------------------------- animations */
1972
+ .workspace-label {
1973
+ flex: 1;
1974
+ min-width: 0;
1975
+ overflow: hidden;
1976
+ white-space: nowrap;
1977
+ text-overflow: ellipsis;
1978
+ }
1780
1979
 
1781
- @keyframes blink {
1782
- 0%,
1783
- 49% {
1784
- opacity: 1;
1785
- }
1786
- 50%,
1787
- 100% {
1788
- opacity: 0;
1789
- }
1980
+ .workspace-chevron {
1981
+ flex: none;
1982
+ width: 12px;
1983
+ height: 12px;
1790
1984
  }
1791
1985
 
1792
- @keyframes pulse {
1793
- 0% {
1794
- box-shadow: 0 0 0 0 rgba(122, 170, 255, 0.45);
1795
- }
1796
- 70% {
1797
- box-shadow: 0 0 0 6px rgba(122, 170, 255, 0);
1798
- }
1799
- 100% {
1800
- box-shadow: 0 0 0 0 rgba(122, 170, 255, 0);
1801
- }
1986
+ .sidebar-foot {
1987
+ display: flex;
1988
+ align-items: center;
1989
+ justify-content: space-between;
1990
+ gap: 8px;
1802
1991
  }
1803
1992
 
1804
- @keyframes pulse-amber {
1805
- 0% {
1806
- box-shadow: 0 0 0 0 rgba(247, 173, 49, 0.5);
1807
- }
1808
- 70% {
1809
- box-shadow: 0 0 0 5px rgba(247, 173, 49, 0);
1810
- }
1811
- 100% {
1812
- box-shadow: 0 0 0 0 rgba(247, 173, 49, 0);
1813
- }
1993
+ .foot-note {
1994
+ min-width: 0;
1995
+ overflow: hidden;
1996
+ white-space: nowrap;
1997
+ text-overflow: ellipsis;
1814
1998
  }
1815
1999
 
1816
- @media (prefers-reduced-motion: reduce) {
1817
- *,
1818
- *::before,
1819
- *::after {
1820
- animation-duration: 0.001ms !important;
1821
- animation-iteration-count: 1 !important;
1822
- transition-duration: 0.001ms !important;
1823
- scroll-behavior: auto !important;
1824
- }
2000
+ .language-picker {
2001
+ display: inline-flex;
2002
+ align-items: center;
2003
+ gap: 2px;
2004
+ flex: none;
2005
+ color: var(--text-caption);
2006
+ cursor: pointer;
1825
2007
  }
1826
2008
 
1827
- /* ---------------------------------------------------------------- compact */
2009
+ .language-picker > svg {
2010
+ width: 13px;
2011
+ height: 13px;
2012
+ }
1828
2013
 
1829
- @media (max-width: 1080px) {
1830
- #sidebar {
1831
- width: 264px;
1832
- }
2014
+ .language-picker select {
2015
+ width: auto;
2016
+ height: 26px;
2017
+ padding: 0 20px 0 2px;
2018
+ background-color: transparent;
2019
+ border-color: transparent;
2020
+ background-position: right 2px center;
2021
+ color: var(--text-caption);
2022
+ font-size: 11px;
2023
+ }
1833
2024
 
1834
- .messages {
1835
- padding-left: 22px;
1836
- padding-right: 22px;
1837
- }
2025
+ .language-picker select:hover {
2026
+ background-color: var(--surface-1);
2027
+ border-color: var(--border);
1838
2028
  }
1839
2029
 
1840
- /* Phones use one full-width pane: the conversation list opens first. */
1841
- @media (max-width: 760px) {
1842
- #sidebar {
1843
- width: 100%;
1844
- min-width: 0;
1845
- max-width: none;
1846
- border-right: 0;
1847
- padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
1848
- }
2030
+ /* The plan / usage card floats over the conversation, like the terminal's ⓘ. */
2031
+ #main {
2032
+ position: relative;
2033
+ }
2034
+
2035
+ .plan-card {
2036
+ position: absolute;
2037
+ top: 76px;
2038
+ right: clamp(16px, 4vw, 32px);
2039
+ z-index: 20;
2040
+ width: min(360px, calc(100vw - 32px));
2041
+ max-height: min(60vh, 560px);
2042
+ max-height: min(60dvh, 560px);
2043
+ padding: 13px 15px;
2044
+ overflow-y: auto;
2045
+ background: var(--bg-sidebar);
2046
+ border: 1px solid var(--border);
2047
+ border-radius: 14px;
2048
+ box-shadow: var(--shadow-strong);
2049
+ backdrop-filter: blur(10px);
2050
+ overscroll-behavior: contain;
2051
+ }
1849
2052
 
1850
- #main {
1851
- display: none;
1852
- padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
1853
- }
2053
+ .plan-card.hidden {
2054
+ display: none;
2055
+ }
1854
2056
 
1855
- #app.conversation-open #sidebar {
1856
- display: none;
1857
- }
2057
+ /* Sit below the model row instead of covering it. */
2058
+ #model-picker:not(.hidden) + #plan-card {
2059
+ top: 138px;
2060
+ }
1858
2061
 
1859
- #app.conversation-open #main {
2062
+ .plan-card-head {
2063
+ display: flex;
2064
+ align-items: center;
2065
+ justify-content: space-between;
2066
+ gap: 10px;
2067
+ }
2068
+
2069
+ .plan-card-head strong {
2070
+ color: var(--text-caption);
2071
+ font-size: 10.5px;
2072
+ font-weight: 600;
2073
+ letter-spacing: 0.09em;
2074
+ text-transform: uppercase;
2075
+ }
2076
+
2077
+ .plan-card-head .icon-btn {
2078
+ width: 24px;
2079
+ height: 24px;
2080
+ }
2081
+
2082
+ .plan-goal {
2083
+ margin: 8px 0 10px;
2084
+ color: var(--text-secondary);
2085
+ font-size: 12.5px;
2086
+ line-height: 1.5;
2087
+ }
2088
+
2089
+ .plan-steps {
2090
+ display: flex;
2091
+ flex-direction: column;
2092
+ }
2093
+
2094
+ .plan-step {
2095
+ position: relative;
2096
+ display: flex;
2097
+ gap: 10px;
2098
+ padding: 7px 0;
2099
+ }
2100
+
2101
+ .plan-step:not(:last-child)::before {
2102
+ content: "";
2103
+ position: absolute;
2104
+ top: 22px;
2105
+ bottom: -6px;
2106
+ left: 5px;
2107
+ width: 1px;
2108
+ background: var(--border);
2109
+ }
2110
+
2111
+ .plan-node {
2112
+ position: relative;
2113
+ z-index: 1;
2114
+ flex: none;
2115
+ width: 11px;
2116
+ height: 11px;
2117
+ margin-top: 4px;
2118
+ background: var(--bg-sidebar);
2119
+ border: 1.5px solid var(--text-caption);
2120
+ border-radius: 50%;
2121
+ }
2122
+
2123
+ .plan-step.done .plan-node {
2124
+ background: var(--text-caption);
2125
+ border-color: var(--text-caption);
2126
+ }
2127
+
2128
+ .plan-step.active .plan-node {
2129
+ background: var(--accent);
2130
+ border-color: var(--accent);
2131
+ box-shadow: 0 0 0 3px var(--accent-fill);
2132
+ }
2133
+
2134
+ .plan-step.failed .plan-node {
2135
+ background: var(--red);
2136
+ border-color: var(--red);
2137
+ }
2138
+
2139
+ .plan-step-body {
2140
+ flex: 1;
2141
+ min-width: 0;
2142
+ }
2143
+
2144
+ .plan-step-title {
2145
+ display: flex;
2146
+ align-items: baseline;
2147
+ justify-content: space-between;
2148
+ gap: 8px;
2149
+ }
2150
+
2151
+ .plan-step-title strong {
2152
+ color: var(--text-secondary);
2153
+ font-size: 12px;
2154
+ font-weight: 500;
2155
+ line-height: 1.4;
2156
+ }
2157
+
2158
+ .plan-step.active .plan-step-title strong {
2159
+ color: var(--text);
2160
+ }
2161
+
2162
+ .plan-step.done .plan-step-title strong {
2163
+ color: var(--text-caption);
2164
+ }
2165
+
2166
+ .plan-step.failed .plan-step-title strong {
2167
+ color: var(--red);
2168
+ }
2169
+
2170
+ .plan-step-state {
2171
+ flex: none;
2172
+ color: var(--text-caption);
2173
+ font-size: 9.5px;
2174
+ letter-spacing: 0.05em;
2175
+ text-transform: uppercase;
2176
+ }
2177
+
2178
+ .plan-step-detail {
2179
+ margin-top: 2px;
2180
+ color: var(--text-caption);
2181
+ font-size: 11px;
2182
+ line-height: 1.45;
2183
+ }
2184
+
2185
+ .plan-meta {
2186
+ margin-top: 9px;
2187
+ padding-top: 9px;
2188
+ border-top: 1px solid var(--border-soft);
2189
+ color: var(--text-caption);
2190
+ font-size: 10.5px;
2191
+ }
2192
+
2193
+ .plan-usage {
2194
+ display: flex;
2195
+ flex-direction: column;
2196
+ gap: 4px;
2197
+ margin-top: 4px;
2198
+ }
2199
+
2200
+ .plan-usage-row {
2201
+ display: flex;
2202
+ align-items: center;
2203
+ justify-content: space-between;
2204
+ gap: 12px;
2205
+ color: var(--text-caption);
2206
+ font-size: 11.5px;
2207
+ }
2208
+
2209
+ .plan-usage-row strong {
2210
+ color: var(--text-secondary);
2211
+ font-weight: 500;
2212
+ font-variant-numeric: tabular-nums;
2213
+ }
2214
+
2215
+ .plan-toggle.active {
2216
+ color: var(--accent);
2217
+ background: var(--accent-fill);
2218
+ }
2219
+
2220
+ .control.danger:hover {
2221
+ color: var(--red);
2222
+ border-color: rgba(242, 90, 90, 0.5);
2223
+ background: rgba(242, 90, 90, 0.08);
2224
+ }
2225
+
2226
+ /* Dialogs: new conversation, folder picker, working directories. */
2227
+ .sheet-dialog {
2228
+ width: min(620px, calc(100vw - 24px));
2229
+ max-height: calc(100vh - 32px);
2230
+ max-height: calc(100dvh - 32px);
2231
+ padding: 0;
2232
+ overflow: hidden;
2233
+ background: var(--bg-sidebar);
2234
+ border: 1px solid var(--border);
2235
+ border-radius: var(--radius-xl);
2236
+ color: var(--text);
2237
+ box-shadow: var(--shadow-strong);
2238
+ }
2239
+
2240
+ .sheet-dialog::backdrop {
2241
+ background: rgba(9, 9, 10, 0.66);
2242
+ backdrop-filter: blur(6px);
2243
+ }
2244
+
2245
+ .sheet-dialog[open] {
2246
+ display: flex;
2247
+ flex-direction: column;
2248
+ }
2249
+
2250
+ .sheet {
2251
+ display: flex;
2252
+ flex-direction: column;
2253
+ min-height: 0;
2254
+ width: 100%;
2255
+ }
2256
+
2257
+ .sheet-header {
2258
+ display: flex;
2259
+ align-items: flex-start;
2260
+ justify-content: space-between;
2261
+ gap: 16px;
2262
+ flex: none;
2263
+ padding: 20px 22px 16px;
2264
+ border-bottom: 1px solid var(--border-soft);
2265
+ }
2266
+
2267
+ .sheet-header h2 {
2268
+ margin: 0;
2269
+ font-size: 16px;
2270
+ font-weight: 600;
2271
+ letter-spacing: -0.01em;
2272
+ }
2273
+
2274
+ .sheet-sub {
2275
+ margin: 3px 0 0;
2276
+ color: var(--text-caption);
2277
+ font-size: 12px;
2278
+ }
2279
+
2280
+ .sheet-body {
2281
+ display: flex;
2282
+ flex-direction: column;
2283
+ gap: 18px;
2284
+ flex: 1 1 auto;
2285
+ min-height: 0;
2286
+ padding: 18px 22px 10px;
2287
+ overflow-y: auto;
2288
+ overscroll-behavior: contain;
2289
+ }
2290
+
2291
+ .field-group {
2292
+ display: flex;
2293
+ flex-direction: column;
2294
+ gap: 8px;
2295
+ min-width: 0;
2296
+ padding: 0;
2297
+ border: 0;
2298
+ }
2299
+
2300
+ .field-group h3 {
2301
+ margin: 0;
2302
+ color: var(--text-secondary);
2303
+ font-size: 12.5px;
2304
+ font-weight: 600;
2305
+ }
2306
+
2307
+ .field-group h4 {
2308
+ margin: 4px 0 0;
2309
+ color: var(--text-caption);
2310
+ font-size: 11px;
2311
+ font-weight: 500;
2312
+ letter-spacing: 0.02em;
2313
+ }
2314
+
2315
+ .recent-title {
2316
+ text-transform: none;
2317
+ }
2318
+
2319
+ .path-row {
2320
+ display: flex;
2321
+ align-items: center;
2322
+ gap: 8px;
2323
+ min-width: 0;
2324
+ }
2325
+
2326
+ .path-input {
2327
+ flex: 1;
2328
+ min-width: 0;
2329
+ height: 36px;
2330
+ padding: 0 11px;
2331
+ background: var(--surface-1);
2332
+ border: 1px solid var(--border-soft);
2333
+ border-radius: 9px;
2334
+ color: var(--text);
2335
+ font-family: var(--mono);
2336
+ font-size: 12px;
2337
+ transition: border-color var(--fast), background-color var(--fast);
2338
+ }
2339
+
2340
+ .path-input::placeholder {
2341
+ color: var(--text-caption);
2342
+ }
2343
+
2344
+ .path-input:hover {
2345
+ border-color: var(--border);
2346
+ }
2347
+
2348
+ .path-input:focus {
2349
+ outline: none;
2350
+ border-color: var(--accent-line);
2351
+ box-shadow: 0 0 0 3px rgba(122, 170, 255, 0.1);
2352
+ }
2353
+
2354
+ .workspace-recents {
2355
+ display: flex;
2356
+ flex-wrap: wrap;
2357
+ gap: 6px;
2358
+ }
2359
+
2360
+ .path-chip {
2361
+ max-width: 220px;
2362
+ height: 26px;
2363
+ padding: 0 10px;
2364
+ overflow: hidden;
2365
+ background: var(--surface-1);
2366
+ border: 1px solid var(--border-soft);
2367
+ border-radius: 999px;
2368
+ color: var(--text-tertiary);
2369
+ font-size: 11.5px;
2370
+ text-overflow: ellipsis;
2371
+ white-space: nowrap;
2372
+ }
2373
+
2374
+ .path-chip:hover {
2375
+ border-color: var(--border-strong);
2376
+ color: var(--text);
2377
+ }
2378
+
2379
+ .path-chip.selected {
2380
+ background: var(--accent-fill);
2381
+ border-color: var(--accent-line);
2382
+ color: var(--accent);
2383
+ }
2384
+
2385
+ .recents-empty {
2386
+ color: var(--text-caption);
2387
+ font-size: 11.5px;
2388
+ }
2389
+
2390
+ .sheet-actions {
2391
+ display: flex;
2392
+ align-items: center;
2393
+ justify-content: flex-end;
2394
+ gap: 8px;
2395
+ flex: none;
2396
+ padding: 14px 22px;
2397
+ border-top: 1px solid var(--border-soft);
2398
+ }
2399
+
2400
+ .sheet-actions .control {
2401
+ height: 34px;
2402
+ padding: 0 16px;
2403
+ }
2404
+
2405
+ .sheet-actions .primary {
2406
+ height: 34px;
2407
+ padding: 0 18px;
2408
+ }
2409
+
2410
+ .sheet-spacer {
2411
+ flex: 1;
2412
+ }
2413
+
2414
+ /* Folder picker */
2415
+ .folder-sheet {
2416
+ max-height: calc(100vh - 32px);
2417
+ max-height: calc(100dvh - 32px);
2418
+ }
2419
+
2420
+ .folder-toolbar {
2421
+ display: flex;
2422
+ align-items: center;
2423
+ gap: 8px;
2424
+ flex: none;
2425
+ padding: 14px 22px 0;
2426
+ }
2427
+
2428
+ .folder-toolbar .path-input {
2429
+ flex: 1;
2430
+ }
2431
+
2432
+ .folder-roots {
2433
+ display: flex;
2434
+ flex-wrap: wrap;
2435
+ gap: 6px;
2436
+ flex: none;
2437
+ padding: 10px 22px 0;
2438
+ }
2439
+
2440
+ .folder-roots:empty {
2441
+ display: none;
2442
+ }
2443
+
2444
+ .root-chip {
2445
+ height: 24px;
2446
+ padding: 0 9px;
2447
+ background: var(--surface-1);
2448
+ border: 1px solid var(--border-soft);
2449
+ border-radius: 6px;
2450
+ color: var(--text-caption);
2451
+ font-size: 11px;
2452
+ }
2453
+
2454
+ .root-chip:hover {
2455
+ border-color: var(--border-strong);
2456
+ color: var(--text-secondary);
2457
+ }
2458
+
2459
+ .folder-list {
2460
+ flex: 1 1 auto;
2461
+ min-height: 140px;
2462
+ max-height: 42vh;
2463
+ max-height: 42dvh;
2464
+ margin: 12px 12px 0;
2465
+ padding: 6px;
2466
+ overflow-y: auto;
2467
+ background: var(--bg);
2468
+ border: 1px solid var(--border-soft);
2469
+ border-radius: 12px;
2470
+ overscroll-behavior: contain;
2471
+ }
2472
+
2473
+ .folder-item {
2474
+ display: flex;
2475
+ align-items: center;
2476
+ gap: 9px;
2477
+ width: 100%;
2478
+ padding: 8px 10px;
2479
+ background: transparent;
2480
+ border: 0;
2481
+ border-radius: 8px;
2482
+ color: var(--text-secondary);
2483
+ font-size: 12.5px;
2484
+ text-align: left;
2485
+ }
2486
+
2487
+ .folder-item:hover {
2488
+ background: var(--surface-1);
2489
+ color: var(--text);
2490
+ }
2491
+
2492
+ .folder-item-icon {
2493
+ display: grid;
2494
+ place-items: center;
2495
+ flex: none;
2496
+ width: 22px;
2497
+ height: 22px;
2498
+ color: var(--text-caption);
2499
+ }
2500
+
2501
+ .folder-item-icon svg {
2502
+ width: 16px;
2503
+ height: 16px;
2504
+ }
2505
+
2506
+ .folder-new {
2507
+ display: flex;
2508
+ align-items: center;
2509
+ gap: 8px;
2510
+ flex: none;
2511
+ padding: 10px 22px 0;
2512
+ }
2513
+
2514
+ .folder-new.hidden {
2515
+ display: none;
2516
+ }
2517
+
2518
+ .folder-sheet > .form-feedback,
2519
+ .sheet > .form-feedback {
2520
+ flex: none;
2521
+ padding: 10px 22px 0;
2522
+ }
2523
+
2524
+ .folder-actions {
2525
+ margin-top: auto;
2526
+ }
2527
+
2528
+ /* Working-directory switcher */
2529
+ .workspace-list {
2530
+ display: flex;
2531
+ flex-direction: column;
2532
+ gap: 2px;
2533
+ flex: 1 1 auto;
2534
+ min-height: 0;
2535
+ max-height: 52vh;
2536
+ max-height: 52dvh;
2537
+ padding: 10px 12px;
2538
+ overflow-y: auto;
2539
+ overscroll-behavior: contain;
2540
+ }
2541
+
2542
+ .workspace-item {
2543
+ display: flex;
2544
+ align-items: center;
2545
+ gap: 10px;
2546
+ width: 100%;
2547
+ padding: 9px 10px;
2548
+ background: transparent;
2549
+ border: 0;
2550
+ border-radius: 10px;
2551
+ color: var(--text-secondary);
2552
+ text-align: left;
2553
+ }
2554
+
2555
+ .workspace-item:hover {
2556
+ background: var(--surface-1);
2557
+ }
2558
+
2559
+ .workspace-item.selected {
2560
+ background: var(--surface-2);
2561
+ }
2562
+
2563
+ .workspace-item.missing {
2564
+ opacity: 0.5;
2565
+ }
2566
+
2567
+ .workspace-icon {
2568
+ display: grid;
2569
+ place-items: center;
2570
+ flex: none;
2571
+ width: 32px;
2572
+ height: 32px;
2573
+ background: var(--surface-1);
2574
+ border-radius: 9px;
2575
+ color: var(--text-tertiary);
2576
+ }
2577
+
2578
+ .workspace-icon svg {
2579
+ width: 17px;
2580
+ height: 17px;
2581
+ }
2582
+
2583
+ .workspace-info {
2584
+ display: flex;
2585
+ flex: 1;
2586
+ flex-direction: column;
2587
+ min-width: 0;
2588
+ }
2589
+
2590
+ .workspace-info strong {
2591
+ color: var(--text);
2592
+ font-size: 12.5px;
2593
+ font-weight: 500;
2594
+ }
2595
+
2596
+ .workspace-info small {
2597
+ overflow: hidden;
2598
+ color: var(--text-caption);
2599
+ font-size: 10.5px;
2600
+ text-overflow: ellipsis;
2601
+ white-space: nowrap;
2602
+ }
2603
+
2604
+ .workspace-count {
2605
+ flex: none;
2606
+ color: var(--text-caption);
2607
+ font-size: 10.5px;
2608
+ }
2609
+
2610
+ .sheet .form-feedback {
2611
+ min-height: 16px;
2612
+ }
2613
+
2614
+ .agents-list {
2615
+ display: flex;
2616
+ flex-direction: column;
2617
+ flex: 1 1 auto;
2618
+ min-height: 120px;
2619
+ max-height: 56vh;
2620
+ max-height: 56dvh;
2621
+ padding: 10px 12px;
2622
+ overflow-y: auto;
2623
+ overscroll-behavior: contain;
2624
+ }
2625
+
2626
+ .agent-section {
2627
+ margin-bottom: 10px;
2628
+ }
2629
+
2630
+ .agent-section h3 {
2631
+ margin: 6px 8px;
2632
+ color: var(--text-caption);
2633
+ font-size: 10.5px;
2634
+ font-weight: 600;
2635
+ letter-spacing: 0.07em;
2636
+ text-transform: uppercase;
2637
+ }
2638
+
2639
+ .agent-session {
2640
+ display: flex;
2641
+ align-items: center;
2642
+ gap: 10px;
2643
+ width: 100%;
2644
+ padding: 9px 10px;
2645
+ background: transparent;
2646
+ border: 0;
2647
+ border-radius: 9px;
2648
+ color: var(--text-secondary);
2649
+ text-align: left;
2650
+ }
2651
+
2652
+ .agent-session:hover {
2653
+ background: var(--surface-1);
2654
+ color: var(--text);
2655
+ }
2656
+
2657
+ .agent-session-body {
2658
+ display: flex;
2659
+ flex: 1;
2660
+ flex-direction: column;
2661
+ min-width: 0;
2662
+ }
2663
+
2664
+ .agent-session-title {
2665
+ overflow: hidden;
2666
+ font-size: 12.5px;
2667
+ text-overflow: ellipsis;
2668
+ white-space: nowrap;
2669
+ }
2670
+
2671
+ .agent-session-meta {
2672
+ color: var(--text-caption);
2673
+ font-size: 10.5px;
2674
+ }
2675
+
2676
+ .agents-cwd {
2677
+ min-width: 0;
2678
+ overflow: hidden;
2679
+ color: var(--text-caption);
2680
+ font-family: var(--mono);
2681
+ font-size: 10.5px;
2682
+ text-overflow: ellipsis;
2683
+ white-space: nowrap;
2684
+ }
2685
+
2686
+ .workspace-path {
2687
+ max-width: 100%;
2688
+ overflow-wrap: anywhere;
2689
+ color: var(--text-caption);
2690
+ font-family: var(--mono);
2691
+ font-size: 11px;
2692
+ }
2693
+
2694
+ .workspace-prompt {
2695
+ margin: 2px 0 6px;
2696
+ color: var(--text-caption);
2697
+ font-size: 12.5px;
2698
+ line-height: 1.5;
2699
+ }
2700
+
2701
+ .workspace-empty .control {
2702
+ margin-top: 4px;
2703
+ }
2704
+
2705
+ /* Settings use a nested two-column grid so a language row can sit beside the
2706
+ approval default without breaking the existing field layout. */
2707
+ .settings-fields .settings-grid {
2708
+ display: grid;
2709
+ grid-column: 1 / -1;
2710
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2711
+ gap: 16px 18px;
2712
+ }
2713
+
2714
+ /* --------------------------------------------------------------- scrollbar */
2715
+
2716
+ * {
2717
+ scrollbar-width: thin;
2718
+ scrollbar-color: #3c3c3d transparent;
2719
+ }
2720
+
2721
+ *::-webkit-scrollbar {
2722
+ width: 8px;
2723
+ height: 8px;
2724
+ }
2725
+
2726
+ *::-webkit-scrollbar-track {
2727
+ background: transparent;
2728
+ }
2729
+
2730
+ *::-webkit-scrollbar-thumb {
2731
+ border: 2px solid transparent;
2732
+ border-radius: 999px;
2733
+ background: #3c3c3d;
2734
+ background-clip: content-box;
2735
+ }
2736
+
2737
+ *::-webkit-scrollbar-thumb:hover {
2738
+ background: #545557;
2739
+ background-clip: content-box;
2740
+ }
2741
+
2742
+ *::-webkit-scrollbar-corner {
2743
+ background: transparent;
2744
+ }
2745
+
2746
+ /* -------------------------------------------------------------- animations */
2747
+
2748
+ @keyframes blink {
2749
+ 0%,
2750
+ 49% {
2751
+ opacity: 1;
2752
+ }
2753
+ 50%,
2754
+ 100% {
2755
+ opacity: 0;
2756
+ }
2757
+ }
2758
+
2759
+ @keyframes pulse {
2760
+ 0% {
2761
+ box-shadow: 0 0 0 0 rgba(122, 170, 255, 0.45);
2762
+ }
2763
+ 70% {
2764
+ box-shadow: 0 0 0 6px rgba(122, 170, 255, 0);
2765
+ }
2766
+ 100% {
2767
+ box-shadow: 0 0 0 0 rgba(122, 170, 255, 0);
2768
+ }
2769
+ }
2770
+
2771
+ @keyframes pulse-amber {
2772
+ 0% {
2773
+ box-shadow: 0 0 0 0 rgba(247, 173, 49, 0.5);
2774
+ }
2775
+ 70% {
2776
+ box-shadow: 0 0 0 5px rgba(247, 173, 49, 0);
2777
+ }
2778
+ 100% {
2779
+ box-shadow: 0 0 0 0 rgba(247, 173, 49, 0);
2780
+ }
2781
+ }
2782
+
2783
+ @media (prefers-reduced-motion: reduce) {
2784
+ *,
2785
+ *::before,
2786
+ *::after {
2787
+ animation-duration: 0.001ms !important;
2788
+ animation-iteration-count: 1 !important;
2789
+ transition-duration: 0.001ms !important;
2790
+ scroll-behavior: auto !important;
2791
+ }
2792
+ }
2793
+
2794
+ /* ---------------------------------------------------------------- compact */
2795
+
2796
+ @media (max-width: 1080px) {
2797
+ #sidebar {
2798
+ width: 264px;
2799
+ }
2800
+
2801
+ .messages {
2802
+ padding-left: 22px;
2803
+ padding-right: 22px;
2804
+ }
2805
+ }
2806
+
2807
+ /* Phones use one full-width pane: the conversation list opens first. */
2808
+ @media (max-width: 760px) {
2809
+ #sidebar {
2810
+ width: 100%;
2811
+ min-width: 0;
2812
+ max-width: none;
2813
+ border-right: 0;
2814
+ padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
2815
+ }
2816
+
2817
+ #main {
2818
+ display: none;
2819
+ padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
2820
+ }
2821
+
2822
+ #app.conversation-open #sidebar {
2823
+ display: none;
2824
+ }
2825
+
2826
+ #app.conversation-open #main {
1860
2827
  display: flex;
1861
2828
  }
1862
2829
 
@@ -1866,7 +2833,16 @@ select option {
1866
2833
  }
1867
2834
 
1868
2835
  .sidebar-foot {
1869
- display: none;
2836
+ display: flex;
2837
+ padding-bottom: calc(10px + env(safe-area-inset-bottom));
2838
+ }
2839
+
2840
+ .new-chat {
2841
+ height: 44px;
2842
+ }
2843
+
2844
+ .workspace-button {
2845
+ height: 36px;
1870
2846
  }
1871
2847
 
1872
2848
  .icon-btn {
@@ -2017,6 +2993,69 @@ select option {
2017
2993
  grid-template-columns: 1fr;
2018
2994
  }
2019
2995
 
2996
+ .settings-fields .settings-grid {
2997
+ grid-template-columns: 1fr;
2998
+ }
2999
+
3000
+ .sheet-dialog {
3001
+ width: calc(100vw - 16px);
3002
+ max-height: calc(100dvh - 16px);
3003
+ }
3004
+
3005
+ .sheet-header,
3006
+ .sheet-actions {
3007
+ padding-left: 16px;
3008
+ padding-right: 16px;
3009
+ }
3010
+
3011
+ .sheet-body {
3012
+ padding: 16px 16px 8px;
3013
+ }
3014
+
3015
+ .folder-toolbar,
3016
+ .folder-roots,
3017
+ .folder-new,
3018
+ .folder-sheet > .form-feedback,
3019
+ .sheet > .form-feedback {
3020
+ padding-left: 16px;
3021
+ padding-right: 16px;
3022
+ }
3023
+
3024
+ .sheet-actions {
3025
+ flex-wrap: wrap;
3026
+ }
3027
+
3028
+ .sheet-actions .control,
3029
+ .sheet-actions .primary {
3030
+ height: 40px;
3031
+ }
3032
+
3033
+ .folder-list {
3034
+ max-height: 36dvh;
3035
+ }
3036
+
3037
+ .workspace-list {
3038
+ max-height: 44dvh;
3039
+ }
3040
+
3041
+ .plan-card {
3042
+ position: fixed;
3043
+ top: 72px;
3044
+ right: 10px;
3045
+ left: 10px;
3046
+ width: auto;
3047
+ max-height: 45dvh;
3048
+ }
3049
+
3050
+ .path-row,
3051
+ .folder-toolbar {
3052
+ flex-wrap: wrap;
3053
+ }
3054
+
3055
+ .path-input {
3056
+ font-size: 16px;
3057
+ }
3058
+
2020
3059
  .settings-fields label,
2021
3060
  .settings-note {
2022
3061
  overflow-wrap: anywhere;