@nextclaw/ui 0.15.2 → 0.15.3

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 (109) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/assets/{api-B7Qigvtm.js → api-iNBpppzj.js} +2 -2
  3. package/dist/assets/{appearance-settings-page-CuE0Iiqj.js → appearance-settings-page-DMffQFR3.js} +1 -1
  4. package/dist/assets/{book-open-Ba2f7YiG.js → book-open-C3mJGwiy.js} +1 -1
  5. package/dist/assets/{channels-list-page-CTsM6TcP.js → channels-list-page-CCtp0BRS.js} +1 -1
  6. package/dist/assets/chat-page-H5a0dWvO.js +1 -0
  7. package/dist/assets/{config-split-page-Fbb4PtTf.js → config-split-page-CrOJgB-Y.js} +1 -1
  8. package/dist/assets/{confirm-dialog-D2EG3nqE.js → confirm-dialog-Chv50USy.js} +2 -2
  9. package/dist/assets/{desktop-update-config-BGR3HUi1.js → desktop-update-config-KzTuXRf_.js} +1 -1
  10. package/dist/assets/{dist-7JTjycxE.js → dist-BunzmC4B.js} +1 -1
  11. package/dist/assets/{dist-wXLhk4hl.js → dist-ChmGwvtK.js} +1 -1
  12. package/dist/assets/doc-browser-DNRL4Zvd.js +1 -0
  13. package/dist/assets/doc-browser-Dg0pmkOg.js +1 -0
  14. package/dist/assets/{doc-browser-context-CYAGm5d5.js → doc-browser-context-BHY-0FSD.js} +1 -1
  15. package/dist/assets/{es2015-j1SRCIX5.js → es2015-DQZ5JWwK.js} +1 -1
  16. package/dist/assets/{external-link-DxuPaDoK.js → external-link-CU0kzzIP.js} +1 -1
  17. package/dist/assets/{form-actions-BztL7P_T.js → form-actions-BvCp_0lS.js} +1 -1
  18. package/dist/assets/{i18n-provider-B4oMxOFx.js → i18n-provider-Cu8XyZb_.js} +1 -1
  19. package/dist/assets/index-CzfBdvK1.css +1 -0
  20. package/dist/assets/index-DGqHne1Q.js +104 -0
  21. package/dist/assets/loader-circle-CDSFuzmk.js +1 -0
  22. package/dist/assets/mcp-marketplace-page-BeEQK0DL.js +9 -0
  23. package/dist/assets/mcp-marketplace-page-D6idOTLp.js +1 -0
  24. package/dist/assets/{model-config-page-DeKk9gvE.js → model-config-page-bNNo-XyG.js} +1 -1
  25. package/dist/assets/plus-D4DsdLN-.js +1 -0
  26. package/dist/assets/{provider-scoped-model-input-DsH2LF1q.js → provider-scoped-model-input-IlgQCsoT.js} +1 -1
  27. package/dist/assets/{providers-config-page-BFnGp68F.js → providers-config-page-wLo6CAJw.js} +1 -1
  28. package/dist/assets/{react-UirzUuST.js → react-BPIsQIlO.js} +1 -1
  29. package/dist/assets/{refresh-cw-eT8BF-8B.js → refresh-cw-CILd1vAP.js} +1 -1
  30. package/dist/assets/remote-uKEYp7AR.js +1 -0
  31. package/dist/assets/rotate-cw-wPFPg1kH.js +1 -0
  32. package/dist/assets/{runtime-config-page-BelAqiNG.js → runtime-config-page-DDn1sP4G.js} +1 -1
  33. package/dist/assets/{save-Cb2g0BOi.js → save-ByJqcPTP.js} +1 -1
  34. package/dist/assets/{search-BcHjwdsb.js → search-DVIV6pfD.js} +1 -1
  35. package/dist/assets/{search-config-page-zPm6--Ig.js → search-config-page-B-Cf4iiB.js} +1 -1
  36. package/dist/assets/{secrets-config-page-Cxyp-KuQ.js → secrets-config-page-DPKsY8Iw.js} +1 -1
  37. package/dist/assets/security-config-e9SSBlKr.js +1 -0
  38. package/dist/assets/{select-CdSEOwVM.js → select-BdgczSNw.js} +1 -1
  39. package/dist/assets/{setting-row-CTAtGexr.js → setting-row-BkTVUTKx.js} +1 -1
  40. package/dist/assets/{settings-2-2DWauOjY.js → settings-2-CH5shGg_.js} +1 -1
  41. package/dist/assets/{side-dock-DPvakJ0a.js → side-dock-BsBvcJ9i.js} +2 -2
  42. package/dist/assets/{skeleton-P5oM14E1.js → skeleton-DeX1FKw7.js} +1 -1
  43. package/dist/assets/switch-Cv8Ekb3x.js +1 -0
  44. package/dist/assets/{tag-chip-D-WsKoT1.js → tag-chip-RB9uKcoC.js} +1 -1
  45. package/dist/assets/{tooltip-CjkOaHW7.js → tooltip-oQlEN-l6.js} +1 -1
  46. package/dist/assets/{use-config--hx5oxQn.js → use-config-l3W7y8Qz.js} +1 -1
  47. package/dist/assets/{use-confirm-dialog-CD9a_SK1.js → use-confirm-dialog-BAxaVOJI.js} +1 -1
  48. package/dist/assets/x-BBMffEN0.js +1 -0
  49. package/dist/index.html +26 -26
  50. package/package.json +9 -9
  51. package/src/app/components/layout/sidebar-items.tsx +3 -3
  52. package/src/app/components/layout/sidebar-rail.styles.ts +2 -2
  53. package/src/app/components/layout/sidebar.tsx +1 -1
  54. package/src/app/styles/design-system.css +17 -4
  55. package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +1 -1
  56. package/src/features/chat/features/conversation/components/session-queued-input-rows.tsx +1 -1
  57. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +62 -1
  58. package/src/features/chat/features/message/components/chat-message-list.container.tsx +47 -1
  59. package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +11 -1
  60. package/src/features/chat/features/message/utils/__tests__/chat-message-texts.utils.test.ts +23 -0
  61. package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +5 -0
  62. package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +138 -0
  63. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +1 -1
  64. package/src/features/chat/features/session/components/session-header/chat-session-title-switcher.tsx +2 -2
  65. package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +1 -1
  66. package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +1 -1
  67. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-file-preview.test.tsx +67 -0
  68. package/src/features/chat/features/workspace/components/chat-session-workspace-directory-browser.tsx +1 -1
  69. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumb-browser.tsx +2 -2
  70. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +1 -1
  71. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +174 -22
  72. package/src/features/chat/features/workspace/utils/chat-workspace-file-tab-persistence.utils.ts +4 -0
  73. package/src/features/chat/managers/chat-thread.manager.ts +2 -0
  74. package/src/features/chat/stores/chat-thread.store.ts +3 -0
  75. package/src/features/cron/components/cron-config.tsx +63 -80
  76. package/src/features/marketplace/components/detail-doc/__tests__/marketplace-detail-doc.test.tsx +44 -6
  77. package/src/features/marketplace/components/marketplace-detail-doc.tsx +8 -4
  78. package/src/features/marketplace/components/marketplace-page-parts.tsx +1 -1
  79. package/src/features/marketplace/hooks/use-marketplace-detail-doc-entry.ts +84 -0
  80. package/src/features/panel-apps/components/panel-apps-list.tsx +2 -2
  81. package/src/features/right-panel-resources/components/right-panel-resource-home-page.tsx +1 -1
  82. package/src/features/side-dock/components/side-dock.tsx +3 -3
  83. package/src/index.css +239 -13
  84. package/src/shared/components/actions/action-link.tsx +1 -1
  85. package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +1 -1
  86. package/src/shared/components/ui/actions/icon-action-button.tsx +1 -1
  87. package/src/shared/components/ui/button.tsx +1 -1
  88. package/src/shared/components/ui/dialog.tsx +1 -1
  89. package/src/shared/components/ui/input.tsx +1 -1
  90. package/src/shared/components/ui/select.tsx +1 -1
  91. package/src/shared/components/ui/switch.tsx +1 -1
  92. package/src/shared/components/ui/tabs.tsx +1 -1
  93. package/src/shared/components/ui/textarea.tsx +1 -1
  94. package/src/shared/lib/i18n/locales/en-US/chat.json +83 -0
  95. package/src/shared/lib/i18n/locales/zh-CN/chat.json +83 -0
  96. package/dist/assets/chat-page-C_5dcuE3.js +0 -1
  97. package/dist/assets/doc-browser-bHyXnxlj.js +0 -1
  98. package/dist/assets/doc-browser-gTrQ3jCF.js +0 -1
  99. package/dist/assets/index-CvrvblgX.css +0 -1
  100. package/dist/assets/index-Obd4JYU2.js +0 -104
  101. package/dist/assets/loader-circle-CdzgK4eH.js +0 -1
  102. package/dist/assets/mcp-marketplace-page-Bt7CuOoq.js +0 -9
  103. package/dist/assets/mcp-marketplace-page-Ck3t78_n.js +0 -1
  104. package/dist/assets/plus-Bx7wQbhG.js +0 -1
  105. package/dist/assets/remote-CDkHZtA8.js +0 -1
  106. package/dist/assets/rotate-cw-1JqxHTuw.js +0 -1
  107. package/dist/assets/security-config-B_gCq9fn.js +0 -1
  108. package/dist/assets/switch-BU_UEULb.js +0 -1
  109. package/dist/assets/x-DT5x45JU.js +0 -1
