feat: add EditorGridSizePicker and EditorSelectionFrame components; implement FreeCreateView for article management; introduce ArticleSelectionOptimizeService for optimizing article selections

This commit is contained in:
2026-04-06 22:18:55 +08:00
parent 08ace0a9e0
commit 1e844704e4
20 changed files with 3033 additions and 740 deletions
+52 -4
View File
@@ -53,7 +53,7 @@ const enUS = {
articleCreation: "Article Creation",
templates: "Templates",
custom: "Custom Generation",
optimize: "Optimization",
freeCreate: "Free Create",
media: "Media",
brandManagement: "Brand Management",
brands: "Brand Library",
@@ -106,9 +106,9 @@ const enUS = {
title: "Custom Generation",
description: "Generate articles with custom prompt rules, instant or scheduled.",
},
optimize: {
title: "Article Optimization",
description: "No matching backend APIs exist in this repository yet.",
freeCreate: {
title: "Free Create",
description: "Create and edit articles freely, no templates or AI generation required.",
},
media: {
title: "Media Management",
@@ -209,8 +209,32 @@ const enUS = {
custom_generation: "Custom generation",
instant_task: "Instant task",
schedule_task: "Scheduled task",
free_create: "Free create",
},
},
freeCreate: {
actions: {
create: "New Article",
},
filters: {
publishStatus: "Publish Status",
keyword: "Search",
createdTime: "Created Time",
createdTimeStart: "Start",
createdTimeEnd: "End",
keywordPlaceholder: "Search by title",
},
list: {
eyebrow: "Free Create",
count: "{count} articles",
empty: "No articles yet. Click \"New Article\" to start creating.",
edit: "Edit article",
deleteConfirm: "Are you sure you want to delete this article?",
deleteSuccess: "Article deleted",
deleteError: "Failed to delete article",
},
createError: "Failed to create article",
},
templates: {
eyebrow: "Article Creation",
actions: {
@@ -431,6 +455,30 @@ const enUS = {
resetSize: "Reset size",
delete: "Delete image",
},
aiOptimize: {
title: "AI Optimize",
subtitle: "Supports contiguous multi-block selections and generates a rewrite from your instruction",
originalLabel: "Selected text",
previewLabel: "Preview",
previewPlaceholder: "After you enter an instruction, the AI rewrite will stream here.",
generating: "Generating...",
streamingHint: "Building a stronger version of the selected text in real time...",
disclaimer: "AI output is for reference only. Review it before replacing the original text.",
promptLabel: "Instruction",
promptPlaceholder: "For example: make it more natural, classroom-friendly, and persuasive while keeping the facts unchanged.",
generate: "Generate",
regenerate: "Regenerate",
stop: "Stop",
replace: "Replace selection",
close: "Keep original",
messages: {
selectionRequired: "Select one block or multiple contiguous blocks of article text first.",
promptRequired: "Enter an instruction first.",
selectionChanged: "The original selection changed. Please select it again before replacing.",
empty: "There is no AI content ready to replace yet.",
failed: "AI optimization failed. Please try again later.",
},
},
messages: {
saved: "Article saved.",
generating: "This article is still generating. Try editing it later.",
+52 -4
View File
@@ -53,7 +53,7 @@ const zhCN = {
articleCreation: "文章创作",
templates: "模版创作",
custom: "自定义生成",
optimize: "文章优化",
freeCreate: "自由创作",
media: "媒体管理",
brandManagement: "品牌管理",
brands: "品牌词库",
@@ -106,9 +106,9 @@ const zhCN = {
title: "自定义生成",
description: "基于自定义 Prompt 规则灵活生成文章,支持即时与定时任务。",
},
optimize: {
title: "文章优化",
description: "当前仓库还没有匹配的后端接口,页面暂保持为设计占位。",
freeCreate: {
title: "自由创作",
description: "自由创建并编辑文章,无需模版或AI生成。",
},
media: {
title: "媒体管理",
@@ -209,8 +209,32 @@ const zhCN = {
custom_generation: "自定义生成",
instant_task: "即时任务",
schedule_task: "定时任务",
free_create: "自由创作",
},
},
freeCreate: {
actions: {
create: "新建文章",
},
filters: {
publishStatus: "发布状态",
keyword: "搜索文章",
createdTime: "创建时间",
createdTimeStart: "开始时间",
createdTimeEnd: "结束时间",
keywordPlaceholder: "请输入标题内容搜索",
},
list: {
eyebrow: "自由创作",
count: "共 {count} 篇文章",
empty: "还未创建文章,点击「新建文章」开始创作~",
edit: "编辑文章",
deleteConfirm: "确认删除这篇文章吗?",
deleteSuccess: "文章已删除",
deleteError: "删除文章失败",
},
createError: "创建文章失败",
},
templates: {
eyebrow: "Article Creation",
actions: {
@@ -438,6 +462,30 @@ const zhCN = {
resetSize: "重置大小",
delete: "删除图片",
},
aiOptimize: {
title: "AI 优化",
subtitle: "支持连续多段选中,基于你的优化要求生成候选改写",
originalLabel: "当前选中文字",
previewLabel: "优化预览",
previewPlaceholder: "输入你的优化要求后,AI 会在这里实时生成候选内容。",
generating: "正在生成中...",
streamingHint: "正在根据你的要求逐步生成更合适的表达...",
disclaimer: "AI 生成内容仅供参考,请确认后再替换原文。",
promptLabel: "优化要求",
promptPlaceholder: "例如:更自然一点,适合课堂导入,保留原有信息但更有感染力。",
generate: "开始生成",
regenerate: "重新生成",
stop: "停止",
replace: "替换原文",
close: "先不替换",
messages: {
selectionRequired: "请先选中一段或连续多段需要优化的正文内容。",
promptRequired: "请先输入你的优化要求。",
selectionChanged: "原选区已变化,请重新选中后再替换。",
empty: "当前还没有可替换的 AI 内容。",
failed: "AI 优化失败,请稍后重试。",
},
},
messages: {
saved: "文章已保存",
generating: "文章还在生成中,请稍后再编辑。",