修复: ai-chat 交互体验批(草稿备份/图片放大/目标完成态/淘汰边界条)

- 输入侧:编辑消息不再静默销毁草稿(备份/回填)、补全浮层滚随、贴图 loading 态+并发上限复核、mention 失焦收口、富文本图文同粘、上传失败提示
- 消息流:图片点击 lightbox 放大、复制钮 focus 可见、复制为图片降级文案据实、JSON 块恢复可选、bucketSig 改哈希防长会话卡顿、user 长消息折叠、工具卡流式滚尾
- 会话框架:后台任务面板入点外/Esc 收起编排、恢复任务行级 busy+失败 toast、菜单底部翻转、搜索态统一清、归档禁改名对齐、listbox 语义+方向键、状态点 title、窄侧栏容器查询
- 跨端:删除目标不再抹其余目标完成态(前后端 GoalEntry 全量传递+失败回滚)
- 边界条:MESSAGE_CAP 滚动淘汰不再静默,头部一键补齐完整会话,历史定位文案据实区分
This commit is contained in:
lxy
2026-10-25 22:32:49 +08:00
parent 3caf2d047f
commit 62776a30f1
38 changed files with 3848 additions and 2778 deletions
+38 -2
View File
@@ -9,8 +9,8 @@ import { useI18n } from 'vue-i18n'
const { t } = useI18n()
defineProps<{
/** 待发送图片列表(url 模式用 url 预览,base64 模式用 dataUrl) */
pendingImages: { id: string; dataUrl?: string; url?: string; mediaType: string }[]
/** 待发送图片列表(url 模式用 url 预览,base64 模式用 dataUrl;uploading=上传中占位 chip) */
pendingImages: { id: string; dataUrl?: string; url?: string; mediaType: string; uploading?: boolean }[]
}>()
const emit = defineEmits<{
@@ -21,7 +21,16 @@ const emit = defineEmits<{
<template>
<div v-if="pendingImages.length" class="ai-img-preview-row">
<div v-for="img in pendingImages" :key="img.id" class="ai-img-preview">
<!-- 走查:上传中占位 chip——url/dataUrl 未定时渲染 loading 态,不渲染空 src <img> -->
<div
v-if="img.uploading && !img.url && !img.dataUrl"
class="ai-img-preview-thumb ai-img-thumb--uploading"
>
<span class="ai-thumb-spinner" aria-hidden="true"></span>
<span class="ai-thumb-uploading-text">{{ t('aiChat.imageUploading') }}</span>
</div>
<img
v-else
:src="img.url || img.dataUrl"
:alt="t('aiChat.imagePreviewAlt')"
class="ai-img-preview-thumb"
@@ -37,3 +46,30 @@ const emit = defineEmits<{
</div>
</div>
</template>
<style scoped>
/* 走查:上传中占位态(与缩略图同尺寸盒,转圈+文案)。仅本组件消费的私有态样式,不入公共库 */
.ai-img-thumb--uploading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 3px;
background: var(--df-bg-card-hover);
}
.ai-thumb-spinner {
width: 12px;
height: 12px;
border: 1.5px solid var(--df-border);
border-top-color: var(--df-accent);
border-radius: 50%;
animation: ai-thumb-spin 0.8s linear infinite;
}
@keyframes ai-thumb-spin {
to { transform: rotate(360deg); }
}
.ai-thumb-uploading-text {
font-size: 9px;
color: var(--df-text-dim);
}
</style>