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 ( -