diff --git a/src/components/nodes/AudioInputNode.tsx b/src/components/nodes/AudioInputNode.tsx index 5d63ba59..7f76500e 100644 --- a/src/components/nodes/AudioInputNode.tsx +++ b/src/components/nodes/AudioInputNode.tsx @@ -181,6 +181,7 @@ export function AudioInputNodeView({ }, [isUploading]); const title = getAudioNodeTitle(id, nodeData, t("node.audioInput")); + const mediaActionVisibility = selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"; return ( - {/* Download button */} + - {/* Remove button */} @@ -334,7 +345,8 @@ export function AudioInputNodeView({ className="flex h-full min-h-28 w-full cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed border-neutral-700 bg-neutral-900/40 transition-colors hover:border-neutral-500 hover:bg-neutral-900/60" > - + + {nodeData.isOptional ? t("common.optional") : t("audioInput.dropAudio")} diff --git a/src/components/nodes/GenerateAudioNode.tsx b/src/components/nodes/GenerateAudioNode.tsx index 2a34adfc..6a002980 100644 --- a/src/components/nodes/GenerateAudioNode.tsx +++ b/src/components/nodes/GenerateAudioNode.tsx @@ -1,7 +1,6 @@ "use client"; import React, { useCallback, useState, useEffect, useMemo } from "react"; -import { CustomerServiceOutlined } from "@ant-design/icons"; import { Handle, Position, NodeProps, Node, useReactFlow } from "@xyflow/react"; import { BaseNode } from "./BaseNode"; import { ProviderBadge } from "./ProviderBadge"; @@ -493,13 +492,6 @@ export function GenerateAudioNodeView({ ) : undefined} > -
- - - - {displayTitle} -
-
{nodeData.outputAudio ? (
@@ -618,8 +610,8 @@ export function GenerateAudioNodeView({
) : ( -
-
+
+
{nodeData.status === "loading" ? ( <>
@@ -630,7 +622,10 @@ export function GenerateAudioNodeView({ {displayError || t("node.generationFailed")} ) : ( - + + + + )}
diff --git a/src/components/nodes/ImageInputNode.tsx b/src/components/nodes/ImageInputNode.tsx index f70cf423..7da20df3 100644 --- a/src/components/nodes/ImageInputNode.tsx +++ b/src/components/nodes/ImageInputNode.tsx @@ -300,6 +300,7 @@ export function ImageInputNodeView({ id, data, selected }: ImageInputNodeViewPro const title = getImageNodeTitle(id, nodeData, t("node.image")); const hasImage = Boolean(displayImage); + const mediaActionVisibility = selected ? "opacity-100" : "opacity-0 group-hover:opacity-100"; return ( - - )} + + + +
) : (
diff --git a/src/components/nodes/SmartAudioNode.tsx b/src/components/nodes/SmartAudioNode.tsx index 4cee8426..1c2882d7 100644 --- a/src/components/nodes/SmartAudioNode.tsx +++ b/src/components/nodes/SmartAudioNode.tsx @@ -103,7 +103,7 @@ function SmartAudioUploadToolbar({ /> {selected && ( -
+
@@ -424,7 +425,7 @@ export function VideoInputNodeView({ id, data, selected }: VideoInputNodeViewPro downloadMedia(nodeData.video!, "video"); }} aria-label={t("videoInput.download")} - className="absolute top-2 right-10 w-6 h-6 bg-black/60 hover:bg-black/80 text-white rounded text-xs opacity-0 group-hover:opacity-100 focus:opacity-100 transition-all flex items-center justify-center" + className={`absolute top-2 right-10 w-6 h-6 bg-black/60 hover:bg-black/80 text-white rounded text-xs focus:opacity-100 transition-all flex items-center justify-center ${mediaActionVisibility}`} > @@ -436,7 +437,7 @@ export function VideoInputNodeView({ id, data, selected }: VideoInputNodeViewPro handleRemove(); }} aria-label={t("videoInput.remove")} - className="absolute top-2 right-2 w-6 h-6 bg-black/60 hover:bg-red-600/80 text-white rounded text-xs opacity-0 group-hover:opacity-100 focus:opacity-100 focus:ring-1 focus:ring-red-400 transition-all flex items-center justify-center" + className={`absolute top-2 right-2 w-6 h-6 bg-black/60 hover:bg-red-600/80 text-white rounded text-xs focus:opacity-100 focus:ring-1 focus:ring-red-400 transition-all flex items-center justify-center ${mediaActionVisibility}`} >