package/src/index.css CHANGED
@@ -546,9 +546,9 @@
546
546
  FOCUS STATES
547
547
  ======================================== */
548
548
  .focus-ring {
549
- @apply focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2;
550
- --tw-ring-color: hsl(var(--ring));
551
- --tw-ring-offset-color: hsl(var(--ring-offset));
549
+ @apply focus:outline-none focus-visible:ring-1 focus-visible:ring-offset-0;
550
+ --tw-ring-color: hsl(var(--border));
551
+ --tw-ring-offset-color: transparent;
552
552
  }
553
553
  }
554
554
 
@@ -972,101 +972,327 @@
972
972
 
973
973
  .chat-codeblock .hljs-keyword,
974
974
  .chat-file-code-syntax .hljs-keyword,
975
+ .chat-terminal-pane .hljs-keyword,
975
976
  .chat-codeblock .hljs-built_in,
976
977
  .chat-file-code-syntax .hljs-built_in,
978
+ .chat-terminal-pane .hljs-built_in,
977
979
  .chat-codeblock .hljs-type,
978
980
  .chat-file-code-syntax .hljs-type,
981
+ .chat-terminal-pane .hljs-type,
979
982
  .chat-codeblock .hljs-literal,
980
983
  .chat-file-code-syntax .hljs-literal,
