diff --git a/.changeset/quiet-goals.md b/.changeset/quiet-goals.md new file mode 100644 index 0000000000..ff4420bb6d --- /dev/null +++ b/.changeset/quiet-goals.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +web: Refine goal mode controls with animated strip interactions, budget-aware progress, and design-system cancellation confirmation. diff --git a/apps/kimi-web/src/components/chat/Composer.vue b/apps/kimi-web/src/components/chat/Composer.vue index 368069faaf..336e777696 100644 --- a/apps/kimi-web/src/components/chat/Composer.vue +++ b/apps/kimi-web/src/components/chat/Composer.vue @@ -1236,7 +1236,8 @@ function selectModel(modelId: string): void { --composer-send-inset: var(--space-2); position: relative; border: 1px solid var(--line); - border-radius: calc((var(--composer-send-size) / 2) + var(--composer-send-inset)); + border-radius: calc((var(--composer-send-size) / 2) + var(--composer-send-inset) + var(--space-3)); + corner-shape: superellipse(1.5); background: var(--bg); box-shadow: var(--shadow-md); transition: border-color 0.15s, box-shadow 0.15s; diff --git a/apps/kimi-web/src/components/chat/GoalStrip.vue b/apps/kimi-web/src/components/chat/GoalStrip.vue index 11dab6b78c..c0fddfe365 100644 --- a/apps/kimi-web/src/components/chat/GoalStrip.vue +++ b/apps/kimi-web/src/components/chat/GoalStrip.vue @@ -2,6 +2,7 @@ import { computed, ref, watch } from 'vue'; import { useI18n } from 'vue-i18n'; import type { AppGoal } from '../../api/types'; +import { useConfirmDialog } from '../../composables/useConfirmDialog'; import Card from '../ui/Card.vue'; import Badge from '../ui/Badge.vue'; import Button from '../ui/Button.vue'; @@ -11,6 +12,7 @@ const props = defineProps<{ goal: AppGoal; forceExpanded?: number }>(); const emit = defineEmits<{ controlGoal: [action: 'pause' | 'resume' | 'cancel'] }>(); const { t } = useI18n(); +const { confirm } = useConfirmDialog(); const expanded = ref(false); @@ -45,12 +47,24 @@ function formatMs(ms: number): string { const hour = Math.floor(min / 60); return `${hour}h ${min % 60}m`; } + +async function onCancel(): Promise { + const confirmed = await confirm({ + title: t('status.goalCancel'), + message: t('status.goalCancelConfirm'), + confirmLabel: t('status.goalCancelConfirmYes'), + cancelLabel: t('status.goalCancelConfirmNo'), + variant: 'danger', + }); + if (confirmed) emit('controlGoal', 'cancel'); +}