moodle_local_treestudyplan/amd/build/util/textfit.min.js.map
2024-02-23 09:20:10 +01:00

1 line
12 KiB
Plaintext

{"version":3,"file":"textfit.min.js","sources":["../../src/util/textfit.js"],"sourcesContent":["/**\n * textFit v2.3.1\n * Previously known as jQuery.textFit\n * 11/2014 by STRML (strml.github.com)\n * MIT License\n *\n * To use: textFit(document.getElementById('target-div'), options);\n *\n * Will make the *text* content inside a container scale to fit the container\n * The container is required to have a set width and height\n * Uses binary search to fit text with minimal layout calls.\n * Version 2.0 does not use jQuery.\n */\nvar defaultSettings = {\n alignVert: false, // if true, textFit will align vertically using css tables\n alignHoriz: false, // if true, textFit will set text-align: center\n multiLine: false, // if true, textFit will not set white-space: no-wrap\n detectMultiLine: true, // disable to turn off automatic multi-line sensing\n minFontSize: 6,\n maxFontSize: 80,\n reProcess: true, // if true, textFit will re-process already-fit nodes. Set to 'false' for better performance\n widthOnly: false, // if true, textFit will fit text to element width, regardless of text height\n alignVertWithFlexbox: false, // if true, textFit will use flexbox for vertical alignment\n};\n\n/**\n * Create new textFit element(S)\n * @param {*} els element or element list\n * @param {*} options Options (See default settings in textfit.js)\n */\nexport function textFit(els, options) {\n\n if (!options) { options = {}; }\n\n // Extend options.\n var settings = {};\n for(var key in defaultSettings){\n if(options.hasOwnProperty(key)){\n settings[key] = options[key];\n } else {\n settings[key] = defaultSettings[key];\n }\n }\n\n // Convert jQuery objects into arrays\n if (typeof els.toArray === \"function\") {\n els = els.toArray();\n }\n\n // Support passing a single el\n var elType = Object.prototype.toString.call(els);\n if (elType !== '[object Array]' && elType !== '[object NodeList]' &&\n elType !== '[object HTMLCollection]'){\n els = [els];\n }\n\n // Process each el we've passed.\n for(var i = 0; i < els.length; i++){\n processItem(els[i], settings);\n }\n}\n\n/**\n * The meat. Given an el, make the text inside it fit its parent.\n * @param {DOMElement} el Child el.\n * @param {Object} settings Options for fit.\n */\nfunction processItem(el, settings){\n if (!isElement(el) || (!settings.reProcess && el.getAttribute('textFitted'))) {\n return false;\n }\n\n // Set textFitted attribute so we know this was processed.\n if(!settings.reProcess){\n el.setAttribute('textFitted', 1);\n }\n\n var innerSpan, originalHeight, originalHTML, originalWidth;\n var low, mid, high;\n\n // Get element data.\n originalHTML = el.innerHTML;\n originalWidth = innerWidth(el);\n originalHeight = innerHeight(el);\n\n // Don't process if we can't find box dimensions\n if (!originalWidth || (!settings.widthOnly && !originalHeight)) {\n if(!settings.widthOnly) {\n throw new Error('Set a static height and width on the target element ' + el.outerHTML +\n ' before using textFit!');\n } else {\n throw new Error('Set a static width on the target element ' + el.outerHTML +\n ' before using textFit!');\n }\n }\n\n // Add textFitted span inside this container.\n if (originalHTML.indexOf('textFitted') === -1) {\n innerSpan = document.createElement('span');\n innerSpan.className = 'textFitted';\n // Inline block ensure it takes on the size of its contents, even if they are enclosed\n // in other tags like <p>\n innerSpan.style['display'] = 'inline-block';\n innerSpan.innerHTML = originalHTML;\n el.innerHTML = '';\n el.appendChild(innerSpan);\n } else {\n // Reprocessing.\n innerSpan = el.querySelector('span.textFitted');\n // Remove vertical align if we're reprocessing.\n if (hasClass(innerSpan, 'textFitAlignVert')){\n innerSpan.className = innerSpan.className.replace('textFitAlignVert', '');\n innerSpan.style['height'] = '';\n el.className.replace('textFitAlignVertFlex', '');\n }\n }\n\n // Prepare & set alignment\n if (settings.alignHoriz) {\n el.style['text-align'] = 'center';\n innerSpan.style['text-align'] = 'center';\n }\n\n // Check if this string is multiple lines\n // Not guaranteed to always work if you use wonky line-heights\n var multiLine = settings.multiLine;\n if (settings.detectMultiLine && !multiLine &&\n innerSpan.getBoundingClientRect().height >= parseInt(window.getComputedStyle(innerSpan)['font-size'], 10) * 2){\n multiLine = true;\n }\n\n // If we're not treating this as a multiline string, don't let it wrap.\n if (!multiLine) {\n el.style['white-space'] = 'nowrap';\n }\n\n low = settings.minFontSize;\n high = settings.maxFontSize;\n\n // Binary search for highest best fit\n var size = low;\n while (low <= high) {\n mid = (high + low) / 2;\n innerSpan.style.fontSize = mid + 'px';\n var innerSpanBoundingClientRect = innerSpan.getBoundingClientRect();\n if (\n innerSpanBoundingClientRect.width <= originalWidth\n && (settings.widthOnly || innerSpanBoundingClientRect.height <= originalHeight)\n ) {\n size = mid;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n // await injection point\n }\n // found, updating font if differs:\n if( innerSpan.style.fontSize != size + 'px' ) { innerSpan.style.fontSize = size + 'px'; }\n\n // Our height is finalized. If we are aligning vertically, set that up.\n if (settings.alignVert) {\n addStyleSheet();\n var height = innerSpan.scrollHeight;\n if (window.getComputedStyle(el)['position'] === \"static\"){\n el.style['position'] = 'relative';\n }\n if (!hasClass(innerSpan, \"textFitAlignVert\")){\n innerSpan.className = innerSpan.className + \" textFitAlignVert\";\n }\n innerSpan.style['height'] = height + \"px\";\n if (settings.alignVertWithFlexbox && !hasClass(el, \"textFitAlignVertFlex\")) {\n el.className = el.className + \" textFitAlignVertFlex\";\n }\n }\n}\n\n/**\n * Calculate height without padding.\n * @param {*} el\n * @returns\n */\nfunction innerHeight(el){\n var style = window.getComputedStyle(el, null);\n return el.getBoundingClientRect().height -\n parseInt(style.getPropertyValue('padding-top'), 10) -\n parseInt(style.getPropertyValue('padding-bottom'), 10);\n}\n\n/**\n * Calculate width without padding.\n * @param {*} el\n * @returns\n */\nfunction innerWidth(el){\n var style = window.getComputedStyle(el, null);\n return el.getBoundingClientRect().width -\n parseInt(style.getPropertyValue('padding-left'), 10) -\n parseInt(style.getPropertyValue('padding-right'), 10);\n}\n\n/**\n * Returns true if it is a DOM element\n * @param {*} o\n * @returns\n */\nfunction isElement(o){\n return (\n typeof HTMLElement === \"object\" ? o instanceof HTMLElement : //DOM2\n o && typeof o === \"object\" && o !== null && o.nodeType === 1 && typeof o.nodeName===\"string\"\n );\n}\n\n/**\n * Check if element has a specific class\n * @param {*} element\n * @param {*} cls\n * @returns\n */\nfunction hasClass(element, cls) {\n return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;\n}\n\n// Better than a stylesheet dependency\n/**\n * Add stylesheet to the page for this\n * @returns\n */\nfunction addStyleSheet() {\n if (document.getElementById(\"textFitStyleSheet\")) { return; }\n var style = [\n \".textFitAlignVert{\",\n \"position: absolute;\",\n \"top: 0; right: 0; bottom: 0; left: 0;\",\n \"margin: auto;\",\n \"display: flex;\",\n \"justify-content: center;\",\n \"flex-direction: column;\",\n \"}\",\n \".textFitAlignVertFlex{\",\n \"display: flex;\",\n \"}\",\n \".textFitAlignVertFlex .textFitAlignVert{\",\n \"position: static;\",\n \"}\",].join(\"\");\n\n var css = document.createElement(\"style\");\n css.type = \"text/css\";\n css.id = \"textFitStyleSheet\";\n css.innerHTML = style;\n document.body.appendChild(css);\n}\n"],"names":["els","options","settings","key","defaultSettings","hasOwnProperty","toArray","elType","Object","prototype","toString","call","i","length","processItem","alignVert","alignHoriz","multiLine","detectMultiLine","minFontSize","maxFontSize","reProcess","widthOnly","alignVertWithFlexbox","el","o","HTMLElement","nodeType","nodeName","getAttribute","innerSpan","originalHeight","originalHTML","originalWidth","low","mid","high","setAttribute","innerHTML","style","window","getComputedStyle","getBoundingClientRect","width","parseInt","getPropertyValue","innerWidth","height","innerHeight","Error","outerHTML","indexOf","document","createElement","className","appendChild","hasClass","querySelector","replace","size","fontSize","innerSpanBoundingClientRect","getElementById","join","css","type","id","body","addStyleSheet","scrollHeight","element","cls"],"mappings":"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"}