diff --git a/src/api/badge.js b/src/api/badge.js index 14eea55..ed12fc4 100644 --- a/src/api/badge.js +++ b/src/api/badge.js @@ -42,7 +42,7 @@ router.get('/badge', async (req, res) => { const iconSize = size; const fontSize = calcFontSize(iconSize); const textPadding = Math.round(iconSize * 0.4); - const textHpad = Math.round(fontSize * 0.6); // horizontal padding inside text rect + const textHpad = 4; // horizontal padding inside text rect — enough to prevent clipping const radius = style === 'flat' ? 3 : 0; const textWidth = estimateTextWidth(effectiveLabel, fontSize) + textHpad * 2; @@ -55,7 +55,7 @@ router.get('/badge', async (req, res) => { if (heightMatch) iconViewBoxHeight = parseFloat(heightMatch[1]); // Ikon doboz mérete - const iconPad = 5; + const iconPad = 2; const iconBoxWidth = iconViewBoxWidth + iconPad; const iconBoxHeight = iconViewBoxHeight + iconPad; diff --git a/src/lib/svg-utils.js b/src/lib/svg-utils.js index e2c1922..d6ec081 100644 --- a/src/lib/svg-utils.js +++ b/src/lib/svg-utils.js @@ -8,10 +8,10 @@ const calcFontSize = (size) => Math.round(size * 0.6); /** * Text-width estimate based on font-size and character count. - * Uses a 0.65 coefficient with Verdana which has wider letterforms. - * Adds extra padding so the text never touches the rect edges. + * Uses a 0.7 coefficient — Verdana has wide letterforms (M, W, D are ~70% of fontSize). + * Returns only the raw text bounding box — padding is added by callers. */ const estimateTextWidth = (text, fontSize) => - text.length * fontSize * 0.65 + fontSize * 0.8; + text.length * fontSize * 0.7; module.exports = { FONT_FAMILY, calcFontSize, estimateTextWidth }; diff --git a/test/svg-utils.test.js b/test/svg-utils.test.js index 41d431a..e16b913 100644 --- a/test/svg-utils.test.js +++ b/test/svg-utils.test.js @@ -29,21 +29,19 @@ describe('svg-utils', () => { describe('estimateTextWidth', () => { it('should estimate width based on text length and font size', () => { const width = estimateTextWidth('Hello', 14); - // formula: text.length * fontSize * 0.65 + fontSize * 0.8 - expect(width).toBe(5 * 14 * 0.65 + 14 * 0.8); // 56.7 + // formula: text.length * fontSize * 0.7 + expect(width).toBe(5 * 14 * 0.7); // 49 }); - it('should include padding for empty string', () => { - // Even empty strings get the base padding - expect(estimateTextWidth('', 14)).toBe(14 * 0.8); // 11.2 + it('should return 0 for empty string', () => { + expect(estimateTextWidth('', 14)).toBe(0); }); it('should scale with font size', () => { const w1 = estimateTextWidth('test', 10); const w2 = estimateTextWidth('test', 20); - // w1 = 4*10*0.65 + 10*0.8 = 34 - // w2 = 4*20*0.65 + 20*0.8 = 68 - expect(w2).toBe(68); + expect(w1).toBe(4 * 10 * 0.7); // 28 + expect(w2).toBe(4 * 20 * 0.7); // 56 }); }); });