{"version":3,"sources":["webpack://uistats-typescript/./src/js/UIStats.js","webpack://uistats-typescript/webpack/bootstrap","webpack://uistats-typescript/./src/js/entry.js"],"names":["FN_IDENTITY","value","UIStats","observee","this","keyProps","keyCount","root","document","createElement","body","appendChild","_self","toggled","header","addEventListener","__toggleVisibility","__applyBaseLayout","proxyHandler","get","target","prop","receiver","set","obj","propName","kProps","refinedValue","childElem","evaluateFn","__applyKeyValue","proxy","Proxy","prototype","keyName","node","getElementById","id","innerHTML","setAttribute","__updateChildElem","newElem","add","Math","floor","random","label","content","style","display","borderBottom","borderLeft","width","color","__applyTextLayout","UIStatsChild","left","transform","textNode","paddingLeft","overflow","whiteSpace","textOverflow","position","top","background","fontFamily","fontSize","transition","justifyContent","alignItems","height","borderRadius","cursor","class_1","uiStats","precision","__installAsNewParent","Number","toFixed","suffix","suffixText","join","prefix","prefixText","newChildElem","exports","__webpack_module_cache__","globalThis","__webpack_require__","moduleId","module","__webpack_modules__"],"mappings":"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","file":"uistats.min.js","sourcesContent":["\"use strict\";\n/**\n * This is a tiny UI module for displaying simple stats data.\n *\n * Not working with IEx. Use a 'Proxy' polyfill maybe?\n *\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n *\n * @author Ikaros Kappler\n * @date   2020-12-20\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\n;\n/**\n * The default `Evaluator` function: identity (display values raw as they are).\n */\nvar FN_IDENTITY = function (value) { return value; };\n/**\n * The main class.\n *\n * Once instantiated it will append a new HTMLDivElement node to the DOM.\n */\nvar UIStats = /** @class */ (function () {\n    // @name LiveStats\n    // @constructor\n    // @param {object} observee\n    // @param {Object} keyToObserve (string->Object with props)\n    function UIStats(observee) {\n        // @member {object} Keeps the props for currently observed keys.\n        this.keyProps = {};\n        // @member {object}\n        this.keyProps = {};\n        // @member {number}\n        this.keyCount = 0;\n        // @member {object}\n        this.observee = observee;\n        this.root = document.createElement('div');\n        document.body.appendChild(this.root);\n        var _self = this;\n        this.toggled = false;\n        // Add header node\n        this.header = document.createElement('div');\n        this.header.addEventListener('click', function () { _self.__toggleVisibility(); });\n        this.root.appendChild(this.header);\n        this.__applyBaseLayout();\n        var proxyHandler = {\n            get: function (target, prop, receiver) {\n                // if( prop === 'message' )\n                //   ...;\n                // console.log('get', prop, target, receiver );\n                return target[prop]; // _self.observee[prop];\n            },\n            set: function (obj, propName, value) {\n                // Apply the setter itself\n                _self.observee[propName] = value;\n                // Check further handling\n                var kProps = _self.keyProps[propName];\n                if (typeof kProps !== \"undefined\") {\n                    var refinedValue = kProps.childElem.evaluateFn(value);\n                    _self.__applyKeyValue(propName, kProps, refinedValue);\n                }\n                return true; // Indicates change was successful\n            }\n        };\n        this.proxy = new Proxy(observee, proxyHandler);\n    }\n    ;\n    // @private\n    UIStats.prototype.__applyKeyValue = function (keyName, kProps, value) {\n        var node = document.getElementById(kProps.id);\n        node.innerHTML = value;\n        node.setAttribute('title', value);\n    };\n    ;\n    // @param {string} keyName\n    // @param {LiveStatsElem} newElem\n    UIStats.prototype.__updateChildElem = function (keyName, newElem) {\n        var kProps = this.keyProps[keyName];\n        if (typeof kProps !== \"undefined\") {\n            kProps.childElem = newElem;\n        }\n    };\n    ;\n    UIStats.prototype.add = function (keyName) {\n        var id = keyName + \"_\" + Math.floor(Math.random() * 65636);\n        // └-Root\n        //   └-Node\n        //     ├-Label\n        //     └-Content (with unique ID)\n        var node = document.createElement('div');\n        var label = document.createElement('div');\n        var content = document.createElement('div');\n        node.style.display = 'flex';\n        node.style.borderBottom = '1px solid #2c2c2c';\n        node.style.borderLeft = '3px solid #806787';\n        label.style.width = '50%';\n        label.style.color = '#0070ff';\n        this.__applyTextLayout(label);\n        label.innerHTML = keyName;\n        label.setAttribute('title', keyName);\n        content.style.width = '50%';\n        content.style.color = '#cccecb';\n        content.setAttribute('id', id);\n        this.__applyTextLayout(content);\n        node.appendChild(label);\n        node.appendChild(content);\n        this.root.appendChild(node);\n        // Gives the user the opportunity to tweak the output.\n        // Identity function is the default behavior.\n        var childElem = new UIStats.UIStatsChild(this, keyName, FN_IDENTITY);\n        this.keyProps[keyName] = { id: id, childElem: childElem };\n        this.keyCount++;\n        // Initially display the current value\n        this.__applyKeyValue(keyName, this.keyProps[keyName], this.observee[keyName]);\n        return childElem;\n    };\n    ;\n    // Toggles the main component on/off.\n    // @private\n    UIStats.prototype.__toggleVisibility = function () {\n        this.toggled = !this.toggled;\n        if (this.toggled) {\n            this.root.style.left = '-200px';\n            this.header.style.transform = 'rotate(180deg)';\n        }\n        else {\n            this.root.style.left = '0px';\n            this.header.style.transform = 'rotate(0deg)';\n        }\n    };\n    ;\n    // Avoid text from overflowing or breaking the bounds.\n    // @private\n    UIStats.prototype.__applyTextLayout = function (textNode) {\n        textNode.style.paddingLeft = '3px';\n        textNode.style.overflow = 'hidden';\n        textNode.style.whiteSpace = 'nowrap';\n        textNode.style.textOverflow = 'ellipsis';\n    };\n    ;\n    // @private\n    UIStats.prototype.__applyBaseLayout = function () {\n        this.root.style.position = 'absolute';\n        this.root.style.left = '0';\n        this.root.style.top = '0';\n        this.root.style.width = '200px';\n        this.root.style.background = '#1a1a1a'; // Like in dat.gui\n        this.root.style.fontFamily = 'Calibri, Arial, Helvetica';\n        this.root.style.fontSize = '12px';\n        this.root.style.transition = 'left 1s';\n        this.header.style.position = 'absolute';\n        this.header.style.display = 'flex';\n        this.header.style.justifyContent = 'center';\n        this.header.style.alignItems = 'center';\n        this.header.style.top = '0';\n        this.header.style.left = '100%';\n        this.header.style.width = '12px';\n        this.header.style.height = '12px';\n        this.header.style.borderRadius = '6px';\n        this.header.style.background = 'rgba(255,255,255,0.5)';\n        this.header.style.color = 'black';\n        this.header.style.fontSize = '6px';\n        this.header.style.cursor = 'pointer';\n        this.header.innerHTML = '&#9664;';\n    };\n    ;\n    // @param {UIStats} liveStats\n    // @param {string} keyName\n    // @param {function} evaluateFn - A function with one param: value => newValue\n    UIStats.UIStatsChild = /** @class */ (function () {\n        // Creates a new child.\n        function class_1(uiStats, keyName, evaluateFn) {\n            this.precision = function (precision) {\n                var _self = this;\n                return this.__installAsNewParent(function (value) {\n                    return Number(_self.evaluateFn(value)).toFixed(precision);\n                });\n            };\n            this.suffix = function (suffixText) {\n                var _self = this;\n                return this.__installAsNewParent(function (value) {\n                    return [_self.evaluateFn(value), suffixText].join('');\n                });\n            };\n            this.prefix = function (prefixText) {\n                var _self = this;\n                return this.__installAsNewParent(function (value) {\n                    return [prefixText, _self.evaluateFn(value)].join('');\n                });\n            };\n            this.uiStats = uiStats;\n            this.keyName = keyName;\n            this.evaluateFn = evaluateFn;\n        }\n        ;\n        class_1.prototype.__installAsNewParent = function (evaluateFn) {\n            var newChildElem = new UIStats.UIStatsChild(this.uiStats, this.keyName, evaluateFn);\n            this.uiStats.__updateChildElem(this.keyName, newChildElem);\n            return newChildElem;\n        };\n        ;\n        return class_1;\n    }()); // END nested class\n    return UIStats;\n}());\n;\nexports.default = UIStats;\n//# sourceMappingURL=UIStats.js.map","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","\"use strict\";\n/* Imports and exports for webpack */\n\n// Expose the component to the global scope\nglobalThis.UIStats = require(\"./UIStats.js\").default;\n"],"sourceRoot":""}