@xingjisoft/neutrino 0.2.1 → 0.4.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 (43) hide show
  1. package/README.md +312 -436
  2. package/assets/pro/backend_output_model.txt +5 -0
  3. package/assets/pro/claude-module-prompt.txt +65 -0
  4. package/assets/pro/common.txt +9 -0
  5. package/assets/pro/confirm_model.txt +5 -0
  6. package/assets/pro/front_output_model.txt +9 -0
  7. package/assets/pro/genimage_model.txt +1 -0
  8. package/assets/pro/main_model.txt +5 -0
  9. package/assets/pro/model-template.json +376 -0
  10. package/assets/pro/modeling_model.txt +5 -0
  11. package/assets/pro/plan_model.txt +8 -0
  12. package/assets/pro/thinking_model.txt +3 -0
  13. package/dist/app.js +43 -7
  14. package/dist/bin.js +5 -2
  15. package/dist/browser.js +57 -0
  16. package/dist/config.js +179 -26
  17. package/dist/index.js +1 -1
  18. package/dist/llm/approval.js +6 -2
  19. package/dist/llm/client.js +197 -28
  20. package/dist/llm/subagent.js +37 -1
  21. package/dist/pro/agents.js +104 -0
  22. package/dist/pro/config.js +88 -0
  23. package/dist/pro/preflight.js +172 -0
  24. package/dist/screens/chat.js +54 -38
  25. package/dist/screens/modelSelect.js +15 -4
  26. package/dist/screens/settings.js +9 -7
  27. package/dist/screens/start.js +48 -15
  28. package/dist/ui.js +58 -0
  29. package/dist/web/hub.js +31 -4
  30. package/dist/web/server.js +611 -50
  31. package/dist/web/session.js +320 -20
  32. package/dist/web/settings.js +117 -24
  33. package/package.json +37 -37
  34. package/web/README.md +158 -16
  35. package/web/app.js +1603 -128
  36. package/web/i18n.js +382 -0
  37. package/web/index.html +289 -37
  38. package/web/markdown.js +710 -0
  39. package/web/neutrino-pro.gif +0 -0
  40. package/web/neutrino.png +0 -0
  41. package/web/pro.js +184 -0
  42. package/web/settings.js +322 -193
  43. package/web/style.css +1378 -42
package/web/style.css CHANGED
@@ -137,6 +137,10 @@ svg {
137
137
  display: none !important;
138
138
  }
139
139
 
140
+ .pro-only { display: none; }
141
+ .pro-mode .pro-only { display: block; }
142
+ .pro-mode .standard-only { display: none !important; }
143
+
140
144
  #app {
141
145
  display: flex;
142
146
  width: 100%;
@@ -240,6 +244,120 @@ svg {
240
244
  flex: none;
241
245
  }
242
246
 
