import { Check, ChevronDown, Cpu, ImageIcon, ImagePlus } from 'lucide-react'; import { type CSSProperties, type Dispatch, type ReactNode, type RefObject, type SetStateAction, useCallback, useRef, useState, } from 'react'; import { PlatformActionButton } from '../common/PlatformActionButton'; import { PlatformFloatingMenu, PlatformFloatingMenuItem, } from '../common/PlatformFloatingMenu'; import { PlatformInlineOptionButton } from '../common/PlatformInlineOptionButton'; import { PlatformStatusMessage } from '../common/PlatformStatusMessage'; import { PlatformTextField } from '../common/PlatformTextField'; import type { CanvasLayer, CharacterReferenceImage, QuickEditPanelState, } from './ImageCanvasEditorTypes'; import { calculateEditorImageModelPrice, EDITOR_IMAGE_DIMENSION_OPTIONS, EDITOR_IMAGE_MODEL_OPTIONS, getEditorImageModelDisplayName, IMAGE_MODEL_NANOBANANA2, normalizeEditorImageModel, QUICK_EDIT_REFERENCE_LIMIT, resolveEditorImageSizeLabel, } from './ImageCanvasGenerationModel'; import { ImageCanvasReferenceSlot } from './ImageCanvasReferenceSlot'; import { useImageCanvasFloatingOptionDismiss } from './useImageCanvasFloatingOptionDismiss'; type ImageCanvasQuickEditPanelViewProps = { panel: QuickEditPanelState; sourceLayer: CanvasLayer; style: CSSProperties; referenceButtonRef?: RefObject; isReferenceMenuOpen?: boolean; setIsReferenceMenuOpen?: Dispatch>; setIsPickingQuickEditReferenceFromCanvas?: Dispatch>; setQuickEditPanel: Dispatch>; renderEditorPortal?: (node: ReactNode) => ReactNode; buildPortalMenuStyle?: ( anchor: HTMLElement | null, placement: 'above' | 'below', ) => CSSProperties; onRequestUpload?: (target: 'quick-edit-reference') => void; onRememberImageModel?: (model: string) => void; onSubmit: () => void; }; type OpenPanel = 'dimensions' | 'model' | null; function resetFailedPanelStatus( panel: T, ) { return { ...panel, status: panel.status === 'failed' ? 'idle' : panel.status, errorMessage: panel.status === 'failed' ? undefined : panel.errorMessage, }; } function QuickEditReferenceChip({ reference, index, onRemove, }: { reference: CharacterReferenceImage; index: number; onRemove: () => void; }) { const label = `图${index + 1}`; return (