984
+ .chat-terminal-pane .hljs-literal,
981
985
  .chat-codeblock .hljs-selector-tag,
982
- .chat-file-code-syntax .hljs-selector-tag {
986
+ .chat-file-code-syntax .hljs-selector-tag,
987
+ .chat-terminal-pane .hljs-selector-tag {
983
988
  color: var(--md-code-keyword);
984
989
  }
985
990
 
986
991
  .chat-codeblock .hljs-title,
987
992
  .chat-file-code-syntax .hljs-title,
993
+ .chat-terminal-pane .hljs-title,
988
994
  .chat-codeblock .hljs-title.function_,
989
995
  .chat-file-code-syntax .hljs-title.function_,
996
+ .chat-terminal-pane .hljs-title.function_,
990
997
  .chat-codeblock .hljs-title.class_,
991
998
  .chat-file-code-syntax .hljs-title.class_,
999
+ .chat-terminal-pane .hljs-title.class_,
992
1000
  .chat-codeblock .hljs-section,
993
1001
  .chat-file-code-syntax .hljs-section,
1002
+ .chat-terminal-pane .hljs-section,
994
1003
  .chat-codeblock .hljs-selector-id,
995
- .chat-file-code-syntax .hljs-selector-id {
1004
+ .chat-file-code-syntax .hljs-selector-id,
1005
+ .chat-terminal-pane .hljs-selector-id {
996
1006
  color: var(--md-code-title);
997
1007
  }
998
1008
 
999
1009
  .chat-codeblock .hljs-string,
1000
1010
  .chat-file-code-syntax .hljs-string,
1011
+ .chat-terminal-pane .hljs-string,
1001
1012
  .chat-codeblock .hljs-regexp,
1002
1013
  .chat-file-code-syntax .hljs-regexp,
1014
+ .chat-terminal-pane .hljs-regexp,
1003
1015
  .chat-codeblock .hljs-symbol,
1004
1016
  .chat-file-code-syntax .hljs-symbol,
1017
+ .chat-terminal-pane .hljs-symbol,
1005
1018
  .chat-codeblock .hljs-bullet,
1006
- .chat-file-code-syntax .hljs-bullet {
1019
+ .chat-file-code-syntax .hljs-bullet,
1020
+ .chat-terminal-pane .hljs-bullet {
1007
1021
  color: var(--md-code-string);
1008
1022
  }
1009
1023
 
1010
1024
  .chat-codeblock .hljs-number,
1011
1025
  .chat-file-code-syntax .hljs-number,
1026
+ .chat-terminal-pane .hljs-number,
1012
1027
  .chat-codeblock .hljs-variable,
1013
1028
  .chat-file-code-syntax .hljs-variable,
1029
+ .chat-terminal-pane .hljs-variable,
1014
1030
  .chat-codeblock .hljs-template-variable,
1015
1031
  .chat-file-code-syntax .hljs-template-variable,
1032
+ .chat-terminal-pane .hljs-template-variable,
1016
1033
  .chat-codeblock .hljs-params,
1017
- .chat-file-code-syntax .hljs-params {
1034
+ .chat-file-code-syntax .hljs-params,
1035
+ .chat-terminal-pane .hljs-params {
1018
1036
  color: var(--md-code-number);
1019
1037
  }
1020
1038
 
1021
1039
  .chat-codeblock .hljs-comment,
1022
1040
  .chat-file-code-syntax .hljs-comment,
1041
+ .chat-terminal-pane .hljs-comment,
1023
1042
  .chat-codeblock .hljs-quote,
1024
- .chat-file-code-syntax .hljs-quote {
1043
+ .chat-file-code-syntax .hljs-quote,
1044
+ .chat-terminal-pane .hljs-quote {
1025
1045
  color: var(--md-code-comment);
1026
1046
  font-style: italic;
1027
1047
  }
1028
1048
 
1029
1049
  .chat-codeblock .hljs-attr,
1030
1050
  .chat-file-code-syntax .hljs-attr,
1051
+ .chat-terminal-pane .hljs-attr,
1031
1052
  .chat-codeblock .hljs-attribute,
1032
1053
  .chat-file-code-syntax .hljs-attribute,
1054
+ .chat-terminal-pane .hljs-attribute,
1033
1055
  .chat-codeblock .hljs-property,
1034
1056
  .chat-file-code-syntax .hljs-property,
1057
+ .chat-terminal-pane .hljs-property,
1035
1058
  .chat-codeblock .hljs-name,
1036
1059
  .chat-file-code-syntax .hljs-name,
1060
+ .chat-terminal-pane .hljs-name,
1037
1061
  .chat-codeblock .hljs-selector-class,
1038
- .chat-file-code-syntax .hljs-selector-class {
1062
+ .chat-file-code-syntax .hljs-selector-class,
1063
+ .chat-terminal-pane .hljs-selector-class {
1039
1064
  color: var(--md-code-attr);
1040
1065
  }
1041
1066
 
1042
1067
  .chat-codeblock .hljs-meta,
1043
1068
  .chat-file-code-syntax .hljs-meta,
1069
+ .chat-terminal-pane .hljs-meta,
1044
1070
  .chat-codeblock .hljs-doctag,
1045
1071
  .chat-file-code-syntax .hljs-doctag,
1072
+ .chat-terminal-pane .hljs-doctag,
1046
1073
  .chat-codeblock .hljs-tag,
1047
- .chat-file-code-syntax .hljs-tag {
1074
+ .chat-file-code-syntax .hljs-tag,
1075
+ .chat-terminal-pane .hljs-tag {
1048
1076
  color: var(--md-code-meta);
1049
1077
  }
1050
1078
 
1051
1079
  .chat-codeblock .hljs-subst,
1052
1080
  .chat-file-code-syntax .hljs-subst,
1081
+ .chat-terminal-pane .hljs-subst,
1053
1082
  .chat-codeblock .hljs-punctuation,
1054
1083
  .chat-file-code-syntax .hljs-punctuation,
1084
+ .chat-terminal-pane .hljs-punctuation,
1055
1085
  .chat-codeblock .hljs-operator,
1056
- .chat-file-code-syntax .hljs-operator {
1086
+ .chat-file-code-syntax .hljs-operator,
1087
+ .chat-terminal-pane .hljs-operator {
1057
1088
  color: var(--md-code-muted);
1058
1089
  }
1059
1090
 
1060
1091
  .chat-codeblock .hljs-deletion,
1061
- .chat-file-code-syntax .hljs-deletion {
1092
+ .chat-file-code-syntax .hljs-deletion,
1093
+ .chat-terminal-pane .hljs-deletion {
1062
1094
  color: var(--md-code-deletion);
1063
1095
  }
1064
1096
 
1065
1097
  .chat-codeblock .hljs-addition,
1066
- .chat-file-code-syntax .hljs-addition {
1098
+ .chat-file-code-syntax .hljs-addition,
1099
+ .chat-terminal-pane .hljs-addition {
1067
1100
  color: var(--md-code-addition);
1068
1101
  }
1069
1102
 
1103
+ /* Terminal tool surface: terminal style without decorative chrome */
1104
+ .chat-terminal-surface {
1105
+ --terminal-surface: #0b1220;
1106
+ --terminal-border: rgba(148, 163, 184, 0.28);
1107
+ --terminal-text: #e5e7eb;
1108
+ --terminal-muted: #94a3b8;
1109
+ --terminal-prompt: #34d399;
1110
+ --terminal-caret: rgba(52, 211, 153, 0.92);
1111
+ --terminal-error-border: rgba(251, 113, 133, 0.42);
1112
+ --terminal-error-bg: rgba(127, 29, 29, 0.16);
1113
+ --terminal-error-text: #fecdd3;
1114
+ --md-code-text: #e5e7eb;
1115
+ --md-code-muted: #94a3b8;
1116
+ --md-code-keyword: #c084fc;
1117
+ --md-code-title: #93c5fd;
1118
+ --md-code-string: #86efac;
1119
+ --md-code-number: #fbbf24;
1120
+ --md-code-comment: #94a3b8;
1121
+ --md-code-attr: #67e8f9;
1122
+ --md-code-meta: #f0abfc;
1123
+ --md-code-deletion: #fca5a5;
1124
+ --md-code-addition: #86efac;
1125
+
1126
+ overflow: hidden;
1127
+ border: 1px solid var(--terminal-border);
1128
+ border-radius: 0.55rem;
1129
+ background: var(--terminal-surface);
1130
+ }
1131
+
1132
+ .chat-terminal-surface-error {
1133
+ border-color: var(--terminal-error-border);
1134
+ background:
1135
+ linear-gradient(180deg, var(--terminal-error-bg), transparent 48%),
1136
+ var(--terminal-surface);
1137
+ }
1138
+
1139
+ .chat-terminal-body {
1140
+ max-height: 22rem;
1141
+ overflow: auto;
1142
+ padding: 0.7rem 0.75rem 0.78rem;
1143
+ scrollbar-width: thin;
1144
+ scrollbar-color: rgba(148, 163, 184, 0.45) transparent;
1145
+ }
1146
+
1147
+ .chat-terminal-line {
1148
+ display: grid;
1149
+ grid-template-columns: 1rem minmax(0, 1fr);
1150
+ column-gap: 0.55rem;
1151
+ align-items: start;
1152
+ }
1153
+
1154
+ .chat-terminal-gutter {
1155
+ width: 1rem;
1156
+ color: var(--terminal-prompt);
1157
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1158
+ font-size: 0.8rem;
1159
+ font-weight: 700;
1160
+ line-height: 1.58;
1161
+ text-align: right;
1162
+ user-select: none;
1163
+ }
1164
+
1165
+ .chat-terminal-line-content {
1166
+ min-width: 0;
1167
+ }
1168
+
1169
+ .chat-terminal-output-block {
1170
+ margin-top: 0.55rem;
1171
+ }
1172
+
1173
+ .chat-terminal-pre {
1174
+ margin: 0;
1175
+ background: transparent;
1176
+ }
1177
+
1178
+ .chat-terminal-pre code,
1179
+ .chat-terminal-code {
1180
+ display: block;
1181
+ white-space: pre-wrap;
1182
+ overflow-wrap: anywhere;
1183
+ word-break: break-word;
1184
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1185
+ font-size: 0.8rem;
1186
+ line-height: 1.58;
1187
+ color: var(--terminal-text);
1188
+ font-variant-ligatures: none;
1189
+ tab-size: 2;
1190
+ }
1191
+
1192
+ .chat-terminal-pre-error,
1193
+ .chat-terminal-code-error {
1194
+ color: var(--terminal-error-text);
1195
+ }
1196
+
1197
+ .chat-terminal-empty {
1198
+ color: var(--terminal-muted);
1199
+ font-size: 0.78rem;
1200
+ font-style: italic;
1201
+ }
1202
+
1203
+ .chat-terminal-caret {
1204
+ display: inline-block;
1205
+ width: 0.42rem;
1206
+ height: 0.95em;
1207
+ margin-left: 0.12rem;
1208
+ vertical-align: text-bottom;
1209
+ background: var(--terminal-caret);
1210
+ animation: chat-terminal-caret-blink 1s steps(1, end) infinite;
1211
+ }
1212
+
1213
+ .chat-terminal-skeleton {
1214
+ height: 0.78rem;
1215
+ width: 9rem;
1216
+ border-radius: 999px;
1217
+ background: rgba(148, 163, 184, 0.28);
1218
+ animation: chat-terminal-skeleton-pulse 1.2s ease-in-out infinite;
1219
+ }
1220
+
1221
+ .chat-terminal-surface .ansi-bold { font-weight: 700; }
1222
+ .chat-terminal-surface .ansi-dim { opacity: 0.72; }
1223
+ .chat-terminal-surface .ansi-italic { font-style: italic; }
1224
+ .chat-terminal-surface .ansi-underline { text-decoration: underline; }
1225
+ .chat-terminal-surface .ansi-inverse {
1226
+ color: var(--terminal-surface);
1227
+ background: var(--terminal-text);
1228
+ }
1229
+
1230
+ .chat-terminal-surface .ansi-fg-black { color: #0f172a; }
1231
+ .chat-terminal-surface .ansi-fg-red { color: #f87171; }
1232
+ .chat-terminal-surface .ansi-fg-green { color: #4ade80; }
1233
+ .chat-terminal-surface .ansi-fg-yellow { color: #fbbf24; }
1234
+ .chat-terminal-surface .ansi-fg-blue { color: #60a5fa; }
1235
+ .chat-terminal-surface .ansi-fg-magenta { color: #e879f9; }
1236
+ .chat-terminal-surface .ansi-fg-cyan { color: #22d3ee; }
1237
+ .chat-terminal-surface .ansi-fg-white { color: #e5e7eb; }
1238
+ .chat-terminal-surface .ansi-fg-bright-black { color: #94a3b8; }
1239
+ .chat-terminal-surface .ansi-fg-bright-red { color: #fca5a5; }
1240
+ .chat-terminal-surface .ansi-fg-bright-green { color: #86efac; }
1241
+ .chat-terminal-surface .ansi-fg-bright-yellow { color: #fde68a; }
1242
+ .chat-terminal-surface .ansi-fg-bright-blue { color: #93c5fd; }
1243
+ .chat-terminal-surface .ansi-fg-bright-magenta { color: #f0abfc; }
1244
+ .chat-terminal-surface .ansi-fg-bright-cyan { color: #67e8f9; }
1245
+ .chat-terminal-surface .ansi-fg-bright-white { color: #f8fafc; }
1246
+
1247
+ .chat-terminal-surface .ansi-bg-black { background: #0f172a; }
1248
+ .chat-terminal-surface .ansi-bg-red { background: rgba(248, 113, 113, 0.28); }
1249
+ .chat-terminal-surface .ansi-bg-green { background: rgba(74, 222, 128, 0.22); }
1250
+ .chat-terminal-surface .ansi-bg-yellow { background: rgba(251, 191, 36, 0.22); }
1251
+ .chat-terminal-surface .ansi-bg-blue { background: rgba(96, 165, 250, 0.22); }
1252
+ .chat-terminal-surface .ansi-bg-magenta { background: rgba(232, 121, 249, 0.22); }
1253
+ .chat-terminal-surface .ansi-bg-cyan { background: rgba(34, 211, 238, 0.2); }
1254
+ .chat-terminal-surface .ansi-bg-white { background: rgba(229, 231, 235, 0.18); }
1255
+
1256
+ @keyframes chat-terminal-caret-blink {
1257
+ 0%, 49% { opacity: 1; }
1258
+ 50%, 100% { opacity: 0; }
1259
+ }
1260
+
1261
+ @keyframes chat-terminal-skeleton-pulse {
1262
+ 0%, 100% { opacity: 0.55; }
1263
+ 50% { opacity: 1; }
1264
+ }
1265
+
1266
+ @media (prefers-reduced-motion: reduce) {
1267
+ .chat-terminal-caret,
1268
+ .chat-terminal-skeleton {
1269
+ animation: none;
1270
+ }
1271
+ }
1272
+
1273
+ :root[data-theme="work"] .chat-terminal-surface {
1274
+ --terminal-surface: #111827;
1275
+ --terminal-border: rgba(148, 163, 184, 0.24);
1276
+ }
1277
+
1278
+ :root[data-theme-appearance="dark"] .chat-terminal-surface {
1279
+ --terminal-surface: #070b14;
1280
+ --terminal-border: rgba(148, 163, 184, 0.22);
1281
+ }
1282
+
1283
+ /* Prevent browser default "详情/Details" fallback on chat process summaries. */
1284
+ .nextclaw-chat-message-user details > summary,
1285
+ .border-border.bg-card details > summary,
1286
+ .chat-markdown details > summary {
1287
+ list-style: none;
1288
+ }
1289
+
1290
+ .nextclaw-chat-message-user details > summary::-webkit-details-marker,
1291
+ .border-border.bg-card details > summary::-webkit-details-marker,
1292
+ .chat-markdown details > summary::-webkit-details-marker {
1293
+ display: none;
1294
+ }
1295
+
1070
1296
  .chat-table-wrap {
1071
1297
  margin: 0.15rem 0;
1072
1298
  border: 1px solid var(--md-border);
@@ -37,7 +37,7 @@ export function ExternalActionLink({ label, className, onClick }: ExternalAction
37
37
  <button
38
38
  type="button"
39
39
  className={cn(
40
- 'inline-flex h-7 shrink-0 items-center gap-1.5 rounded-md px-1.5 text-[13px] font-medium text-primary transition-colors hover:text-primary-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
40
+ 'inline-flex h-7 shrink-0 items-center gap-1.5 rounded-md px-1.5 text-[13px] font-medium text-primary transition-colors hover:text-primary-hover focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border',
41
41
  className
42
42
  )}
43
43
  onClick={onClick}
@@ -54,7 +54,7 @@ export function DocBrowserAddressToolbar({
54
54
  onChange={(e) => onUrlInputChange(e.target.value)}
55
55
  aria-label={t('docBrowserAddressLabel')}
56
56
  placeholder={placeholder}
57
- className="h-8 w-full rounded-lg border border-border bg-background pl-8 pr-3 text-xs text-foreground transition-colors placeholder:text-muted-foreground/55 focus:border-primary/40 focus:outline-none focus:ring-1 focus:ring-primary/30"
57
+ className="h-8 w-full rounded-lg border border-border/75 bg-background pl-8 pr-3 text-xs text-foreground transition-colors placeholder:text-muted-foreground/55 focus:border-border focus:outline-none focus:ring-0"
58
58
  />
59
59
  </form>
60
60
  <IconActionButton
@@ -59,7 +59,7 @@ const IconActionButton = React.forwardRef<HTMLButtonElement, IconActionButtonPro
59
59
  disabled={disabled}
60
60
  aria-label={label}
61
61
  className={cn(
62
- 'inline-flex shrink-0 items-center justify-center transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 disabled:cursor-not-allowed',
62
+ 'inline-flex shrink-0 items-center justify-center transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:cursor-not-allowed',
63
63
  SIZE_CLASS[size],
64
64
  TONE_CLASS[tone],
65
65
  className
@@ -3,7 +3,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
3
3
  import { cn } from '@/shared/lib/utils';
4
4
 
5
5
  const buttonVariants = cva(
6
- 'inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-medium ring-offset-background transition-colors duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
6
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-medium ring-offset-background transition-colors duration-fast focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:pointer-events-none disabled:opacity-50',
7
7
  {
8
8
  variants: {
9
9
  variant: {
@@ -42,7 +42,7 @@ const DialogContent = React.forwardRef<
42
42
  {...props}
43
43
  >
44
44
  {children}
45
- <DialogPrimitive.Close className="absolute right-4 top-4 rounded-lg p-1 opacity-70 ring-offset-background transition-all duration-fast hover:bg-accent hover:text-accent-foreground hover:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 disabled:pointer-events-none">
45
+ <DialogPrimitive.Close className="absolute right-4 top-4 rounded-lg p-1 opacity-70 transition-all duration-fast hover:bg-accent hover:text-accent-foreground hover:opacity-100 focus:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:pointer-events-none">
46
46
  <X className="h-4 w-4 text-muted-foreground" />
47
47
  <span className="sr-only">Close</span>
48
48
  </DialogPrimitive.Close>
@@ -9,7 +9,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
9
9
  <input
10
10
  type={type}
11
11
  className={cn(
12
- 'flex h-9 w-full rounded-xl border border-border bg-card px-3.5 py-2 text-sm text-foreground file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground/55 placeholder:font-normal focus:outline-none focus:ring-1 focus:ring-primary/40 focus:border-primary/50 transition-colors disabled:cursor-not-allowed disabled:opacity-50',
12
+ 'flex h-9 w-full rounded-xl border border-border/75 bg-card px-3.5 py-2 text-sm text-foreground file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground/55 placeholder:font-normal transition-colors focus:outline-none focus:ring-0 focus:border-border disabled:cursor-not-allowed disabled:opacity-50',
13
13
  className
14
14
  )}
15
15
  ref={ref}
@@ -25,7 +25,7 @@ const SelectTrigger = React.forwardRef<
25
25
  <SelectPrimitive.Trigger
26
26
  ref={ref}
27
27
  className={cn(
28
- "flex h-9 w-full items-center justify-between whitespace-nowrap rounded-xl border border-border bg-card px-3 py-2 text-sm text-foreground shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary/40 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
28
+ "flex h-9 w-full items-center justify-between whitespace-nowrap rounded-xl border border-border/75 bg-card px-3 py-2 text-sm text-foreground ring-offset-background placeholder:text-muted-foreground transition-colors focus:outline-none focus:ring-0 focus:border-border disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
29
29
  className
30
30
  )}
31
31
  {...props}
@@ -17,7 +17,7 @@ const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(
17
17
  data-state={checked ? 'checked' : 'unchecked'}
18
18
  ref={ref}
19
19
  className={cn(
20
- 'switch-track peer inline-flex h-[22px] w-10 shrink-0 cursor-pointer items-center rounded-full border-2 transition-colors duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50',
20
+ 'switch-track peer inline-flex h-[22px] w-10 shrink-0 cursor-pointer items-center rounded-full border-2 transition-colors duration-fast focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:cursor-not-allowed disabled:opacity-50',
21
21
  checked ? 'border-primary/70 bg-primary' : 'border-border/60 bg-muted hover:bg-accent',
22
22
  className
23
23
  )}
@@ -64,7 +64,7 @@ export function TabsTrigger({ value, children, className }: TabsTriggerProps) {
64
64
  aria-pressed={isActive}
65
65
  data-state={isActive ? 'active' : 'inactive'}
66
66
  className={cn(
67
- 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-[13px] font-medium ring-offset-background transition-all duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
67
+ 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-[13px] font-medium transition-all duration-fast focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:pointer-events-none disabled:opacity-50',
68
68
  isActive
69
69
  ? 'bg-card text-foreground shadow-sm'
70
70
  : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground',
@@ -7,7 +7,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
7
7
  ({ className, ...props }, ref) => (
8
8
  <textarea
9
9
  className={cn(
10
- "flex min-h-28 w-full rounded-xl border border-border bg-card px-3.5 py-2.5 text-sm text-foreground placeholder:text-muted-foreground/55 placeholder:font-normal focus:outline-none focus:ring-1 focus:ring-primary/40 focus:border-primary/50 transition-colors disabled:cursor-not-allowed disabled:opacity-50",
10
+ "flex min-h-28 w-full rounded-xl border border-border/75 bg-card px-3.5 py-2.5 text-sm text-foreground placeholder:text-muted-foreground/55 placeholder:font-normal transition-colors focus:outline-none focus:ring-0 focus:border-border disabled:cursor-not-allowed disabled:opacity-50",
11
11
  className,
12
12
  )}
13
13
  ref={ref}
@@ -60,6 +60,9 @@
60
60
  "chatWorkspaceDirectoryEmpty": "This directory is empty.",
61
61
  "chatWorkspaceDirectoryLoadFailed": "Failed to load directory",
62
62
  "chatWorkspacePreviewUnsupported": "This file is not supported in the sidebar preview yet.",
63
+ "chatWorkspacePreviewUnsupportedHint": "Formats like Word, Excel, and archives can’t be rendered in the sidebar. Download and open them with a local app.",
64
+ "chatWorkspacePreviewDownload": "Download file",
65
+ "chatWorkspacePreviewOpenExternally": "Open with system app",
63
66
  "chatWorkspacePreviewEmpty": "No file content is available for preview.",
64
67
  "chatWorkspaceDiffEmpty": "No diff content is available.",
65
68
  "chatWorkspaceHtmlPreviewTitle": "Rendered HTML preview",
@@ -68,8 +71,86 @@
68
71
  "chatWorkspaceCronJobEmpty": "This session has no cron jobs.",
69
72
  "chatSessionUnread": "Session has unread updates",
70
73
  "chatTyping": "Agent is thinking...",
74
+ "chatReasoningInProgressCharacterCount": "Thinking · {count} characters so far",
75
+ "chatReasoningCompletedCharacterCount": "Thought through {count} characters",
76
+ "chatToolTerminalRunning": "Running command",
77
+ "chatToolTerminalSuccess": "Ran command",
78
+ "chatToolTerminalError": "Command failed",
79
+ "chatToolTerminalCancelled": "Command cancelled",
80
+ "chatToolFileReadRunning": "Reading file",
81
+ "chatToolFileReadSuccess": "Read file",
82
+ "chatToolFileReadError": "File read failed",
83
+ "chatToolFileReadCancelled": "File read cancelled",
84
+ "chatToolFileEditRunning": "Editing file",
85
+ "chatToolFileEditSuccess": "Edited file",
86
+ "chatToolFileEditError": "File edit failed",
87
+ "chatToolFileEditCancelled": "File edit cancelled",
88
+ "chatToolSearchRunning": "Searching",
89
+ "chatToolSearchSuccess": "Searched",
90
+ "chatToolSearchError": "Search failed",
91
+ "chatToolSearchCancelled": "Search cancelled",
92
+ "chatToolDirectoryRunning": "Listing directory",
93
+ "chatToolDirectorySuccess": "Listed directory",
94
+ "chatToolDirectoryError": "Directory listing failed",
95
+ "chatToolDirectoryCancelled": "Directory listing cancelled",
96
+ "chatToolWebRunning": "Fetching page",
97
+ "chatToolWebSuccess": "Fetched page",
98
+ "chatToolWebError": "Page fetch failed",
99
+ "chatToolWebCancelled": "Page fetch cancelled",
100
+ "chatToolMessageRunning": "Sending message",
101
+ "chatToolMessageSuccess": "Sent message",
102
+ "chatToolMessageError": "Message failed",
103
+ "chatToolMessageCancelled": "Message cancelled",
104
+ "chatToolSessionRunning": "Reading sessions",
105
+ "chatToolSessionSuccess": "Read sessions",
106
+ "chatToolSessionError": "Session read failed",
107
+ "chatToolSessionCancelled": "Session read cancelled",
108
+ "chatToolAgentRunning": "Managing subtask",
109
+ "chatToolAgentSuccess": "Managed subtask",
110
+ "chatToolAgentError": "Subtask failed",
111
+ "chatToolAgentCancelled": "Subtask cancelled",
112
+ "chatToolMemoryRunning": "Accessing memory",
113
+ "chatToolMemorySuccess": "Accessed memory",
114
+ "chatToolMemoryError": "Memory access failed",
115
+ "chatToolMemoryCancelled": "Memory access cancelled",
116
+ "chatToolScheduleRunning": "Managing schedule",
117
+ "chatToolScheduleSuccess": "Managed schedule",
118
+ "chatToolScheduleError": "Schedule action failed",
119
+ "chatToolScheduleCancelled": "Schedule action cancelled",
120
+ "chatToolSystemRunning": "Managing service",
121
+ "chatToolSystemSuccess": "Managed service",
122
+ "chatToolSystemError": "Service action failed",
123
+ "chatToolSystemCancelled": "Service action cancelled",
124
+ "chatToolImageRunning": "Viewing image",
125
+ "chatToolImageSuccess": "Viewed image",
126
+ "chatToolImageError": "Image view failed",
127
+ "chatToolImageCancelled": "Image view cancelled",
128
+ "chatToolDisplayRunning": "Showing result",
129
+ "chatToolDisplaySuccess": "Showed result",
130
+ "chatToolDisplayError": "Display failed",
131
+ "chatToolDisplayCancelled": "Display cancelled",
71
132
  "chatScrollToBottom": "Scroll to bottom",
72
133
  "chatProcessSummaryProcessed": "Processed",
134
+ "chatToolActivityReadOne": "Read 1 file",
135
+ "chatToolActivityReadOther": "Read {count} files",
136
+ "chatToolActivityEditOne": "Edit 1 file",
137
+ "chatToolActivityEditOther": "Edit {count} files",
138
+ "chatToolActivityDirectoryOne": "View 1 directory",
139
+ "chatToolActivityDirectoryOther": "View {count} directories",
140
+ "chatToolActivitySearchOne": "Search 1 time",
141
+ "chatToolActivitySearchOther": "Search {count} times",
142
+ "chatToolActivityBashOne": "Run 1 command",
143
+ "chatToolActivityBashOther": "Run {count} commands",
144
+ "chatToolActivityWebOne": "Open 1 page",
145
+ "chatToolActivityWebOther": "Open {count} pages",
146
+ "chatToolActivityAgentOne": "Start 1 subtask",
147
+ "chatToolActivityAgentOther": "Start {count} subtasks",
148
+ "chatToolActivityPanelOne": "Show 1 result",
149
+ "chatToolActivityPanelOther": "Show {count} results",
150
+ "chatToolActivityOtherOne": "Use 1 tool",
151
+ "chatToolActivityOtherOther": "Use {count} tools",
152
+ "chatProcessSummaryFailed": "failed",
153
+ "chatProcessSummaryCancelled": "cancelled",
73
154
  "chatRuntimeInitializing": "Chat is still initializing. You can keep typing and send once startup finishes.",
74
155
  "chatRuntimeInitializationFailed": "Chat startup failed. Please retry in a moment or inspect the service logs.",
75
156
  "chatInputPlaceholder": "Type a message, / for commands, apps or skills, @ for panel app references, Enter to send, Shift + Enter for newline",
@@ -182,6 +263,8 @@
182
263
  "chatFileAttachment": "File attachment",
183
264
  "chatAttachmentOpen": "Open",
184
265
  "chatAttachmentAttached": "Attached",
266
+ "chatAttachmentExpand": "Expand image",
267
+ "chatAttachmentClosePreview": "Close preview",
185
268
  "chatAttachmentCategoryArchive": "Archive",
186
269
  "chatAttachmentCategoryAudio": "Audio",
187
270
  "chatAttachmentCategoryCode": "Code file",