247
+ /* The orbit badge doubles as the switch to the Pro workspace. */
248
+ .brand-logo {
249
+ appearance: none;
250
+ padding: 0;
251
+ cursor: pointer;
252
+ transition: background var(--fast), border-color var(--fast), transform var(--fast);
253
+ }
254
+
255
+ .brand-logo:hover {
256
+ background: var(--surface-2);
257
+ border-color: var(--border-strong);
258
+ }
259
+
260
+ .brand-logo:active {
261
+ transform: scale(0.96);
262
+ }
263
+
264
+ .brand-logo:focus-visible {
265
+ outline: 2px solid var(--accent);
266
+ outline-offset: 2px;
267
+ }
268
+
269
+ /* Pro mode replaces the orbit with the static Neutrino wordmark and drops the
270
+ button cue. The PNG is transparent, so it sits directly on the sidebar. */
271
+ .brand-logo.pro-logo {
272
+ /* Narrower than the animated mark was: the brand name grows to "Neutrino
273
+ Pro" in this workspace, and the extra 30px keeps the name on one line at
274
+ the default sidebar width without touching the action buttons. */
275
+ width: 86px;
276
+ height: 25.8px;
277
+ cursor: default;
278
+ overflow: hidden;
279
+ background: transparent;
280
+ border-color: transparent;
281
+ border-radius: 0;
282
+ }
283
+
284
+ .brand-logo.pro-logo:hover {
285
+ background: transparent;
286
+ border-color: transparent;
287
+ }
288
+
289
+ .brand-logo.pro-logo:active {
290
+ transform: none;
291
+ }
292
+
293
+ .brand-logo.pro-logo img {
294
+ display: block;
295
+ width: 100%;
296
+ height: 100%;
297
+ object-fit: contain;
298
+ }
299
+
300
+ /* A dismissible hint under the brand; it never renders in Pro mode. It takes
301
+ its own row so it never covers the New conversation button, with the
302
+ triangle pointing back up at the badge. */
303
+ .pro-tip {
304
+ position: relative;
305
+ z-index: 20;
306
+ display: flex;
307
+ align-items: center;
308
+ gap: 6px;
309
+ flex: none;
310
+ margin: 10px 12px 0;
311
+ padding: 8px 8px 8px 12px;
312
+ background: #2563eb;
313
+ color: #ffffff;
314
+ border-radius: 10px;
315
+ box-shadow: 0 10px 26px rgba(0, 0, 0, 0.42);
316
+ font-size: 12px;
317
+ line-height: 1.4;
318
+ }
319
+
320
+ .pro-tip::before {
321
+ content: "";
322
+ position: absolute;
323
+ top: -6px;
324
+ left: 16px;
325
+ width: 0;
326
+ height: 0;
327
+ border-right: 6px solid transparent;
328
+ border-bottom: 6px solid #2563eb;
329
+ border-left: 6px solid transparent;
330
+ }
331
+
332
+ .pro-tip span {
333
+ flex: 1;
334
+ min-width: 0;
335
+ overflow-wrap: anywhere;
336
+ }
337
+
338
+ .pro-tip-close {
339
+ display: grid;
340
+ place-items: center;
341
+ flex: none;
342
+ width: 20px;
343
+ height: 20px;
344
+ padding: 0;
345
+ background: transparent;
346
+ border: 0;
347
+ border-radius: 6px;
348
+ color: rgba(255, 255, 255, 0.82);
349
+ }
350
+
351
+ .pro-tip-close:hover {
352
+ background: rgba(255, 255, 255, 0.16);
353
+ color: #ffffff;
354
+ }
355
+
356
+ .pro-tip-close svg {
357
+ width: 12px;
358
+ height: 12px;
359
+ }
360
+
243
361
  .icon-btn {
244
362
  display: grid;
245
363
  place-items: center;
@@ -516,6 +634,29 @@ svg {
516
634
  gap: 6px;
517
635
  }
518
636
 
637
+ /* Pro workspace only: a persistent way back to the regular console, pinned to
638
+ the far right of the main header. */
639
+ .pro-exit {
640
+ flex: none;
641
+ }
642
+
643
+ .pro-exit svg {
644
+ flex: none;
645
+ width: 14px;
646
+ height: 14px;
647
+ }
648
+
649
+ @media (max-width: 560px) {
650
+ .pro-exit {
651
+ width: 30px;
652
+ padding: 0;
653
+ }
654
+
655
+ .pro-exit span {
656
+ display: none;
657
+ }
658
+ }
659
+
519
660
  .badge {
520
661
  display: inline-flex;
521
662
  align-items: center;
@@ -746,7 +887,7 @@ svg {
746
887
  background: var(--surface-2);
747
888
  color: var(--text);
748
889
  line-height: 1.65;
749
- white-space: pre-wrap;
890
+ white-space: normal;
750
891
  }
751
892
 
752
893
  .message .body p {
@@ -812,6 +953,161 @@ svg {
812
953
  color: var(--accent);
813
954
  }
814
955
 
956
+ .message del {
957
+ color: var(--text-caption);
958
+ }
959
+
960
+ .message .body h1,
961
+ .message .body h2,
962
+ .message .body h3,
963
+ .message .body h4,
964
+ .message .body h5,
965
+ .message .body h6 {
966
+ margin: 18px 0 8px;
967
+ color: var(--text);
968
+ font-weight: 600;
969
+ line-height: 1.35;
970
+ }
971
+
972
+ .message .body h1 {
973
+ font-size: 1.35em;
974
+ letter-spacing: -0.015em;
975
+ }
976
+
977
+ .message .body h2 {
978
+ font-size: 1.22em;
979
+ letter-spacing: -0.01em;
980
+ }
981
+
982
+ .message .body h3 {
983
+ font-size: 1.1em;
984
+ }
985
+
986
+ .message .body h4,
987
+ .message .body h5,
988
+ .message .body h6 {
989
+ font-size: 1em;
990
+ color: var(--text-secondary);
991
+ }
992
+
993
+ .message .body > h1:first-child,
994
+ .message .body > h2:first-child,
995
+ .message .body > h3:first-child,
996
+ .message .body > h4:first-child,
997
+ .message .body > h5:first-child,
998
+ .message .body > h6:first-child {
999
+ margin-top: 0;
1000
+ }
1001
+
1002
+ .message .body ul,
1003
+ .message .body ol {
1004
+ padding-left: 24px;
1005
+ }
1006
+
1007
+ .message .body li {
1008
+ margin: 3px 0;
1009
+ }
1010
+
1011
+ .message .body li > p {
1012
+ margin: 0 0 5px;
1013
+ }
1014
+
1015
+ .message .body li > p:last-child {
1016
+ margin-bottom: 0;
1017
+ }
1018
+
1019
+ .message .body li > ul,
1020
+ .message .body li > ol {
1021
+ margin: 4px 0 6px;
1022
+ }
1023
+
1024
+ .message .body li.task-item {
1025
+ list-style: none;
1026
+ margin-left: -20px;
1027
+ }
1028
+
1029
+ .message .body .task-checkbox {
1030
+ width: 14px;
1031
+ height: 14px;
1032
+ margin: 0 5px 0 0;
1033
+ accent-color: var(--accent-strong);
1034
+ vertical-align: -2px;
1035
+ cursor: default;
1036
+ }
1037
+
1038
+ .message .body hr {
1039
+ margin: 18px 0;
1040
+ border: 0;
1041
+ border-top: 1px solid var(--border);
1042
+ }
1043
+
1044
+ .message .body blockquote > :last-child {
1045
+ margin-bottom: 0;
1046
+ }
1047
+
1048
+ .message .body blockquote p {
1049
+ margin-bottom: 8px;
1050
+ }
1051
+
1052
+ .message .body .table-wrap {
1053
+ margin: 13px 0;
1054
+ overflow-x: auto;
1055
+ border: 1px solid var(--border-soft);
1056
+ border-radius: var(--radius-md);
1057
+ }
1058
+
1059
+ .message .body table {
1060
+ width: 100%;
1061
+ border-collapse: collapse;
1062
+ font-size: 12.8px;
1063
+ line-height: 1.55;
1064
+ }
1065
+
1066
+ .message .body th,
1067
+ .message .body td {
1068
+ padding: 7px 11px;
1069
+ border-bottom: 1px solid var(--border-soft);
1070
+ border-right: 1px solid var(--border-soft);
1071
+ text-align: left;
1072
+ vertical-align: top;
1073
+ }
1074
+
1075
+ .message .body th:last-child,
1076
+ .message .body td:last-child {
1077
+ border-right: 0;
1078
+ }
1079
+
1080
+ .message .body tbody tr:last-child td {
1081
+ border-bottom: 0;
1082
+ }
1083
+
1084
+ .message .body th {
1085
+ background: var(--surface-1);
1086
+ color: var(--text-secondary);
1087
+ font-weight: 600;
1088
+ }
1089
+
1090
+ .message .body .align-center {
1091
+ text-align: center;
1092
+ }
1093
+
1094
+ .message .body .align-right {
1095
+ text-align: right;
1096
+ }
1097
+
1098
+ .message .body img {
1099
+ display: block;
1100
+ max-width: 100%;
1101
+ height: auto;
1102
+ margin: 12px 0;
1103
+ border: 1px solid var(--border-soft);
1104
+ border-radius: var(--radius-md);
1105
+ }
1106
+
1107
+ .message .body pre.code code {
1108
+ white-space: pre;
1109
+ }
1110
+
815
1111
  .message.streaming .body::after {
816
1112
  content: "";
817
1113
  display: inline-block;
@@ -1132,6 +1428,113 @@ svg {
1132
1428
  outline: none;
1133
1429
  }
1134
1430
 
1431
+ .pro-mode .composer-card { flex-wrap: wrap; }
1432
+ .pro-mode .composer textarea { flex: 1 0 100%; }
1433
+ .pro-preset-control { position: relative; margin-left: auto; align-self: center; }
1434
+ .pro-preset-control > summary {
1435
+ display: flex; align-items: center; gap: 10px; padding: 7px 10px;
1436
+ border-radius: var(--radius-sm); color: var(--text-secondary); cursor: pointer;
1437
+ font-size: 12px; list-style: none; user-select: none;
1438
+ }
1439
+ .pro-preset-control > summary::-webkit-details-marker { display: none; }
1440
+ .pro-preset-chevron { width: 14px; height: 14px; flex: none; transition: transform var(--fast); }
1441
+ .pro-preset-control[open] .pro-preset-chevron { transform: rotate(180deg); }
1442
+ .pro-preset-control > summary:hover, .pro-preset-control[open] > summary { background: var(--surface-3); }
1443
+ .pro-preset-card {
1444
+ position: absolute; z-index: 30; right: 0; bottom: calc(100% + 12px);
1445
+ width: min(390px, calc(100vw - 48px)); max-height: min(560px, 65dvh); overflow-y: auto;
1446
+ padding: 18px; border: 1px solid var(--border-strong); border-radius: var(--radius-lg);
1447
+ background: var(--surface-1); box-shadow: var(--shadow-strong);
1448
+ }
1449
+ .pro-preset-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; font-size: 13px; }
1450
+ .pro-preset-heading strong { color: var(--accent); font-size: 14px; font-weight: 500; }
1451
+ .pro-slider-label { display: block; color: var(--text-tertiary); font-size: 11px; margin-bottom: 8px; }
1452
+ .pro-preset-slider { position: relative; height: 40px; --pro-slider-position: 0; }
1453
+ .pro-preset-slider.is-disabled { opacity: .5; }
1454
+ .pro-slider-track {
1455
+ position: absolute; top: 8px; right: 2px; left: 2px; height: 24px;
1456
+ border-radius: 999px; background: #454547; overflow: hidden; pointer-events: none;
1457
+ }
1458
+ .pro-slider-fill {
1459
+ width: calc(12px + (100% - 24px) * var(--pro-slider-position)); height: 100%; background: #347ff6;
1460
+ }
1461
+ .pro-slider-stops {
1462
+ position: absolute; top: 18px; right: 14px; left: 14px; height: 4px; pointer-events: none;
1463
+ }
1464
+ .pro-slider-stop {
1465
+ position: absolute; width: 4px; height: 4px; transform: translateX(-50%);
1466
+ border-radius: 50%; background: rgba(255, 255, 255, .18);
1467
+ }
1468
+ .pro-slider-stop.is-filled { background: rgba(255, 255, 255, .35); }
1469
+ #pro-preset-range {
1470
+ position: relative; display: block; width: 100%; height: 40px; margin: 0; padding: 0;
1471
+ -webkit-appearance: none; appearance: none; border: 0; border-radius: 999px; background: transparent; cursor: pointer;
1472
+ }
1473
+ #pro-preset-range::-webkit-slider-runnable-track { height: 24px; border: 0; background: transparent; }
1474
+ #pro-preset-range::-webkit-slider-thumb {
1475
+ -webkit-appearance: none; appearance: none; width: 28px; height: 28px; margin-top: -2px;
1476
+ border: 0; border-radius: 50%; background: #fff;
1477
+ }
1478
+ #pro-preset-range::-moz-range-track { height: 24px; border: 0; background: transparent; }
1479
+ #pro-preset-range::-moz-range-progress { background: transparent; }
1480
+ #pro-preset-range::-moz-range-thumb { width: 28px; height: 28px; border: 0; border-radius: 50%; background: #fff; }
1481
+ #pro-preset-range:focus-visible { outline-offset: 2px; }
1482
+ #pro-preset-range:disabled { cursor: default; }
1483
+ .pro-preset-ticks { position: relative; height: 24px; margin: 6px 14px 16px; }
1484
+ .pro-preset-ticks button {
1485
+ position: absolute; transform: translateX(-50%); border: 0; background: transparent;
1486
+ color: var(--text-caption); font-size: 11px; line-height: 16px; padding: 4px; white-space: nowrap; cursor: pointer;
1487
+ }
1488
+ .pro-preset-ticks button[aria-pressed="true"] { color: var(--accent); }
1489
+ .pro-preset-ticks button:disabled { cursor: default; }
1490
+ .pro-slider-meteors { position: absolute; inset: 0; opacity: 0; pointer-events: none; }
1491
+ .pro-slider-meteor {
1492
+ position: absolute; top: 4px; left: -52px; width: 46px; height: 1.5px; opacity: 0;
1493
+ border-radius: 999px; background: linear-gradient(90deg, transparent, rgba(224, 222, 255, .7) 75%, #fff);
1494
+ animation: pro-slider-meteor 2.8s linear infinite; animation-play-state: paused;
1495
+ }
1496
+ .pro-slider-meteor::after {
1497
+ content: ""; position: absolute; top: 50%; right: -1px; width: 3px; height: 3px;
1498
+ transform: translateY(-50%); border-radius: 50%; background: #fff; box-shadow: 0 0 5px rgba(242, 232, 255, .8);
1499
+ }
1500
+ .pro-slider-meteor:nth-child(2) { top: 15px; width: 34px; animation-duration: 3.4s; animation-delay: -1.1s; }
1501
+ .pro-slider-meteor:nth-child(3) { top: 22px; width: 26px; animation-duration: 2.5s; animation-delay: -.45s; }
1502
+ .pro-slider-meteor:nth-child(4) { top: 8px; width: 20px; animation-duration: 4.2s; animation-delay: -2.3s; }
1503
+ .pro-preset-control.is-max .pro-slider-fill { background: linear-gradient(100deg, #347ff6 5%, #6075ff 50%, #a45af8); }
1504
+ .pro-preset-control.is-max .pro-slider-track { box-shadow: 0 0 14px rgba(132, 99, 255, .22); }
1505
+ .pro-preset-control.is-max .pro-slider-meteors { opacity: 1; }
1506
+ .pro-preset-control[open].is-max .pro-slider-meteor { animation-play-state: running; }
1507
+ .pro-preset-control.is-max .pro-preset-heading strong,
1508
+ .pro-preset-control.is-max .pro-preset-ticks button[aria-pressed="true"] { color: #bda8ff; }
1509
+ @keyframes pro-slider-meteor {
1510
+ 0% { transform: translate3d(0, 8px, 0) rotate(-14deg); opacity: 0; }
1511
+ 8% { opacity: .9; }
1512
+ 55% { opacity: .65; }
1513
+ 72%, 100% { transform: translate3d(450px, -8px, 0) rotate(-14deg); opacity: 0; }
1514
+ }
1515
+ .pro-model-details { border-top: 1px solid var(--border-soft); }
1516
+ .pro-model-details > summary {
1517
+ display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 0;
1518
+ color: var(--text-tertiary); font-size: 11.5px; list-style: none; cursor: pointer; user-select: none;
1519
+ }
1520
+ .pro-model-details > summary::-webkit-details-marker { display: none; }
1521
+ .pro-model-details > summary:hover { color: var(--text); }
1522
+ .pro-model-details-chevron { width: 14px; height: 14px; flex: none; color: var(--text-caption); transition: transform var(--fast); }
1523
+ .pro-model-details[open] .pro-model-details-chevron { transform: rotate(180deg); }
1524
+ .pro-preset-models { display: grid; gap: 9px; padding: 2px 0 12px; }
1525
+ .pro-model-row { display: grid; grid-template-columns: minmax(90px, .8fr) minmax(0, 1.6fr); gap: 12px; font-size: 11.5px; line-height: 1.5; }
1526
+ .pro-model-row > span:first-child { color: var(--text-tertiary); }
1527
+ .pro-model-row > span:last-child { overflow-wrap: anywhere; text-align: right; }
1528
+ .pro-model-row .pro-model-fallback { color: var(--amber); }
1529
+ .pro-preset-card .settings-note { margin-top: 15px; font-size: 11px; }
1530
+ .pro-preset-card .form-feedback:empty { display: none; }
1531
+ .pro-fallback-rows { display: grid; gap: 14px; margin-top: 18px; }
1532
+ .pro-fallback-row { display: grid; gap: 5px; padding-bottom: 14px; border-bottom: 1px solid var(--border-soft); overflow-wrap: anywhere; }
1533
+ .pro-fallback-row strong { font-size: 13px; font-weight: 500; }
1534
+ .pro-fallback-row > span { color: var(--amber); font-size: 12px; }
1535
+ .pro-fallback-row small { color: var(--text-tertiary); font-size: 11px; }
1536
+ .pro-fallback-dialog { max-width: 540px; }
1537
+
1135
1538
  #send {
1136
1539
  display: grid;
1137
1540
  place-items: center;
@@ -1744,64 +2147,915 @@ select option {
1744
2147
  padding: 0 18px;
1745
2148
  }
1746
2149
 
1747
- /* --------------------------------------------------------------- scrollbar */
2150
+ /* ---------------------------------------------------- workspaces & sheets */
1748
2151
 
1749
- * {
1750
- scrollbar-width: thin;
1751
- scrollbar-color: #3c3c3d transparent;
2152
+ .sidebar-tools {
2153
+ display: flex;
2154
+ flex-direction: column;
2155
+ gap: 5px;
2156
+ flex: none;
2157
+ padding: 10px 10px 2px;
1752
2158
  }
1753
2159
 
1754
- *::-webkit-scrollbar {
1755
- width: 8px;
1756
- height: 8px;
2160
+ .new-chat {
2161
+ display: flex;
2162
+ align-items: center;
2163
+ gap: 8px;
2164
+ width: 100%;
2165
+ height: 36px;
2166
+ padding: 0 12px;
2167
+ background: var(--surface-1);
2168
+ border: 1px solid var(--border);
2169
+ border-radius: 10px;
2170
+ color: var(--text);
2171
+ font-size: 12.5px;
2172
+ font-weight: 500;
2173
+ text-align: left;
2174
+ transition: background var(--fast), border-color var(--fast);
1757
2175
  }
1758
2176
 
1759
- *::-webkit-scrollbar-track {
1760
- background: transparent;
2177
+ .new-chat:hover {
2178
+ background: var(--surface-2);
2179
+ border-color: var(--border-strong);
1761
2180
  }
1762
2181
 
1763
- *::-webkit-scrollbar-thumb {
1764
- border: 2px solid transparent;
1765
- border-radius: 999px;
1766
- background: #3c3c3d;
1767
- background-clip: content-box;
2182
+ .new-chat svg {
2183
+ flex: none;
2184
+ width: 16px;
2185
+ height: 16px;
2186
+ color: var(--accent);
1768
2187
  }
1769
2188
 
1770
- *::-webkit-scrollbar-thumb:hover {
1771
- background: #545557;
1772
- background-clip: content-box;
2189
+ .workspace-button {
2190
+ display: flex;
2191
+ align-items: center;
2192
+ gap: 7px;
2193
+ width: 100%;
2194
+ height: 30px;
2195
+ padding: 0 8px;
2196
+ background: transparent;
2197
+ border: 1px solid transparent;
2198
+ border-radius: 8px;
2199
+ color: var(--text-caption);
2200
+ font-size: 11.5px;
2201
+ text-align: left;
2202
+ transition: background var(--fast), color var(--fast);
1773
2203
  }
1774
2204
 
1775
- *::-webkit-scrollbar-corner {
1776
- background: transparent;
2205
+ .workspace-button:hover {
2206
+ background: var(--surface-1);
2207
+ color: var(--text-secondary);
1777
2208
  }
1778
2209
 
1779
- /* -------------------------------------------------------------- animations */
2210
+ .workspace-button.active {
2211
+ color: var(--text-secondary);
2212
+ }
1780
2213
 
1781
- @keyframes blink {
1782
- 0%,
1783
- 49% {
1784
- opacity: 1;
1785
- }
1786
- 50%,
1787
- 100% {
1788
- opacity: 0;
1789
- }
2214
+ .workspace-button > svg:first-child {
2215
+ flex: none;
2216
+ width: 14px;
2217
+ height: 14px;
1790
2218
  }
1791
2219
 
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
- }
2220
+ .workspace-label {
2221
+ flex: 1;
2222
+ min-width: 0;
2223
+ overflow: hidden;
2224
+ white-space: nowrap;
2225
+ text-overflow: ellipsis;
1802
2226
  }
1803
2227
 
1804
- @keyframes pulse-amber {
2228
+ .workspace-chevron {
2229
+ flex: none;
2230
+ width: 12px;
2231
+ height: 12px;
2232
+ }
2233
+
2234
+ .sidebar-foot {
2235
+ display: flex;
2236
+ align-items: center;
2237
+ justify-content: space-between;
2238
+ gap: 8px;
2239
+ }
2240
+
2241
+ .foot-note {
2242
+ min-width: 0;
2243
+ overflow: hidden;
2244
+ white-space: nowrap;
2245
+ text-overflow: ellipsis;
2246
+ }
2247
+
2248
+ .language-picker {
2249
+ display: inline-flex;
2250
+ align-items: center;
2251
+ gap: 2px;
2252
+ flex: none;
2253
+ color: var(--text-caption);
2254
+ cursor: pointer;
2255
+ }
2256
+
2257
+ .language-picker > svg {
2258
+ width: 13px;
2259
+ height: 13px;
2260
+ }
2261
+
2262
+ .language-picker select {
2263
+ width: auto;
2264
+ height: 26px;
2265
+ padding: 0 20px 0 2px;
2266
+ background-color: transparent;
2267
+ border-color: transparent;
2268
+ background-position: right 2px center;
2269
+ color: var(--text-caption);
2270
+ font-size: 11px;
2271
+ }
2272
+
2273
+ .language-picker select:hover {
2274
+ background-color: var(--surface-1);
2275
+ border-color: var(--border);
2276
+ }
2277
+
2278
+ /* The plan / usage card floats over the conversation, like the terminal's ⓘ. */
2279
+ #main {
2280
+ position: relative;
2281
+ }
2282
+
2283
+ .plan-card {
2284
+ position: absolute;
2285
+ top: 76px;
2286
+ right: clamp(16px, 4vw, 32px);
2287
+ z-index: 20;
2288
+ width: min(360px, calc(100vw - 32px));
2289
+ max-height: min(60vh, 560px);
2290
+ max-height: min(60dvh, 560px);
2291
+ padding: 13px 15px;
2292
+ overflow-y: auto;
2293
+ background: var(--bg-sidebar);
2294
+ border: 1px solid var(--border);
2295
+ border-radius: 14px;
2296
+ box-shadow: var(--shadow-strong);
2297
+ backdrop-filter: blur(10px);
2298
+ overscroll-behavior: contain;
2299
+ }
2300
+
2301
+ .plan-card.hidden {
2302
+ display: none;
2303
+ }
2304
+
2305
+ /* Sit below the model row instead of covering it. */
2306
+ #model-picker:not(.hidden) + #plan-card {
2307
+ top: 138px;
2308
+ }
2309
+
2310
+ .plan-card-head {
2311
+ display: flex;
2312
+ align-items: center;
2313
+ justify-content: space-between;
2314
+ gap: 10px;
2315
+ }
2316
+
2317
+ .plan-card-head strong {
2318
+ color: var(--text-caption);
2319
+ font-size: 10.5px;
2320
+ font-weight: 600;
2321
+ letter-spacing: 0.09em;
2322
+ text-transform: uppercase;
2323
+ }
2324
+
2325
+ .plan-card-head .icon-btn {
2326
+ width: 24px;
2327
+ height: 24px;
2328
+ }
2329
+
2330
+ .plan-goal {
2331
+ margin: 8px 0 10px;
2332
+ color: var(--text-secondary);
2333
+ font-size: 12.5px;
2334
+ line-height: 1.5;
2335
+ }
2336
+
2337
+ .plan-steps {
2338
+ display: flex;
2339
+ flex-direction: column;
2340
+ }
2341
+
2342
+ .plan-step {
2343
+ position: relative;
2344
+ display: flex;
2345
+ gap: 10px;
2346
+ padding: 7px 0;
2347
+ }
2348
+
2349
+ .plan-step:not(:last-child)::before {
2350
+ content: "";
2351
+ position: absolute;
2352
+ top: 22px;
2353
+ bottom: -6px;
2354
+ left: 5px;
2355
+ width: 1px;
2356
+ background: var(--border);
2357
+ }
2358
+
2359
+ .plan-node {
2360
+ position: relative;
2361
+ z-index: 1;
2362
+ flex: none;
2363
+ width: 11px;
2364
+ height: 11px;
2365
+ margin-top: 4px;
2366
+ background: var(--bg-sidebar);
2367
+ border: 1.5px solid var(--text-caption);
2368
+ border-radius: 50%;
2369
+ }
2370
+
2371
+ .plan-step.done .plan-node {
2372
+ background: var(--text-caption);
2373
+ border-color: var(--text-caption);
2374
+ }
2375
+
2376
+ .plan-step.active .plan-node {
2377
+ background: var(--accent);
2378
+ border-color: var(--accent);
2379
+ box-shadow: 0 0 0 3px var(--accent-fill);
2380
+ }
2381
+
2382
+ .plan-step.failed .plan-node {
2383
+ background: var(--red);
2384
+ border-color: var(--red);
2385
+ }
2386
+
2387
+ .plan-step-body {
2388
+ flex: 1;
2389
+ min-width: 0;
2390
+ }
2391
+
2392
+ .plan-step-title {
2393
+ display: flex;
2394
+ align-items: baseline;
2395
+ justify-content: space-between;
2396
+ gap: 8px;
2397
+ }
2398
+
2399
+ .plan-step-title strong {
2400
+ color: var(--text-secondary);
2401
+ font-size: 12px;
2402
+ font-weight: 500;
2403
+ line-height: 1.4;
2404
+ }
2405
+
2406
+ .plan-step.active .plan-step-title strong {
2407
+ color: var(--text);
2408
+ }
2409
+
2410
+ .plan-step.done .plan-step-title strong {
2411
+ color: var(--text-caption);
2412
+ }
2413
+
2414
+ .plan-step.failed .plan-step-title strong {
2415
+ color: var(--red);
2416
+ }
2417
+
2418
+ .plan-step-state {
2419
+ flex: none;
2420
+ color: var(--text-caption);
2421
+ font-size: 9.5px;
2422
+ letter-spacing: 0.05em;
2423
+ text-transform: uppercase;
2424
+ }
2425
+
2426
+ .plan-step-detail {
2427
+ margin-top: 2px;
2428
+ color: var(--text-caption);
2429
+ font-size: 11px;
2430
+ line-height: 1.45;
2431
+ }
2432
+
2433
+ .plan-meta {
2434
+ margin-top: 9px;
2435
+ padding-top: 9px;
2436
+ border-top: 1px solid var(--border-soft);
2437
+ color: var(--text-caption);
2438
+ font-size: 10.5px;
2439
+ }
2440
+
2441
+ .plan-usage {
2442
+ display: flex;
2443
+ flex-direction: column;
2444
+ gap: 4px;
2445
+ margin-top: 4px;
2446
+ }
2447
+
2448
+ .plan-usage-row {
2449
+ display: flex;
2450
+ align-items: center;
2451
+ justify-content: space-between;
2452
+ gap: 12px;
2453
+ color: var(--text-caption);
2454
+ font-size: 11.5px;
2455
+ }
2456
+
2457
+ .plan-usage-row strong {
2458
+ color: var(--text-secondary);
2459
+ font-weight: 500;
2460
+ font-variant-numeric: tabular-nums;
2461
+ }
2462
+
2463
+ .plan-toggle.active {
2464
+ color: var(--accent);
2465
+ background: var(--accent-fill);
2466
+ }
2467
+
2468
+ .control.danger:hover {
2469
+ color: var(--red);
2470
+ border-color: rgba(242, 90, 90, 0.5);
2471
+ background: rgba(242, 90, 90, 0.08);
2472
+ }
2473
+
2474
+ /* Dialogs: new conversation, folder picker, working directories. */
2475
+ .sheet-dialog {
2476
+ width: min(620px, calc(100vw - 24px));
2477
+ max-height: calc(100vh - 32px);
2478
+ max-height: calc(100dvh - 32px);
2479
+ padding: 0;
2480
+ overflow: hidden;
2481
+ background: var(--bg-sidebar);
2482
+ border: 1px solid var(--border);
2483
+ border-radius: var(--radius-xl);
2484
+ color: var(--text);
2485
+ box-shadow: var(--shadow-strong);
2486
+ }
2487
+
2488
+ .sheet-dialog::backdrop {
2489
+ background: rgba(9, 9, 10, 0.66);
2490
+ backdrop-filter: blur(6px);
2491
+ }
2492
+
2493
+ .sheet-dialog[open] {
2494
+ display: flex;
2495
+ flex-direction: column;
2496
+ }
2497
+
2498
+ .sheet {
2499
+ display: flex;
2500
+ flex-direction: column;
2501
+ min-height: 0;
2502
+ width: 100%;
2503
+ }
2504
+
2505
+ .sheet-header {
2506
+ display: flex;
2507
+ align-items: flex-start;
2508
+ justify-content: space-between;
2509
+ gap: 16px;
2510
+ flex: none;
2511
+ padding: 20px 22px 16px;
2512
+ border-bottom: 1px solid var(--border-soft);
2513
+ }
2514
+
2515
+ .sheet-header h2 {
2516
+ margin: 0;
2517
+ font-size: 16px;
2518
+ font-weight: 600;
2519
+ letter-spacing: -0.01em;
2520
+ }
2521
+
2522
+ .sheet-sub {
2523
+ margin: 3px 0 0;
2524
+ color: var(--text-caption);
2525
+ font-size: 12px;
2526
+ }
2527
+
2528
+ .sheet-body {
2529
+ display: flex;
2530
+ flex-direction: column;
2531
+ gap: 18px;
2532
+ flex: 1 1 auto;
2533
+ min-height: 0;
2534
+ padding: 18px 22px 10px;
2535
+ overflow-y: auto;
2536
+ overscroll-behavior: contain;
2537
+ }
2538
+
2539
+ .field-group {
2540
+ display: flex;
2541
+ flex-direction: column;
2542
+ gap: 8px;
2543
+ min-width: 0;
2544
+ padding: 0;
2545
+ border: 0;
2546
+ }
2547
+
2548
+ .field-group h3 {
2549
+ margin: 0;
2550
+ color: var(--text-secondary);
2551
+ font-size: 12.5px;
2552
+ font-weight: 600;
2553
+ }
2554
+
2555
+ .field-group h4 {
2556
+ margin: 4px 0 0;
2557
+ color: var(--text-caption);
2558
+ font-size: 11px;
2559
+ font-weight: 500;
2560
+ letter-spacing: 0.02em;
2561
+ }
2562
+
2563
+ .recent-title {
2564
+ text-transform: none;
2565
+ }
2566
+
2567
+ .path-row {
2568
+ display: flex;
2569
+ align-items: center;
2570
+ gap: 8px;
2571
+ min-width: 0;
2572
+ }
2573
+
2574
+ .path-input {
2575
+ flex: 1;
2576
+ min-width: 0;
2577
+ height: 36px;
2578
+ padding: 0 11px;
2579
+ background: var(--surface-1);
2580
+ border: 1px solid var(--border-soft);
2581
+ border-radius: 9px;
2582
+ color: var(--text);
2583
+ font-family: var(--mono);
2584
+ font-size: 12px;
2585
+ transition: border-color var(--fast), background-color var(--fast);
2586
+ }
2587
+
2588
+ .path-input::placeholder {
2589
+ color: var(--text-caption);
2590
+ }
2591
+
2592
+ .path-input:hover {
2593
+ border-color: var(--border);
2594
+ }
2595
+
2596
+ .path-input:focus {
2597
+ outline: none;
2598
+ border-color: var(--accent-line);
2599
+ box-shadow: 0 0 0 3px rgba(122, 170, 255, 0.1);
2600
+ }
2601
+
2602
+ .workspace-recents {
2603
+ display: flex;
2604
+ flex-wrap: wrap;
2605
+ gap: 6px;
2606
+ }
2607
+
2608
+ .path-chip {
2609
+ max-width: 220px;
2610
+ height: 26px;
2611
+ padding: 0 10px;
2612
+ overflow: hidden;
2613
+ background: var(--surface-1);
2614
+ border: 1px solid var(--border-soft);
2615
+ border-radius: 999px;
2616
+ color: var(--text-tertiary);
2617
+ font-size: 11.5px;
2618
+ text-overflow: ellipsis;
2619
+ white-space: nowrap;
2620
+ }
2621
+
2622
+ .path-chip:hover {
2623
+ border-color: var(--border-strong);
2624
+ color: var(--text);
2625
+ }
2626
+
2627
+ .path-chip.selected {
2628
+ background: var(--accent-fill);
2629
+ border-color: var(--accent-line);
2630
+ color: var(--accent);
2631
+ }
2632
+
2633
+ .recents-empty {
2634
+ color: var(--text-caption);
2635
+ font-size: 11.5px;
2636
+ }
2637
+
2638
+ .sheet-actions {
2639
+ display: flex;
2640
+ align-items: center;
2641
+ justify-content: flex-end;
2642
+ gap: 8px;
2643
+ flex: none;
2644
+ padding: 14px 22px;
2645
+ border-top: 1px solid var(--border-soft);
2646
+ }
2647
+
2648
+ .sheet-actions .control {
2649
+ height: 34px;
2650
+ padding: 0 16px;
2651
+ }
2652
+
2653
+ .sheet-actions .primary {
2654
+ height: 34px;
2655
+ padding: 0 18px;
2656
+ }
2657
+
2658
+ .sheet-spacer {
2659
+ flex: 1;
2660
+ }
2661
+
2662
+ /* Folder picker */
2663
+ .folder-sheet {
2664
+ max-height: calc(100vh - 32px);
2665
+ max-height: calc(100dvh - 32px);
2666
+ }
2667
+
2668
+ .folder-toolbar {
2669
+ display: flex;
2670
+ align-items: center;
2671
+ gap: 8px;
2672
+ flex: none;
2673
+ padding: 14px 22px 0;
2674
+ }
2675
+
2676
+ .folder-toolbar .path-input {
2677
+ flex: 1;
2678
+ }
2679
+
2680
+ .folder-roots {
2681
+ display: flex;
2682
+ flex-wrap: wrap;
2683
+ gap: 6px;
2684
+ flex: none;
2685
+ padding: 10px 22px 0;
2686
+ }
2687
+
2688
+ .folder-roots:empty {
2689
+ display: none;
2690
+ }
2691
+
2692
+ .root-chip {
2693
+ height: 24px;
2694
+ padding: 0 9px;
2695
+ background: var(--surface-1);
2696
+ border: 1px solid var(--border-soft);
2697
+ border-radius: 6px;
2698
+ color: var(--text-caption);
2699
+ font-size: 11px;
2700
+ }
2701
+
2702
+ .root-chip:hover {
2703
+ border-color: var(--border-strong);
2704
+ color: var(--text-secondary);
2705
+ }
2706
+
2707
+ .folder-list {
2708
+ flex: 1 1 auto;
2709
+ min-height: 140px;
2710
+ max-height: 42vh;
2711
+ max-height: 42dvh;
2712
+ margin: 12px 12px 0;
2713
+ padding: 6px;
2714
+ overflow-y: auto;
2715
+ background: var(--bg);
2716
+ border: 1px solid var(--border-soft);
2717
+ border-radius: 12px;
2718
+ overscroll-behavior: contain;
2719
+ }
2720
+
2721
+ .folder-item {
2722
+ display: flex;
2723
+ align-items: center;
2724
+ gap: 9px;
2725
+ width: 100%;
2726
+ padding: 8px 10px;
2727
+ background: transparent;
2728
+ border: 0;
2729
+ border-radius: 8px;
2730
+ color: var(--text-secondary);
2731
+ font-size: 12.5px;
2732
+ text-align: left;
2733
+ }
2734
+
2735
+ .folder-item:hover {
2736
+ background: var(--surface-1);
2737
+ color: var(--text);
2738
+ }
2739
+
2740
+ .folder-item-icon {
2741
+ display: grid;
2742
+ place-items: center;
2743
+ flex: none;
2744
+ width: 22px;
2745
+ height: 22px;
2746
+ color: var(--text-caption);
2747
+ }
2748
+
2749
+ .folder-item-icon svg {
2750
+ width: 16px;
2751
+ height: 16px;
2752
+ }
2753
+
2754
+ .folder-new {
2755
+ display: flex;
2756
+ align-items: center;
2757
+ gap: 8px;
2758
+ flex: none;
2759
+ padding: 10px 22px 0;
2760
+ }
2761
+
2762
+ .folder-new.hidden {
2763
+ display: none;
2764
+ }
2765
+
2766
+ .folder-sheet > .form-feedback,
2767
+ .sheet > .form-feedback {
2768
+ flex: none;
2769
+ padding: 10px 22px 0;
2770
+ }
2771
+
2772
+ .folder-actions {
2773
+ margin-top: auto;
2774
+ }
2775
+
2776
+ /* Working-directory switcher */
2777
+ .workspace-list {
2778
+ display: flex;
2779
+ flex-direction: column;
2780
+ gap: 2px;
2781
+ flex: 1 1 auto;
2782
+ min-height: 0;
2783
+ max-height: 52vh;
2784
+ max-height: 52dvh;
2785
+ padding: 10px 12px;
2786
+ overflow-y: auto;
2787
+ overscroll-behavior: contain;
2788
+ }
2789
+
2790
+ .workspace-item {
2791
+ display: flex;
2792
+ align-items: center;
2793
+ gap: 10px;
2794
+ width: 100%;
2795
+ padding: 9px 10px;
2796
+ background: transparent;
2797
+ border: 0;
2798
+ border-radius: 10px;
2799
+ color: var(--text-secondary);
2800
+ text-align: left;
2801
+ }
2802
+
2803
+ .workspace-item:hover {
2804
+ background: var(--surface-1);
2805
+ }
2806
+
2807
+ .workspace-item.selected {
2808
+ background: var(--surface-2);
2809
+ }
2810
+
2811
+ .workspace-item.missing {
2812
+ opacity: 0.5;
2813
+ }
2814
+
2815
+ .workspace-icon {
2816
+ display: grid;
2817
+ place-items: center;
2818
+ flex: none;
2819
+ width: 32px;
2820
+ height: 32px;
2821
+ background: var(--surface-1);
2822
+ border-radius: 9px;
2823
+ color: var(--text-tertiary);
2824
+ }
2825
+
2826
+ .workspace-icon svg {
2827
+ width: 17px;
2828
+ height: 17px;
2829
+ }
2830
+
2831
+ .workspace-info {
2832
+ display: flex;
2833
+ flex: 1;
2834
+ flex-direction: column;
2835
+ min-width: 0;
2836
+ }
2837
+
2838
+ .workspace-info strong {
2839
+ color: var(--text);
2840
+ font-size: 12.5px;
2841
+ font-weight: 500;
2842
+ }
2843
+
2844
+ .workspace-info small {
2845
+ overflow: hidden;
2846
+ color: var(--text-caption);
2847
+ font-size: 10.5px;
2848
+ text-overflow: ellipsis;
2849
+ white-space: nowrap;
2850
+ }
2851
+
2852
+ .workspace-count {
2853
+ flex: none;
2854
+ color: var(--text-caption);
2855
+ font-size: 10.5px;
2856
+ }
2857
+
2858
+ .sheet .form-feedback {
2859
+ min-height: 16px;
2860
+ }
2861
+
2862
+ .agents-list {
2863
+ display: flex;
2864
+ flex-direction: column;
2865
+ flex: 1 1 auto;
2866
+ min-height: 120px;
2867
+ max-height: 56vh;
2868
+ max-height: 56dvh;
2869
+ padding: 10px 12px;
2870
+ overflow-y: auto;
2871
+ overscroll-behavior: contain;
2872
+ }
2873
+
2874
+ .agent-section {
2875
+ margin-bottom: 10px;
2876
+ }
2877
+
2878
+ .agent-section h3 {
2879
+ margin: 6px 8px;
2880
+ color: var(--text-caption);
2881
+ font-size: 10.5px;
2882
+ font-weight: 600;
2883
+ letter-spacing: 0.07em;
2884
+ text-transform: uppercase;
2885
+ }
2886
+
2887
+ .agent-session {
2888
+ display: flex;
2889
+ align-items: center;
2890
+ gap: 10px;
2891
+ width: 100%;
2892
+ padding: 9px 10px;
2893
+ background: transparent;
2894
+ border: 0;
2895
+ border-radius: 9px;
2896
+ color: var(--text-secondary);
2897
+ text-align: left;
2898
+ }
2899
+
2900
+ .agent-session:hover {
2901
+ background: var(--surface-1);
2902
+ color: var(--text);
2903
+ }
2904
+
2905
+ .agent-session-body {
2906
+ display: flex;
2907
+ flex: 1;
2908
+ flex-direction: column;
2909
+ min-width: 0;
2910
+ }
2911
+
2912
+ .agent-session-title {
2913
+ overflow: hidden;
2914
+ font-size: 12.5px;
2915
+ text-overflow: ellipsis;
2916
+ white-space: nowrap;
2917
+ }
2918
+
2919
+ .agent-session-meta {
2920
+ color: var(--text-caption);
2921
+ font-size: 10.5px;
2922
+ }
2923
+
2924
+ .agents-cwd {
2925
+ min-width: 0;
2926
+ overflow: hidden;
2927
+ color: var(--text-caption);
2928
+ font-family: var(--mono);
2929
+ font-size: 10.5px;
2930
+ text-overflow: ellipsis;
2931
+ white-space: nowrap;
2932
+ }
2933
+
2934
+ .workspace-path {
2935
+ max-width: 100%;
2936
+ overflow-wrap: anywhere;
2937
+ color: var(--text-caption);
2938
+ font-family: var(--mono);
2939
+ font-size: 11px;
2940
+ }
2941
+
2942
+ .workspace-prompt {
2943
+ margin: 2px 0 6px;
2944
+ color: var(--text-caption);
2945
+ font-size: 12.5px;
2946
+ line-height: 1.5;
2947
+ }
2948
+
2949
+ .workspace-empty .control {
2950
+ margin-top: 4px;
2951
+ }
2952
+
2953
+ /* Settings use a nested two-column grid so a language row can sit beside the
2954
+ approval default without breaking the existing field layout. */
2955
+ .settings-fields .settings-grid {
2956
+ display: grid;
2957
+ grid-column: 1 / -1;
2958
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2959
+ gap: 16px 18px;
2960
+ }
2961
+
2962
+ /* --------------------------------------------------------------- scrollbar */
2963
+
2964
+ * {
2965
+ scrollbar-width: thin;
2966
+ scrollbar-color: #3c3c3d transparent;
2967
+ }
2968
+
2969
+ *::-webkit-scrollbar {
2970
+ width: 8px;
2971
+ height: 8px;
2972
+ }
2973
+
2974
+ *::-webkit-scrollbar-track {
2975
+ background: transparent;
2976
+ }
2977
+
2978
+ *::-webkit-scrollbar-thumb {
2979
+ border: 2px solid transparent;
2980
+ border-radius: 999px;
2981
+ background: #3c3c3d;
2982
+ background-clip: content-box;
2983
+ }
2984
+
2985
+ *::-webkit-scrollbar-thumb:hover {
2986
+ background: #545557;
2987
+ background-clip: content-box;
2988
+ }
2989
+
2990
+ *::-webkit-scrollbar-corner {
2991
+ background: transparent;
2992
+ }
2993
+
2994
+ /* --------------------------------------------------------------- pro curtain */
2995
+
2996
+ /* Set by the inline head bootstrap when a just-started switch is recorded. It
2997
+ covers /pro before the module runs, so there is no flash of the new page
2998
+ while the curtain is being rebuilt. The module removes it immediately. */
2999
+ html.pro-transitioning body::before {
3000
+ content: "";
3001
+ position: fixed;
3002
+ inset: 0;
3003
+ z-index: 299;
3004
+ background: #151515;
3005
+ }
3006
+
3007
+ /* Full-screen cover used while switching to /pro. #151515 matches the GIF's
3008
+ own background, so the wordmark blends into the cover on first paint. */
3009
+ .pro-curtain {
3010
+ position: fixed;
3011
+ inset: 0;
3012
+ z-index: 300;
3013
+ display: flex;
3014
+ align-items: center;
3015
+ justify-content: center;
3016
+ background: #151515;
3017
+ opacity: 0;
3018
+ transition: opacity 0.35s ease;
3019
+ }
3020
+
3021
+ .pro-curtain.pro-curtain-visible {
3022
+ opacity: 1;
3023
+ }
3024
+
3025
+ .pro-curtain img {
3026
+ display: block;
3027
+ width: min(82vw, 900px);
3028
+ max-height: 60vh;
3029
+ height: auto;
3030
+ object-fit: contain;
3031
+ }
3032
+
3033
+ /* -------------------------------------------------------------- animations */
3034
+
3035
+ @keyframes blink {
3036
+ 0%,
3037
+ 49% {
3038
+ opacity: 1;
3039
+ }
3040
+ 50%,
3041
+ 100% {
3042
+ opacity: 0;
3043
+ }
3044
+ }
3045
+
3046
+ @keyframes pulse {
3047
+ 0% {
3048
+ box-shadow: 0 0 0 0 rgba(122, 170, 255, 0.45);
3049
+ }
3050
+ 70% {
3051
+ box-shadow: 0 0 0 6px rgba(122, 170, 255, 0);
3052
+ }
3053
+ 100% {
3054
+ box-shadow: 0 0 0 0 rgba(122, 170, 255, 0);
3055
+ }
3056
+ }
3057
+
3058
+ @keyframes pulse-amber {
1805
3059
  0% {
1806
3060
  box-shadow: 0 0 0 0 rgba(247, 173, 49, 0.5);
1807
3061
  }
@@ -1814,6 +3068,7 @@ select option {
1814
3068
  }
1815
3069
 
1816
3070
  @media (prefers-reduced-motion: reduce) {
3071
+ .pro-slider-meteors { display: none; }
1817
3072
  *,
1818
3073
  *::before,
1819
3074
  *::after {
@@ -1837,6 +3092,15 @@ select option {
1837
3092
  }
1838
3093
  }
1839
3094
 
3095
+ /* Pro's brand name is longer ("Neutrino Pro"). Keep the regular 288px sidebar
3096
+ down to phone width so the name stays on one line next to the narrower logo;
3097
+ the regular workspace keeps its more compact 264px pane. */
3098
+ @media (min-width: 761px) and (max-width: 1080px) {
3099
+ body.pro-mode #sidebar {
3100
+ width: 288px;
3101
+ }
3102
+ }
3103
+
1840
3104
  /* Phones use one full-width pane: the conversation list opens first. */
1841
3105
  @media (max-width: 760px) {
1842
3106
  #sidebar {
@@ -1866,7 +3130,16 @@ select option {
1866
3130
  }
1867
3131
 
1868
3132
  .sidebar-foot {
1869
- display: none;
3133
+ display: flex;
3134
+ padding-bottom: calc(10px + env(safe-area-inset-bottom));
3135
+ }
3136
+
3137
+ .new-chat {
3138
+ height: 44px;
3139
+ }
3140
+
3141
+ .workspace-button {
3142
+ height: 36px;
1870
3143
  }
1871
3144
 
1872
3145
  .icon-btn {
@@ -2017,6 +3290,69 @@ select option {
2017
3290
  grid-template-columns: 1fr;
2018
3291
  }
2019
3292
 
3293
+ .settings-fields .settings-grid {
3294
+ grid-template-columns: 1fr;
3295
+ }
3296
+
3297
+ .sheet-dialog {
3298
+ width: calc(100vw - 16px);
3299
+ max-height: calc(100dvh - 16px);
3300
+ }
3301
+
3302
+ .sheet-header,
3303
+ .sheet-actions {
3304
+ padding-left: 16px;
3305
+ padding-right: 16px;
3306
+ }
3307
+
3308
+ .sheet-body {
3309
+ padding: 16px 16px 8px;
3310
+ }
3311
+
3312
+ .folder-toolbar,
3313
+ .folder-roots,
3314
+ .folder-new,
3315
+ .folder-sheet > .form-feedback,
3316
+ .sheet > .form-feedback {
3317
+ padding-left: 16px;
3318
+ padding-right: 16px;
3319
+ }
3320
+
3321
+ .sheet-actions {
3322
+ flex-wrap: wrap;
3323
+ }
3324
+
3325
+ .sheet-actions .control,
3326
+ .sheet-actions .primary {
3327
+ height: 40px;
3328
+ }
3329
+
3330
+ .folder-list {
3331
+ max-height: 36dvh;
3332
+ }
3333
+
3334
+ .workspace-list {
3335
+ max-height: 44dvh;
3336
+ }
3337
+
3338
+ .plan-card {
3339
+ position: fixed;
3340
+ top: 72px;
3341
+ right: 10px;
3342
+ left: 10px;
3343
+ width: auto;
3344
+ max-height: 45dvh;
3345
+ }
3346
+
3347
+ .path-row,
3348
+ .folder-toolbar {
3349
+ flex-wrap: wrap;
3350
+ }
3351
+
3352
+ .path-input {
3353
+ font-size: 16px;
3354
+ }
3355
+
2020
3356
  .settings-fields label,
2021
3357
  .settings-note {
2022
3358
  overflow-wrap: anywhere;