From e8d4397b3af4bb9b03f37bcd3612b8f883ff6ce6 Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Sat, 22 Nov 2025 14:03:09 +0800 Subject: [PATCH] refactor(ui): unify dialog styles and improve layout consistency Standardize dialog and panel components across the application. - Update dialog background to use semantic color tokens - Adjust FullScreenPanel max-width to 56rem for better alignment - Add drag region and prevent body scroll in full-screen panels - Optimize button sizes and spacing in panel headers - Apply consistent styling to all dialog-based components --- src/components/UsageScriptModal.tsx | 30 ++++++++--------- src/components/common/FullScreenPanel.tsx | 30 +++++++++-------- src/components/mcp/UnifiedMcpPanel.tsx | 2 +- src/components/prompts/PromptPanel.tsx | 2 +- .../providers/EditProviderDialog.tsx | 20 +++++------ .../providers/forms/BasicFormFields.tsx | 33 +++++++++---------- .../forms/ProviderPresetSelector.tsx | 4 +-- src/components/settings/SettingsPage.tsx | 4 +-- src/components/skills/SkillsPage.tsx | 2 +- src/components/ui/dialog.tsx | 2 +- 10 files changed, 65 insertions(+), 64 deletions(-) diff --git a/src/components/UsageScriptModal.tsx b/src/components/UsageScriptModal.tsx index 7118799..a05f4b2 100644 --- a/src/components/UsageScriptModal.tsx +++ b/src/components/UsageScriptModal.tsx @@ -348,7 +348,7 @@ const UsageScriptModal: React.FC = ({ onClose={onClose} footer={footer} > -
+

{t("usageScript.enableUsageQuery")} @@ -369,7 +369,7 @@ const UsageScriptModal: React.FC = ({ {script.enabled && (

{/* 预设模板选择 */} -
+
@@ -476,7 +476,7 @@ const UsageScriptModal: React.FC = ({ } placeholder="https://api.newapi.com" autoComplete="off" - className="bg-card border-border-default" + className="border-white/10" />
@@ -499,7 +499,7 @@ const UsageScriptModal: React.FC = ({ "usageScript.accessTokenPlaceholder", )} autoComplete="off" - className="bg-card border-border-default" + className="border-white/10" /> {script.accessToken && (
@@ -548,7 +548,7 @@ const UsageScriptModal: React.FC = ({
{/* 脚本配置 */} -
+

{t("usageScript.scriptConfig")} @@ -574,7 +574,7 @@ const UsageScriptModal: React.FC = ({ }); }} placeholder={t("usageScript.requestUrlPlaceholder")} - className="bg-card border-border-default" + className="border-white/10" />

@@ -597,7 +597,7 @@ const UsageScriptModal: React.FC = ({ }); }} placeholder="GET / POST" - className="bg-card border-border-default" + className="border-white/10" />
@@ -622,7 +622,7 @@ const UsageScriptModal: React.FC = ({ timeout: validateTimeout(e.target.value), }) } - className="bg-card border-border-default" + className="border-white/10" />
@@ -706,7 +706,7 @@ const UsageScriptModal: React.FC = ({ ), }) } - className="bg-card border-border-default" + className="border-white/10" />

{t("usageScript.autoQueryIntervalHint")} @@ -716,7 +716,7 @@ const UsageScriptModal: React.FC = ({

{/* 提取器代码 */} -
+
{/* 帮助信息 */} -
+

{t("usageScript.scriptHelp")}

{t("usageScript.configFormat")} -
+                
                   {`({
   request: {
     url: "{{baseUrl}}/api/usage",
diff --git a/src/components/common/FullScreenPanel.tsx b/src/components/common/FullScreenPanel.tsx
index b98d2e4..56e3cab 100644
--- a/src/components/common/FullScreenPanel.tsx
+++ b/src/components/common/FullScreenPanel.tsx
@@ -23,6 +23,15 @@ export const FullScreenPanel: React.FC = ({
   children,
   footer,
 }) => {
+  React.useEffect(() => {
+    if (isOpen) {
+      document.body.style.overflow = "hidden";
+    }
+    return () => {
+      document.body.style.overflow = "";
+    };
+  }, [isOpen]);
+
   if (!isOpen) return null;
 
   return createPortal(
@@ -32,26 +41,21 @@ export const FullScreenPanel: React.FC = ({
     >
       {/* Header */}
       
-
-

{title}

{/* Content */} -
-
+
+
{children}
@@ -62,7 +66,7 @@ export const FullScreenPanel: React.FC = ({ className="flex-shrink-0 py-4 border-t border-border-default" style={{ backgroundColor: "hsl(var(--background))" }} > -
+
{footer}
diff --git a/src/components/mcp/UnifiedMcpPanel.tsx b/src/components/mcp/UnifiedMcpPanel.tsx index b740753..4d5f3f8 100644 --- a/src/components/mcp/UnifiedMcpPanel.tsx +++ b/src/components/mcp/UnifiedMcpPanel.tsx @@ -115,7 +115,7 @@ const UnifiedMcpPanel = React.forwardRef< }; return ( -
+
{/* Info Section */}
diff --git a/src/components/prompts/PromptPanel.tsx b/src/components/prompts/PromptPanel.tsx index f07bf2e..4b1761a 100644 --- a/src/components/prompts/PromptPanel.tsx +++ b/src/components/prompts/PromptPanel.tsx @@ -80,7 +80,7 @@ const PromptPanel = React.forwardRef( const enabledPrompt = promptEntries.find(([_, p]) => p.enabled); return ( -
+
{t("prompts.count", { count: promptEntries.length })} ·{" "} diff --git a/src/components/providers/EditProviderDialog.tsx b/src/components/providers/EditProviderDialog.tsx index 4f2db7b..cbf2849 100644 --- a/src/components/providers/EditProviderDialog.tsx +++ b/src/components/providers/EditProviderDialog.tsx @@ -111,6 +111,16 @@ export function EditProviderDialog({ isOpen={open} title={t("provider.editProvider")} onClose={() => onOpenChange(false)} + footer={ + + } > -
- -
); } diff --git a/src/components/providers/forms/BasicFormFields.tsx b/src/components/providers/forms/BasicFormFields.tsx index 2242303..50863cf 100644 --- a/src/components/providers/forms/BasicFormFields.tsx +++ b/src/components/providers/forms/BasicFormFields.tsx @@ -69,25 +69,22 @@ export function BasicFormFields({ form }: BasicFormFieldsProps) { className="p-0 sm:rounded-none" >
-
- - - -

- {t("providerIcon.selectIcon", { - defaultValue: "选择图标", - })} -

+
+
+ + + +

+ {t("providerIcon.selectIcon", { + defaultValue: "选择图标", + })} +

+
-
-
+
+
{t("providerPreset.custom")} diff --git a/src/components/settings/SettingsPage.tsx b/src/components/settings/SettingsPage.tsx index 58c87f8..fbcee95 100644 --- a/src/components/settings/SettingsPage.tsx +++ b/src/components/settings/SettingsPage.tsx @@ -168,7 +168,7 @@ export function SettingsPage({ const isBusy = useMemo(() => isLoading && !settings, [isLoading, settings]); return ( -
+
{isBusy ? (
@@ -272,7 +272,7 @@ export function SettingsPage({ > {t("settings.restartRequired")} diff --git a/src/components/skills/SkillsPage.tsx b/src/components/skills/SkillsPage.tsx index 62414cf..7de6a7a 100644 --- a/src/components/skills/SkillsPage.tsx +++ b/src/components/skills/SkillsPage.tsx @@ -168,7 +168,7 @@ export const SkillsPage = forwardRef( {/* 技能网格(可滚动详情区域) */}
-
+
{loading ? (
diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx index 52a5a69..80e262d 100644 --- a/src/components/ui/dialog.tsx +++ b/src/components/ui/dialog.tsx @@ -65,7 +65,7 @@ const DialogContent = React.forwardRef< const variantClass = { default: - "fixed left-1/2 top-1/2 flex flex-col w-full max-w-lg max-h-[90vh] translate-x-[-50%] translate-y-[-50%] border border-border-default bg-white dark:bg-gray-900 shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg", + "fixed left-1/2 top-1/2 flex flex-col w-full max-w-lg max-h-[90vh] translate-x-[-50%] translate-y-[-50%] border border-border-default bg-background text-foreground shadow-lg duration-200 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-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg", fullscreen: "fixed inset-0 flex flex-col w-screen h-screen translate-x-0 translate-y-0 bg-background text-foreground p-0 sm:rounded-none shadow-none", }[variant];