@nextclaw/ui 0.26.3 → 0.26.5

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 (191) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/.vite/manifest.json +362 -362
  3. package/dist/assets/{account-panel-DIdHjKG-.js → account-panel-BAH7FW6z.js} +1 -1
  4. package/dist/assets/{api-DkLJrSCd.js → api-DjiZvIa0.js} +2 -2
  5. package/dist/assets/app-presenter-provider-CCRFsFYr.js +232 -0
  6. package/dist/assets/{appearance-settings-page-DI8aDY2G.js → appearance-settings-page-CdP86QJ7.js} +1 -1
  7. package/dist/assets/{book-open-BPMkKSci.js → book-open-Bcnn2_uV.js} +1 -1
  8. package/dist/assets/card-Cqs73hGI.js +1 -0
  9. package/dist/assets/{channels-list-page-CCIaTQu7.js → channels-list-page-5qGagKuE.js} +2 -2
  10. package/dist/assets/{circle-dashed-B48a0t6p.js → circle-dashed-EY1ScSMe.js} +1 -1
  11. package/dist/assets/{client-imrVphQb.js → client-CH7w6yRV.js} +1 -1
  12. package/dist/assets/config-split-page-CuEGQL8Z.js +1 -0
  13. package/dist/assets/{confirm-dialog-10Qb3dpZ.js → confirm-dialog-CxfecBzO.js} +1 -1
  14. package/dist/assets/{context-menu-CRqH2SEk.js → context-menu-BsCj2fRs.js} +1 -1
  15. package/dist/assets/{createLucideIcon-B4xj2I2g.js → createLucideIcon-Cfo2ySi5.js} +1 -1
  16. package/dist/assets/{desktop-capabilities-page-CFcT2g8-.js → desktop-capabilities-page-BDYITStl.js} +1 -1
  17. package/dist/assets/{desktop-update-config-CRJd_An1.js → desktop-update-config-e-zhkJuS.js} +1 -1
  18. package/dist/assets/{dialog-BgL3vKJQ.js → dialog-QjQoKbIV.js} +1 -1
  19. package/dist/assets/doc-browser-CLEdkH9z.js +1 -0
  20. package/dist/assets/{doc-browser-context-DH4aWvkS.js → doc-browser-context-DwgG6wrz.js} +1 -1
  21. package/dist/assets/{download-Cr337h4W.js → download-BoaKzDJk.js} +1 -1
  22. package/dist/assets/{es2015-D-CRf3_Z.js → es2015-Bp6cuSGh.js} +1 -1
  23. package/dist/assets/{extensions-CsmJPz7g.js → extensions-CgShSIkd.js} +1 -1
  24. package/dist/assets/{eye-DrQRSAfJ.js → eye-kisejBFH.js} +1 -1
  25. package/dist/assets/{form-actions-BEeWTGUZ.js → form-actions-D9JWSFQu.js} +1 -1
  26. package/dist/assets/{i18n-OGmF0Ws_.js → i18n-Bm3Ov7Fy.js} +2 -2
  27. package/dist/assets/{keyboard-shortcuts-settings-page-DQU56SrW.js → keyboard-shortcuts-settings-page-DZ8A1iLg.js} +1 -1
  28. package/dist/assets/loader-circle-Bd1fTm-x.js +1 -0
  29. package/dist/assets/{login-page-sgivRYG1.js → login-page-C-DvcG3L.js} +1 -1
  30. package/dist/assets/login-page-D99JjH9F.js +1 -0
  31. package/dist/assets/{main-B-oxUq-o.js → main-Bt5r6b21.js} +2 -2
  32. package/dist/assets/main-DXd_aKJV.css +1 -0
  33. package/dist/assets/main-i18n-catalog.config-D0Ll36J_.js +1 -0
  34. package/dist/assets/mcp-marketplace-page-DUoGfSmY.js +1 -0
  35. package/dist/assets/{model-config-page-CDQBhmVr.js → model-config-page-9NNf-mzK.js} +1 -1
  36. package/dist/assets/{navigation-link-D3pzNHeA.js → navigation-link-CjxNC8aT.js} +1 -1
  37. package/dist/assets/panel-app-i18n-catalog.config-Ddf2Kv8A.js +1 -0
  38. package/dist/assets/panelStandalone-BRg7B1EI.css +1 -0
  39. package/dist/assets/{panelStandalone-CGkYeMK5.js → panelStandalone-BaUzY8Wy.js} +2 -2
  40. package/dist/assets/{privacy-settings-page-CjoAkoDt.js → privacy-settings-page-CVMBFuak.js} +1 -1
  41. package/dist/assets/projects-BEsU3box.js +1 -0
  42. package/dist/assets/provider-models-Dm-pmWAA.js +1 -0
  43. package/dist/assets/provider-scoped-model-input-CzrXg4cX.js +1 -0
  44. package/dist/assets/providers-config-page-839uUADZ.js +1 -0
  45. package/dist/assets/{puzzle--RLCeYML.js → puzzle-BGvD2DPZ.js} +1 -1
  46. package/dist/assets/{pwa-DcizGowz.js → pwa-DNNK_8E9.js} +1 -1
  47. package/dist/assets/{refresh-cw-syCVj_nw.js → refresh-cw-BlXDrVP0.js} +1 -1
  48. package/dist/assets/remote-B5qIuUbT.js +1 -0
  49. package/dist/assets/{rotate-cw-BlH9El3x.js → rotate-cw-ei6rPD6z.js} +1 -1
  50. package/dist/assets/{runtime-config-page-Cco9dS73.js → runtime-config-page-Bf-4JYxQ.js} +1 -1
  51. package/dist/assets/{save-BWynuRQ2.js → save-DdF-bXgC.js} +1 -1
  52. package/dist/assets/{search-config-page-Cc74_SAU.js → search-config-page-C0qA3j-T.js} +1 -1
  53. package/dist/assets/{secrets-config-page-raYDzlFC.js → secrets-config-page-DxfZWpnk.js} +1 -1
  54. package/dist/assets/security-config-CItfIQZ4.js +1 -0
  55. package/dist/assets/{select-6Uq4chZW.js → select-CWyjnar7.js} +1 -1
  56. package/dist/assets/service-apps-panel-D3SOkRVv.js +1 -0
  57. package/dist/assets/{settings-2-COvVf1XX.js → settings-2-CrNhfInU.js} +1 -1
  58. package/dist/assets/{status-dot-DZlxa5zW.js → status-dot-C3SRFEta.js} +1 -1
  59. package/dist/assets/{tag-chip-DXHtZ8AS.js → tag-chip-BIuavK2K.js} +1 -1
  60. package/dist/assets/{theme-provider-C5PCDBPB.js → theme-provider-CWUz4yO9.js} +1 -1
  61. package/dist/assets/{trash-2-DazgBvmJ.js → trash-2-hAbJh9VZ.js} +1 -1
  62. package/dist/assets/{use-config-DRRGF9Zb.js → use-config-evzage09.js} +1 -1
  63. package/dist/assets/{use-desktop-capabilities-CdfOUjdE.js → use-desktop-capabilities-BYDjFlpt.js} +1 -1
  64. package/dist/assets/{use-viewport-layout-DdxVnCYc.js → use-viewport-layout-D_9XWGDV.js} +1 -1
  65. package/dist/assets/x-ChPbNv39.js +1 -0
  66. package/dist/index.html +34 -34
  67. package/dist/panel-standalone.html +11 -11
  68. package/package.json +3 -3
  69. package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +2 -2
  70. package/src/app/components/layout/sidebar-rail.styles.ts +3 -3
  71. package/src/app/configs/__tests__/app-navigation.config.test.ts +4 -2
  72. package/src/app/configs/app-navigation.config.ts +7 -2
  73. package/src/app/styles/charcoal-theme.css +0 -3
  74. package/src/app/styles/design-system.css +12 -6
  75. package/src/app/styles/island-theme.css +2 -15
  76. package/src/features/app-data/components/app-data-removal-choice.tsx +1 -1
  77. package/src/features/channels/pages/channels-list-page.tsx +1 -1
  78. package/src/features/chat/components/chat-sidebar-list-mode-switch.tsx +1 -1
  79. package/src/features/chat/components/conversation/__tests__/chat-conversation-header-section.test.tsx +28 -16
  80. package/src/features/chat/components/conversation/chat-conversation-content.tsx +8 -2
  81. package/src/features/chat/components/layout/__tests__/chat-sidebar-session-area.test.tsx +6 -4
  82. package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +22 -1
  83. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +10 -14
  84. package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +38 -7
  85. package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +4 -4
  86. package/src/features/chat/components/layout/chat-sidebar.tsx +2 -2
  87. package/src/features/chat/features/conversation/components/session-queued-input-rows.tsx +1 -1
  88. package/src/features/chat/features/message/components/chat-message-list.container.tsx +12 -3
  89. package/src/features/chat/features/message/components/chat-tool-call-stress-harness.tsx +32 -2
  90. package/src/features/chat/features/message/hooks/__tests__/use-chat-message-virtualizer.test.tsx +7 -5
  91. package/src/features/chat/features/message/hooks/use-chat-message-virtualizer.ts +7 -3
  92. package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +4 -6
  93. package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +2 -10
  94. package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +1 -0
  95. package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +1 -1
  96. package/src/features/chat/features/session/components/chat-mobile-session-row.tsx +1 -1
  97. package/src/features/chat/features/session/components/chat-sidebar-context-card.tsx +1 -1
  98. package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +2 -1
  99. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +7 -5
  100. package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +45 -10
  101. package/src/features/chat/features/session/components/session-header/chat-session-more-actions-menu.tsx +3 -0
  102. package/src/features/chat/features/session/components/session-header/chat-session-switcher-groups.tsx +6 -6
  103. package/src/features/chat/features/session/components/session-header/chat-session-title-switcher.tsx +5 -4
  104. package/src/features/chat/features/session-type/components/chat-session-type-option-item.tsx +1 -1
  105. package/src/features/chat/features/welcome/components/chat-welcome-agent-picker.tsx +0 -1
  106. package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +1 -1
  107. package/src/features/chat/features/welcome/components/chat-welcome-prompt-suggestions.tsx +1 -1
  108. package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +1 -1
  109. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumb-browser.tsx +2 -2
  110. package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +5 -5
  111. package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +1 -0
  112. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +1 -1
  113. package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +1 -1
  114. package/src/features/chat/features/workspace/components/child-sessions/chat-session-child-sessions.tsx +2 -2
  115. package/src/features/chat/features/workspace/components/file-content-preview/workspace-spreadsheet-preview.tsx +2 -2
  116. package/src/features/chat/features/workspace/components/overview/chat-session-continuous-attention.tsx +3 -3
  117. package/src/features/chat/features/workspace/components/overview/chat-session-token-usage.tsx +1 -1
  118. package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +4 -3
  119. package/src/features/chat/features/workspace/components/project-files/workspace-new-folder-tree-item.tsx +2 -1
  120. package/src/features/chat/features/workspace/components/session-cron-job-content.tsx +3 -3
  121. package/src/features/chat/features/workspace/components/workspace-file-content-preview.tsx +2 -2
  122. package/src/features/chat/features/workspace/components/workspace-markdown-outline.tsx +1 -1
  123. package/src/features/cron/components/cron-config.tsx +2 -2
  124. package/src/features/cron/components/cron-job-detail-dialog.tsx +1 -1
  125. package/src/features/cron/components/cron-job-row.tsx +3 -3
  126. package/src/features/cron/components/cron-task-discovery.tsx +1 -1
  127. package/src/features/inbox/pages/inbox-page.test.ts +12 -3
  128. package/src/features/inbox/pages/inbox-page.tsx +32 -25
  129. package/src/features/marketplace/components/curated-shelves/marketplace-curated-shelves.tsx +2 -2
  130. package/src/features/marketplace/components/curated-shelves/marketplace-shelf-card.tsx +2 -2
  131. package/src/features/marketplace/components/marketplace-list-card.tsx +4 -4
  132. package/src/features/marketplace/components/marketplace-page.tsx +2 -2
  133. package/src/features/marketplace/components/mcp/mcp-marketplace-card.tsx +2 -2
  134. package/src/features/marketplace/components/mcp/mcp-marketplace-page.tsx +3 -3
  135. package/src/features/panel-apps/components/panel-app-list-item.tsx +3 -3
  136. package/src/features/projects/pages/project-home-page.tsx +4 -2
  137. package/src/features/pwa/components/pwa-install-entry.tsx +1 -1
  138. package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx +9 -1
  139. package/src/features/right-panel-resources/components/page-resource-sidebar-nav.tsx +1 -1
  140. package/src/features/right-panel-resources/components/right-panel-resource-home-page.tsx +1 -1
  141. package/src/features/service-apps/components/service-action-row.tsx +3 -3
  142. package/src/features/service-apps/components/service-app-list-item.tsx +4 -4
  143. package/src/features/service-apps/components/service-apps-panel.tsx +1 -1
  144. package/src/features/settings/components/config/provider-model-list.tsx +5 -5
  145. package/src/features/settings/components/config/provider-model-suggestions-panel.tsx +4 -4
  146. package/src/features/settings/components/config/provider-pill-selector.tsx +1 -1
  147. package/src/features/settings/pages/appearance-settings-page.tsx +2 -2
  148. package/src/features/settings/pages/providers-config-page.tsx +6 -6
  149. package/src/features/side-dock/components/side-dock.tsx +4 -4
  150. package/src/index.css +4 -0
  151. package/src/platforms/desktop/components/desktop-window-chrome.tsx +1 -1
  152. package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +9 -0
  153. package/src/platforms/mobile/components/mobile-app-shell.tsx +4 -2
  154. package/src/platforms/mobile/components/mobile-bottom-nav.tsx +3 -3
  155. package/src/platforms/mobile/components/mobile-topbar.tsx +2 -2
  156. package/src/shared/components/common/brand-header.tsx +1 -1
  157. package/src/shared/components/common/searchable-model-input.tsx +2 -2
  158. package/src/shared/components/config-split-page.tsx +3 -3
  159. package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +2 -2
  160. package/src/shared/components/path-picker/server-path-picker-locations.tsx +1 -1
  161. package/src/shared/components/ui/button.tsx +2 -2
  162. package/src/shared/components/ui/card.tsx +1 -1
  163. package/src/shared/components/ui/context-menu/context-menu-items.tsx +3 -3
  164. package/src/shared/components/ui/input.tsx +7 -3
  165. package/src/shared/components/ui/overlays/sheet.tsx +1 -1
  166. package/src/shared/components/ui/popover.tsx +1 -1
  167. package/src/shared/components/ui/select.tsx +2 -2
  168. package/src/shared/components/ui/tab-strip/compact-tab-strip.tsx +4 -4
  169. package/src/shared/components/ui/tabs.tsx +1 -1
  170. package/src/shared/components/workbench/workbench-surface.tsx +1 -1
  171. package/src/shared/lib/i18n/locales/en-US/chat.json +1 -2
  172. package/src/shared/lib/i18n/locales/zh-CN/chat.json +1 -2
  173. package/dist/assets/app-presenter-provider-Co8uKOyW.js +0 -124
  174. package/dist/assets/card-Bqu8zWLq.js +0 -1
  175. package/dist/assets/config-split-page-Bd-bGKsw.js +0 -1
  176. package/dist/assets/doc-browser-52t2_rSF.js +0 -1
  177. package/dist/assets/loader-circle-DbOQWT9C.js +0 -1
  178. package/dist/assets/login-page-DW1AZXqX.js +0 -1
  179. package/dist/assets/main-BpL6OjwM.css +0 -1
  180. package/dist/assets/main-i18n-catalog.config-Bpu5GcwF.js +0 -1
  181. package/dist/assets/mcp-marketplace-page-DSLRpJEB.js +0 -1
  182. package/dist/assets/panel-app-i18n-catalog.config-D44qmtfk.js +0 -1
  183. package/dist/assets/panelStandalone-D-mhAGNa.css +0 -1
  184. package/dist/assets/projects-C7Zxpcoi.js +0 -1
  185. package/dist/assets/provider-models-YW7rIeOD.js +0 -1
  186. package/dist/assets/provider-scoped-model-input-axJ-pTEu.js +0 -1
  187. package/dist/assets/providers-config-page-_QhBXQ4M.js +0 -1
  188. package/dist/assets/remote-BLQU7aY5.js +0 -1
  189. package/dist/assets/security-config-aE_jOwy-.js +0 -1
  190. package/dist/assets/service-apps-panel-jBWAa4qZ.js +0 -1
  191. package/dist/assets/x-CQIp_nJT.js +0 -1
