{"version":3,"file":"textFit.min.js","sources":["https:\/\/moodle.sonsbeekmedia.nl\/caie_39\/mod\/teachingtools\/amd\/src\/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 *\/\n\/*global define:true, document:true, window:true, HTMLElement:true*\/\n\n(function(root, factory) {\n \"use strict\";\n\n \/\/ UMD shim\n if (typeof define === \"function\" && define.amd) {\n \/\/ AMD\n define([], factory);\n } else if (typeof exports === \"object\") {\n \/\/ Node\/CommonJS\n module.exports = factory();\n } else {\n \/\/ Browser\n root.textFit = factory();\n }\n\n}(typeof global === \"object\" ? global : this, function () {\n \"use strict\";\n\n var 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 return 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 *\/\n function 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 \/\/ 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

\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) >> 1;\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 \/\/ Calculate height without padding.\n function 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 \/\/ Calculate width without padding.\n function 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 \/\/Returns true if it is a DOM element\n function 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 function hasClass(element, cls) {\n return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;\n }\n\n \/\/ Better than a stylesheet dependency\n function 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":["root","factory","global","this","defaultSettings","alignVert","alignHoriz","multiLine","detectMultiLine","minFontSize","maxFontSize","reProcess","widthOnly","alignVertWithFlexbox","els","options","settings","key","hasOwnProperty","toArray","elType","Object","prototype","toString","call","i","length","processItem","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","define","amd","exports","module","textFit"],"mappings":"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\/E"}