|
@@ -32,14 +32,6 @@
|
|
|
<span>正在生成大纲,请稍候</span>
|
|
<span>正在生成大纲,请稍候</span>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div v-else-if="taskInfo" class="progress-strip">
|
|
|
|
|
- <div class="current-step">{{ currentProgressLabel }}</div>
|
|
|
|
|
- <div class="progress-line">
|
|
|
|
|
- <div class="progress-bar" :style="{ width: `${progressValue}%` }"></div>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="progress-value">{{ progressValue }}%</div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
<div v-if="workflowStep === 1" class="setup-stage simplified-setup">
|
|
<div v-if="workflowStep === 1" class="setup-stage simplified-setup">
|
|
|
<div class="stage-intro">
|
|
<div class="stage-intro">
|
|
|
<div>
|
|
<div>
|
|
@@ -140,20 +132,12 @@
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div v-if="draftPreparationState !== 'idle'" :class="['compact-process-state', draftPreparationState]">
|
|
|
|
|
- <span v-if="draftPreparationState === 'optimizing'" class="loading-dot"></span>
|
|
|
|
|
- <span v-else class="process-state-icon">{{ draftPreparationState === "ready" ? "✓" : "!" }}</span>
|
|
|
|
|
- <div>
|
|
|
|
|
- <strong>{{ draftStatusTitle }}</strong>
|
|
|
|
|
- <span>{{ draftStatusDescription }}</span>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
<div v-if="!workspaceSlide" :class="['final-preview-placeholder', draftPreparationState]">
|
|
<div v-if="!workspaceSlide" :class="['final-preview-placeholder', draftPreparationState]">
|
|
|
<span v-if="draftPreparationState === 'optimizing'" class="loading-dot"></span>
|
|
<span v-if="draftPreparationState === 'optimizing'" class="loading-dot"></span>
|
|
|
<span v-else class="placeholder-icon">!</span>
|
|
<span v-else class="placeholder-icon">!</span>
|
|
|
- <strong>{{ draftPreparationState === "failed" ? "最终课件暂未生成成功" : "正在生成并优化最终课件" }}</strong>
|
|
|
|
|
- <small>{{ draftPreparationState === "failed" ? "请更换模板或返回修改需求后重试" : "完成后将直接展示可应用的最终效果" }}</small>
|
|
|
|
|
|
|
+ <strong>{{ draftPreparationState === "failed" ? "课件生成失败" : generationStatusTitle }}</strong>
|
|
|
|
|
+ <small>{{ draftPreparationState === "failed" ? draftFailureMessage : "完成后可直接预览、编辑和应用" }}</small>
|
|
|
|
|
+ <Button v-if="draftPreparationState === 'failed'" type="primary" @click="regenerateFinalPreview">重新生成</Button>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div v-if="workspaceSlide" class="unified-review-workspace">
|
|
<div v-if="workspaceSlide" class="unified-review-workspace">
|
|
@@ -191,8 +175,8 @@
|
|
|
/>
|
|
/>
|
|
|
<div v-if="working" class="workspace-processing-overlay">
|
|
<div v-if="working" class="workspace-processing-overlay">
|
|
|
<span class="loading-dot"></span>
|
|
<span class="loading-dot"></span>
|
|
|
- <strong>正在生成并优化新版本</strong>
|
|
|
|
|
- <small>完成后会自动更新预览</small>
|
|
|
|
|
|
|
+ <strong>{{ generationStatusTitle }}</strong>
|
|
|
|
|
+ <small>完成后自动更新当前预览</small>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div v-if="sampleBackgroundState.status === 'error'" class="template-load-error">模板背景加载失败,请更换模板或稍后重试</div>
|
|
<div v-if="sampleBackgroundState.status === 'error'" class="template-load-error">模板背景加载失败,请更换模板或稍后重试</div>
|
|
@@ -227,7 +211,6 @@
|
|
|
</template>
|
|
</template>
|
|
|
<template v-else-if="isStyleStep">
|
|
<template v-else-if="isStyleStep">
|
|
|
<Button @click="workflowStep = 1" :disabled="working">返回修改需求</Button>
|
|
<Button @click="workflowStep = 1" :disabled="working">返回修改需求</Button>
|
|
|
- <span v-if="draftPreparationState === 'optimizing'" class="footer-progress">正在自动检查并优化,无需操作…</span>
|
|
|
|
|
<Button
|
|
<Button
|
|
|
v-if="displayedConverted && draftPreparationState === 'ready'"
|
|
v-if="displayedConverted && draftPreparationState === 'ready'"
|
|
|
type="primary"
|
|
type="primary"
|
|
@@ -329,8 +312,7 @@ const displayedConverted = ref<{ title: string; theme: Partial<SlideTheme>; slid
|
|
|
const displayedTemplateId = ref<AiCoursewareTemplateId>()
|
|
const displayedTemplateId = ref<AiCoursewareTemplateId>()
|
|
|
const draftQuality = ref<AiPptQualityReport>()
|
|
const draftQuality = ref<AiPptQualityReport>()
|
|
|
const draftPreparationState = ref<"idle" | "optimizing" | "ready" | "failed">("idle")
|
|
const draftPreparationState = ref<"idle" | "optimizing" | "ready" | "failed">("idle")
|
|
|
-const automaticRepairAttempts = ref(0)
|
|
|
|
|
-const MAX_AUTOMATIC_REPAIR_ATTEMPTS = 3
|
|
|
|
|
|
|
+const draftFailureMessage = ref("请稍后重试")
|
|
|
type ProtectedPageContent = {
|
|
type ProtectedPageContent = {
|
|
|
title: string
|
|
title: string
|
|
|
subtitle?: string
|
|
subtitle?: string
|
|
@@ -387,6 +369,10 @@ const currentProgressLabel = computed(() => {
|
|
|
const matched = [...progressSteps].reverse().find(step => progressValue.value >= step.threshold)
|
|
const matched = [...progressSteps].reverse().find(step => progressValue.value >= step.threshold)
|
|
|
return shortProgressLabel(taskInfo.value?.message) || matched?.label || "处理中"
|
|
return shortProgressLabel(taskInfo.value?.message) || matched?.label || "处理中"
|
|
|
})
|
|
})
|
|
|
|
|
+const generationStatusTitle = computed(() => {
|
|
|
|
|
+ if (!taskInfo.value) return "正在生成课件"
|
|
|
|
|
+ return `${currentProgressLabel.value} ${progressValue.value}%`
|
|
|
|
|
+})
|
|
|
const pageTitle = computed(() => outline.value?.chapterName || outline.value?.title || "AI生成课件")
|
|
const pageTitle = computed(() => outline.value?.chapterName || outline.value?.title || "AI生成课件")
|
|
|
const pageMeta = computed(() => {
|
|
const pageMeta = computed(() => {
|
|
|
if (!outline.value) return `根据当前教材生成${preferences.minPages}至${preferences.maxPages}页音乐课件`
|
|
if (!outline.value) return `根据当前教材生成${preferences.minPages}至${preferences.maxPages}页音乐课件`
|
|
@@ -398,17 +384,6 @@ const selectedWorkspacePageIndex = computed(() => selectedDraftPageIndex.value)
|
|
|
const workspacePage = computed(() => workspacePages.value[selectedWorkspacePageIndex.value])
|
|
const workspacePage = computed(() => workspacePages.value[selectedWorkspacePageIndex.value])
|
|
|
const workspaceSlide = computed(() => workspaceSlides.value[selectedWorkspacePageIndex.value])
|
|
const workspaceSlide = computed(() => workspaceSlides.value[selectedWorkspacePageIndex.value])
|
|
|
const canEditWorkspaceText = computed(() => !working.value && Boolean(displayedConverted.value) && draftPreparationState.value === "ready")
|
|
const canEditWorkspaceText = computed(() => !working.value && Boolean(displayedConverted.value) && draftPreparationState.value === "ready")
|
|
|
-const draftStatusTitle = computed(() => {
|
|
|
|
|
- if (draftPreparationState.value === "ready") return "课件已准备完成"
|
|
|
|
|
- if (draftPreparationState.value === "failed") return "自动优化未能完成"
|
|
|
|
|
- return "正在自动检查和优化课件"
|
|
|
|
|
-})
|
|
|
|
|
-const draftStatusDescription = computed(() => {
|
|
|
|
|
- if (draftPreparationState.value === "ready") return "当前展示的就是优化后的最终课件,可直接编辑或应用。"
|
|
|
|
|
- if (draftPreparationState.value === "failed")
|
|
|
|
|
- return displayedConverted.value ? "新版本未生成成功,已保留上一次最终预览。" : "请更换模板或返回修改需求后重新生成。"
|
|
|
|
|
- return `系统正在自动处理问题页面(${Math.max(1, automaticRepairAttempts.value)}/${MAX_AUTOMATIC_REPAIR_ATTEMPTS})。`
|
|
|
|
|
-})
|
|
|
|
|
const previewSlides = computed(() => {
|
|
const previewSlides = computed(() => {
|
|
|
if (!outline.value?.pages.length) return undefined
|
|
if (!outline.value?.pages.length) return undefined
|
|
|
const previewOutline = { ...outline.value, style: selectedStyle.value }
|
|
const previewOutline = { ...outline.value, style: selectedStyle.value }
|
|
@@ -552,6 +527,7 @@ async function handleOutline() {
|
|
|
displayedTemplateId.value = undefined
|
|
displayedTemplateId.value = undefined
|
|
|
draftQuality.value = undefined
|
|
draftQuality.value = undefined
|
|
|
draftPreparationState.value = "idle"
|
|
draftPreparationState.value = "idle"
|
|
|
|
|
+ draftFailureMessage.value = "请稍后重试"
|
|
|
outline.value = res.data as AiCoursewareOutline
|
|
outline.value = res.data as AiCoursewareOutline
|
|
|
if (templateSelectionMode.value === "auto") selectedTemplateId.value = recommendAiCoursewareTemplate(outline.value).id
|
|
if (templateSelectionMode.value === "auto") selectedTemplateId.value = recommendAiCoursewareTemplate(outline.value).id
|
|
|
outline.value.style = selectedStyle.value
|
|
outline.value.style = selectedStyle.value
|
|
@@ -604,6 +580,7 @@ function handleFinalPreparationFailure(message = "自动生成和优化未能完
|
|
|
ElMessage.warning(`${message},已保留上一次最终预览`)
|
|
ElMessage.warning(`${message},已保留上一次最终预览`)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
+ draftFailureMessage.value = message
|
|
|
draftPreparationState.value = "failed"
|
|
draftPreparationState.value = "failed"
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -618,7 +595,7 @@ async function handleGenerate() {
|
|
|
draftConverted.value = undefined
|
|
draftConverted.value = undefined
|
|
|
draftQuality.value = undefined
|
|
draftQuality.value = undefined
|
|
|
draftPreparationState.value = "optimizing"
|
|
draftPreparationState.value = "optimizing"
|
|
|
- automaticRepairAttempts.value = 0
|
|
|
|
|
|
|
+ draftFailureMessage.value = "请稍后重试"
|
|
|
sourceOutline.style = selectedStyle.value
|
|
sourceOutline.style = selectedStyle.value
|
|
|
sourceOutline.templateId = selectedTemplateId.value
|
|
sourceOutline.templateId = selectedTemplateId.value
|
|
|
restoreProtectedPageContent(sourceOutline)
|
|
restoreProtectedPageContent(sourceOutline)
|
|
@@ -631,7 +608,7 @@ async function handleGenerate() {
|
|
|
preferences: { ...preferences }
|
|
preferences: { ...preferences }
|
|
|
})
|
|
})
|
|
|
if (res.code !== 200) {
|
|
if (res.code !== 200) {
|
|
|
- handleFinalPreparationFailure()
|
|
|
|
|
|
|
+ handleFinalPreparationFailure(res.message || "课件生成请求失败,请重试")
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -651,6 +628,7 @@ async function fetchTask(taskId: string) {
|
|
|
const res = await httpAjaxErrMsg(aiCoursewareTaskApi, taskId)
|
|
const res = await httpAjaxErrMsg(aiCoursewareTaskApi, taskId)
|
|
|
if (res.code !== 200) {
|
|
if (res.code !== 200) {
|
|
|
clearTask()
|
|
clearTask()
|
|
|
|
|
+ handleFinalPreparationFailure(res.message || "未能取得课件生成进度,请重试")
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
taskInfo.value = res.data as AiCoursewareTaskInfo
|
|
taskInfo.value = res.data as AiCoursewareTaskInfo
|
|
@@ -661,13 +639,8 @@ async function fetchTask(taskId: string) {
|
|
|
clearPollTimer()
|
|
clearPollTimer()
|
|
|
const message = taskInfo.value.message || "AI课件生成失败"
|
|
const message = taskInfo.value.message || "AI课件生成失败"
|
|
|
clearTask()
|
|
clearTask()
|
|
|
- if (draftOutline.value && draftQuality.value) {
|
|
|
|
|
- console.error("AI课件自动优化失败", message)
|
|
|
|
|
- await continueAutomaticRepairAfterFailure()
|
|
|
|
|
- } else {
|
|
|
|
|
- console.error("AI课件生成失败", message)
|
|
|
|
|
- handleFinalPreparationFailure(message)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ console.error("AI课件生成失败", message)
|
|
|
|
|
+ handleFinalPreparationFailure(message)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -687,11 +660,16 @@ async function loadDraft(taskId: string) {
|
|
|
const res = await httpAjaxErrMsg(aiCoursewareResultApi, taskId)
|
|
const res = await httpAjaxErrMsg(aiCoursewareResultApi, taskId)
|
|
|
if (res.code !== 200) {
|
|
if (res.code !== 200) {
|
|
|
clearTask()
|
|
clearTask()
|
|
|
- handleFinalPreparationFailure("未能取得最终课件")
|
|
|
|
|
|
|
+ handleFinalPreparationFailure(res.message || "未能取得最终课件")
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const result = res.data as AiCoursewareGenerateResult
|
|
const result = res.data as AiCoursewareGenerateResult
|
|
|
|
|
+ if (!result?.outline?.pages?.length) {
|
|
|
|
|
+ clearTask()
|
|
|
|
|
+ handleFinalPreparationFailure("服务器未返回完整课件数据,请重新生成")
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
draftOutline.value = result.outline
|
|
draftOutline.value = result.outline
|
|
|
restoreProtectedPageContent(draftOutline.value)
|
|
restoreProtectedPageContent(draftOutline.value)
|
|
|
draftOutline.value.templateId = selectedTemplateId.value
|
|
draftOutline.value.templateId = selectedTemplateId.value
|
|
@@ -720,7 +698,7 @@ function rebuildDraftPreview() {
|
|
|
async function regenerateDraftPage(index: number) {
|
|
async function regenerateDraftPage(index: number) {
|
|
|
if (!draftOutline.value || !pptWork.id) return
|
|
if (!draftOutline.value || !pptWork.id) return
|
|
|
draftPreparationState.value = "optimizing"
|
|
draftPreparationState.value = "optimizing"
|
|
|
- automaticRepairAttempts.value = 0
|
|
|
|
|
|
|
+ draftFailureMessage.value = "请稍后重试"
|
|
|
restoreProtectedPageContent(draftOutline.value)
|
|
restoreProtectedPageContent(draftOutline.value)
|
|
|
if (sampleFeedbackTags.value.includes("画风不合适")) paletteVariant.value = (paletteVariant.value + 1) % 3
|
|
if (sampleFeedbackTags.value.includes("画风不合适")) paletteVariant.value = (paletteVariant.value + 1) % 3
|
|
|
const feedback = [...sampleFeedbackTags.value, sampleFeedbackText.value.trim()].filter(Boolean).join(";")
|
|
const feedback = [...sampleFeedbackTags.value, sampleFeedbackText.value.trim()].filter(Boolean).join(";")
|
|
@@ -734,7 +712,7 @@ async function regenerateDraftPage(index: number) {
|
|
|
regeneratePageNo: index + 1
|
|
regeneratePageNo: index + 1
|
|
|
})
|
|
})
|
|
|
if (res.code !== 200) {
|
|
if (res.code !== 200) {
|
|
|
- await continueAutomaticRepairAfterFailure()
|
|
|
|
|
|
|
+ handleFinalPreparationFailure(res.message || "当前页面更新失败,请重试")
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
taskInfo.value = res.data as AiCoursewareTaskInfo
|
|
taskInfo.value = res.data as AiCoursewareTaskInfo
|
|
@@ -807,7 +785,6 @@ async function selectTemplate(templateId: AiCoursewareTemplateId, fromSample = f
|
|
|
if (fromSample) {
|
|
if (fromSample) {
|
|
|
templatePickerExpanded.value = false
|
|
templatePickerExpanded.value = false
|
|
|
showAllTemplates.value = false
|
|
showAllTemplates.value = false
|
|
|
- ElMessage.info(`正在生成并优化${getAiCoursewareTemplate(templateId).name}`)
|
|
|
|
|
}
|
|
}
|
|
|
await regenerateFinalPreview()
|
|
await regenerateFinalPreview()
|
|
|
}
|
|
}
|
|
@@ -815,7 +792,6 @@ async function selectTemplate(templateId: AiCoursewareTemplateId, fromSample = f
|
|
|
async function useRecommendedTemplate() {
|
|
async function useRecommendedTemplate() {
|
|
|
templateSelectionMode.value = "auto"
|
|
templateSelectionMode.value = "auto"
|
|
|
selectedTemplateId.value = templateRecommendation.value.id
|
|
selectedTemplateId.value = templateRecommendation.value.id
|
|
|
- ElMessage.info(`正在生成并优化${recommendedTemplate.value.name}`)
|
|
|
|
|
await regenerateFinalPreview()
|
|
await regenerateFinalPreview()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -846,60 +822,24 @@ function templateFit(templateId: AiCoursewareTemplateId) {
|
|
|
async function prepareDraftForUse() {
|
|
async function prepareDraftForUse() {
|
|
|
if (!draftOutline.value) return
|
|
if (!draftOutline.value) return
|
|
|
draftPreparationState.value = "optimizing"
|
|
draftPreparationState.value = "optimizing"
|
|
|
- normalizeDraftLocally()
|
|
|
|
|
- restoreProtectedPageContent(draftOutline.value)
|
|
|
|
|
- rebuildDraftPreview()
|
|
|
|
|
-
|
|
|
|
|
- if (draftQuality.value?.passed) {
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ normalizeDraftLocally()
|
|
|
|
|
+ restoreProtectedPageContent(draftOutline.value)
|
|
|
|
|
+ rebuildDraftPreview()
|
|
|
|
|
+ if (!draftConverted.value?.slides.length || draftConverted.value.slides.length !== draftOutline.value.pages.length) {
|
|
|
|
|
+ handleFinalPreparationFailure("课件页面数据不完整,请重新生成")
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ if (draftQuality.value?.errors.length) {
|
|
|
|
|
+ console.warn("AI课件质量检查发现非阻断问题", draftQuality.value.errors)
|
|
|
|
|
+ }
|
|
|
publishFinalPreview()
|
|
publishFinalPreview()
|
|
|
|
|
+ draftFailureMessage.value = "请稍后重试"
|
|
|
draftPreparationState.value = "ready"
|
|
draftPreparationState.value = "ready"
|
|
|
- ElMessage.success("最终课件已完成优化,可以直接预览并应用")
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- console.warn("AI课件自动检查发现待修复项", draftQuality.value?.errors)
|
|
|
|
|
- if (automaticRepairAttempts.value >= MAX_AUTOMATIC_REPAIR_ATTEMPTS) {
|
|
|
|
|
- handleFinalPreparationFailure()
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- automaticRepairAttempts.value += 1
|
|
|
|
|
- await requestAutomaticRepair()
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-async function requestAutomaticRepair() {
|
|
|
|
|
- if (!draftOutline.value || !pptWork.id || !draftQuality.value) {
|
|
|
|
|
- handleFinalPreparationFailure()
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- const repairSummary = draftQuality.value.errors
|
|
|
|
|
- .slice(0, 12)
|
|
|
|
|
- .map(issue => `${issue.pageNo ? `第${issue.pageNo}页` : "整套课件"}:${issue.message}`)
|
|
|
|
|
- .join(";")
|
|
|
|
|
- const res = await httpAjaxErrMsg(aiCoursewareGenerateApi, {
|
|
|
|
|
- id: pptWork.id,
|
|
|
|
|
- fromType: queryParams.pptResourcesType || queryParams.fromType,
|
|
|
|
|
- outline: draftOutline.value,
|
|
|
|
|
- templateId: selectedTemplateId.value,
|
|
|
|
|
- visualPrompt: `${buildVisualPrompt()}系统检查发现以下问题,请在保持教学目标和页数不变的前提下全部修正:${repairSummary}。`,
|
|
|
|
|
- preferences: { ...preferences }
|
|
|
|
|
- })
|
|
|
|
|
- if (res.code !== 200) {
|
|
|
|
|
- await continueAutomaticRepairAfterFailure()
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error("AI课件预览转换失败", error)
|
|
|
|
|
+ handleFinalPreparationFailure(error instanceof Error ? error.message : "课件预览转换失败,请重试")
|
|
|
}
|
|
}
|
|
|
- taskInfo.value = res.data as AiCoursewareTaskInfo
|
|
|
|
|
- await pollTask(taskInfo.value.taskId)
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-async function continueAutomaticRepairAfterFailure() {
|
|
|
|
|
- clearTask()
|
|
|
|
|
- if (automaticRepairAttempts.value >= MAX_AUTOMATIC_REPAIR_ATTEMPTS) {
|
|
|
|
|
- handleFinalPreparationFailure()
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- automaticRepairAttempts.value += 1
|
|
|
|
|
- await requestAutomaticRepair()
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function normalizeDraftLocally() {
|
|
function normalizeDraftLocally() {
|
|
@@ -1164,7 +1104,6 @@ function shortProgressLabel(message?: string) {
|
|
|
font-size: 12px;
|
|
font-size: 12px;
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
}
|
|
}
|
|
|
-.progress-strip,
|
|
|
|
|
.loading-strip {
|
|
.loading-strip {
|
|
|
margin-top: 12px;
|
|
margin-top: 12px;
|
|
|
height: 42px;
|
|
height: 42px;
|
|
@@ -1184,34 +1123,6 @@ function shortProgressLabel(message?: string) {
|
|
|
border-radius: 50%;
|
|
border-radius: 50%;
|
|
|
animation: loading-rotate 0.8s linear infinite;
|
|
animation: loading-rotate 0.8s linear infinite;
|
|
|
}
|
|
}
|
|
|
-.current-step {
|
|
|
|
|
- width: 64px;
|
|
|
|
|
- flex-shrink: 0;
|
|
|
|
|
- color: $themeColor;
|
|
|
|
|
- font-size: 13px;
|
|
|
|
|
- font-weight: 600;
|
|
|
|
|
- white-space: nowrap;
|
|
|
|
|
-}
|
|
|
|
|
-.progress-value {
|
|
|
|
|
- width: 42px;
|
|
|
|
|
- text-align: right;
|
|
|
|
|
- font-size: 13px;
|
|
|
|
|
- color: $themeColor;
|
|
|
|
|
- font-weight: 700;
|
|
|
|
|
-}
|
|
|
|
|
-.progress-line {
|
|
|
|
|
- height: 6px;
|
|
|
|
|
- flex: 1;
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
- border-radius: 999px;
|
|
|
|
|
- background: #e7edf5;
|
|
|
|
|
-}
|
|
|
|
|
-.progress-bar {
|
|
|
|
|
- height: 100%;
|
|
|
|
|
- border-radius: inherit;
|
|
|
|
|
- background: $themeColor;
|
|
|
|
|
- transition: width 0.25s ease;
|
|
|
|
|
-}
|
|
|
|
|
@keyframes loading-rotate {
|
|
@keyframes loading-rotate {
|
|
|
to {
|
|
to {
|
|
|
transform: rotate(360deg);
|
|
transform: rotate(360deg);
|
|
@@ -1479,56 +1390,6 @@ function shortProgressLabel(message?: string) {
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
overflow: hidden;
|
|
overflow: hidden;
|
|
|
}
|
|
}
|
|
|
-.compact-process-state {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- gap: 8px;
|
|
|
|
|
- margin-top: 8px;
|
|
|
|
|
- padding: 7px 10px;
|
|
|
|
|
- border-radius: 7px;
|
|
|
|
|
- background: #f5f8fc;
|
|
|
|
|
- color: #52616b;
|
|
|
|
|
- font-size: 11px;
|
|
|
|
|
- &.ready {
|
|
|
|
|
- background: #eff9f5;
|
|
|
|
|
- color: #16776f;
|
|
|
|
|
- }
|
|
|
|
|
- &.failed {
|
|
|
|
|
- background: #fff7ed;
|
|
|
|
|
- color: #9a5b08;
|
|
|
|
|
- }
|
|
|
|
|
- > div {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- min-width: 0;
|
|
|
|
|
- align-items: baseline;
|
|
|
|
|
- gap: 8px;
|
|
|
|
|
- }
|
|
|
|
|
- strong {
|
|
|
|
|
- color: #263442;
|
|
|
|
|
- font-size: 12px;
|
|
|
|
|
- }
|
|
|
|
|
- span:last-child {
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
- text-overflow: ellipsis;
|
|
|
|
|
- white-space: nowrap;
|
|
|
|
|
- }
|
|
|
|
|
- .loading-dot {
|
|
|
|
|
- width: 12px;
|
|
|
|
|
- height: 12px;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-.process-state-icon {
|
|
|
|
|
- display: grid;
|
|
|
|
|
- width: 18px;
|
|
|
|
|
- height: 18px;
|
|
|
|
|
- flex: 0 0 18px;
|
|
|
|
|
- place-items: center;
|
|
|
|
|
- border-radius: 50%;
|
|
|
|
|
- background: currentColor;
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- font-size: 11px;
|
|
|
|
|
- font-weight: 700;
|
|
|
|
|
-}
|
|
|
|
|
.final-preview-placeholder {
|
|
.final-preview-placeholder {
|
|
|
min-height: 320px;
|
|
min-height: 320px;
|
|
|
flex: 1;
|
|
flex: 1;
|
|
@@ -1557,6 +1418,10 @@ function shortProgressLabel(message?: string) {
|
|
|
width: 20px;
|
|
width: 20px;
|
|
|
height: 20px;
|
|
height: 20px;
|
|
|
}
|
|
}
|
|
|
|
|
+ :deep(.button.primary) {
|
|
|
|
|
+ min-width: 104px;
|
|
|
|
|
+ margin-top: 6px;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
.placeholder-icon {
|
|
.placeholder-icon {
|
|
|
display: grid;
|
|
display: grid;
|
|
@@ -2711,13 +2576,6 @@ function shortProgressLabel(message?: string) {
|
|
|
font-weight: 700;
|
|
font-weight: 700;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-.footer-progress {
|
|
|
|
|
- min-width: 154px;
|
|
|
|
|
- color: $themeColor;
|
|
|
|
|
- font-size: 13px;
|
|
|
|
|
- font-weight: 600;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
-}
|
|
|
|
|
.ai-dialog.review-mode .footer {
|
|
.ai-dialog.review-mode .footer {
|
|
|
margin-top: 10px;
|
|
margin-top: 10px;
|
|
|
padding-top: 10px;
|
|
padding-top: 10px;
|