From d1ee239fd6d95349ddd79d3f5d19a85aaaf4a100 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 31 Mar 2026 20:25:07 +0800 Subject: [PATCH] fix: preserve psd text padding alignment --- lib/agents/psd-template-parser.ts | 11 +++++++++++ lib/agents/psd-template-style-resolver.ts | 11 +++++++++++ lib/agents/psd-text-layout.ts | 20 ++++++++++++++------ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/lib/agents/psd-template-parser.ts b/lib/agents/psd-template-parser.ts index e68578249..78fc4af87 100644 --- a/lib/agents/psd-template-parser.ts +++ b/lib/agents/psd-template-parser.ts @@ -589,6 +589,17 @@ export async function preparePsdTemplateRenderAssets(params: { }; } + if ( + currentLayer.paddingX <= 0 && + Number.isFinite(Number(analysis.suggestedPaddingX)) && + Number(analysis.suggestedPaddingX) > 0 + ) { + nextLayer = { + ...nextLayer, + paddingX: Math.max(0, Number(analysis.suggestedPaddingX)), + }; + } + if (nextLayer !== currentLayer) { nextLayers[layerIndex] = nextLayer; } diff --git a/lib/agents/psd-template-style-resolver.ts b/lib/agents/psd-template-style-resolver.ts index 0d62aef43..d92bc5b1c 100644 --- a/lib/agents/psd-template-style-resolver.ts +++ b/lib/agents/psd-template-style-resolver.ts @@ -131,6 +131,17 @@ export async function resolveAgentPsdTemplateTextStyles(template: AgentPsdTempla textAlign: analysis.inferredTextAlign, }; } + + if ( + Number(nextLayer.paddingX || 0) <= 0 && + Number.isFinite(Number(analysis?.suggestedPaddingX)) && + Number(analysis?.suggestedPaddingX) > 0 + ) { + nextLayer = { + ...nextLayer, + paddingX: Math.max(0, Number(analysis?.suggestedPaddingX)), + }; + } } if (nextLayer !== layer) { diff --git a/lib/agents/psd-text-layout.ts b/lib/agents/psd-text-layout.ts index fef35c0e3..ab9cd49b1 100644 --- a/lib/agents/psd-text-layout.ts +++ b/lib/agents/psd-text-layout.ts @@ -199,20 +199,28 @@ export function analyzeTextLayerPixels(params: { ); const leftGap = minX; const rightGap = Math.max(0, width - maxX - 1); - const tolerance = Math.max(4, width * 0.08); - const visibleWidth = maxX - minX + 1; + const centerTolerance = Math.max(4, width * 0.06); + const edgeTolerance = Math.max(6, width * 0.08); + const contentCenterX = (minX + maxX) / 2; + const stageCenterX = (width - 1) / 2; const inferredTextAlign: AgentPsdTextAlign = - visibleWidth >= width * 0.92 - ? "left" - : Math.abs(leftGap - rightGap) <= tolerance + Math.abs(contentCenterX - stageCenterX) <= centerTolerance && + Math.abs(leftGap - rightGap) <= edgeTolerance ? "center" - : leftGap > rightGap + : leftGap > rightGap + edgeTolerance ? "right" : "left"; + const suggestedPaddingX = + inferredTextAlign === "right" + ? Math.max(0, Math.round(rightGap)) + : inferredTextAlign === "center" + ? Math.max(0, Math.round(Math.min(leftGap, rightGap))) + : Math.max(0, Math.round(leftGap)); return { dominantColor, inferredTextAlign, + suggestedPaddingX, visibleBounds: { minX, minY,