@xcanwin/manyoyo 6.1.3 → 6.2.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.
@@ -17,6 +17,7 @@
17
17
  --line-medium: rgba(181, 146, 99, 0.4);
18
18
  --tree-guide: rgba(181, 146, 99, 0.44);
19
19
  --tree-guide-soft: rgba(181, 146, 99, 0.44);
20
+ --tree-active: #ecdfc8;
20
21
 
21
22
  --surface-panel: linear-gradient(180deg, rgba(255, 255, 255, 0.88) 0%, rgba(252, 246, 236, 0.88) 100%);
22
23
 
@@ -160,13 +161,6 @@ body::after {
160
161
  text-transform: uppercase;
161
162
  }
162
163
 
163
- .brand-sub {
164
- color: var(--muted);
165
- font-size: 11px;
166
- letter-spacing: 0.3px;
167
- text-transform: uppercase;
168
- }
169
-
170
164
  .sidebar-actions {
171
165
  display: inline-flex;
172
166
  gap: 8px;
@@ -258,12 +252,6 @@ textarea:focus-visible {
258
252
  display: none;
259
253
  }
260
254
 
261
- .mobile-actions-toggle {
262
- display: inline-flex;
263
- padding: 8px 12px;
264
- font-size: 13px;
265
- }
266
-
267
255
  .sidebar-backdrop[hidden] {
268
256
  display: none !important;
269
257
  }
@@ -682,9 +670,9 @@ button.tree-toggle:active {
682
670
  column-gap: 8px;
683
671
  }
684
672
 
685
- .tree-node-row.tree-node-row-container {
673
+ .tree-node-row.tree-node-row-container,
674
+ .tree-node-row.tree-node-row-agent {
686
675
  position: relative;
687
- grid-template-columns: auto minmax(0, 1fr);
688
676
  }
689
677
 
690
678
  .tree-prefix {
@@ -802,17 +790,17 @@ button.tree-toggle:active {
802
790
  .tree-node-button {
803
791
  width: 100%;
804
792
  text-align: left;
805
- border: 1px solid rgba(181, 146, 99, 0.38);
806
- background: rgba(255, 255, 255, 0.94);
793
+ border: 1px solid transparent;
794
+ background: transparent;
807
795
  color: var(--text);
808
- border-radius: 12px;
796
+ border-radius: 10px;
809
797
  padding: 10px 11px;
798
+ transition: background-color 120ms ease;
810
799
  }
811
800
 
812
801
  .tree-node-button:hover {
813
802
  transform: none;
814
- border-color: #d1aa7f;
815
- background: #fff8ef;
803
+ background: var(--panel-soft);
816
804
  }
817
805
 
818
806
  .tree-node-button:active {
@@ -825,9 +813,7 @@ button.tree-toggle:active {
825
813
  }
826
814
 
827
815
  .tree-node-button.active {
828
- border-color: #c68d5a;
829
- background: #fff3e8;
830
- box-shadow: inset 3px 0 0 var(--accent), 0 0 0 2px rgba(196, 85, 31, 0.14);
816
+ background: var(--tree-active);
831
817
  }
832
818
 
833
819
  .tree-node-button.tree-node-tone-history .tree-node-title,
@@ -836,17 +822,12 @@ button.tree-toggle:active {
836
822
  }
837
823
 
838
824
  .tree-node-block.has-active > .tree-node-row > .tree-node-button:not(.active) {
839
- border-color: #c68d5a;
840
- box-shadow: 0 0 0 2px rgba(196, 85, 31, 0.08);
841
- }
842
-
843
- .tree-node-button-directory,
844
- .tree-node-button-container {
845
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.96) 0%, rgba(249, 242, 232, 0.98) 100%);
825
+ background: var(--panel-soft);
846
826
  }
847
827
 
848
- .tree-node-row-container .tree-node-button-container {
849
- padding-right: 52px;
828
+ .tree-node-row-container .tree-node-button-container,
829
+ .tree-node-row-agent .tree-node-button-agent {
830
+ padding-right: 38px;
850
831
  }
851
832
 
852
833
  .tree-node-main {
@@ -899,32 +880,95 @@ button.tree-toggle:active {
899
880
  color: var(--status-unknown-text);
900
881
  }
901
882
 
902
- .tree-node-hover-menu {
883
+ .tree-node-menu {
903
884
  position: absolute;
904
885
  top: 50%;
905
- right: 10px;
906
- display: inline-flex;
907
- align-items: center;
908
- gap: 6px;
886
+ right: 6px;
887
+ z-index: 9;
888
+ transform: translateY(-50%);
909
889
  opacity: 0;
910
890
  pointer-events: none;
911
- transform: translateY(-50%) translateX(4px);
912
- transition: opacity 140ms ease, transform 140ms ease;
891
+ transition: opacity 140ms ease;
913
892
  }
914
893
 
915
- .tree-node-row-container:hover .tree-node-hover-menu,
916
- .tree-node-hover-menu:focus-within {
894
+ .tree-node-row:hover .tree-node-menu,
895
+ .tree-node-menu:focus-within,
896
+ .tree-node-menu.is-open {
917
897
  opacity: 1;
918
898
  pointer-events: auto;
919
- transform: translateY(-50%) translateX(0);
920
899
  }
921
900
 
922
- .tree-node-menu-item {
923
- padding: 6px 9px;
924
- font-size: 11px;
925
- border-radius: 999px;
926
- white-space: nowrap;
927
- box-shadow: 0 10px 22px rgba(44, 31, 15, 0.12);
901
+ .tree-node-menu.is-open {
902
+ z-index: 20;
903
+ }
904
+
905
+ @media (hover: none) {
906
+ .tree-node-menu {
907
+ opacity: 1;
908
+ pointer-events: auto;
909
+ }
910
+ }
911
+
912
+ .tree-node-menu-trigger {
913
+ width: 26px;
914
+ height: 26px;
915
+ padding: 0;
916
+ display: inline-flex;
917
+ align-items: center;
918
+ justify-content: center;
919
+ border-radius: 8px;
920
+ }
921
+
922
+ .tree-node-menu-trigger svg {
923
+ width: 14px;
924
+ height: 14px;
925
+ fill: currentColor;
926
+ }
927
+
928
+ .tree-node-menu-panel {
929
+ position: absolute;
930
+ top: calc(100% + 4px);
931
+ right: 0;
932
+ z-index: 9;
933
+ width: max-content;
934
+ min-width: 140px;
935
+ padding: 6px;
936
+ border: 1px solid var(--line);
937
+ border-radius: 10px;
938
+ background: #fffaf2;
939
+ box-shadow: var(--shadow-strong);
940
+ display: flex;
941
+ flex-direction: column;
942
+ gap: 2px;
943
+ }
944
+
945
+ .tree-node-menu-panel[hidden] {
946
+ display: none;
947
+ }
948
+
949
+ .tree-node-menu-panel-item {
950
+ width: 100%;
951
+ text-align: left;
952
+ border: none;
953
+ background: transparent;
954
+ color: var(--text);
955
+ font-weight: 600;
956
+ font-size: 12px;
957
+ padding: 7px 9px;
958
+ border-radius: 6px;
959
+ }
960
+
961
+ .tree-node-menu-panel-item:hover {
962
+ transform: none;
963
+ background: var(--panel-soft);
964
+ }
965
+
966
+ .tree-node-menu-panel-item.is-danger {
967
+ color: var(--danger);
968
+ }
969
+
970
+ .tree-node-menu-panel-item.is-danger:hover {
971
+ background: var(--danger-soft);
928
972
  }
929
973
 
930
974
  .tree-node-children[hidden] {
@@ -996,8 +1040,9 @@ button.tree-toggle:active {
996
1040
  display: grid;
997
1041
  grid-template-rows: auto minmax(0, 1fr) auto;
998
1042
  gap: 0;
999
- background:
1000
- linear-gradient(165deg, rgba(255, 251, 243, 0.95) 0%, rgba(247, 237, 223, 0.95) 100%);
1043
+ /* 和 #messages / .composer 用同一个 --surface-panel,避免包裹它们的这层
1044
+ 在缝隙处显得比内容区更深一截 */
1045
+ background: var(--surface-panel);
1001
1046
  animation: panelIn 360ms ease 60ms both;
1002
1047
  }
1003
1048
 
@@ -1015,51 +1060,18 @@ button.tree-toggle:active {
1015
1060
  flex: 1;
1016
1061
  min-width: 0;
1017
1062
  display: flex;
1018
- flex-direction: column;
1019
- gap: 8px;
1020
- }
1021
-
1022
- .header-main-top {
1023
- display: flex;
1024
- align-items: center;
1025
- gap: 8px;
1026
- min-width: 0;
1027
- }
1028
-
1029
- .header-menu {
1030
- position: relative;
1031
- flex: none;
1032
- }
1033
-
1034
- #activeTitle {
1035
- margin: 0;
1036
- font-family: var(--font-display);
1037
- font-size: 22px;
1038
- font-weight: 700;
1039
- line-height: 1.12;
1040
- letter-spacing: 0.4px;
1041
- word-break: break-all;
1042
- }
1043
-
1044
- .header-main-top #activeTitle {
1045
- flex: 1;
1046
- min-width: 0;
1047
- }
1048
-
1049
- #activeMeta {
1050
- margin-top: 2px;
1051
- font-size: 12px;
1052
- color: var(--muted);
1053
1063
  }
1054
1064
 
1055
1065
  .workbench-tabs {
1056
- display: inline-flex;
1066
+ flex: 1;
1067
+ display: flex;
1057
1068
  flex-wrap: wrap;
1069
+ align-items: center;
1058
1070
  gap: 8px;
1059
1071
  }
1060
1072
 
1061
1073
  .workbench-tabs button.is-active,
1062
- .composer-mode-switch button.is-active {
1074
+ .composer-options-panel button.is-active {
1063
1075
  color: #ffffff;
1064
1076
  background: var(--accent);
1065
1077
  border-color: var(--accent-strong);
@@ -1068,6 +1080,8 @@ button.tree-toggle:active {
1068
1080
  .workspace-switcher {
1069
1081
  position: relative;
1070
1082
  display: inline-flex;
1083
+ /* 始终贴住这一行的右侧:桌面端只有它自己时贴最右,移动端"会话"贴最左时它仍贴最右 */
1084
+ margin-left: auto;
1071
1085
  }
1072
1086
 
1073
1087
  .workspace-switcher-btn {
@@ -1095,7 +1109,8 @@ button.tree-toggle:active {
1095
1109
  display: none;
1096
1110
  position: absolute;
1097
1111
  top: calc(100% + 8px);
1098
- left: 0;
1112
+ /* 触发按钮固定贴住这一行右侧,面板也从右边缘向左展开,避免在宽屏下超出视口 */
1113
+ right: 0;
1099
1114
  z-index: 8;
1100
1115
  width: max-content;
1101
1116
  padding: 8px;
@@ -1115,26 +1130,6 @@ body.workspace-switcher-open .workspace-switcher-panel {
1115
1130
  text-align: left;
1116
1131
  }
1117
1132
 
1118
- .header-actions {
1119
- display: none;
1120
- position: absolute;
1121
- top: calc(100% + 8px);
1122
- right: 0;
1123
- z-index: 8;
1124
- width: min(240px, calc(100vw - 36px));
1125
- padding: 8px;
1126
- border: 1px solid var(--line);
1127
- border-radius: 10px;
1128
- background: #fffaf2;
1129
- box-shadow: var(--shadow-strong);
1130
- grid-template-columns: 1fr;
1131
- gap: 8px;
1132
- }
1133
-
1134
- body.mobile-actions-open .header-actions {
1135
- display: grid;
1136
- }
1137
-
1138
1133
  .workspace-shell {
1139
1134
  min-height: 0;
1140
1135
  height: 100%;
@@ -1166,8 +1161,7 @@ body.mobile-actions-open .header-actions {
1166
1161
  min-height: 0;
1167
1162
  overflow-y: auto;
1168
1163
  margin: 0;
1169
- padding: 14px;
1170
- border: 1px solid var(--line);
1164
+ padding: 14px 14px 44px;
1171
1165
  border-radius: 14px;
1172
1166
  display: flex;
1173
1167
  flex-direction: column;
@@ -1663,6 +1657,17 @@ body.terminal-mode .composer {
1663
1657
  gap: 6px;
1664
1658
  animation: msgIn 210ms ease both;
1665
1659
  animation-delay: 0ms;
1660
+ /* animation 会让每条消息各自建立独立的层叠上下文(transform/opacity 动画的副作用),
1661
+ 悬浮显示的 .msg-actions 浮层因此只能在本条消息内部比较 z-index,
1662
+ 会被后面消息按 DOM 序整体盖住;悬浮时显式提升本条消息的 z-index 才能穿透 */
1663
+ z-index: 0;
1664
+ }
1665
+
1666
+ .msg:hover,
1667
+ .msg:focus-within {
1668
+ /* 需要高于移动端 .composer 的 z-index: 3(position: sticky,悬浮在滚动内容之上),
1669
+ 否则最后一条消息的浮层会被吸底的输入框盖住 */
1670
+ z-index: 4;
1666
1671
  }
1667
1672
 
1668
1673
  .msg.user {
@@ -1708,20 +1713,45 @@ body.terminal-mode .composer {
1708
1713
  }
1709
1714
 
1710
1715
  .msg-actions {
1716
+ position: absolute;
1717
+ top: 100%;
1718
+ /* 用 padding-top 而不是 margin-top 留白:margin 在盒子外,鼠标从气泡移到按钮
1719
+ 之间会经过一段没有任何元素承接的"死区",:hover 提前丢失导致按钮还没碰到就消失;
1720
+ padding 仍属于本元素的可命中区域,鼠标全程都在同一个悬浮触发范围内 */
1721
+ padding-top: 4px;
1711
1722
  display: flex;
1712
1723
  gap: 6px;
1713
1724
  opacity: 0;
1725
+ pointer-events: none;
1714
1726
  transition: opacity 140ms ease;
1727
+ z-index: 1;
1728
+ }
1729
+
1730
+ .msg.user .msg-actions {
1731
+ right: 0;
1732
+ }
1733
+
1734
+ .msg.assistant .msg-actions,
1735
+ .msg.system .msg-actions {
1736
+ left: 0;
1715
1737
  }
1716
1738
 
1717
1739
  .msg:hover .msg-actions,
1718
1740
  .msg:focus-within .msg-actions {
1719
1741
  opacity: 1;
1742
+ pointer-events: auto;
1720
1743
  }
1721
1744
 
1722
1745
  @media (hover: none) {
1723
1746
  .msg-actions {
1724
1747
  opacity: 1;
1748
+ pointer-events: auto;
1749
+ }
1750
+
1751
+ /* 触屏设备没有真正的 :hover,上面 .msg:hover 提升 z-index 的规则永远不会触发;
1752
+ 这里常驻按住基础 z-index 之上,浮层才不会被吸底输入框(sticky, z-index: 3)盖住 */
1753
+ .msg {
1754
+ z-index: 4;
1725
1755
  }
1726
1756
  }
1727
1757
 
@@ -1739,6 +1769,9 @@ body.terminal-mode .composer {
1739
1769
 
1740
1770
  .msg-copy-btn:hover {
1741
1771
  color: var(--accent-strong);
1772
+ /* 不显式设置背景色的话,通用 button:hover 规则的深色背景会覆盖进来,
1773
+ 和同色系的文字撞色看不清,这里只需要比默认背景微微变深 */
1774
+ background: #f0e6d3;
1742
1775
  border-color: var(--line-strong);
1743
1776
  }
1744
1777
 
@@ -1767,6 +1800,7 @@ body.terminal-mode .composer {
1767
1800
  }
1768
1801
 
1769
1802
  .bubble {
1803
+ position: relative;
1770
1804
  border: 1px solid var(--line);
1771
1805
  border-radius: 10px;
1772
1806
  background: var(--assistant-bubble);
@@ -1822,6 +1856,7 @@ body.command-mode .msg.origin-agent .bubble {
1822
1856
  display: flex;
1823
1857
  flex-direction: column;
1824
1858
  gap: 10px;
1859
+ margin-bottom: 10px;
1825
1860
  }
1826
1861
 
1827
1862
  .trace-flow {
@@ -1998,49 +2033,61 @@ details.trace-card > .trace-card-summary {
1998
2033
  }
1999
2034
 
2000
2035
  .composer {
2001
- border-top: 1px solid var(--line-medium);
2002
2036
  margin-top: 12px;
2003
2037
  padding: 12px 8px 4px;
2038
+ border-radius: 14px;
2004
2039
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.32) 0%, rgba(255, 249, 240, 0.78) 100%);
2005
2040
  }
2006
2041
 
2007
- .composer-toolbar {
2008
- display: flex;
2009
- align-items: center;
2010
- justify-content: space-between;
2042
+ .composer-inner {
2043
+ display: grid;
2044
+ grid-template-columns: 1fr auto;
2045
+ align-items: flex-end;
2011
2046
  gap: 10px;
2012
- max-height: 0;
2013
- margin-bottom: 0;
2014
- opacity: 0;
2015
- overflow: hidden;
2016
- transition: max-height 180ms ease, opacity 160ms ease, margin-bottom 180ms ease;
2017
2047
  }
2018
2048
 
2019
- .composer.is-expanded .composer-toolbar {
2020
- max-height: 56px;
2021
- margin-bottom: 10px;
2022
- opacity: 1;
2049
+ .composer-actions {
2050
+ display: flex;
2051
+ flex-direction: column;
2052
+ gap: 8px;
2023
2053
  }
2024
2054
 
2025
- .composer-toolbar-meta {
2026
- display: inline-flex;
2027
- align-items: center;
2028
- gap: 10px;
2029
- margin-left: auto;
2055
+ .composer-options {
2056
+ position: relative;
2057
+ display: flex;
2030
2058
  }
2031
2059
 
2032
- .composer-mode-switch {
2033
- display: inline-flex;
2034
- gap: 8px;
2060
+ #composerOptionsToggle {
2061
+ min-width: 92px;
2035
2062
  }
2036
2063
 
2037
- .toolbar-mini-btn {
2038
- padding: 7px 12px;
2039
- font-size: 12px;
2040
- white-space: nowrap;
2064
+ .composer-options-panel {
2065
+ display: none;
2066
+ position: absolute;
2067
+ /* 触发按钮在 composer 底部,下拉框往下展开会跑出视口,改成往上展开 */
2068
+ bottom: calc(100% + 8px);
2069
+ right: 0;
2070
+ z-index: 8;
2071
+ width: max-content;
2072
+ min-width: 140px;
2073
+ padding: 8px;
2074
+ border: 1px solid var(--line);
2075
+ border-radius: 10px;
2076
+ background: #fffaf2;
2077
+ box-shadow: var(--shadow-strong);
2078
+ flex-direction: column;
2079
+ gap: 6px;
2041
2080
  }
2042
2081
 
2043
- .toolbar-chip {
2082
+ body.composer-options-open .composer-options-panel {
2083
+ display: flex;
2084
+ }
2085
+
2086
+ .composer-options-panel button {
2087
+ text-align: left;
2088
+ }
2089
+
2090
+ .composer-options-info {
2044
2091
  display: inline-flex;
2045
2092
  align-items: center;
2046
2093
  min-height: 32px;
@@ -2054,19 +2101,6 @@ details.trace-card > .trace-card-summary {
2054
2101
  white-space: nowrap;
2055
2102
  }
2056
2103
 
2057
- .composer-inner {
2058
- display: grid;
2059
- grid-template-columns: 1fr auto;
2060
- align-items: flex-end;
2061
- gap: 10px;
2062
- }
2063
-
2064
- .composer-actions {
2065
- display: flex;
2066
- flex-direction: column;
2067
- gap: 8px;
2068
- }
2069
-
2070
2104
  #commandInput {
2071
2105
  width: 100%;
2072
2106
  min-height: 116px;
@@ -2086,29 +2120,6 @@ details.trace-card > .trace-card-summary {
2086
2120
  min-width: 92px;
2087
2121
  }
2088
2122
 
2089
- #stopBtn {
2090
- min-width: 92px;
2091
- }
2092
-
2093
- .composer-foot {
2094
- margin-top: 8px;
2095
- display: flex;
2096
- justify-content: space-between;
2097
- align-items: center;
2098
- gap: 10px;
2099
- color: var(--muted);
2100
- font-size: 12px;
2101
- }
2102
-
2103
- .send-state {
2104
- white-space: nowrap;
2105
- }
2106
-
2107
- .send-state.is-active {
2108
- color: var(--accent);
2109
- font-weight: 700;
2110
- }
2111
-
2112
2123
  @keyframes panelIn {
2113
2124
  from {
2114
2125
  opacity: 0;
@@ -2269,42 +2280,14 @@ details.trace-card > .trace-card-summary {
2269
2280
  }
2270
2281
 
2271
2282
  .header {
2272
- padding: 10px 12px 16px;
2273
- }
2274
-
2275
- #activeTitle {
2276
- font-size: 20px;
2277
- }
2278
-
2279
- #activeMeta {
2280
- display: none;
2283
+ padding: 4px 12px;
2284
+ border-bottom: none;
2281
2285
  }
2282
2286
 
2283
2287
  .workbench-tabs {
2284
- display: flex;
2285
2288
  gap: 6px;
2286
2289
  }
2287
2290
 
2288
- .workbench-tabs > #viewActivityBtn {
2289
- flex: 1;
2290
- padding: 8px 10px;
2291
- font-size: 12px;
2292
- }
2293
-
2294
- .workspace-switcher-panel {
2295
- left: auto;
2296
- right: 0;
2297
- }
2298
-
2299
- .composer-toolbar {
2300
- flex-direction: column;
2301
- align-items: flex-start;
2302
- }
2303
-
2304
- .composer.is-expanded .composer-toolbar {
2305
- max-height: 120px;
2306
- }
2307
-
2308
2291
  .files-layout {
2309
2292
  grid-template-columns: minmax(0, 1fr);
2310
2293
  grid-template-rows: minmax(180px, 38%) minmax(0, 1fr);
@@ -2315,16 +2298,8 @@ details.trace-card > .trace-card-summary {
2315
2298
  border-bottom: 1px solid var(--line);
2316
2299
  }
2317
2300
 
2318
- .composer-toolbar-meta {
2319
- width: 100%;
2320
- justify-content: space-between;
2321
- margin-left: 0;
2322
- }
2323
-
2324
- .composer-mode-switch {
2325
- width: 100%;
2326
- display: grid;
2327
- grid-template-columns: repeat(2, minmax(0, 1fr));
2301
+ .composer-inner {
2302
+ align-items: stretch;
2328
2303
  }
2329
2304
 
2330
2305
  #commandInput {
@@ -2332,16 +2307,13 @@ details.trace-card > .trace-card-summary {
2332
2307
  max-height: 160px;
2333
2308
  }
2334
2309
 
2335
- #sendBtn {
2310
+ #sendBtn,
2311
+ #composerOptionsToggle {
2336
2312
  width: auto;
2337
2313
  min-width: 74px;
2338
2314
  align-self: stretch;
2339
2315
  }
2340
2316
 
2341
- .composer-foot {
2342
- display: none;
2343
- }
2344
-
2345
2317
  .composer {
2346
2318
  padding: 8px 8px 6px;
2347
2319
  }