From 3c125ceb86ffaff76a6f141563556593cceda0e8 Mon Sep 17 00:00:00 2001 From: kdletters Date: Thu, 25 Jun 2026 18:17:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=BF=AB=E9=80=9F=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E4=B8=8E=E6=94=B9=E9=80=A0=E7=94=9F=E6=88=90=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E5=BA=95=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 复用 ImageCanvasBasicGenerationComposerView 作为快速编辑面板容器 复用 ImageCanvasBasicGenerationComposerView 作为改造对话框容器 为基础底盘增加可配置化参数,覆盖标题、提示词、按钮、参考图和引用源能力 生成器参数与状态可由外层覆盖,支持快速编辑重绘等场景定制 Quick-edit 参考图使用通用参考图 Slot,不再手写组件 --- ...ImageCanvasBasicGenerationComposerView.tsx | 347 +++++++---- .../ImageCanvasEditGenerationModalView.tsx | 92 +-- .../ImageCanvasGenerationImageOptionsView.tsx | 168 +++--- .../ImageCanvasQuickEditPanelView.tsx | 541 ++++-------------- 4 files changed, 458 insertions(+), 690 deletions(-) diff --git a/src/components/image-editor/ImageCanvasBasicGenerationComposerView.tsx b/src/components/image-editor/ImageCanvasBasicGenerationComposerView.tsx index 2036eeb09..925907f9e 100644 --- a/src/components/image-editor/ImageCanvasBasicGenerationComposerView.tsx +++ b/src/components/image-editor/ImageCanvasBasicGenerationComposerView.tsx @@ -16,14 +16,27 @@ import { PlatformTextField } from '../common/PlatformTextField'; import type { CharacterReferenceImage, GenerateDialogState, + UploadTarget, } from './ImageCanvasEditorTypes'; import { ImageCanvasGenerationImageOptionsView } from './ImageCanvasGenerationImageOptionsView'; import { ImageCanvasReferenceSlot } from './ImageCanvasReferenceSlot'; -import { - calculateEditorImageGenerationPrice, -} from './ImageCanvasGenerationModel'; +import { calculateEditorImageGenerationPrice } from './ImageCanvasGenerationModel'; import { useImageCanvasFloatingOptionDismiss } from './useImageCanvasFloatingOptionDismiss'; +type ReferenceLabelFormatter = ( + reference: CharacterReferenceImage, + index: number, +) => string; + +type ReferenceTone = + | 'default' + | 'spec' + | 'icon' + | 'ui' + | 'quick-edit' + | 'video' + | 'audio'; + type ImageCanvasBasicGenerationComposerViewProps = { dialog: GenerateDialogState; style: CSSProperties; @@ -37,11 +50,41 @@ type ImageCanvasBasicGenerationComposerViewProps = { anchor: HTMLElement | null, placement: 'above' | 'below', ) => CSSProperties; - onRequestUpload: (target: 'generation-reference') => void; + onRequestUpload: (target: UploadTarget) => void; + onPickReferenceFromCanvas?: () => void; onToggleReferenceMenu?: () => void; onRememberImageModel?: (model: string) => void; onSubmit: (dialog: GenerateDialogState) => void; + dialogLabel?: string; + includeDimensions?: boolean; + includeModel?: boolean; + includeReferences?: boolean; + promptLabel?: string; + promptPlaceholder?: string; + optionLabelPrefix?: string; + dimensionRatioAriaLabelPrefix?: string; + dimensionSizeAriaLabelPrefix?: string; + referenceUploadTarget?: UploadTarget; + referenceButtonIcon?: ReactNode; + referenceButtonLabel?: string; + referenceButtonAriaLabel?: string; + referenceMenuLabel?: string; + referenceSlotTone?: ReferenceTone; + referenceSlotDisabled?: boolean; + referenceLabelFormatter?: ReferenceLabelFormatter; + referenceAriaLabelFormatter?: ReferenceLabelFormatter; + referenceRemoveLabelFormatter?: ReferenceLabelFormatter; + showReferenceAddButton?: boolean; + formClassName?: string; + footerClassName?: string; + promptClassName?: string; + referenceSlotClassName?: string; + submitButtonClassName?: string; + submitLabel?: string; + submitAriaLabel?: string; + submittingStatusLabel?: string; }; + function resetFailedDialogStatus(dialog: GenerateDialogState) { return { ...dialog, @@ -50,31 +93,6 @@ function resetFailedDialogStatus(dialog: GenerateDialogState) { }; } -function ReferenceChip({ - reference, - index, - onRemove, -}: { - reference: CharacterReferenceImage; - index: number; - onRemove: () => void; -}) { - const label = reference.label || `参考图${index + 1}`; - return ( -