@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.
- package/CHANGELOG.md +34 -0
- package/dist/.vite/manifest.json +362 -362
- package/dist/assets/{account-panel-DIdHjKG-.js → account-panel-BAH7FW6z.js} +1 -1
- package/dist/assets/{api-DkLJrSCd.js → api-DjiZvIa0.js} +2 -2
- package/dist/assets/app-presenter-provider-CCRFsFYr.js +232 -0
- package/dist/assets/{appearance-settings-page-DI8aDY2G.js → appearance-settings-page-CdP86QJ7.js} +1 -1
- package/dist/assets/{book-open-BPMkKSci.js → book-open-Bcnn2_uV.js} +1 -1
- package/dist/assets/card-Cqs73hGI.js +1 -0
- package/dist/assets/{channels-list-page-CCIaTQu7.js → channels-list-page-5qGagKuE.js} +2 -2
- package/dist/assets/{circle-dashed-B48a0t6p.js → circle-dashed-EY1ScSMe.js} +1 -1
- package/dist/assets/{client-imrVphQb.js → client-CH7w6yRV.js} +1 -1
- package/dist/assets/config-split-page-CuEGQL8Z.js +1 -0
- package/dist/assets/{confirm-dialog-10Qb3dpZ.js → confirm-dialog-CxfecBzO.js} +1 -1
- package/dist/assets/{context-menu-CRqH2SEk.js → context-menu-BsCj2fRs.js} +1 -1
- package/dist/assets/{createLucideIcon-B4xj2I2g.js → createLucideIcon-Cfo2ySi5.js} +1 -1
- package/dist/assets/{desktop-capabilities-page-CFcT2g8-.js → desktop-capabilities-page-BDYITStl.js} +1 -1
- package/dist/assets/{desktop-update-config-CRJd_An1.js → desktop-update-config-e-zhkJuS.js} +1 -1
- package/dist/assets/{dialog-BgL3vKJQ.js → dialog-QjQoKbIV.js} +1 -1
- package/dist/assets/doc-browser-CLEdkH9z.js +1 -0
- package/dist/assets/{doc-browser-context-DH4aWvkS.js → doc-browser-context-DwgG6wrz.js} +1 -1
- package/dist/assets/{download-Cr337h4W.js → download-BoaKzDJk.js} +1 -1
- package/dist/assets/{es2015-D-CRf3_Z.js → es2015-Bp6cuSGh.js} +1 -1
- package/dist/assets/{extensions-CsmJPz7g.js → extensions-CgShSIkd.js} +1 -1
- package/dist/assets/{eye-DrQRSAfJ.js → eye-kisejBFH.js} +1 -1
- package/dist/assets/{form-actions-BEeWTGUZ.js → form-actions-D9JWSFQu.js} +1 -1
- package/dist/assets/{i18n-OGmF0Ws_.js → i18n-Bm3Ov7Fy.js} +2 -2
- package/dist/assets/{keyboard-shortcuts-settings-page-DQU56SrW.js → keyboard-shortcuts-settings-page-DZ8A1iLg.js} +1 -1
- package/dist/assets/loader-circle-Bd1fTm-x.js +1 -0
- package/dist/assets/{login-page-sgivRYG1.js → login-page-C-DvcG3L.js} +1 -1
- package/dist/assets/login-page-D99JjH9F.js +1 -0
- package/dist/assets/{main-B-oxUq-o.js → main-Bt5r6b21.js} +2 -2
- package/dist/assets/main-DXd_aKJV.css +1 -0
- package/dist/assets/main-i18n-catalog.config-D0Ll36J_.js +1 -0
- package/dist/assets/mcp-marketplace-page-DUoGfSmY.js +1 -0
- package/dist/assets/{model-config-page-CDQBhmVr.js → model-config-page-9NNf-mzK.js} +1 -1
- package/dist/assets/{navigation-link-D3pzNHeA.js → navigation-link-CjxNC8aT.js} +1 -1
- package/dist/assets/panel-app-i18n-catalog.config-Ddf2Kv8A.js +1 -0
- package/dist/assets/panelStandalone-BRg7B1EI.css +1 -0
- package/dist/assets/{panelStandalone-CGkYeMK5.js → panelStandalone-BaUzY8Wy.js} +2 -2
- package/dist/assets/{privacy-settings-page-CjoAkoDt.js → privacy-settings-page-CVMBFuak.js} +1 -1
- package/dist/assets/projects-BEsU3box.js +1 -0
- package/dist/assets/provider-models-Dm-pmWAA.js +1 -0
- package/dist/assets/provider-scoped-model-input-CzrXg4cX.js +1 -0
- package/dist/assets/providers-config-page-839uUADZ.js +1 -0
- package/dist/assets/{puzzle--RLCeYML.js → puzzle-BGvD2DPZ.js} +1 -1
- package/dist/assets/{pwa-DcizGowz.js → pwa-DNNK_8E9.js} +1 -1
- package/dist/assets/{refresh-cw-syCVj_nw.js → refresh-cw-BlXDrVP0.js} +1 -1
- package/dist/assets/remote-B5qIuUbT.js +1 -0
- package/dist/assets/{rotate-cw-BlH9El3x.js → rotate-cw-ei6rPD6z.js} +1 -1
- package/dist/assets/{runtime-config-page-Cco9dS73.js → runtime-config-page-Bf-4JYxQ.js} +1 -1
- package/dist/assets/{save-BWynuRQ2.js → save-DdF-bXgC.js} +1 -1
- package/dist/assets/{search-config-page-Cc74_SAU.js → search-config-page-C0qA3j-T.js} +1 -1
- package/dist/assets/{secrets-config-page-raYDzlFC.js → secrets-config-page-DxfZWpnk.js} +1 -1
- package/dist/assets/security-config-CItfIQZ4.js +1 -0
- package/dist/assets/{select-6Uq4chZW.js → select-CWyjnar7.js} +1 -1
- package/dist/assets/service-apps-panel-D3SOkRVv.js +1 -0
- package/dist/assets/{settings-2-COvVf1XX.js → settings-2-CrNhfInU.js} +1 -1
- package/dist/assets/{status-dot-DZlxa5zW.js → status-dot-C3SRFEta.js} +1 -1
- package/dist/assets/{tag-chip-DXHtZ8AS.js → tag-chip-BIuavK2K.js} +1 -1
- package/dist/assets/{theme-provider-C5PCDBPB.js → theme-provider-CWUz4yO9.js} +1 -1
- package/dist/assets/{trash-2-DazgBvmJ.js → trash-2-hAbJh9VZ.js} +1 -1
- package/dist/assets/{use-config-DRRGF9Zb.js → use-config-evzage09.js} +1 -1
- package/dist/assets/{use-desktop-capabilities-CdfOUjdE.js → use-desktop-capabilities-BYDjFlpt.js} +1 -1
- package/dist/assets/{use-viewport-layout-DdxVnCYc.js → use-viewport-layout-D_9XWGDV.js} +1 -1
- package/dist/assets/x-ChPbNv39.js +1 -0
- package/dist/index.html +34 -34
- package/dist/panel-standalone.html +11 -11
- package/package.json +3 -3
- package/src/app/components/layout/__tests__/sidebar.layout.test.tsx +2 -2
- package/src/app/components/layout/sidebar-rail.styles.ts +3 -3
- package/src/app/configs/__tests__/app-navigation.config.test.ts +4 -2
- package/src/app/configs/app-navigation.config.ts +7 -2
- package/src/app/styles/charcoal-theme.css +0 -3
- package/src/app/styles/design-system.css +12 -6
- package/src/app/styles/island-theme.css +2 -15
- package/src/features/app-data/components/app-data-removal-choice.tsx +1 -1
- package/src/features/channels/pages/channels-list-page.tsx +1 -1
- package/src/features/chat/components/chat-sidebar-list-mode-switch.tsx +1 -1
- package/src/features/chat/components/conversation/__tests__/chat-conversation-header-section.test.tsx +28 -16
- package/src/features/chat/components/conversation/chat-conversation-content.tsx +8 -2
- package/src/features/chat/components/layout/__tests__/chat-sidebar-session-area.test.tsx +6 -4
- package/src/features/chat/components/layout/__tests__/chat-sidebar-toolbar.test.tsx +22 -1
- package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +10 -14
- package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +38 -7
- package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +4 -4
- package/src/features/chat/components/layout/chat-sidebar.tsx +2 -2
- package/src/features/chat/features/conversation/components/session-queued-input-rows.tsx +1 -1
- package/src/features/chat/features/message/components/chat-message-list.container.tsx +12 -3
- package/src/features/chat/features/message/components/chat-tool-call-stress-harness.tsx +32 -2
- package/src/features/chat/features/message/hooks/__tests__/use-chat-message-virtualizer.test.tsx +7 -5
- package/src/features/chat/features/message/hooks/use-chat-message-virtualizer.ts +7 -3
- package/src/features/chat/features/message/utils/__tests__/chat-message-process-summary.utils.test.ts +4 -6
- package/src/features/chat/features/message/utils/chat-message-process-summary.utils.ts +2 -10
- package/src/features/chat/features/message/utils/chat-message-texts.utils.ts +1 -0
- package/src/features/chat/features/session/components/__tests__/chat-sidebar-project-groups.test.tsx +1 -1
- package/src/features/chat/features/session/components/chat-mobile-session-row.tsx +1 -1
- package/src/features/chat/features/session/components/chat-sidebar-context-card.tsx +1 -1
- package/src/features/chat/features/session/components/chat-sidebar-project-groups.tsx +2 -1
- package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +7 -5
- package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +45 -10
- package/src/features/chat/features/session/components/session-header/chat-session-more-actions-menu.tsx +3 -0
- package/src/features/chat/features/session/components/session-header/chat-session-switcher-groups.tsx +6 -6
- package/src/features/chat/features/session/components/session-header/chat-session-title-switcher.tsx +5 -4
- package/src/features/chat/features/session-type/components/chat-session-type-option-item.tsx +1 -1
- package/src/features/chat/features/welcome/components/chat-welcome-agent-picker.tsx +0 -1
- package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +1 -1
- package/src/features/chat/features/welcome/components/chat-welcome-prompt-suggestions.tsx +1 -1
- package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +1 -1
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumb-browser.tsx +2 -2
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-breadcrumbs.tsx +5 -5
- package/src/features/chat/features/workspace/components/chat-session-workspace-file-preview.tsx +1 -0
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel-content.tsx +1 -1
- package/src/features/chat/features/workspace/components/chat-session-workspace-panel-nav.tsx +1 -1
- package/src/features/chat/features/workspace/components/child-sessions/chat-session-child-sessions.tsx +2 -2
- package/src/features/chat/features/workspace/components/file-content-preview/workspace-spreadsheet-preview.tsx +2 -2
- package/src/features/chat/features/workspace/components/overview/chat-session-continuous-attention.tsx +3 -3
- package/src/features/chat/features/workspace/components/overview/chat-session-token-usage.tsx +1 -1
- package/src/features/chat/features/workspace/components/project-files/workspace-directory-tree.tsx +4 -3
- package/src/features/chat/features/workspace/components/project-files/workspace-new-folder-tree-item.tsx +2 -1
- package/src/features/chat/features/workspace/components/session-cron-job-content.tsx +3 -3
- package/src/features/chat/features/workspace/components/workspace-file-content-preview.tsx +2 -2
- package/src/features/chat/features/workspace/components/workspace-markdown-outline.tsx +1 -1
- package/src/features/cron/components/cron-config.tsx +2 -2
- package/src/features/cron/components/cron-job-detail-dialog.tsx +1 -1
- package/src/features/cron/components/cron-job-row.tsx +3 -3
- package/src/features/cron/components/cron-task-discovery.tsx +1 -1
- package/src/features/inbox/pages/inbox-page.test.ts +12 -3
- package/src/features/inbox/pages/inbox-page.tsx +32 -25
- package/src/features/marketplace/components/curated-shelves/marketplace-curated-shelves.tsx +2 -2
- package/src/features/marketplace/components/curated-shelves/marketplace-shelf-card.tsx +2 -2
- package/src/features/marketplace/components/marketplace-list-card.tsx +4 -4
- package/src/features/marketplace/components/marketplace-page.tsx +2 -2
- package/src/features/marketplace/components/mcp/mcp-marketplace-card.tsx +2 -2
- package/src/features/marketplace/components/mcp/mcp-marketplace-page.tsx +3 -3
- package/src/features/panel-apps/components/panel-app-list-item.tsx +3 -3
- package/src/features/projects/pages/project-home-page.tsx +4 -2
- package/src/features/pwa/components/pwa-install-entry.tsx +1 -1
- package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx +9 -1
- package/src/features/right-panel-resources/components/page-resource-sidebar-nav.tsx +1 -1
- package/src/features/right-panel-resources/components/right-panel-resource-home-page.tsx +1 -1
- package/src/features/service-apps/components/service-action-row.tsx +3 -3
- package/src/features/service-apps/components/service-app-list-item.tsx +4 -4
- package/src/features/service-apps/components/service-apps-panel.tsx +1 -1
- package/src/features/settings/components/config/provider-model-list.tsx +5 -5
- package/src/features/settings/components/config/provider-model-suggestions-panel.tsx +4 -4
- package/src/features/settings/components/config/provider-pill-selector.tsx +1 -1
- package/src/features/settings/pages/appearance-settings-page.tsx +2 -2
- package/src/features/settings/pages/providers-config-page.tsx +6 -6
- package/src/features/side-dock/components/side-dock.tsx +4 -4
- package/src/index.css +4 -0
- package/src/platforms/desktop/components/desktop-window-chrome.tsx +1 -1
- package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +9 -0
- package/src/platforms/mobile/components/mobile-app-shell.tsx +4 -2
- package/src/platforms/mobile/components/mobile-bottom-nav.tsx +3 -3
- package/src/platforms/mobile/components/mobile-topbar.tsx +2 -2
- package/src/shared/components/common/brand-header.tsx +1 -1
- package/src/shared/components/common/searchable-model-input.tsx +2 -2
- package/src/shared/components/config-split-page.tsx +3 -3
- package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +2 -2
- package/src/shared/components/path-picker/server-path-picker-locations.tsx +1 -1
- package/src/shared/components/ui/button.tsx +2 -2
- package/src/shared/components/ui/card.tsx +1 -1
- package/src/shared/components/ui/context-menu/context-menu-items.tsx +3 -3
- package/src/shared/components/ui/input.tsx +7 -3
- package/src/shared/components/ui/overlays/sheet.tsx +1 -1
- package/src/shared/components/ui/popover.tsx +1 -1
- package/src/shared/components/ui/select.tsx +2 -2
- package/src/shared/components/ui/tab-strip/compact-tab-strip.tsx +4 -4
- package/src/shared/components/ui/tabs.tsx +1 -1
- package/src/shared/components/workbench/workbench-surface.tsx +1 -1
- package/src/shared/lib/i18n/locales/en-US/chat.json +1 -2
- package/src/shared/lib/i18n/locales/zh-CN/chat.json +1 -2
- package/dist/assets/app-presenter-provider-Co8uKOyW.js +0 -124
- package/dist/assets/card-Bqu8zWLq.js +0 -1
- package/dist/assets/config-split-page-Bd-bGKsw.js +0 -1
- package/dist/assets/doc-browser-52t2_rSF.js +0 -1
- package/dist/assets/loader-circle-DbOQWT9C.js +0 -1
- package/dist/assets/login-page-DW1AZXqX.js +0 -1
- package/dist/assets/main-BpL6OjwM.css +0 -1
- package/dist/assets/main-i18n-catalog.config-Bpu5GcwF.js +0 -1
- package/dist/assets/mcp-marketplace-page-DSLRpJEB.js +0 -1
- package/dist/assets/panel-app-i18n-catalog.config-D44qmtfk.js +0 -1
- package/dist/assets/panelStandalone-D-mhAGNa.css +0 -1
- package/dist/assets/projects-C7Zxpcoi.js +0 -1
- package/dist/assets/provider-models-YW7rIeOD.js +0 -1
- package/dist/assets/provider-scoped-model-input-axJ-pTEu.js +0 -1
- package/dist/assets/providers-config-page-_QhBXQ4M.js +0 -1
- package/dist/assets/remote-BLQU7aY5.js +0 -1
- package/dist/assets/security-config-aE_jOwy-.js +0 -1
- package/dist/assets/service-apps-panel-jBWAa4qZ.js +0 -1
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
@@ -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-
|
|
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
|
|
36
|
-
const
|
|
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-
|
|
44
|
-
: "text-muted-foreground hover:bg-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
126
|
-
: 'bg-transparent text-muted-foreground hover:bg-
|
|
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-
|
|
134
|
-
inactiveTabClassName="text-muted-foreground hover:bg-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 '
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 ?? "
|
|
239
|
+
? (activeTabClassName ?? "bg-background text-foreground")
|
|
240
240
|
: (inactiveTabClassName ??
|
|
241
|
-
"
|
|
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-
|
|
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
|
|
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": "图表无法渲染,已显示源代码",
|