9c7b3ad16d
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.
102 lines
3.0 KiB
TypeScript
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>
|
|
);
|
|
}
|