diff --git a/app/canvas/[id]/page.tsx b/app/canvas/[id]/page.tsx index 1e7ee82dc..976f94eee 100644 --- a/app/canvas/[id]/page.tsx +++ b/app/canvas/[id]/page.tsx @@ -68,7 +68,10 @@ import { AgentWorkflowMaterialSelectionPanel } from "@/components/agents/AgentWo import { AgentPresetPanelNew } from "@/components/agents/AgentPresetPanelNew"; // 深色主题组件 V2 (新版布局) import { AgentPresetPanelDarkV2 } from "@/components/agents/AgentPresetPanelDarkV2"; -import { AgentWorkflowPanelDarkV2 } from "@/components/agents/AgentWorkflowPanelDarkV2"; +import { + AgentWorkflowBrandStorePanel, + AgentWorkflowPanelDarkV2, +} from "@/components/agents/AgentWorkflowPanelDarkV2"; import { AgentGenerationWorkspaceDarkV2 } from "@/components/agents/AgentGenerationWorkspaceDarkV2"; import { AgentProjectListSheet } from "@/components/agents/AgentProjectListSheet"; import { CanvasWorkspace } from "@/components/canvas"; @@ -1488,6 +1491,14 @@ export default function CanvasEditorPage({ params }: PageProps) { }); }} onClearPreset={() => setSelectedAgentPresetId(null)} + brandStorePanel={ + + } workflowStylePanel={ } // 嵌入的智能体选择面板 diff --git a/components/agents/AgentGenerationWorkspaceDarkV2.tsx b/components/agents/AgentGenerationWorkspaceDarkV2.tsx index bb6069684..5a1a8f471 100644 --- a/components/agents/AgentGenerationWorkspaceDarkV2.tsx +++ b/components/agents/AgentGenerationWorkspaceDarkV2.tsx @@ -68,6 +68,7 @@ interface AgentGenerationWorkspaceDarkV2Props { workflowContext?: AgentWorkflowComposerContext | null; onBack?: () => void; presetPanel?: ReactNode; + brandStorePanel?: ReactNode; materialSelectionPanel?: ReactNode; brandModelPanel?: ReactNode; onClearPreset?: () => void; @@ -351,6 +352,7 @@ export function AgentGenerationWorkspaceDarkV2({ workflowContext = null, onBack, presetPanel, + brandStorePanel, materialSelectionPanel, brandModelPanel, onClearPreset, @@ -1900,7 +1902,7 @@ export function AgentGenerationWorkspaceDarkV2({ 选择生图模式

- 先确定本次使用的模式,后续的商品图、参考图和结果展示都会随模式切换。 + 先确定本次使用的模式,并完成品牌和店铺选择,后续的商品图、品牌模特、参考图和结果展示都会随之联动。

