diff --git a/design/model-setup-dialog/v1/README.md b/design/model-setup-dialog/v1/README.md new file mode 100644 index 0000000..0de897d --- /dev/null +++ b/design/model-setup-dialog/v1/README.md @@ -0,0 +1,23 @@ +# Model Setup Dialog Design v1 + +## Scope +- Improve selected-state clarity for provider cards. +- Unify selected ring and check colors with primary action color. +- Replace hardcoded red error/close-hover colors with MAI danger tokens. + +## Decisions +- Selected card keeps a single visible selected border layer. +- Selected fill matches hover fill to avoid a blue tint bias. +- Error text and close-hover danger visuals use semantic tokens: + - --smtc-status-danger-foreground + - --smtc-status-danger-background + +## Files Updated +- desktop/renderer/src/components/ModelSetupDialog.vue +- desktop/renderer/src/components/GatewayLoading.vue +- desktop/renderer/src/App.vue +- desktop/renderer/src/styles/global.css +- desktop/renderer/src/views/ChatView.vue + +## Notes +- This version is intended for design iteration and review on branch design/model-setup-dialog/v1. diff --git a/desktop/renderer/src/App.vue b/desktop/renderer/src/App.vue index 9b4eb14..e5ec171 100644 --- a/desktop/renderer/src/App.vue +++ b/desktop/renderer/src/App.vue @@ -359,12 +359,17 @@ onMounted(async () => { } catch {} // Listen for mid-session integrity alerts (file watcher) - unsubIntegrityAlert = window.openclaw.skills.onIntegrityAlert((result) => { - if (!result.valid) { - integrityResult.value = result; - integrityDialogVisible.value = true; + // Some preview environments do not expose this API yet. + try { + if (typeof window.openclaw.skills.onIntegrityAlert === "function") { + unsubIntegrityAlert = window.openclaw.skills.onIntegrityAlert((result) => { + if (!result.valid) { + integrityResult.value = result; + integrityDialogVisible.value = true; + } + }); } - }); + } catch {} // Listen for sandbox permission requests unsubPermission = window.openclaw.sandbox.onPermissionRequest((data: PermissionRequestData) => { @@ -547,28 +552,40 @@ onUnmounted(() => { diff --git a/desktop/renderer/src/assets/modelprovider/Qwen.png b/desktop/renderer/src/assets/modelprovider/Qwen.png index 2ad8ff2..2389a67 100644 Binary files a/desktop/renderer/src/assets/modelprovider/Qwen.png and b/desktop/renderer/src/assets/modelprovider/Qwen.png differ diff --git a/desktop/renderer/src/assets/modelprovider/minimax.png b/desktop/renderer/src/assets/modelprovider/minimax.png index c0d114b..9ec8d00 100644 Binary files a/desktop/renderer/src/assets/modelprovider/minimax.png and b/desktop/renderer/src/assets/modelprovider/minimax.png differ diff --git a/desktop/renderer/src/components/GatewayLoading.vue b/desktop/renderer/src/components/GatewayLoading.vue index 4f711a3..2fc13a9 100644 --- a/desktop/renderer/src/components/GatewayLoading.vue +++ b/desktop/renderer/src/components/GatewayLoading.vue @@ -403,15 +403,15 @@ watch( } .win-ctrl--close:hover { - background: #fee2e2; + background: var(--smtc-status-danger-background); } .win-ctrl--close:hover svg { - stroke: #dc2626; + stroke: var(--smtc-status-danger-foreground); } :global(html.dark) .win-ctrl--close:hover { - background: rgba(239, 68, 68, 0.15); + background: color-mix(in srgb, var(--smtc-status-danger-background) 28%, transparent); } .loading-center { diff --git a/desktop/renderer/src/components/ModelSetupDialog.vue b/desktop/renderer/src/components/ModelSetupDialog.vue index 47b6498..64dcb38 100644 --- a/desktop/renderer/src/components/ModelSetupDialog.vue +++ b/desktop/renderer/src/components/ModelSetupDialog.vue @@ -2,11 +2,23 @@
@@ -106,7 +139,6 @@ interface ModelFamilyPreset { apiFormat: ApiFormat; models: string[]; apiKeyPlaceholder: string; - apiKeyUrl?: string; logo: string; } @@ -125,24 +157,23 @@ const modelFamilies: ModelFamilyPreset[] = [ providerKey: "qwen", baseUrl: ALIYUN_OPENAI_COMPATIBLE_BASE_URL, apiFormat: "openai-chat", - models: ["Qwen3.6-Plus", "Qwen3.5-Plus"], + models: ["qwen", "Qwen3.6-Plus", "Qwen3.5-Plus"], apiKeyPlaceholder: "sk-...", - apiKeyUrl: "https://platform.qianwenai.com/home/api-keys", logo: qwenLogo, }, { id: "minimax", label: "MiniMax", providerKey: "minimax", - baseUrl: "https://api.minimaxi.com/anthropic", + baseUrl: "", apiFormat: "anthropic", - models: ["MiniMax-M1"], + models: ["minimaxm3", "MiniMax-M1"], apiKeyPlaceholder: "sk-cp-...", logo: minimaxLogo, }, ]; -const step = ref<"select" | "key">("select"); +const isKeyStep = ref(false); const selectedFamilyId = ref