@grafana/ui
Version:
Grafana Components Library
1 lines • 2.94 kB
Source Map (JSON)
{"version":3,"file":"measureText.mjs","sources":["../../../src/utils/measureText.ts"],"sourcesContent":["let _context: CanvasRenderingContext2D;\nconst cache = new Map<string, TextMetrics>();\nconst cacheLimit = 500;\nlet ctxFontStyle = '';\n\n/**\n * @internal\n */\nexport function getCanvasContext() {\n if (!_context) {\n _context = document.createElement('canvas').getContext('2d')!;\n }\n return _context;\n}\n\n/**\n * @beta\n */\nexport function measureText(text: string, fontSize: number, fontWeight = 400): TextMetrics {\n const fontStyle = `${fontWeight} ${fontSize}px 'Inter'`;\n const cacheKey = text + fontStyle;\n const fromCache = cache.get(cacheKey);\n\n if (fromCache) {\n return fromCache;\n }\n\n const context = getCanvasContext();\n\n if (ctxFontStyle !== fontStyle) {\n context.font = ctxFontStyle = fontStyle;\n }\n\n const metrics = context.measureText(text);\n\n if (cache.size === cacheLimit) {\n cache.clear();\n }\n\n cache.set(cacheKey, metrics);\n\n return metrics;\n}\n\n/**\n * @beta\n */\nexport function calculateFontSize(\n text: string,\n width: number,\n height: number,\n lineHeight: number,\n maxSize?: number,\n fontWeight?: number\n) {\n // calculate width in 14px\n const textSize = measureText(text, 14, fontWeight);\n // how much bigger than 14px can we make it while staying within our width constraints\n const fontSizeBasedOnWidth = (width / (textSize.width + 2)) * 14;\n const fontSizeBasedOnHeight = height / lineHeight;\n\n // final fontSize\n const optimalSize = Math.min(fontSizeBasedOnHeight, fontSizeBasedOnWidth);\n return Math.min(optimalSize, maxSize ?? optimalSize);\n}\n"],"names":[],"mappings":"AAAA,IAAI,QAAA;AACJ,MAAM,KAAA,uBAAY,GAAyB,EAAA;AAC3C,MAAM,UAAa,GAAA,GAAA;AACnB,IAAI,YAAe,GAAA,EAAA;AAKZ,SAAS,gBAAmB,GAAA;AACjC,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,QAAA,GAAW,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAE,WAAW,IAAI,CAAA;AAAA;AAE7D,EAAO,OAAA,QAAA;AACT;AAKO,SAAS,WAAY,CAAA,IAAA,EAAc,QAAkB,EAAA,UAAA,GAAa,GAAkB,EAAA;AACzF,EAAA,MAAM,SAAY,GAAA,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,UAAA,CAAA;AAC3C,EAAA,MAAM,WAAW,IAAO,GAAA,SAAA;AACxB,EAAM,MAAA,SAAA,GAAY,KAAM,CAAA,GAAA,CAAI,QAAQ,CAAA;AAEpC,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA;AAGT,EAAA,MAAM,UAAU,gBAAiB,EAAA;AAEjC,EAAA,IAAI,iBAAiB,SAAW,EAAA;AAC9B,IAAA,OAAA,CAAQ,OAAO,YAAe,GAAA,SAAA;AAAA;AAGhC,EAAM,MAAA,OAAA,GAAU,OAAQ,CAAA,WAAA,CAAY,IAAI,CAAA;AAExC,EAAI,IAAA,KAAA,CAAM,SAAS,UAAY,EAAA;AAC7B,IAAA,KAAA,CAAM,KAAM,EAAA;AAAA;AAGd,EAAM,KAAA,CAAA,GAAA,CAAI,UAAU,OAAO,CAAA;AAE3B,EAAO,OAAA,OAAA;AACT;AAKO,SAAS,kBACd,IACA,EAAA,KAAA,EACA,MACA,EAAA,UAAA,EACA,SACA,UACA,EAAA;AAEA,EAAA,MAAM,QAAW,GAAA,WAAA,CAAY,IAAM,EAAA,EAAA,EAAI,UAAU,CAAA;AAEjD,EAAA,MAAM,oBAAwB,GAAA,KAAA,IAAS,QAAS,CAAA,KAAA,GAAQ,CAAM,CAAA,GAAA,EAAA;AAC9D,EAAA,MAAM,wBAAwB,MAAS,GAAA,UAAA;AAGvC,EAAA,MAAM,WAAc,GAAA,IAAA,CAAK,GAAI,CAAA,qBAAA,EAAuB,oBAAoB,CAAA;AACxE,EAAA,OAAO,IAAK,CAAA,GAAA,CAAI,WAAa,EAAW,WAAW,CAAA;AACrD;;;;"}