{isReplacementPreset ? (

@@ -1953,6 +1955,12 @@ export function AgentGenerationWorkspaceDarkV2({ 暂无可用的生图模式配置。 )} + + {brandStorePanel ? ( +

+ {brandStorePanel} +
+ ) : null} {hasMaterialStep ? ( @@ -1982,7 +1990,7 @@ export function AgentGenerationWorkspaceDarkV2({ 风格步骤卡片

- 在同一页完成品牌、店铺、风格卡片、品牌模特和 Prompt 组合,不再跳转第二个页面。 + 在同一页完成风格卡片、品牌模特和 Prompt 组合,不再跳转第二个页面。

diff --git a/components/agents/AgentPresetCardDark.tsx b/components/agents/AgentPresetCardDark.tsx index b1d084a26..ba6565c65 100644 --- a/components/agents/AgentPresetCardDark.tsx +++ b/components/agents/AgentPresetCardDark.tsx @@ -99,7 +99,7 @@ export function AgentPresetCardDark({ whileHover={{ y: -3, scale: 1.01 }} whileTap={{ scale: 0.98 }} className={cn( - "group relative cursor-pointer overflow-hidden rounded-2xl border p-2.5 transition-all duration-300", + "group relative cursor-pointer overflow-hidden rounded-2xl border p-3 transition-all duration-300", selected ? "border-emerald-400/40 bg-emerald-500/[0.08] shadow-[0_0_24px_rgba(16,185,129,0.14)]" : "border-white/10 bg-white/[0.03] hover:border-white/20 hover:bg-white/[0.06]" @@ -142,29 +142,43 @@ export function AgentPresetCardDark({ > - ) : null} + ) : null} -
- {previewUrl ? ( - {preset.name} - ) : ( -
- +
+
+ {previewUrl ? ( + {preset.name} + ) : ( +
+ +
+ )} +
+
+ {imageModeLabel || typeInfo.label} +
+
+ +
+
+ {preset.name} +
+
+
+ + 贡献者:{ownerName} +
+
+ + 贡献时间:{publishedAt || "未记录"} +
- )} -
-
- -
-
- {preset.name}
-
{imageModeLabel || typeInfo.label}
{selected ? ( diff --git a/components/agents/AgentPresetPanelDarkV2.tsx b/components/agents/AgentPresetPanelDarkV2.tsx index b9da63a41..a02f33532 100644 --- a/components/agents/AgentPresetPanelDarkV2.tsx +++ b/components/agents/AgentPresetPanelDarkV2.tsx @@ -338,7 +338,7 @@ export function AgentPresetPanelDarkV2({ ) : null} {/* 卡片网格 */} -
+
{isLoading ? (
diff --git a/components/agents/AgentWorkflowPanelDarkV2.tsx b/components/agents/AgentWorkflowPanelDarkV2.tsx index 71e32971d..294e94953 100644 --- a/components/agents/AgentWorkflowPanelDarkV2.tsx +++ b/components/agents/AgentWorkflowPanelDarkV2.tsx @@ -58,6 +58,16 @@ interface AgentWorkflowPanelDarkV2Props { showcaseConfig?: AgentWorkflowShowcaseConfig | null; topNavRightSlot?: ReactNode; embedded?: boolean; + showBrandStoreSection?: boolean; +} + +interface AgentWorkflowBrandStorePanelProps { + config?: AgentWorkflowUiConfig | null; + inputs: AgentWorkflowInputs; + onInputsChange: (next: AgentWorkflowInputs) => void; + theme?: "light" | "dark"; + title?: string; + description?: string; } function buildSelectionSummary(params: { @@ -170,6 +180,77 @@ function StepOptionCard({ ); } +export function AgentWorkflowBrandStorePanel({ + config, + inputs, + onInputsChange, + theme = "dark", + title = "品牌和店铺选择", + description = "先选择品牌和店铺,后续品牌模特与风格步骤会按这里的选择联动。", +}: AgentWorkflowBrandStorePanelProps) { + const brandOptions = useMemo( + () => config?.inputOptions?.brands || defaultAgentWorkflowUiConfig.inputOptions?.brands || [], + [config?.inputOptions?.brands] + ); + const brandStoreEntries = useMemo( + () => getAgentWorkflowBrandStoreEntries(config), + [config] + ); + const storeOptions = useMemo( + () => getAgentWorkflowStoreOptionsByBrand({ config, brand: inputs.brand }), + [config, inputs.brand] + ); + const isDark = theme === "dark"; + + return ( +
+
+
+ {title} +
+
+ {description} +
+
+
+ + onInputsChange({ + ...inputs, + brand: value, + store: + value.trim().toLowerCase() === inputs.brand.trim().toLowerCase() + ? inputs.store + : "", + }) + } + /> + 0 && storeOptions.length === 0)} + onValueChange={(value) => onInputsChange({ ...inputs, store: value })} + /> +
+
+ ); +} + export function AgentWorkflowPanelDarkV2({ config, inputs, @@ -186,20 +267,8 @@ export function AgentWorkflowPanelDarkV2({ showcaseConfig, topNavRightSlot, embedded = false, + showBrandStoreSection = true, }: AgentWorkflowPanelDarkV2Props) { - const brandOptions = useMemo( - () => config?.inputOptions?.brands || defaultAgentWorkflowUiConfig.inputOptions?.brands || [], - [config?.inputOptions?.brands] - ); - const brandStoreEntries = useMemo( - () => getAgentWorkflowBrandStoreEntries(config), - [config] - ); - const storeOptions = useMemo( - () => getAgentWorkflowStoreOptionsByBrand({ config, brand: inputs.brand }), - [config, inputs.brand] - ); - const resolvedConfig = useMemo(() => { const source = config || defaultAgentWorkflowUiConfig; return { @@ -385,54 +454,27 @@ export function AgentWorkflowPanelDarkV2({ const workflowContent = (
- {/* 品牌和店铺选择 */} - -

- - 1 - - 品牌和店铺选择 -

-
- +

+ + 1 + + 品牌和店铺选择 +

+ - onInputsChange({ - ...inputs, - brand: value, - store: - value.trim().toLowerCase() === inputs.brand.trim().toLowerCase() - ? inputs.store - : "", - }) - } /> - 0 && storeOptions.length === 0)} - onValueChange={(value) => onInputsChange({ ...inputs, store: value })} - /> -
-
+ + ) : null} {/* 工作流步骤 */} {embedded ? (