@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
|
@@ -2,7 +2,7 @@ import { PageResourceActionsMenu } from '@/features/right-panel-resources';
|
|
|
2
2
|
import { pageResourceFromSystemObject } from '@/features/right-panel-resources';
|
|
3
3
|
import { useEffect, useMemo, useState } from "react";
|
|
4
4
|
import type { InboxDelivery } from "@nextclaw/shared";
|
|
5
|
-
import { Archive, Inbox, MessageCircle, MoreVertical, RotateCcw, Trash2 } from "lucide-react";
|
|
5
|
+
import { Archive, ArrowLeft, Inbox, MessageCircle, MoreVertical, RotateCcw, Trash2 } from "lucide-react";
|
|
6
6
|
import { ContextMenu, ContextMenuTrigger } from '@/shared/components/ui/context-menu/context-menu';
|
|
7
7
|
import { IconActionButton } from '@/shared/components/ui/actions/icon-action-button';
|
|
8
8
|
import { Link, useNavigate, useParams } from "react-router-dom";
|
|
@@ -120,7 +120,7 @@ function InboxListPane({
|
|
|
120
120
|
{filteredDeliveries.map((delivery) => (
|
|
121
121
|
<li key={delivery.id} className={cn(
|
|
122
122
|
"group/page-row relative rounded-lg hover:bg-[var(--interaction-hover)] focus-within:bg-[var(--interaction-hover)] has-[[data-context-menu-open]]:bg-[var(--interaction-hover)]",
|
|
123
|
-
activeDeliveryId === delivery.id && "bg-[var(--interaction-selection)]",
|
|
123
|
+
activeDeliveryId === delivery.id && "bg-[var(--interaction-selection)] hover:bg-[var(--interaction-selection)] focus-within:bg-[var(--interaction-selection)] has-[[data-context-menu-open]]:bg-[var(--interaction-selection)]",
|
|
124
124
|
)}>
|
|
125
125
|
<Link
|
|
126
126
|
to={`/inbox/${encodeURIComponent(delivery.id)}`}
|
|
@@ -167,6 +167,7 @@ function InboxListPane({
|
|
|
167
167
|
|
|
168
168
|
function InboxDetailPane({
|
|
169
169
|
delivery,
|
|
170
|
+
isMobile,
|
|
170
171
|
error,
|
|
171
172
|
pending,
|
|
172
173
|
onArchiveToggle,
|
|
@@ -175,6 +176,7 @@ function InboxDetailPane({
|
|
|
175
176
|
onReadToggle,
|
|
176
177
|
}: {
|
|
177
178
|
delivery: InboxDelivery | null;
|
|
179
|
+
isMobile: boolean;
|
|
178
180
|
error: string | null;
|
|
179
181
|
pending: boolean;
|
|
180
182
|
onArchiveToggle: () => void;
|
|
@@ -182,38 +184,52 @@ function InboxDetailPane({
|
|
|
182
184
|
onDelete: () => void;
|
|
183
185
|
onReadToggle: () => void;
|
|
184
186
|
}) {
|
|
187
|
+
const navigate = useNavigate();
|
|
188
|
+
const backButton = <IconActionButton size="sm" icon={<ArrowLeft className="h-4 w-4" />} label={t("inboxTitle")} onClick={() => navigate('/inbox')} />;
|
|
185
189
|
const scrollRestoration = useScrollRestoration<HTMLDivElement>({
|
|
186
190
|
restorationKey: delivery ? `inbox:delivery:${delivery.id}` : null,
|
|
187
191
|
});
|
|
188
192
|
const { onScroll, scrollRef } = scrollRestoration;
|
|
189
193
|
if (!delivery) {
|
|
190
|
-
return <main className="flex min-h-0 flex-col"><InboxEmptyState selection /></main>;
|
|
194
|
+
return <main className="flex min-h-0 flex-col"><div className="md:hidden">{backButton}</div><InboxEmptyState selection /></main>;
|
|
191
195
|
}
|
|
192
196
|
const isHtml = delivery.contentType === "html";
|
|
193
197
|
return (
|
|
194
|
-
<main className="flex min-h-0 flex-col">
|
|
195
|
-
<div className="shrink-0
|
|
196
|
-
<div className="flex min-h-7 min-w-0 items-center gap-
|
|
198
|
+
<main className="flex min-h-0 min-w-0 flex-col max-md:pt-[env(safe-area-inset-top,0px)] max-md:pb-[env(safe-area-inset-bottom,0px)]">
|
|
199
|
+
<div className="shrink-0 border-b border-border/50 px-2 py-2 md:px-6 md:py-3">
|
|
200
|
+
<div className="flex min-h-7 min-w-0 items-center gap-1">
|
|
201
|
+
<div className="md:hidden">{backButton}</div>
|
|
197
202
|
<h2
|
|
198
203
|
title={delivery.title}
|
|
199
|
-
className="min-w-0 truncate text-sm font-medium text-foreground"
|
|
204
|
+
className="min-w-0 flex-1 truncate text-sm font-medium text-foreground md:flex-none"
|
|
200
205
|
>
|
|
201
206
|
{delivery.title}
|
|
202
207
|
</h2>
|
|
203
|
-
<span className="hidden shrink-0 text-muted-foreground
|
|
208
|
+
<span className="hidden shrink-0 text-muted-foreground md:inline" aria-hidden="true">·</span>
|
|
204
209
|
<time
|
|
205
|
-
className="hidden shrink-0 text-[11px] tabular-nums text-muted-foreground
|
|
210
|
+
className="hidden shrink-0 text-[11px] tabular-nums text-muted-foreground md:block"
|
|
206
211
|
dateTime={delivery.createdAt}
|
|
207
212
|
>
|
|
208
213
|
{formatDateTime(delivery.createdAt)}
|
|
209
214
|
</time>
|
|
215
|
+
{isMobile ? <div className="flex shrink-0 items-center">
|
|
216
|
+
<IconActionButton size="sm" icon={<MessageCircle className="h-4 w-4" />} label={t('inboxContinueChat')} disabled={pending} onClick={onContinue} />
|
|
217
|
+
<ContextMenu label={t('inboxTitle')} groups={[{ key: 'delivery', items: [
|
|
218
|
+
{ key: 'read', label: delivery.readAt ? t('inboxMarkUnread') : t('inboxMarkRead'), disabled: pending, onSelect: onReadToggle },
|
|
219
|
+
{ key: 'archive', label: delivery.archivedAt ? t('inboxRestore') : t('inboxArchive'), icon: <Archive className="h-4 w-4" />, disabled: pending, onSelect: onArchiveToggle },
|
|
220
|
+
{ key: 'delete', label: t('inboxDelete'), icon: <Trash2 className="h-4 w-4" />, destructive: true, disabled: pending, onSelect: onDelete },
|
|
221
|
+
] }]}>
|
|
222
|
+
<div><ContextMenuTrigger><IconActionButton size="sm" icon={<MoreVertical className="h-4 w-4" />} label={t('more')} /></ContextMenuTrigger></div>
|
|
223
|
+
</ContextMenu>
|
|
224
|
+
</div> : null}
|
|
210
225
|
</div>
|
|
211
226
|
</div>
|
|
227
|
+
{error ? <p role="alert" className="shrink-0 px-4 py-2 text-sm text-destructive">{error}</p> : null}
|
|
212
228
|
<div className={cn(
|
|
213
229
|
"min-h-0 flex-1",
|
|
214
230
|
isHtml
|
|
215
231
|
? "p-0 md:p-4"
|
|
216
|
-
: "custom-scrollbar overflow-y-auto px-
|
|
232
|
+
: "custom-scrollbar overflow-y-auto overscroll-contain px-4 py-4 sm:px-6 sm:py-6",
|
|
217
233
|
)}
|
|
218
234
|
ref={scrollRef}
|
|
219
235
|
onScroll={onScroll}
|
|
@@ -228,8 +244,7 @@ function InboxDetailPane({
|
|
|
228
244
|
/>
|
|
229
245
|
</div>
|
|
230
246
|
</div>
|
|
231
|
-
<div className="shrink-0 border-t border-border/50 px-
|
|
232
|
-
{error ? <p role="alert" className="mb-2 text-sm text-destructive">{error}</p> : null}
|
|
247
|
+
{!isMobile ? <div className="shrink-0 border-t border-border/50 px-6 py-3">
|
|
233
248
|
<div className="flex items-center justify-between gap-2">
|
|
234
249
|
<div className="hidden md:flex flex-wrap items-center gap-1">
|
|
235
250
|
<Button size="sm" variant="outline" disabled={pending} onClick={onReadToggle}>
|
|
@@ -246,21 +261,12 @@ function InboxDetailPane({
|
|
|
246
261
|
{t("inboxDelete")}
|
|
247
262
|
</Button>
|
|
248
263
|
</div>
|
|
249
|
-
<div className="md:hidden">
|
|
250
|
-
<ContextMenu label={t('inboxTitle')} groups={[{ key: 'delivery', items: [
|
|
251
|
-
{ key: 'read', label: delivery.readAt ? t('inboxMarkUnread') : t('inboxMarkRead'), disabled: pending, onSelect: onReadToggle },
|
|
252
|
-
{ key: 'archive', label: delivery.archivedAt ? t('inboxRestore') : t('inboxArchive'), icon: <Archive className="h-4 w-4" />, disabled: pending, onSelect: onArchiveToggle },
|
|
253
|
-
{ key: 'delete', label: t('inboxDelete'), icon: <Trash2 className="h-4 w-4" />, destructive: true, disabled: pending, onSelect: onDelete },
|
|
254
|
-
] }]}>
|
|
255
|
-
<div><ContextMenuTrigger><IconActionButton icon={<MoreVertical className="h-4 w-4" />} label={t('more')} /></ContextMenuTrigger></div>
|
|
256
|
-
</ContextMenu>
|
|
257
|
-
</div>
|
|
258
264
|
<Button size="sm" disabled={pending} onClick={onContinue}>
|
|
259
265
|
<MessageCircle className="mr-2 h-4 w-4" />
|
|
260
266
|
{t("inboxContinueChat")}
|
|
261
267
|
</Button>
|
|
262
268
|
</div>
|
|
263
|
-
</div>
|
|
269
|
+
</div> : null}
|
|
264
270
|
</main>
|
|
265
271
|
);
|
|
266
272
|
}
|
|
@@ -359,8 +365,8 @@ export function InboxPage() {
|
|
|
359
365
|
});
|
|
360
366
|
};
|
|
361
367
|
|
|
362
|
-
const showList = !isMobile || !
|
|
363
|
-
const showDetail = !isMobile || Boolean(
|
|
368
|
+
const showList = !isMobile || !deliveryId;
|
|
369
|
+
const showDetail = !isMobile || Boolean(deliveryId);
|
|
364
370
|
|
|
365
371
|
return (
|
|
366
372
|
<div className="flex h-full min-h-0 flex-col md:gap-6">
|
|
@@ -372,7 +378,7 @@ export function InboxPage() {
|
|
|
372
378
|
|
|
373
379
|
<div className="min-h-0 flex-1 overflow-hidden bg-background md:rounded-2xl md:border md:border-border/60">
|
|
374
380
|
{deliveriesQuery.isError ? (
|
|
375
|
-
<div role="alert" className="
|
|
381
|
+
<div className="p-4">{isMobile && deliveryId ? <IconActionButton icon={<ArrowLeft className="h-4 w-4" />} label={t("inboxTitle")} onClick={() => navigate('/inbox')} /> : null}<p role="alert" className="text-sm text-destructive">{t("inboxLoadError")}</p></div>
|
|
376
382
|
) : (
|
|
377
383
|
<div className="grid h-full min-h-0 grid-cols-1 md:grid-cols-[300px_minmax(0,1fr)]">
|
|
378
384
|
{showList ? <InboxListPane
|
|
@@ -383,6 +389,7 @@ export function InboxPage() {
|
|
|
383
389
|
/> : null}
|
|
384
390
|
{showDetail ? <InboxDetailPane
|
|
385
391
|
delivery={activeDelivery}
|
|
392
|
+
isMobile={isMobile}
|
|
386
393
|
error={error}
|
|
387
394
|
pending={pendingAction !== null}
|
|
388
395
|
onArchiveToggle={toggleArchive}
|
|
@@ -131,7 +131,7 @@ function GoalCard(props: {
|
|
|
131
131
|
type="button"
|
|
132
132
|
onClick={() => onSelect(scene.scene)}
|
|
133
133
|
className={cn(
|
|
134
|
-
"group flex min-h-[74px] flex-col justify-center rounded-lg border px-3 py-2.5 text-left shadow-sm transition-colors hover:border-gray-300 hover:bg-
|
|
134
|
+
"group flex min-h-[74px] flex-col justify-center rounded-lg border px-3 py-2.5 text-left shadow-sm transition-colors hover:border-gray-300 hover:bg-[var(--interaction-hover)]",
|
|
135
135
|
tone.card,
|
|
136
136
|
)}
|
|
137
137
|
>
|
|
@@ -194,7 +194,7 @@ export function MarketplaceCuratedSceneView(props: {
|
|
|
194
194
|
<button
|
|
195
195
|
type="button"
|
|
196
196
|
onClick={onBack}
|
|
197
|
-
className="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-600 transition-colors hover:bg-
|
|
197
|
+
className="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-600 transition-colors hover:bg-[var(--interaction-hover)] hover:text-gray-900"
|
|
198
198
|
aria-label={readLocalized({ zh: "返回", en: "Back" }, language)}
|
|
199
199
|
>
|
|
200
200
|
<ArrowLeft className="h-4 w-4" />
|
|
@@ -42,7 +42,7 @@ export function SkillShelfCard(props: {
|
|
|
42
42
|
<article
|
|
43
43
|
onClick={() => onOpen(entry)}
|
|
44
44
|
className={cn(
|
|
45
|
-
"group flex min-h-[166px] cursor-pointer flex-col justify-between rounded-xl border border-gray-200/70 bg-white p-3 shadow-sm transition-colors hover:border-gray-300 hover:bg-
|
|
45
|
+
"group flex min-h-[166px] cursor-pointer flex-col justify-between rounded-xl border border-gray-200/70 bg-white p-3 shadow-sm transition-colors hover:border-gray-300 hover:bg-[var(--interaction-hover)]",
|
|
46
46
|
layout === "rail" ? "w-[260px] shrink-0" : "w-full min-w-0",
|
|
47
47
|
)}
|
|
48
48
|
>
|
|
@@ -81,7 +81,7 @@ export function SkillShelfCard(props: {
|
|
|
81
81
|
event.stopPropagation();
|
|
82
82
|
onInstall(item);
|
|
83
83
|
}}
|
|
84
|
-
className="inline-flex h-7 items-center gap-1.5 rounded-md border border-gray-200 bg-white px-2 text-[11px] font-semibold text-gray-700 transition-colors hover:border-gray-300 hover:bg-
|
|
84
|
+
className="inline-flex h-7 items-center gap-1.5 rounded-md border border-gray-200 bg-white px-2 text-[11px] font-semibold text-gray-700 transition-colors hover:border-gray-300 hover:bg-[var(--interaction-hover)] disabled:opacity-50"
|
|
85
85
|
>
|
|
86
86
|
<Download className="h-3.5 w-3.5" />
|
|
87
87
|
{isInstalling ? t("marketplaceInstalling") : t("marketplaceInstall")}
|
|
@@ -125,7 +125,7 @@ function MarketplaceListCardActionButtons(props: MarketplaceListCardActionProps)
|
|
|
125
125
|
onInstall(item);
|
|
126
126
|
}}
|
|
127
127
|
disabled={isInstalling}
|
|
128
|
-
className="inline-flex h-6 items-center gap-1 whitespace-nowrap rounded-md bg-primary px-2 text-[11px] font-medium text-white transition-colors hover:bg-primary-
|
|
128
|
+
className="inline-flex h-6 items-center gap-1 whitespace-nowrap rounded-md bg-primary px-2 text-[11px] font-medium text-white transition-colors hover:bg-[hsl(var(--primary-hover))] disabled:opacity-50"
|
|
129
129
|
>
|
|
130
130
|
<Download className="h-3 w-3" />
|
|
131
131
|
{isInstalling ? t("marketplaceInstalling") : t("marketplaceInstall")}
|
|
@@ -139,7 +139,7 @@ function MarketplaceListCardActionButtons(props: MarketplaceListCardActionProps)
|
|
|
139
139
|
event.stopPropagation();
|
|
140
140
|
onManage("update", record);
|
|
141
141
|
}}
|
|
142
|
-
className="inline-flex h-6 items-center gap-1 whitespace-nowrap rounded-md border border-blue-200/80 bg-white px-2 text-[11px] font-medium text-blue-600 transition-colors hover:border-blue-300 hover:bg-
|
|
142
|
+
className="inline-flex h-6 items-center gap-1 whitespace-nowrap rounded-md border border-blue-200/80 bg-white px-2 text-[11px] font-medium text-blue-600 transition-colors hover:border-blue-300 hover:bg-[var(--interaction-hover)] disabled:opacity-50"
|
|
143
143
|
>
|
|
144
144
|
<RefreshCw className="h-3 w-3" />
|
|
145
145
|
{busyAction === "update"
|
|
@@ -155,7 +155,7 @@ function MarketplaceListCardActionButtons(props: MarketplaceListCardActionProps)
|
|
|
155
155
|
event.stopPropagation();
|
|
156
156
|
onManage("uninstall", record);
|
|
157
157
|
}}
|
|
158
|
-
className="inline-flex h-6 items-center gap-1 whitespace-nowrap rounded-md border border-gray-200/80 bg-white px-2 text-[11px] font-medium text-gray-500 transition-colors hover:border-rose-200 hover:bg-
|
|
158
|
+
className="inline-flex h-6 items-center gap-1 whitespace-nowrap rounded-md border border-gray-200/80 bg-white px-2 text-[11px] font-medium text-gray-500 transition-colors hover:border-rose-200 hover:bg-destructive/10 hover:text-rose-600 disabled:opacity-50"
|
|
159
159
|
>
|
|
160
160
|
<Trash2 className="h-3 w-3" />
|
|
161
161
|
{busyAction === "uninstall"
|
|
@@ -263,7 +263,7 @@ export function MarketplaceListCard(props: {
|
|
|
263
263
|
return (
|
|
264
264
|
<article
|
|
265
265
|
onClick={onOpen}
|
|
266
|
-
className="group flex h-full min-h-[156px] cursor-pointer flex-col rounded-xl border border-gray-200/60 bg-white p-3.5 shadow-sm transition-colors hover:border-gray-300 hover:bg-
|
|
266
|
+
className="group flex h-full min-h-[156px] cursor-pointer flex-col rounded-xl border border-gray-200/60 bg-white p-3.5 shadow-sm transition-colors hover:border-gray-300 hover:bg-[var(--interaction-hover)]"
|
|
267
267
|
>
|
|
268
268
|
<div className="flex min-w-0 items-start gap-2.5">
|
|
269
269
|
<MarketplaceItemIcon
|
|
@@ -150,13 +150,13 @@ export function MarketplacePage({
|
|
|
150
150
|
<TabsList className="mb-0 h-auto flex-1 justify-start gap-4 sm:gap-6 rounded-none border-b-0 bg-transparent p-0 text-muted-foreground">
|
|
151
151
|
<TabsTrigger
|
|
152
152
|
value="all"
|
|
153
|
-
className="rounded-none border-b-2 border-transparent bg-transparent px-0 pb-3 pt-0 shadow-none hover:bg-
|
|
153
|
+
className="rounded-none border-b-2 border-transparent bg-transparent px-0 pb-3 pt-0 shadow-none hover:bg-[var(--interaction-hover)] data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-gray-950 data-[state=active]:shadow-none"
|
|
154
154
|
>
|
|
155
155
|
{t("marketplaceTabMarketplaceSkills")}
|
|
156
156
|
</TabsTrigger>
|
|
157
157
|
<TabsTrigger
|
|
158
158
|
value="installed"
|
|
159
|
-
className="gap-1.5 rounded-none border-b-2 border-transparent bg-transparent px-0 pb-3 pt-0 shadow-none hover:bg-
|
|
159
|
+
className="gap-1.5 rounded-none border-b-2 border-transparent bg-transparent px-0 pb-3 pt-0 shadow-none hover:bg-[var(--interaction-hover)] data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-gray-950 data-[state=active]:shadow-none"
|
|
160
160
|
>
|
|
161
161
|
{t("marketplaceTabInstalledSkills")}
|
|
162
162
|
<span className="text-[11px] font-medium text-gray-500">
|
|
@@ -98,7 +98,7 @@ export function McpMarketplaceCard(props: {
|
|
|
98
98
|
type="button"
|
|
99
99
|
size="sm"
|
|
100
100
|
variant="outline"
|
|
101
|
-
className="rounded-xl border-blue-200 text-blue-700 hover:border-blue-300 hover:bg-
|
|
101
|
+
className="rounded-xl border-blue-200 text-blue-700 hover:border-blue-300 hover:bg-[var(--interaction-hover)] hover:text-blue-700"
|
|
102
102
|
onClick={(event) => {
|
|
103
103
|
event.stopPropagation();
|
|
104
104
|
onDoctor();
|
|
@@ -112,7 +112,7 @@ export function McpMarketplaceCard(props: {
|
|
|
112
112
|
type="button"
|
|
113
113
|
size="sm"
|
|
114
114
|
variant="outline"
|
|
115
|
-
className="rounded-xl border-rose-200 text-rose-600 hover:border-rose-300 hover:bg-
|
|
115
|
+
className="rounded-xl border-rose-200 text-rose-600 hover:border-rose-300 hover:bg-destructive/10 hover:text-rose-600"
|
|
116
116
|
onClick={(event) => {
|
|
117
117
|
event.stopPropagation();
|
|
118
118
|
onRemove();
|
|
@@ -288,8 +288,8 @@ export function McpMarketplacePage() {
|
|
|
288
288
|
className={cn(
|
|
289
289
|
"relative flex min-w-0 items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-colors",
|
|
290
290
|
isActive
|
|
291
|
-
? "bg-
|
|
292
|
-
: "text-muted-foreground hover:bg-
|
|
291
|
+
? "bg-[var(--interaction-selection)] text-foreground"
|
|
292
|
+
: "text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-foreground"
|
|
293
293
|
)}
|
|
294
294
|
>
|
|
295
295
|
<Icon className="h-4 w-4 shrink-0" />
|
|
@@ -297,7 +297,7 @@ export function McpMarketplacePage() {
|
|
|
297
297
|
{tab.id === 'installed' && typeof tab.count === 'number' && (
|
|
298
298
|
<span className={cn(
|
|
299
299
|
"flex h-5 min-w-5 items-center justify-center rounded-full px-1.5 text-[11px] font-semibold",
|
|
300
|
-
isActive ? "bg-
|
|
300
|
+
isActive ? "bg-[var(--interaction-selection)] text-foreground" : "bg-muted text-muted-foreground"
|
|
301
301
|
)}>
|
|
302
302
|
{tab.count}
|
|
303
303
|
</span>
|
|
@@ -40,7 +40,7 @@ export function PanelAppListItem({
|
|
|
40
40
|
setIsDeleteDialogOpen(true);
|
|
41
41
|
};
|
|
42
42
|
return (
|
|
43
|
-
<div className="group w-full min-w-0 rounded-lg border border-border/60 bg-card px-2.5 py-2.5 transition-colors hover:bg-
|
|
43
|
+
<div className="group w-full min-w-0 rounded-lg border border-border/60 bg-card px-2.5 py-2.5 transition-colors hover:bg-[var(--interaction-hover)]">
|
|
44
44
|
<div className="flex min-w-0 items-start gap-2">
|
|
45
45
|
<button type="button" onClick={onOpen} className="min-w-0 flex-1 text-left">
|
|
46
46
|
<span className="flex min-w-0 items-center gap-2">
|
|
@@ -59,7 +59,7 @@ export function PanelAppListItem({
|
|
|
59
59
|
type="button"
|
|
60
60
|
onClick={handleFavorite}
|
|
61
61
|
disabled={favoritePending}
|
|
62
|
-
className="rounded-md p-1.5 text-muted-foreground/70 transition-colors hover:bg-
|
|
62
|
+
className="rounded-md p-1.5 text-muted-foreground/70 transition-colors hover:bg-[var(--interaction-hover)] hover:text-foreground disabled:opacity-50"
|
|
63
63
|
title={favoriteLabel}
|
|
64
64
|
aria-label={favoriteLabel}
|
|
65
65
|
>
|
|
@@ -69,7 +69,7 @@ export function PanelAppListItem({
|
|
|
69
69
|
<PopoverTrigger asChild>
|
|
70
70
|
<button
|
|
71
71
|
type="button"
|
|
72
|
-
className="rounded-md p-1.5 text-muted-foreground/70 transition-colors hover:bg-
|
|
72
|
+
className="rounded-md p-1.5 text-muted-foreground/70 transition-colors hover:bg-[var(--interaction-hover)] hover:text-foreground"
|
|
73
73
|
aria-label={t('panelAppsMoreActions')}
|
|
74
74
|
disabled={deletePending}
|
|
75
75
|
>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useState } from "react";
|
|
2
|
-
import { useNavigate, useParams } from "react-router-dom";
|
|
2
|
+
import { useLocation, useNavigate, useParams } from "react-router-dom";
|
|
3
3
|
import { useProjects } from "@/shared/hooks/use-projects";
|
|
4
4
|
import { useViewportLayout } from "@/app/hooks/use-viewport-layout";
|
|
5
5
|
import { t } from "@/shared/lib/i18n";
|
|
@@ -43,6 +43,7 @@ export function ProjectsPage() {
|
|
|
43
43
|
tab?: string;
|
|
44
44
|
}>();
|
|
45
45
|
const navigate = useNavigate();
|
|
46
|
+
const { state } = useLocation();
|
|
46
47
|
const presenter = usePresenter();
|
|
47
48
|
const { isMobile } = useViewportLayout();
|
|
48
49
|
const projects = useProjects();
|
|
@@ -86,7 +87,7 @@ export function ProjectsPage() {
|
|
|
86
87
|
<select
|
|
87
88
|
id="project-home-selection"
|
|
88
89
|
value=""
|
|
89
|
-
onChange={(event) => navigate(`/projects/${encodeURIComponent(event.target.value)}/overview
|
|
90
|
+
onChange={(event) => navigate(`/projects/${encodeURIComponent(event.target.value)}/overview`, { state })}
|
|
90
91
|
className="min-h-11 w-full rounded-xl border border-border bg-card px-3 text-base text-foreground"
|
|
91
92
|
>
|
|
92
93
|
<option value="" disabled>{t("projectsChoose")}</option>
|
|
@@ -117,6 +118,7 @@ export function ProjectsPage() {
|
|
|
117
118
|
onValueChange={(value) =>
|
|
118
119
|
navigate(
|
|
119
120
|
`/projects/${encodeURIComponent(selectedProject.id)}/${value}`,
|
|
121
|
+
{ state },
|
|
120
122
|
)
|
|
121
123
|
}
|
|
122
124
|
>
|
|
@@ -122,7 +122,7 @@ export function PwaInstallBanner() {
|
|
|
122
122
|
<button
|
|
123
123
|
type='button'
|
|
124
124
|
aria-label={t('pwaInstallDismiss')}
|
|
125
|
-
className='rounded-full p-1 text-gray-400 transition hover:bg-
|
|
125
|
+
className='rounded-full p-1 text-gray-400 transition hover:bg-[var(--interaction-hover)] hover:text-gray-600'
|
|
126
126
|
onClick={() => {
|
|
127
127
|
pwaInstallManager.dismissInstallPrompt();
|
|
128
128
|
}}
|
package/src/features/right-panel-resources/components/__tests__/page-resource-sidebar-nav.test.tsx
CHANGED
|
@@ -110,7 +110,15 @@ describe("shared left pages", () => {
|
|
|
110
110
|
it("preserves the collapsed group preference", async () => {
|
|
111
111
|
mocks.entries = [createEntry({ mainSidebar: true })];
|
|
112
112
|
renderNav();
|
|
113
|
-
|
|
113
|
+
const groupTrigger = screen.getByRole("button", { name: "Pages 1" });
|
|
114
|
+
expect(groupTrigger.className).toContain(
|
|
115
|
+
"hover:bg-[var(--sidebar-interaction-hover)]",
|
|
116
|
+
);
|
|
117
|
+
expect(groupTrigger.className).toContain(
|
|
118
|
+
"active:bg-[var(--sidebar-interaction-selection)]",
|
|
119
|
+
);
|
|
120
|
+
expect(groupTrigger.className).toContain("focus-visible:ring-1");
|
|
121
|
+
await userEvent.click(groupTrigger);
|
|
114
122
|
expect(screen.queryByRole("link")).toBeNull();
|
|
115
123
|
expect(
|
|
116
124
|
useViewportLayoutStore.getState().isMainSidebarAppGroupCollapsed,
|
|
@@ -105,7 +105,7 @@ export function PageResourceSidebarNav({
|
|
|
105
105
|
type="button"
|
|
106
106
|
aria-expanded={!groupCollapsed}
|
|
107
107
|
onClick={viewportLayoutManager.toggleMainSidebarAppGroupCollapsed}
|
|
108
|
-
className=
|
|
108
|
+
className={`flex w-full items-center gap-2 px-2.5 py-1.5 text-[13px] ${SIDEBAR_RAIL_SURFACE_CLASS}`}
|
|
109
109
|
>
|
|
110
110
|
<ChevronDown
|
|
111
111
|
className={`h-3.5 w-3.5 ${groupCollapsed ? "-rotate-90" : ""}`}
|
|
@@ -52,7 +52,7 @@ const HOME_ITEM_VIEW_BY_ID: Record<string, RightPanelResourceHomeItem> = {
|
|
|
52
52
|
function resolveHomeItemView(item: RightPanelResourceHomeNavigationItem): RightPanelResourceHomeItem {
|
|
53
53
|
return HOME_ITEM_VIEW_BY_ID[item.id] ?? {
|
|
54
54
|
accentClassName: 'bg-gray-50 text-gray-700',
|
|
55
|
-
hoverAccentClassName: 'group-hover:bg-
|
|
55
|
+
hoverAccentClassName: 'group-hover:bg-[var(--interaction-hover)]',
|
|
56
56
|
icon: <Boxes className="h-5 w-5" />,
|
|
57
57
|
};
|
|
58
58
|
}
|
|
@@ -66,7 +66,7 @@ export function ServiceActionRow({
|
|
|
66
66
|
<button
|
|
67
67
|
type="button"
|
|
68
68
|
disabled={grantAgentPending || availableAgents.length === 0}
|
|
69
|
-
className="ml-1 rounded-md p-1 text-muted-foreground/70 transition-colors hover:bg-
|
|
69
|
+
className="ml-1 rounded-md p-1 text-muted-foreground/70 transition-colors hover:bg-[var(--interaction-hover)] hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border disabled:cursor-not-allowed disabled:opacity-40"
|
|
70
70
|
title={t("serviceAppsGrantToAgent")}
|
|
71
71
|
aria-label={t("serviceAppsGrantToAgent")}
|
|
72
72
|
>
|
|
@@ -85,7 +85,7 @@ export function ServiceActionRow({
|
|
|
85
85
|
onGrantAgent(action.id, agent.id);
|
|
86
86
|
setAgentMenuOpen(false);
|
|
87
87
|
}}
|
|
88
|
-
className="flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left text-xs text-foreground transition-colors hover:bg-
|
|
88
|
+
className="flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left text-xs text-foreground transition-colors hover:bg-[var(--interaction-hover)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
|
|
89
89
|
>
|
|
90
90
|
<Bot className="h-3.5 w-3.5 text-muted-foreground" />
|
|
91
91
|
<span className="min-w-0 truncate">
|
|
@@ -111,7 +111,7 @@ export function ServiceActionRow({
|
|
|
111
111
|
<button
|
|
112
112
|
type="button"
|
|
113
113
|
onClick={() => onRevoke(grant)}
|
|
114
|
-
className="rounded-md p-1 text-muted-foreground/70 transition-colors hover:bg-
|
|
114
|
+
className="rounded-md p-1 text-muted-foreground/70 transition-colors hover:bg-[var(--interaction-hover)] hover:text-rose-600 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border"
|
|
115
115
|
title={t("serviceAppsRevokeGrant")}
|
|
116
116
|
aria-label={t("serviceAppsRevokeGrant")}
|
|
117
117
|
>
|
|
@@ -99,7 +99,7 @@ export function ServiceAppListItem({
|
|
|
99
99
|
};
|
|
100
100
|
return (
|
|
101
101
|
<TooltipProvider delayDuration={250}>
|
|
102
|
-
<section className="group bg-card transition-colors hover:bg-
|
|
102
|
+
<section className="group bg-card transition-colors hover:bg-[var(--interaction-hover)]">
|
|
103
103
|
<div className="flex items-start gap-3 px-4 py-3.5">
|
|
104
104
|
<div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground">
|
|
105
105
|
<Server className="h-4 w-4" />
|
|
@@ -155,7 +155,7 @@ export function ServiceAppListItem({
|
|
|
155
155
|
<PopoverTrigger asChild>
|
|
156
156
|
<button
|
|
157
157
|
type="button"
|
|
158
|
-
className="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-
|
|
158
|
+
className="rounded-md p-1.5 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 disabled:opacity-50"
|
|
159
159
|
aria-label={t("serviceAppsMoreActions")}
|
|
160
160
|
disabled={deletePending}
|
|
161
161
|
>
|
|
@@ -208,7 +208,7 @@ export function ServiceAppListItem({
|
|
|
208
208
|
<button
|
|
209
209
|
type="button"
|
|
210
210
|
onClick={() => onActionsOpenChange(!actionsOpen)}
|
|
211
|
-
className="flex min-w-0 flex-1 items-center justify-between gap-2 px-4 py-2 text-left text-xs text-muted-foreground transition-colors hover:bg-
|
|
211
|
+
className="flex min-w-0 flex-1 items-center justify-between gap-2 px-4 py-2 text-left text-xs text-muted-foreground transition-colors hover:bg-[var(--interaction-hover)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-border"
|
|
212
212
|
aria-expanded={actionsOpen}
|
|
213
213
|
>
|
|
214
214
|
<div className="flex min-w-0 items-center gap-2">
|
|
@@ -228,7 +228,7 @@ export function ServiceAppListItem({
|
|
|
228
228
|
<button
|
|
229
229
|
type="button"
|
|
230
230
|
onClick={() => setIsDiagnosticsOpen((open) => !open)}
|
|
231
|
-
className="flex shrink-0 items-center gap-1 border-l border-border/60 px-3 text-xs text-muted-foreground transition-colors hover:bg-
|
|
231
|
+
className="flex shrink-0 items-center gap-1 border-l border-border/60 px-3 text-xs text-muted-foreground transition-colors hover:bg-[var(--interaction-hover)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-border"
|
|
232
232
|
aria-expanded={isDiagnosticsOpen}
|
|
233
233
|
>
|
|
234
234
|
<span>{t("serviceAppsDetails")}</span>
|
|
@@ -110,7 +110,7 @@ export function ServiceAppsPanel({
|
|
|
110
110
|
<TooltipTrigger asChild>
|
|
111
111
|
<button
|
|
112
112
|
type="button"
|
|
113
|
-
className="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-
|
|
113
|
+
className="rounded-md p-1.5 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"
|
|
114
114
|
aria-label={t("serviceAppsRefresh")}
|
|
115
115
|
onClick={refetch}
|
|
116
116
|
>
|
|
@@ -143,7 +143,7 @@ export function ProviderModelList(props: ProviderModelListProps) {
|
|
|
143
143
|
return (
|
|
144
144
|
<label
|
|
145
145
|
key={modelName}
|
|
146
|
-
className="inline-flex max-w-full cursor-pointer items-center gap-2 rounded-full border border-border/55 bg-muted/45 px-3 py-1.5 hover:bg-
|
|
146
|
+
className="inline-flex max-w-full cursor-pointer items-center gap-2 rounded-full border border-border/55 bg-muted/45 px-3 py-1.5 hover:bg-[var(--interaction-hover)]"
|
|
147
147
|
>
|
|
148
148
|
<input
|
|
149
149
|
type="checkbox"
|
|
@@ -180,7 +180,7 @@ export function ProviderModelList(props: ProviderModelListProps) {
|
|
|
180
180
|
<PopoverTrigger asChild>
|
|
181
181
|
<button
|
|
182
182
|
type="button"
|
|
183
|
-
className="inline-flex h-5 w-5 items-center justify-center rounded-full text-muted-foreground/70 opacity-100 transition-opacity hover:bg-
|
|
183
|
+
className="inline-flex h-5 w-5 items-center justify-center rounded-full text-muted-foreground/70 opacity-100 transition-opacity hover:bg-[var(--interaction-hover)] hover:text-foreground md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100"
|
|
184
184
|
aria-label={t("providerModelThinkingTitle")}
|
|
185
185
|
title={t("providerModelThinkingTitle")}
|
|
186
186
|
>
|
|
@@ -224,8 +224,8 @@ export function ProviderModelList(props: ProviderModelListProps) {
|
|
|
224
224
|
}
|
|
225
225
|
className={`rounded-full border px-2.5 py-1 text-xs font-medium transition-colors ${
|
|
226
226
|
selected
|
|
227
|
-
? "border-
|
|
228
|
-
: "border-border/55 bg-muted/50 text-muted-foreground hover:border-border hover:bg-
|
|
227
|
+
? "border-[var(--interaction-selection-border)] bg-[var(--interaction-selection)] text-foreground"
|
|
228
|
+
: "border-border/55 bg-muted/50 text-muted-foreground hover:border-border hover:bg-[var(--interaction-hover)] hover:text-foreground"
|
|
229
229
|
}`}
|
|
230
230
|
>
|
|
231
231
|
{formatThinkingLevelLabel(level)}
|
|
@@ -274,7 +274,7 @@ export function ProviderModelList(props: ProviderModelListProps) {
|
|
|
274
274
|
<button
|
|
275
275
|
type="button"
|
|
276
276
|
onClick={() => onRemoveModel(modelName)}
|
|
277
|
-
className="inline-flex h-5 w-5 items-center justify-center rounded-full text-muted-foreground/70 opacity-100 transition-opacity hover:bg-
|
|
277
|
+
className="inline-flex h-5 w-5 items-center justify-center rounded-full text-muted-foreground/70 opacity-100 transition-opacity hover:bg-[var(--interaction-hover)] hover:text-foreground md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100"
|
|
278
278
|
aria-label={t("remove")}
|
|
279
279
|
>
|
|
280
280
|
<X className="h-3 w-3" />
|
|
@@ -69,7 +69,7 @@ export function ProviderModelSuggestionsPanel(props: ProviderModelSuggestionsPan
|
|
|
69
69
|
<button
|
|
70
70
|
type='button'
|
|
71
71
|
aria-expanded={expanded}
|
|
72
|
-
className='flex min-w-0 flex-1 items-center gap-1.5 rounded-lg px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-
|
|
72
|
+
className='flex min-w-0 flex-1 items-center gap-1.5 rounded-lg px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-[var(--interaction-hover)] hover:text-foreground'
|
|
73
73
|
onClick={() => onExpandedChange(!expanded)}
|
|
74
74
|
>
|
|
75
75
|
<Sparkles className='h-3.5 w-3.5 shrink-0 text-primary' />
|
|
@@ -81,7 +81,7 @@ export function ProviderModelSuggestionsPanel(props: ProviderModelSuggestionsPan
|
|
|
81
81
|
{models.length <= BULK_ADD_LIMIT ? (
|
|
82
82
|
<button
|
|
83
83
|
type='button'
|
|
84
|
-
className='shrink-0 rounded-lg px-2 py-1.5 text-xs font-medium text-primary transition-colors hover:bg-
|
|
84
|
+
className='shrink-0 rounded-lg px-2 py-1.5 text-xs font-medium text-primary transition-colors hover:bg-[var(--interaction-hover)]'
|
|
85
85
|
onClick={() => addModels(models)}
|
|
86
86
|
>
|
|
87
87
|
{t('providerModelsSuggestionsAddAll')}
|
|
@@ -105,7 +105,7 @@ export function ProviderModelSuggestionsPanel(props: ProviderModelSuggestionsPan
|
|
|
105
105
|
{visibleModels.map((modelName) => (
|
|
106
106
|
<label
|
|
107
107
|
key={modelName}
|
|
108
|
-
className='grid min-w-0 cursor-pointer grid-cols-[auto_minmax(0,1fr)] items-center gap-2 rounded-lg px-2 py-1.5 hover:bg-
|
|
108
|
+
className='grid min-w-0 cursor-pointer grid-cols-[auto_minmax(0,1fr)] items-center gap-2 rounded-lg px-2 py-1.5 hover:bg-[var(--interaction-hover)]'
|
|
109
109
|
>
|
|
110
110
|
<input
|
|
111
111
|
type='checkbox'
|
|
@@ -137,7 +137,7 @@ export function ProviderModelSuggestionsPanel(props: ProviderModelSuggestionsPan
|
|
|
137
137
|
<button
|
|
138
138
|
type='button'
|
|
139
139
|
disabled={selectedModels.length === 0}
|
|
140
|
-
className='shrink-0 rounded-md bg-primary/10 px-2 py-1 text-[11px] font-medium text-primary transition-colors hover:bg-
|
|
140
|
+
className='shrink-0 rounded-md bg-primary/10 px-2 py-1 text-[11px] font-medium text-primary transition-colors hover:bg-[var(--interaction-hover)] disabled:cursor-not-allowed disabled:opacity-45'
|
|
141
141
|
onClick={() => addModels(selectedModels)}
|
|
142
142
|
>
|
|
143
143
|
{t('providerModelsSuggestionsAddSelected')}
|
|
@@ -16,7 +16,7 @@ export function ProviderPillSelector(props: ProviderPillSelectorProps) {
|
|
|
16
16
|
type="button"
|
|
17
17
|
onClick={() => onChange(option.value)}
|
|
18
18
|
aria-pressed={selected}
|
|
19
|
-
className={`rounded-full border px-3 py-1.5 text-xs font-medium transition-colors ${selected ? 'border-
|
|
19
|
+
className={`rounded-full border px-3 py-1.5 text-xs font-medium transition-colors ${selected ? 'border-[var(--interaction-selection-border)] bg-[var(--interaction-selection)] text-foreground' : 'border-border/55 bg-muted/50 text-muted-foreground hover:border-border hover:bg-[var(--interaction-hover)] hover:text-foreground'}`}
|
|
20
20
|
>
|
|
21
21
|
{option.label}
|
|
22
22
|
</button>
|
|
@@ -100,8 +100,8 @@ export function AppearanceSettingsPage() {
|
|
|
100
100
|
className={cn(
|
|
101
101
|
'flex min-w-0 items-start gap-3 rounded-lg px-3 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',
|
|
102
102
|
selected
|
|
103
|
-
? 'bg-
|
|
104
|
-
: 'text-muted-foreground hover:bg-
|
|
103
|
+
? 'bg-[var(--interaction-selection)] text-foreground'
|
|
104
|
+
: 'text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-foreground'
|
|
105
105
|
)}
|
|
106
106
|
>
|
|
107
107
|
<span
|
|
@@ -156,7 +156,7 @@ export function ProvidersConfigPage() {
|
|
|
156
156
|
<div className='grid max-h-[24rem] grid-cols-2 gap-2 overflow-y-auto sm:grid-cols-3'>
|
|
157
157
|
<button
|
|
158
158
|
type='button'
|
|
159
|
-
className='flex min-h-20 w-full flex-col items-start gap-2 rounded-lg border border-dashed border-border/70 bg-muted/20 px-3 py-2 text-left transition-colors hover:border-border hover:bg-
|
|
159
|
+
className='flex min-h-20 w-full flex-col items-start gap-2 rounded-lg border border-dashed border-border/70 bg-muted/20 px-3 py-2 text-left transition-colors hover:border-border hover:bg-[var(--interaction-hover)]'
|
|
160
160
|
onClick={async () => {
|
|
161
161
|
try {
|
|
162
162
|
const result = await createProvider.mutateAsync({
|
|
@@ -183,7 +183,7 @@ export function ProvidersConfigPage() {
|
|
|
183
183
|
<button
|
|
184
184
|
key={template.providerType}
|
|
185
185
|
type='button'
|
|
186
|
-
className='flex min-h-20 w-full flex-col items-start gap-2 rounded-lg border border-border/55 bg-muted/15 px-3 py-2 text-left transition-colors hover:border-border/80 hover:bg-
|
|
186
|
+
className='flex min-h-20 w-full flex-col items-start gap-2 rounded-lg border border-border/55 bg-muted/15 px-3 py-2 text-left transition-colors hover:border-border/80 hover:bg-[var(--interaction-hover)]'
|
|
187
187
|
onClick={async () => {
|
|
188
188
|
try {
|
|
189
189
|
const result = await createProvider.mutateAsync({
|
|
@@ -254,8 +254,8 @@ export function ProvidersConfigPage() {
|
|
|
254
254
|
className={cn(
|
|
255
255
|
'group w-full rounded-xl p-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',
|
|
256
256
|
resolvedSelectedProvider === provider.providerId
|
|
257
|
-
? 'bg-
|
|
258
|
-
: 'bg-transparent text-muted-foreground hover:bg-
|
|
257
|
+
? 'bg-[var(--interaction-selection)] text-foreground'
|
|
258
|
+
: 'bg-transparent text-muted-foreground hover:bg-[var(--interaction-hover)] hover:text-foreground'
|
|
259
259
|
)}
|
|
260
260
|
>
|
|
261
261
|
<div className='relative min-h-10'>
|
|
@@ -300,7 +300,7 @@ export function ProvidersConfigPage() {
|
|
|
300
300
|
<PopoverTrigger asChild>
|
|
301
301
|
<button
|
|
302
302
|
type='button'
|
|
303
|
-
className='inline-flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground/70 hover:bg-
|
|
303
|
+
className='inline-flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground/70 hover:bg-[var(--interaction-hover)] hover:text-foreground'
|
|
304
304
|
onClick={(event) => event.stopPropagation()}
|
|
305
305
|
title={t('more')}
|
|
306
306
|
>
|
|
@@ -310,7 +310,7 @@ export function ProvidersConfigPage() {
|
|
|
310
310
|
<PopoverContent className='w-40 p-1' align='end' onClick={(event) => event.stopPropagation()}>
|
|
311
311
|
<button
|
|
312
312
|
type='button'
|
|
313
|
-
className='flex w-full items-center gap-2 rounded-md px-2 py-2 text-sm text-red-600 hover:bg-
|
|
313
|
+
className='flex w-full items-center gap-2 rounded-md px-2 py-2 text-sm text-red-600 hover:bg-destructive/10'
|
|
314
314
|
onClick={() => setProviderToDelete(provider.providerId)}
|
|
315
315
|
>
|
|
316
316
|
<Trash2 className='h-4 w-4' />
|