From 30d51de08800a5c033d48cbfeb415244ea6e31ec Mon Sep 17 00:00:00 2001 From: tbphp Date: Sat, 1 Aug 2026 15:20:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ui):=20=E7=BB=9F=E4=B8=80=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E7=A1=AE=E8=AE=A4=E6=A1=86=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/ui/AppConfirmDialog.vue | 66 ++++++++++++ web/src/components/ui/AppDialog.vue | 38 +++++-- web/src/components/ui/AppDrawer.vue | 32 ++++-- web/src/components/ui/AppToastViewport.vue | 7 +- .../components/ui/AppTypedConfirmation.vue | 64 +++++++++++ .../access-keys/AccessKeyCollection.vue | 1 - .../access-keys/AccessKeyDeleteDialog.vue | 101 ++++++------------ .../features/access-keys/AccessKeyDrawer.vue | 6 +- .../access-keys/AccessKeyScopeEditor.vue | 12 +-- web/src/features/groups/keys/GroupKeysTab.vue | 42 ++------ .../features/groups/models/GroupModelsTab.vue | 36 ++----- .../groups/settings/GroupDeleteDialog.vue | 61 +++-------- .../groups/settings/GroupSettingsTab.vue | 37 ++----- web/src/features/home/GatewayConnection.vue | 30 ++---- .../model-prices/ModelPriceResetDialog.vue | 36 ++----- .../features/model-prices/ModelPricesView.vue | 5 +- web/src/i18n/locales/en-US/access-keys.ts | 3 +- 17 files changed, 275 insertions(+), 302 deletions(-) create mode 100644 web/src/components/ui/AppConfirmDialog.vue create mode 100644 web/src/components/ui/AppTypedConfirmation.vue diff --git a/web/src/components/ui/AppConfirmDialog.vue b/web/src/components/ui/AppConfirmDialog.vue new file mode 100644 index 00000000..fdbc00d8 --- /dev/null +++ b/web/src/components/ui/AppConfirmDialog.vue @@ -0,0 +1,66 @@ + + + diff --git a/web/src/components/ui/AppDialog.vue b/web/src/components/ui/AppDialog.vue index 42e2e0eb..f4beaad2 100644 --- a/web/src/components/ui/AppDialog.vue +++ b/web/src/components/ui/AppDialog.vue @@ -52,7 +52,8 @@ function guardDismiss(event: Event): void { {{ description }} -
+
+ @@ -71,7 +72,7 @@ function guardDismiss(event: Event): void { top: 50%; left: 50%; display: grid; - width: min(calc(100vw - 32px), 460px); + width: min(calc(100vw - 32px), 420px); max-height: calc(100vh - 32px); max-height: calc(100dvh - 32px); transform: translate(-50%, -50%); @@ -81,23 +82,26 @@ function guardDismiss(event: Event): void { background: var(--color-surface); box-shadow: var(--shadow-overlay); color: var(--color-text); - padding: var(--space-5); + padding: 0; } .app-dialog__header { display: flex; - align-items: flex-start; + min-height: 58px; + align-items: center; justify-content: space-between; gap: var(--space-3); + border-bottom: 1px solid var(--color-border-subtle); + padding: 10px 16px 10px 18px; } .app-dialog__title { - font-size: 1.0625rem; + font-size: var(--text-meta); font-weight: 700; } .app-dialog__close { display: inline-flex; - width: 44px; - height: 44px; - flex: 0 0 44px; + width: 36px; + height: 36px; + flex: 0 0 36px; align-items: center; justify-content: center; border: 0; @@ -111,13 +115,25 @@ function guardDismiss(event: Event): void { opacity: 0.55; } .app-dialog__description { - margin: var(--space-2) 0 0; - color: var(--color-text-muted); + margin: 0; + padding: 12px 18px 0; + color: var(--color-text-faint); + font-size: var(--text-sm); + line-height: var(--line-normal); } .app-dialog__body { min-height: 0; - margin-top: var(--space-5); overflow-y: auto; overscroll-behavior: contain; + padding: 14px 18px 16px; +} +.app-dialog__footer { + display: flex; + min-height: 58px; + align-items: center; + justify-content: flex-end; + gap: var(--space-2); + border-top: 1px solid var(--color-border-subtle); + padding: 10px 18px; } diff --git a/web/src/components/ui/AppDrawer.vue b/web/src/components/ui/AppDrawer.vue index d064e655..396ee1c8 100644 --- a/web/src/components/ui/AppDrawer.vue +++ b/web/src/components/ui/AppDrawer.vue @@ -154,20 +154,36 @@ function guardDismiss(event: Event): void { padding: 10px 18px; } @keyframes app-drawer-overlay-in { - from { opacity: 0; } - to { opacity: 1; } + from { + opacity: 0; + } + to { + opacity: 1; + } } @keyframes app-drawer-overlay-out { - from { opacity: 1; } - to { opacity: 0; } + from { + opacity: 1; + } + to { + opacity: 0; + } } @keyframes app-drawer-content-in { - from { transform: translateX(100%); } - to { transform: translateX(0); } + from { + transform: translateX(100%); + } + to { + transform: translateX(0); + } } @keyframes app-drawer-content-out { - from { transform: translateX(0); } - to { transform: translateX(100%); } + from { + transform: translateX(0); + } + to { + transform: translateX(100%); + } } @media (max-width: 480px) { .app-drawer__content { diff --git a/web/src/components/ui/AppToastViewport.vue b/web/src/components/ui/AppToastViewport.vue index a876bbdf..a55debfe 100644 --- a/web/src/components/ui/AppToastViewport.vue +++ b/web/src/components/ui/AppToastViewport.vue @@ -10,12 +10,7 @@ const current = toast.current