@grafana/ui
Version:
Grafana Components Library
1 lines • 2.99 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,GAAA,EAAyB;AAC3C,MAAM,UAAA,GAAa,GAAA;AACnB,IAAI,YAAA,GAAe,EAAA;AAKZ,SAAS,gBAAA,GAAmB;AACjC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAAE,WAAW,IAAI,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,WAAA,CAAY,IAAA,EAAc,QAAA,EAAkB,UAAA,GAAa,GAAA,EAAkB;AACzF,EAAA,MAAM,SAAA,GAAY,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,UAAA,CAAA;AAC3C,EAAA,MAAM,WAAW,IAAA,GAAO,SAAA;AACxB,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAEpC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,gBAAA,EAAiB;AAEjC,EAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,IAAA,OAAA,CAAQ,OAAO,YAAA,GAAe,SAAA;AAAA,EAChC;AAEA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,WAAA,CAAY,IAAI,CAAA;AAExC,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EACd;AAEA,EAAA,KAAA,CAAM,GAAA,CAAI,UAAU,OAAO,CAAA;AAE3B,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,kBACd,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACA,SACA,UAAA,EACA;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,UAAU,CAAA;AAEjD,EAAA,MAAM,oBAAA,GAAwB,KAAA,IAAS,QAAA,CAAS,KAAA,GAAQ,CAAA,CAAA,GAAM,EAAA;AAC9D,EAAA,MAAM,wBAAwB,MAAA,GAAS,UAAA;AAGvC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,oBAAoB,CAAA;AACxE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,OAAA,IAAA,IAAA,GAAA,OAAA,GAAW,WAAW,CAAA;AACrD;;;;"}