@@ -60,9 +60,9 @@ function SideDockButton({
60
60
  onClick={() => onOpen(item)}
61
61
  className={cn(
62
62
  'flex h-10 w-10 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors',
63
- 'hover:bg-primary/10 hover:text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border',
63
+ 'hover:bg-[var(--interaction-hover)] hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border',
64
64
  active
65
- ? 'bg-primary/10 text-primary'
65
+ ? 'bg-[var(--interaction-selection)] text-foreground hover:bg-[var(--interaction-selection)]'
66
66
  : 'bg-transparent',
67
67
  )}
68
68
  >
@@ -78,7 +78,7 @@ function SideDockButton({
78
78
  event.stopPropagation();
79
79
  onUnpin(item);
80
80
  }}
81
- className="absolute -right-1 -top-1 hidden h-4 w-4 items-center justify-center rounded-full bg-background text-muted-foreground shadow-sm ring-1 ring-border/70 transition-colors hover:bg-muted hover:text-foreground group-hover:flex focus-visible:flex focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
81
+ className="absolute -right-1 -top-1 hidden h-4 w-4 items-center justify-center rounded-full bg-background text-muted-foreground shadow-sm ring-1 ring-border/70 transition-colors hover:bg-[var(--interaction-hover)] hover:text-foreground group-hover:flex focus-visible:flex focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
82
82
  >
83
83
  <X className="h-3 w-3" aria-hidden="true" />
84
84
  </button>
@@ -109,7 +109,7 @@ function SideDockActionButton({
109
109
  onClick={onClick}
110
110
  className={cn(
111
111
  'flex h-10 w-10 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors',
112
- 'hover:bg-primary/10 hover:text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border',
112
+ 'hover:bg-[var(--interaction-hover)] hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border',
113
113
  )}
114
114
  >
115
115
  <Icon className="h-5 w-5" aria-hidden="true" />
package/src/index.css CHANGED
@@ -140,6 +140,10 @@
140
140
  box-shadow: var(--shadow-card);
141
141
  }
142
142
 
143
+ .shadow-floating {
144
+ box-shadow: var(--shadow-popover);
145
+ }
146
+
143
147
  .shadow-card-hover {
144
148
  box-shadow: var(--shadow-card-hover);
145
149
  }
@@ -90,7 +90,7 @@ function DesktopWindowControlButton({
90
90
  className={
91
91
  control.variant === "danger"
92
92
  ? "desktop-window-no-drag flex h-10 w-[46px] items-center justify-center text-gray-700 transition-colors hover:bg-red-500 hover:text-white"
93
- : "desktop-window-no-drag flex h-10 w-[46px] items-center justify-center text-gray-700 transition-colors hover:bg-black/10"
93
+ : "desktop-window-no-drag flex h-10 w-[46px] items-center justify-center text-gray-700 transition-colors hover:bg-[var(--interaction-hover)]"
94
94
  }
95
95
  onClick={() => {
96
96
  void window.nextclawDesktop?.controlWindow?.(control.action);
@@ -31,6 +31,15 @@ function renderShell(pathname: string) {
31
31
  }
32
32
 
33
33
  describe("MobileAppShell", () => {
34
+ it("lets inbox details own their reading chrome and restores navigation on the list", () => {
35
+ const detail = renderShell("/inbox/report-1");
36
+ expect(screen.queryByTestId("mobile-bottom-nav")).toBeNull();
37
+ expect(screen.queryByTestId("mobile-topbar")).toBeNull();
38
+ detail.unmount();
39
+ renderShell("/inbox");
40
+ expect(screen.getByTestId("mobile-bottom-nav")).toBeTruthy();
41
+ expect(screen.getByTestId("mobile-topbar")).toBeTruthy();
42
+ });
34
43
  it("shows the bottom navigation on the chat list route", () => {
35
44
  const { shell } = renderShell("/chat");
36
45
 
@@ -1,6 +1,7 @@
1
1
  import { lazy, Suspense } from "react";
2
2
  import {
3
3
  isChatSessionDetailRoute,
4
+ isInboxDetailRoute,
4
5
  isMainWorkspaceRoute,
5
6
  } from "@/app/configs/app-navigation.config";
6
7
  import { MobileBottomNav } from "@/platforms/mobile/components/mobile-bottom-nav";
@@ -32,8 +33,9 @@ export function MobileAppShell({
32
33
  children,
33
34
  }: MobileAppShellProps) {
34
35
  const isMainRoute = isMainWorkspaceRoute(pathname);
35
- const showTopbar = pathname !== '/chat' && !isChatSessionDetailRoute(pathname);
36
- const showBottomNav = !isChatSessionDetailRoute(pathname);
36
+ const ownsDetailChrome = isChatSessionDetailRoute(pathname) || isInboxDetailRoute(pathname);
37
+ const showTopbar = pathname !== '/chat' && !ownsDetailChrome;
38
+ const showBottomNav = !ownsDetailChrome;
37
39
 
38
40
  return (
39
41
  <div className="flex h-[100svh] flex-col bg-background font-sans text-foreground supports-[height:100dvh]:h-[100dvh]">
@@ -40,8 +40,8 @@ export function MobileBottomNav() {
40
40
  className={cn(
41
41
  "group flex min-h-12 flex-col items-center justify-center gap-1 rounded-xl px-0.5 py-1 text-[11px] font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border",
42
42
  active
43
- ? "bg-muted text-foreground"
44
- : "text-muted-foreground hover:bg-muted hover:text-foreground",
43
+ ? "bg-[var(--interaction-selection)] text-foreground"
44
+ : "text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-foreground",
45
45
  )}
46
46
  >
47
47
  <span className="relative">
@@ -64,7 +64,7 @@ export function MobileBottomNav() {
64
64
  <button
65
65
  type="button"
66
66
  onClick={() => openApps(docBrowser)}
67
- className="group flex min-h-12 w-full flex-col items-center justify-center gap-1 rounded-xl px-0.5 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
67
+ className="group flex min-h-12 w-full flex-col items-center justify-center gap-1 rounded-xl px-0.5 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-[var(--interaction-hover)] hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
68
68
  >
69
69
  <Boxes className="h-5 w-5 text-muted-foreground" />
70
70
  <span className="max-w-full truncate">{t("appsTitle")}</span>
@@ -6,8 +6,8 @@ import { IconActionButton } from "@/shared/components/ui/actions/icon-action-but
6
6
 
7
7
  export function MobileTopbar({ leadingInset }: { leadingInset?: string }) {
8
8
  const navigate = useNavigate();
9
- const { pathname } = useLocation();
10
- const routeMeta = resolveMobileRouteMeta(pathname, t);
9
+ const { pathname, state } = useLocation();
10
+ const routeMeta = resolveMobileRouteMeta(pathname, t, typeof state?.returnTo === 'string' ? state.returnTo : undefined);
11
11
 
12
12
  return (
13
13
  <header
@@ -181,7 +181,7 @@ function RuntimeUpdateReleaseNotesHover({
181
181
  external
182
182
  icon={null}
183
183
  aria-label={label}
184
- className="whitespace-nowrap rounded-md border bg-popover px-3 py-1.5 text-left text-xs font-medium text-popover-foreground shadow-md outline-none transition-colors hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-gray-300"
184
+ className="whitespace-nowrap rounded-md border bg-popover px-3 py-1.5 text-left text-xs font-medium text-popover-foreground shadow-md outline-none transition-colors hover:bg-[var(--interaction-hover)] focus-visible:ring-2 focus-visible:ring-gray-300"
185
185
  >
186
186
  {label}
187
187
  </NavigationLink>
@@ -152,7 +152,7 @@ export function SearchableModelInput({
152
152
  onChange(value.trim());
153
153
  closeMenu();
154
154
  }}
155
- className="flex w-full items-center gap-2 px-3 py-2 text-left text-sm hover:bg-gray-50"
155
+ className="flex w-full items-center gap-2 px-3 py-2 text-left text-sm hover:bg-[var(--interaction-hover)]"
156
156
  >
157
157
  <Check className="h-4 w-4 text-transparent" />
158
158
  <span className="truncate text-gray-700">
@@ -170,7 +170,7 @@ export function SearchableModelInput({
170
170
  onChange(option);
171
171
  closeMenu();
172
172
  }}
173
- className="flex w-full items-center gap-2 px-3 py-2 text-left text-sm hover:bg-gray-50"
173
+ className="flex w-full items-center gap-2 px-3 py-2 text-left text-sm hover:bg-[var(--interaction-hover)]"
174
174
  >
175
175
  <Check className={cn('h-4 w-4', option === value.trim() ? 'text-primary' : 'text-transparent')} />
176
176
  <span className="truncate text-gray-700">{option}</span>
@@ -47,7 +47,7 @@ export function ConfigSplitPage({
47
47
  <button
48
48
  type='button'
49
49
  onClick={onMobileBack}
50
- className='inline-flex items-center gap-2 rounded-lg px-2 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40'
50
+ className='inline-flex items-center gap-2 rounded-lg px-2 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-[var(--interaction-hover)] hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40'
51
51
  >
52
52
  <ArrowLeft className='h-4 w-4' />
53
53
  <span>{mobileListLabel ?? t('backToMain')}</span>
@@ -122,8 +122,8 @@ export function ConfigSelectionCard({
122
122
  className={cn(
123
123
  'w-full rounded-xl p-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',
124
124
  active
125
- ? 'bg-background/95 text-foreground shadow-sm'
126
- : 'bg-transparent text-muted-foreground hover:bg-background/65 hover:text-foreground',
125
+ ? 'bg-[var(--interaction-selection)] text-foreground'
126
+ : 'bg-transparent text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-foreground',
127
127
  className
128
128
  )}
129
129
  {...props}
@@ -130,8 +130,8 @@ export function DocBrowserTabStrip({
130
130
  tabsClassName="items-center gap-0.5"
131
131
  actionsClassName="h-full max-md:h-11 max-md:w-full items-center gap-0.5"
132
132
  tabBaseClassName="inline-flex cursor-pointer items-center gap-0.5 h-7 max-md:min-h-11 px-2 rounded-md text-xs max-w-[220px] shrink-0 transition-colors"
133
- activeTabClassName="bg-muted/80 text-foreground"
134
- inactiveTabClassName="text-muted-foreground hover:bg-muted/45 hover:text-foreground"
133
+ activeTabClassName="bg-[var(--interaction-selection)] text-foreground"
134
+ inactiveTabClassName="text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-foreground"
135
135
  labelClassName="px-0.5 text-xs font-normal"
136
136
 
137
137
  />
@@ -112,7 +112,7 @@ export function ServerPathPickerLocations({
112
112
  type="button"
113
113
  className={cn(
114
114
  'flex w-full items-center gap-2 rounded-md px-2 py-2 text-left text-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border',
115
- active ? 'bg-primary/12 text-primary' : 'text-foreground hover:bg-[var(--interaction-hover)]',
115
+ active ? 'bg-[var(--interaction-selection)] text-foreground' : 'text-foreground hover:bg-[var(--interaction-hover)]',
116
116
  )}
117
117
  aria-current={active ? 'location' : undefined}
118
118
  onClick={() => onNavigate(item.path)}
@@ -7,13 +7,13 @@ const buttonVariants = cva(
7
7
  {
8
8
  variants: {
9
9
  variant: {
10
- default: 'bg-primary text-primary-foreground hover:bg-primary-600 active:bg-primary-700 shadow-sm',
10
+ default: 'bg-primary text-primary-foreground hover:bg-[hsl(var(--primary-hover))] active:bg-[hsl(var(--primary-active))] shadow-sm',
11
11
  destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
12
12
  outline: 'border border-border bg-card text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-accent-foreground',
13
13
  secondary: 'bg-muted text-foreground hover:bg-[var(--interaction-hover)] hover:text-accent-foreground',
14
14
  ghost: 'text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-accent-foreground',
15
15
  link: 'text-primary underline-offset-4 hover:underline',
16
- primary: 'bg-primary text-primary-foreground hover:bg-primary-600 active:bg-primary-700 shadow-sm',
16
+ primary: 'bg-primary text-primary-foreground hover:bg-[hsl(var(--primary-hover))] active:bg-[hsl(var(--primary-active))] shadow-sm',
17
17
  subtle: 'bg-muted text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-accent-foreground',
18
18
  'primary-outline': 'border border-primary/30 text-primary hover:bg-primary hover:text-primary-foreground'
19
19
  },
@@ -17,7 +17,7 @@ const Card = React.forwardRef<
17
17
  ? 'border-border shadow-card'
18
18
  : 'border-border/75 shadow-none',
19
19
  hover && surface === 'raised' && 'hover:border-primary/25 hover:shadow-card-hover',
20
- hover && surface === 'flat' && 'hover:bg-muted/40',
20
+ hover && surface === 'flat' && 'hover:bg-[var(--interaction-hover)]',
21
21
  className
22
22
  )}
23
23
  {...props}
@@ -2,11 +2,11 @@ import { useCallback, useEffect, useRef, useState, type ReactNode } from "react"
2
2
  import * as Popover from "@radix-ui/react-popover";
3
3
  import { ChevronRight } from "lucide-react";
4
4
  import { cn } from "@/shared/lib/utils";
5
- import { ACTION_FEEDBACK, ACTION_MENU_ITEM_CLASS } from '../actions/action-feedback';
5
+ import { ACTION_FEEDBACK, ACTION_MENU_ITEM_CLASS } from '@/shared/components/ui/actions/action-feedback';
6
6
  import type { ContextMenuGroup, ContextMenuItem } from "./context-menu";
7
7
 
8
8
  export const CONTEXT_MENU_SURFACE_CLASS =
9
- "w-max min-w-52 max-w-[min(18rem,calc(100vw-16px))] overflow-y-auto rounded-xl border border-border bg-popover p-1 text-popover-foreground shadow-[0_18px_48px_-20px_rgba(15,23,42,0.42)] outline-none";
9
+ "w-max min-w-52 max-w-[min(18rem,calc(100vw-16px))] overflow-y-auto rounded-xl border border-border/40 bg-popover p-1 text-popover-foreground shadow-floating outline-none";
10
10
 
11
11
  function MenuItemContent({ item }: { item: ContextMenuItem }) {
12
12
  return <>
@@ -152,7 +152,7 @@ export function ContextMenuItems({ groups, onClose }: {
152
152
  }}
153
153
  >
154
154
  {groups.filter((group) => group.items.length).map((group, index) => <div key={group.key} role="group">
155
- {index > 0 ? <div className="my-1 h-px bg-border" /> : null}
155
+ {index > 0 ? <div className="mx-2 my-1 h-px bg-border/50" /> : null}
156
156
  {group.items.map((item) => {
157
157
  const className = cn(
158
158
  ACTION_MENU_ITEM_CLASS,
@@ -1,16 +1,20 @@
1
1
  import * as React from 'react';
2
2
  import { cn } from '@/shared/lib/utils';
3
3
 
4
- export type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
4
+ export type InputProps = React.InputHTMLAttributes<HTMLInputElement> & {
5
+ density?: 'default' | 'compact';
6
+ };
5
7
 
6
8
  const Input = React.forwardRef<HTMLInputElement, InputProps>(
7
- ({ className, type, ...props }, ref) => {
9
+ ({ className, density = 'default', type, ...props }, ref) => {
8
10
  return (
9
11
  <input
10
12
  type={type}
11
13
  className={cn(
12
14
  '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 disabled:cursor-not-allowed disabled:opacity-50',
13
- 'max-md:min-h-[var(--control-touch-size)] max-md:text-base',
15
+ density === 'default'
16
+ ? 'max-md:min-h-[var(--control-touch-size)] max-md:text-base'
17
+ : 'text-[13px] max-md:min-h-0 max-md:text-[13px]',
14
18
  className
15
19
  )}
16
20
  ref={ref}
@@ -69,7 +69,7 @@ const SheetContent = React.forwardRef<
69
69
  }}
70
70
  >
71
71
  {children}
72
- <SheetPrimitive.Close className="absolute right-4 top-4 rounded-lg p-1.5 text-muted-foreground opacity-75 transition-colors hover:bg-muted hover:text-foreground hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:pointer-events-none">
72
+ <SheetPrimitive.Close className="absolute right-4 top-4 rounded-lg p-1.5 text-muted-foreground opacity-75 transition-colors hover:bg-[var(--interaction-hover)] hover:text-foreground hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:pointer-events-none">
73
73
  <X className="h-4 w-4" />
74
74
  <span className="sr-only">{closeLabel}</span>
75
75
  </SheetPrimitive.Close>
@@ -31,7 +31,7 @@ const PopoverContent = React.forwardRef<
31
31
  align={align}
32
32
  collisionPadding={collisionPadding}
33
33
  className={cn(
34
- 'z-[var(--z-popover,10100)] w-72 overflow-x-hidden overflow-y-auto rounded-2xl border border-border bg-popover p-4 text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
34
+ 'z-[var(--z-popover,10100)] w-72 overflow-x-hidden overflow-y-auto rounded-xl border border-border/40 bg-popover p-4 text-popover-foreground shadow-floating animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
35
35
  className,
36
36
  variant === 'menu' && CONTEXT_MENU_SURFACE_CLASS
37
37
  )}
@@ -80,7 +80,7 @@ const SelectContent = React.forwardRef<
80
80
  ref={ref}
81
81
  data-theme-overlay="select"
82
82
  className={cn(
83
- "relative z-[var(--z-popover,10100)] flex max-h-96 min-w-[8rem] flex-col overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
83
+ "relative z-[var(--z-popover,10100)] flex max-h-96 min-w-[8rem] flex-col overflow-hidden rounded-xl border border-border/40 bg-popover text-popover-foreground shadow-floating data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
84
84
  position === "popper" &&
85
85
  "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
86
86
  className
@@ -121,7 +121,7 @@ const SelectItem = React.forwardRef<
121
121
  <SelectPrimitive.Item
122
122
  ref={ref}
123
123
  className={cn(
124
- "relative flex max-md:min-h-[var(--control-touch-size)] w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 hover:bg-[var(--interaction-hover)]",
124
+ "relative flex max-md:min-h-[var(--control-touch-size)] w-full cursor-default select-none items-center rounded-lg py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-[var(--interaction-hover)] focus:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 hover:bg-[var(--interaction-hover)]",
125
125
  className
126
126
  )}
127
127
  {...props}
@@ -233,12 +233,12 @@ function CompactTabItem({
233
233
  onClick={(event) => event.target === event.currentTarget && tab.onSelect()}
234
234
  className={cn(
235
235
  tabBaseClassName ??
236
- "flex max-w-[180px] cursor-pointer items-center gap-1.5 border-r border-gray-200/70 border-b-2 px-2.5 py-2 transition-colors",
236
+ "flex h-8 max-w-[180px] cursor-pointer items-center gap-1.5 border-r border-border/50 px-2.5 transition-colors",
237
237
  "group relative",
238
238
  tab.active
239
- ? (activeTabClassName ?? "border-b-primary bg-white text-gray-900")
239
+ ? (activeTabClassName ?? "bg-background text-foreground")
240
240
  : (inactiveTabClassName ??
241
- "border-b-transparent bg-gray-50/85 text-gray-500 hover:bg-gray-100"),
241
+ "bg-transparent text-muted-foreground hover:bg-[var(--interaction-hover)]"),
242
242
  )}
243
243
  >
244
244
  <CompactTabLabelButton tab={tab} labelClassName={labelClassName} />
@@ -287,7 +287,7 @@ export function CompactTabStrip({
287
287
  >
288
288
  <div
289
289
  className={cn(
290
- "min-w-0 flex-1 overflow-x-auto overflow-y-hidden",
290
+ "flex min-w-0 flex-1 items-stretch overflow-x-auto overflow-y-hidden",
291
291
  scrollClassName,
292
292
  )}
293
293
  onPointerDown={onScrollPointerDown}
@@ -89,7 +89,7 @@ export function TabsTrigger({ value, children, className }: TabsTriggerProps) {
89
89
  className={cn(
90
90
  'inline-flex max-md:min-h-[var(--control-touch-size)] 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',
91
91
  isActive
92
- ? 'bg-card text-foreground shadow-sm'
92
+ ? 'bg-[var(--interaction-selection)] text-foreground'
93
93
  : 'text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-accent-foreground',
94
94
  className
95
95
  )}
@@ -265,7 +265,7 @@ export function WorkbenchSurface({
265
265
  }}
266
266
  >
267
267
  <header
268
- className="flex min-h-10 shrink-0 select-none items-center gap-1 border-b border-border/60 bg-muted/30 px-2"
268
+ className={cn("flex shrink-0 select-none items-center gap-1 border-b border-border/60 bg-muted/30 pr-2", navigation && !state.minimized ? "min-h-8 pl-0" : "min-h-10 pl-2")}
269
269
  style={{ touchAction: floating ? "none" : undefined, paddingTop: isCompact ? "env(safe-area-inset-top, 0px)" : undefined }}
270
270
  onPointerDown={(event) => startInteraction(event)}
271
271
  onDoubleClick={(event) => {
@@ -282,8 +282,6 @@
282
282
  "chatHistoryLoadFailed": "Couldn’t load earlier messages",
283
283
  "chatHistoryRetry": "Retry",
284
284
  "chatProcessSummaryProcessed": "Processed",
285
- "chatProcessSummaryError": "Failed",
286
- "chatProcessSummaryStopped": "Stopped",
287
285
  "chatProcessDurationHoursMinutes": "{hours}h {minutes}m",
288
286
  "chatProcessDurationHours": "{hours}h",
289
287
  "chatProcessDurationMinutesSeconds": "{minutes}m {seconds}s",
@@ -610,6 +608,7 @@
610
608
  "chatMessageCopy": "Copy",
611
609
  "chatMessageCopied": "Copied",
612
610
  "chatMermaidDiagram": "Diagram",
611
+ "chatMarkdownFrontmatter": "Document properties",
613
612
  "chatMermaidExpand": "Expand diagram",
614
613
  "chatMermaidLoading": "Rendering diagram…",
615
614
  "chatMermaidRenderError": "Diagram could not be rendered; showing source instead",
@@ -282,8 +282,6 @@
282
282
  "chatHistoryLoadFailed": "较早消息加载失败",
283
283
  "chatHistoryRetry": "重试",
284
284
  "chatProcessSummaryProcessed": "已处理",
285
- "chatProcessSummaryError": "处理失败",
286
- "chatProcessSummaryStopped": "已停止",
287
285
  "chatProcessDurationHoursMinutes": "{hours}小时{minutes}分钟",
288
286
  "chatProcessDurationHours": "{hours}小时",
289
287
  "chatProcessDurationMinutesSeconds": "{minutes}分钟{seconds}秒",
@@ -610,6 +608,7 @@
610
608
  "chatMessageCopy": "复制",
611
609
  "chatMessageCopied": "已复制",
612
610
  "chatMermaidDiagram": "图表",
611
+ "chatMarkdownFrontmatter": "文档属性",
613
612
  "chatMermaidExpand": "放大图表",
614
613
  "chatMermaidLoading": "正在渲染图表…",
615
614
  "chatMermaidRenderError": "图表无法渲染,已显示源代码",