Files
Genarrative/src/components/image-editor/ImageCanvasSelectedLayerToolbarView.tsx
T
JenkenB 9c7b3ad16d Image editor: Seedance2.0 refs and audio changes
Adds Seedance 2.0 reference-media constraints and forbids video data URLs; updates docs/decision-log and pitfalls to record the new rules. Introduces typed audio params (type: one-shot|loop, tempo: number|null), generator-specific placeholder styles/avoidance and UI changes for generation panels. Implements related front-end changes (new crop/ raster edit components, many image-editor models, tests and workflow hooks) and server-side contract/handler updates across api-server, shared-contracts, platform-audio, platform-image and vector_engine_audio_generation to support the new submission/asset flow and validations.
2026-06-18 17:31:35 +08:00

102 lines
3.0 KiB
TypeScript

import {
Crop,
Download,
Eraser,
Sparkles,
WandSparkles,
} from 'lucide-react';
import type { CSSProperties } from 'react';
import { PlatformIconButton } from '../common/PlatformIconButton';
import { EditorIconButton } from './ImageCanvasEditorPrimitives';
import type { CanvasLayer } from './ImageCanvasEditorTypes';
type ImageCanvasSelectedLayerToolbarViewProps = {
selectedLayer: CanvasLayer | null;
selectedToolbarStyle: CSSProperties | null;
onOpenQuickEditPanel: (layer: CanvasLayer) => void;
onOpenRedrawPanel: (layer: CanvasLayer) => void;
onOpenCropExpandPanel: (layer: CanvasLayer) => void;
onRemoveBackground: (layer: CanvasLayer) => void;
onOpenCharacterAnimationPanel: (layer: CanvasLayer) => void;
onDownloadLayer: (layer: CanvasLayer) => void;
};
export function ImageCanvasSelectedLayerToolbarView({
selectedLayer,
selectedToolbarStyle,
onOpenQuickEditPanel,
onOpenRedrawPanel,
onOpenCropExpandPanel,
onRemoveBackground,
onOpenCharacterAnimationPanel,
onDownloadLayer,
}: ImageCanvasSelectedLayerToolbarViewProps) {
if (!selectedLayer || !selectedToolbarStyle) {
return null;
}
return (
<div
className="image-canvas-editor__floating-toolbar"
style={selectedToolbarStyle}
role="toolbar"
aria-label="图片工具栏"
onPointerDown={(event) => event.stopPropagation()}
>
<PlatformIconButton
className="image-canvas-editor__floating-toolbar-text-button"
label="快速编辑"
title="快速编辑"
icon={<Sparkles className="h-4 w-4" />}
onClick={() => onOpenQuickEditPanel(selectedLayer)}
>
<span>快速编辑</span>
</PlatformIconButton>
<span
aria-hidden="true"
className="image-canvas-editor__floating-toolbar-divider"
/>
<EditorIconButton
label="裁扩按钮"
title="裁扩按钮"
icon={Crop}
onClick={() => onOpenCropExpandPanel(selectedLayer)}
/>
<EditorIconButton
label="去除背景按钮"
title="去除背景按钮"
icon={Eraser}
onClick={() => onRemoveBackground(selectedLayer)}
/>
{selectedLayer.assetKind === 'character' ? (
<EditorIconButton
label="生成动画"
title="生成动画"
icon={Sparkles}
onClick={() => onOpenCharacterAnimationPanel(selectedLayer)}
/>
) : null}
<span
aria-hidden="true"
className="image-canvas-editor__floating-toolbar-divider"
/>
<PlatformIconButton
className="image-canvas-editor__floating-toolbar-text-button"
label="重绘"
title="重绘"
icon={<WandSparkles className="h-4 w-4" />}
onClick={() => onOpenRedrawPanel(selectedLayer)}
>
<span>重绘</span>
</PlatformIconButton>
<EditorIconButton
label="下载按钮"
title="下载按钮"
icon={Download}
onClick={() => onDownloadLayer(selectedLayer)}
/>
</div>
);
}