From bd6447479dbd4a409f43b141508d564b0b050cb5 Mon Sep 17 00:00:00 2001 From: Yif <877193178@qq.com> Date: Fri, 18 Sep 2026 14:00:50 +0800 Subject: [PATCH] refine(plugin-manager): polish install dialog guide, input, and wizard states --- .../src/client/PluginManagerPage.module.css | 75 ++++++++++++------- .../src/client/PluginManagerPage.tsx | 30 ++++---- .../ui-plugin-manager/src/client/locales.ts | 12 +-- .../tests/components.client.spec.tsx | 6 +- .../client/ui-primitives/src/icons/index.tsx | 17 +++++ 5 files changed, 86 insertions(+), 54 deletions(-) diff --git a/packages/client/ui-plugin-manager/src/client/PluginManagerPage.module.css b/packages/client/ui-plugin-manager/src/client/PluginManagerPage.module.css index 63f55bd302..ba90b04f93 100644 --- a/packages/client/ui-plugin-manager/src/client/PluginManagerPage.module.css +++ b/packages/client/ui-plugin-manager/src/client/PluginManagerPage.module.css @@ -397,7 +397,7 @@ /* Wider than the default dialog: pnpm's lines are long, and the terminal keeps them unwrapped. The card never outgrows the viewport; the running screens scroll inside it so the head's controls stay reachable. */ .installDialog { - width: min(540px, 100%); + width: min(560px, 100%); max-height: calc(100vh - 48px); } @@ -425,16 +425,22 @@ } .installField input[type='text'] { - height: 36px; - padding: 0 12px; + height: 40px; + padding: 0 14px; border: 0.5px solid var(--dsw-alias-border-l4); - border-radius: 10px; + border-radius: 14px; + outline: none; background: var(--dsw-alias-bg-layer-3); font: inherit; font-size: 13px; color: var(--dsw-alias-label-primary); } +.installField input[type='text']:focus { + border-color: var(--dsw-alias-brand-primary); + box-shadow: inset 0 0 0 0.5px var(--dsw-alias-brand-primary); +} + .installField input[aria-invalid='true'] { border-color: var(--dsw-alias-state-error-primary); } @@ -445,6 +451,7 @@ align-items: center; align-self: flex-start; gap: 4px; + margin-top: 4px; padding: 0; border: 0; background: none; @@ -470,13 +477,12 @@ display: flex; flex-direction: column; gap: 10px; - padding: 12px 14px; + padding: 8px 14px 14px; border: 0.5px solid var(--dsw-alias-border-l4); - border-radius: 12px; + border-radius: 14px; background: var(--dsw-alias-bg-layer-1); } -.guideIntro, .guideHint { margin: 0; font-size: 12px; @@ -488,10 +494,10 @@ .guideSafety { display: flex; align-items: flex-start; - gap: 6px; + gap: 8px; margin: 0; - padding: 8px 10px; - border-radius: 8px; + padding: 10px 12px; + border-radius: 10px; background: color-mix(in srgb, var(--dsw-alias-state-warning-primary, var(--dsw-alias-state-business-primary)) 12%, transparent); font-size: 12px; line-height: 18px; @@ -503,19 +509,10 @@ margin-top: 2px; } -.guideNote { - margin: 0; - padding: 8px 10px; - border-radius: 8px; - background: var(--dsw-alias-bg-layer-3); - font-size: 12px; - line-height: 18px; - color: var(--dsw-alias-label-secondary); -} - .guideList { display: flex; flex-direction: column; + gap: 2px; margin: 0; padding: 0; list-style: none; @@ -526,38 +523,43 @@ align-items: flex-start; gap: 10px; padding: 8px 0; - border-top: 0.5px solid var(--dsw-alias-border-l4); + border-radius: 10px; + background: var(--dsw-alias-bg-layer-2); } .guideIndex { + display: inline-flex; flex: none; + align-items: center; + justify-content: center; width: 20px; height: 20px; border-radius: 999px; corner-shape: round; - background: var(--dsw-alias-bg-layer-3); + background: var(--dsw-alias-bg-module-platform); font-size: 11px; - line-height: 20px; - text-align: center; - color: var(--dsw-alias-label-tertiary); + font-weight: 500; + color: var(--dsw-alias-label-secondary); } .guideMain { display: flex; flex: 1; flex-direction: column; - gap: 2px; + gap: 0; min-width: 0; } .guideTitle { - font-size: 12.5px; - font-weight: 600; + font-size: 13px; + font-weight: 500; + line-height: 20px; color: var(--dsw-alias-label-primary); } .guideExample { font-size: 12px; + line-height: 20px; color: var(--dsw-alias-label-secondary); overflow-wrap: anywhere; } @@ -581,7 +583,9 @@ /* The footer's only action spans the dialog, as the primary action of a short form does. */ .wide { width: 100%; + height: 40px; justify-content: center; + border-radius: 14px; } /* The installing, installed, and failed screens: a head row, the centred @@ -593,7 +597,7 @@ gap: 16px; min-width: 0; min-height: 0; - padding: 16px 20px 20px; + padding: 16px 20px 0; } /* Everything under the head: it scrolls when the runs' output makes the screen taller than the card. */ @@ -664,6 +668,14 @@ color: var(--dsw-alias-label-secondary); } +.wizardIcon[data-state='done'] { + color: var(--dsw-alias-state-success-secondary); +} + +.wizardIcon[data-state='error'] { + color: var(--dsw-alias-state-warn-label); +} + .wizardTitle { margin: 0; font-size: 18px; @@ -714,6 +726,11 @@ gap: 12px; } +.footAction { + height: 32px; + border-radius: 16px; +} + .detailsToggle { display: inline-flex; align-items: center; diff --git a/packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx b/packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx index f27252c775..2e1fee9ea9 100644 --- a/packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx +++ b/packages/client/ui-plugin-manager/src/client/PluginManagerPage.tsx @@ -12,8 +12,8 @@ import { useEffect, useId, useState, type ReactNode } from 'react' import type { PluginInstallFailureKind } from '@deepseek-ai/dsh-api-remotes/client' import { - Button, IconChevronDownOutlineRegular, IconChevronLeftOutlineRegular, - IconChevronRightOutlineRegular, IconCloseOutlineRegular, + Button, IconCheckCircleFillRegular, IconChevronDownOutlineRegular, IconChevronLeftOutlineMedium, + IconChevronRightOutlineRegular, IconCloseOutlineMedium, IconPlusOutlineRegular, IconRefreshOutlineRegular, IconTrashOutlineRegular, IconWarningOutlineRegular, Input, Modal, PluginArtworkDefault, PluginArtworkLoop, PluginArtworkSearch, PluginArtworkSubagent, PluginArtworkTeam, PluginArtworkTerminal, @@ -672,19 +672,19 @@ function InstallDialog({ )} >
-