diff --git a/apps/api/src/lib/meme-text-renderer.ts b/apps/api/src/lib/meme-text-renderer.ts index 1d0f6277..9d624990 100644 --- a/apps/api/src/lib/meme-text-renderer.ts +++ b/apps/api/src/lib/meme-text-renderer.ts @@ -143,8 +143,9 @@ export function autoSizeFontToFit( boxHeight: number, maxFontSize = DEFAULT_MAX_FONT_SIZE, ): number { + const effectiveMax = Math.min(maxFontSize, Math.floor(boxHeight / 2), Math.floor(boxWidth / 3)); let lo = MIN_FONT_SIZE; - let hi = maxFontSize; + let hi = Math.max(MIN_FONT_SIZE, effectiveMax); let best = MIN_FONT_SIZE; while (lo <= hi) { @@ -216,6 +217,9 @@ export function renderMemeTextSvg(opts: MemeTextOptions): Buffer { const fillAttr = escapeXmlAttr(textColor); const strokeAttr = escapeXmlAttr(strokeColor); + const totalTextHeight = lines.length * lineHeight; + const yOffset = by + (bh - totalTextHeight) / 2 + fontSize * 0.85; + for (let i = 0; i < lines.length; i++) { const line = lines[i]; if (!line) continue; @@ -228,12 +232,10 @@ export function renderMemeTextSvg(opts: MemeTextOptions): Buffer { } else if (textAlign === "right") { x = bx + bw - lineWidth; } else { - // center x = bx + (bw - lineWidth) / 2; } - // Baseline y: top of box + line offset + ascent approximation - const y = by + (i + 1) * lineHeight; + const y = yOffset + i * lineHeight; let d: string; try { diff --git a/apps/web/src/components/tools/meme-generator-settings.tsx b/apps/web/src/components/tools/meme-generator-settings.tsx index eb180483..bf9c1a57 100644 --- a/apps/web/src/components/tools/meme-generator-settings.tsx +++ b/apps/web/src/components/tools/meme-generator-settings.tsx @@ -163,46 +163,46 @@ function EditorSettings() { {/* Colors */} -
-
+
+
-
+
setTextColor(e.target.value)} - className="w-8 h-8 rounded border border-border shrink-0 cursor-pointer" + className="w-7 h-7 rounded border border-border shrink-0 cursor-pointer" /> setTextColor(e.target.value)} - className="flex-1 px-1.5 py-1 rounded border border-border bg-background text-xs text-foreground font-mono" + className="flex-1 min-w-0 px-1 py-1 rounded border border-border bg-background text-[11px] text-foreground font-mono" />
-
+
-
+
setStrokeColor(e.target.value)} - className="w-8 h-8 rounded border border-border shrink-0 cursor-pointer" + className="w-7 h-7 rounded border border-border shrink-0 cursor-pointer" /> setStrokeColor(e.target.value)} - className="flex-1 px-1.5 py-1 rounded border border-border bg-background text-xs text-foreground font-mono" + className="flex-1 min-w-0 px-1 py-1 rounded border border-border bg-background text-[11px] text-foreground font-mono" />