{"version":3,"sources":["jsdelivr-header.js","/npm/bootstrap-input-spinner@5.0.7/src/InputSpinner.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACCA,MAAM,WAAa,SAAU,EAAO,GAChC,MAAM,EAAS,EAAM,QAAU,QAE/B,IAAI,EAAe,KACnB,KAAK,MAAQ,SAAU,GACnB,IAAK,EAAc,CACf,MAAM,EAAM,IAAI,KAAK,aAAa,GAC5B,EAAoB,EAAI,OAAO,OAAO,QAAQ,KAAM,KAAO,IAC3D,EAAmB,EAAI,OAAO,KAAK,QAAQ,KAAM,IACvD,EAAe,CACX,MAAO,KACP,SAAU,IAAI,OAAO,KAAO,EAAmB,KAC/C,QAAS,IAAI,OAAO,KAAO,GAEnC,CACA,OAAO,WAAW,EACb,QAAQ,EAAa,MAAO,IAC5B,QAAQ,EAAa,SAAU,IAC/B,QAAQ,EAAa,QAAS,KAEvC,EAEA,IAAI,EAAY,KACZ,GAAkB,EAClB,EAAiB,KACrB,KAAK,OAAS,SAAU,GACpB,MAAM,EAAW,SAAS,EAAQ,aAAa,mBAAqB,EAC9D,IAAkE,UAAhD,EAAQ,aAAa,wBAU7C,OATK,GAAa,IAAa,GAAkB,IAAkB,IAC/D,EAAY,IAAI,KAAK,aAAa,EAAQ,CACtC,sBAAuB,EACvB,sBAAuB,EACvB,YAAa,IAEjB,EAAiB,EACjB,EAAiB,GAEd,EAAU,OAAO,EAC5B,CACJ,EAEA,SAAS,cAAc,GACnB,MAAM,EAAM,SAAS,cAAc,YAEnC,OADA,EAAI,UAAY,EAAK,OACd,EAAI,QAAQ,iBACvB,CAEA,SAAS,gBAAgB,EAAI,EAAM,GAC/B,MAAM,EAAM,EAAG,aAAa,GAC5B,OAAY,OAAR,GAAwB,KAAR,GAAc,MAAM,WAAW,IACxC,EAEJ,WAAW,EACtB,QAEO,MAAM,aAET,WAAA,CAAY,EAAS,GAEjB,MAAM,EAAO,KACb,KAAK,QAAU,EAEf,KAAK,MAAQ,CACT,gBAAiB,2BACjB,gBAAiB,0BACjB,WAAY,GACZ,aAAc,wBACd,aAAc,SACd,UAAW,SACX,UAAW,IACX,aAAc,GACd,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,OAAQ,UAAU,SAClB,OAAQ,WACR,SACI,sbAOR,OAAO,OAAO,KAAK,MAAO,GAE1B,MAAM,EAAO,KAAK,MAAM,SACnB,QAAQ,kBAAmB,KAAK,MAAM,YACtC,QAAQ,oBAAqB,KAAK,MAAM,cACxC,QAAQ,oBAAqB,KAAK,MAAM,cACxC,QAAQ,uBAAwB,KAAK,MAAM,iBAC3C,QAAQ,uBAAwB,KAAK,MAAM,iBAC3C,QAAQ,iBAAkB,KAAK,MAAM,WAE1C,GAAI,EAAQ,2BAER,YADA,QAAQ,KAAK,UAAW,EAAS,wCAIrC,KAAK,SAAW,EAChB,KAAK,SAAS,4BAA6B,EAC3C,KAAK,SAAS,MAAM,QAAU,OAC9B,KAAK,SAAS,mBAAqB,IAAI,KAAK,MAAM,OAAO,KAAK,MAAO,GAErE,KAAK,iBAAmB,KACxB,KAAK,oBAAsB,KAE3B,KAAK,WAAa,cAAc,GAChC,KAAK,gBAAkB,KAAK,WAAW,cAAc,kBACrD,KAAK,gBAAkB,KAAK,WAAW,cAAc,kBACrD,KAAK,MAAQ,KAAK,WAAW,cAAc,SAE3C,KAAK,MAAQ,KACT,KAAK,SAAS,KACd,KAAK,MAAQ,SAAS,cAAc,cAAgB,KAAK,SAAS,GAAK,OAEtE,KAAK,QACN,KAAK,MAAQ,KAAK,SAAS,QAAQ,UAGvC,KAAK,IAAM,KACX,KAAK,IAAM,KACX,KAAK,KAAO,KAEZ,IAEA,KAAK,MAAQ,WAAW,KAAK,SAAS,OACtC,IAAI,GAAe,EAEnB,MAAM,EAAS,KAAK,SAAS,aAAa,gBAAkB,GACtD,EAAS,KAAK,SAAS,aAAa,gBAAkB,GAE5D,GAAI,EAAQ,CACR,MAAM,EAAgB,SAAS,cAAc,QAC7C,EAAc,UAAY,mBAC1B,EAAc,YAAc,EAC5B,KAAK,MAAM,WAAW,aAAa,EAAe,KAAK,MAC3D,CACA,GAAI,EAAQ,CACR,MAAM,EAAgB,SAAS,cAAc,QAC7C,EAAc,UAAY,mBAC1B,EAAc,YAAc,EAC5B,KAAK,MAAM,WAAW,aAAa,EAAe,KAAK,MAAM,YACjE,CAEA,KAAK,SAAS,SAAW,SAAU,GAC/B,EAAS,EACb,EACA,KAAK,SAAS,oBAAsB,YAyIpC,WACQ,EAAK,MAAM,WACX,EAAK,SAAS,UAAW,GAE7B,EAAK,SAAS,aACd,IACA,IAAK,MAAM,KAAO,EAAK,UAAW,IAClC,EAAK,UAAY,GACjB,EAAK,WAAW,SAChB,EAAK,SAAS,MAAM,QAAU,GAC9B,EAAK,SAAS,gCAA6B,SACpC,EAAK,SAAS,gBACd,EAAK,SAAS,2BACd,EAAK,SAAS,mBACjB,EAAK,OACL,EAAK,MAAM,aAAa,MAAO,EAAK,SAAS,IAAM,GAE3D,CAzJI,EACJ,EAEA,IAAI,GAAoB,EAExB,KAAK,SAAW,IAAI,kBAAiB,WACjC,IACA,EAAS,EAAK,OAAO,EACzB,IACA,KAAK,SAAS,QAAQ,KAAK,SAAU,CAAC,YAAY,IAElD,KAAK,SAAS,WAAW,aAAa,KAAK,WAAY,KAAK,SAAS,aAErE,EAAS,KAAK,OAGd,KAAK,UAAY,GACjB,MAAM,EAAO,SAAU,EAAQ,EAAM,EAAS,GAC1C,EAAO,iBAAiB,EAAM,EAAS,GACvC,EAAK,UAAU,MAAK,WAChB,EAAO,oBAAoB,EAAM,EAAS,EAC9C,GACJ,EAEM,EAAe,SAAU,GAC3B,IAAI,EAAW,EAAK,MAAM,MAC1B,MAAM,EAA0B,aAAf,EAAM,KAClB,EAAK,MAAM,cACZ,EAAW,EAAK,SAAS,mBAAmB,MAAM,GAClD,EAAS,EAAU,GACnB,EAAc,EAAK,SAAU,EAAM,OAEnC,EAAK,MAAM,kBAAoB,GAC/B,GAER,EACA,EAAK,KAAK,MAAO,QAAS,GAC1B,EAAK,KAAK,MAAO,QAAS,GAC1B,EAAK,KAAK,MAAO,SAAU,GAC3B,EAAK,KAAK,MAAO,WAAY,GAE7B,EAAK,KAAK,MAAO,WAAW,SAAU,GAC7B,EAAK,MAAM,mBACE,YAAd,EAAM,KAAuC,KAAlB,EAAM,SACjC,EAAM,iBACD,EAAK,gBAAgB,UACtB,EAAa,EAAK,OAED,cAAd,EAAM,KAAyC,KAAlB,EAAM,UAC1C,EAAM,iBACD,EAAK,gBAAgB,UACtB,GAAc,EAAK,OAG/B,IACA,EAAK,KAAK,MAAO,SAAS,SAAU,IAC5B,EAAK,MAAM,kBACI,YAAd,EAAM,KAAmC,cAAd,EAAM,KACZ,KAAlB,EAAM,SAAoC,KAAlB,EAAM,UAClC,EAAM,iBACN,IAER,IAMA,MAAM,EAAU,SAAU,GACtB,GAAI,EAAK,MAAM,UAAY,EAAK,MAAM,SAAU,OAChD,GAAqB,IAAjB,EAAM,OAAc,OACxB,EAAM,iBAIN,GADkB,EAAM,OAAS,EAAI,GAAK,GACrB,EAAK,MAC1B,EAAc,EAAK,SAAU,SACjC,EACA,IAAI,GAAa,EACjB,MAKM,EAAc,WACX,IACL,EAAK,MAAM,oBAAoB,QAAS,EAAS,CAAC,SAAS,IAC3D,GAAa,EACjB,EAoJA,IAAqB,EAAI,EAzHzB,SAAS,EAAS,EAAU,QACJ,IAAhB,IACA,GAAc,GAEd,MAAM,IAA0B,KAAb,GACnB,EAAK,SAAS,MAAQ,GAClB,IACA,EAAK,MAAM,MAAQ,IAEvB,EAAK,MAAQ,MAEb,EAAW,WAAW,GACtB,EAAW,KAAK,IAAI,KAAK,IAAI,EAAU,EAAK,KAAM,EAAK,KACvD,EAAK,SAAS,MAAQ,EAClB,IACA,EAAK,MAAM,MAAQ,EAAK,SAAS,mBAAmB,OAAO,IAE/D,EAAK,MAAQ,EAErB,CAqBA,SAAS,EAAc,EAAQ,GACtB,GACL,YAAW,WACP,EAAO,cAAc,IAAI,MAAM,EAAM,CAAC,SAAS,IACnD,GACJ,CAEA,SAAS,EAAa,GAIlB,MAAM,EAAY,EAAO,GAAK,EAAI,EAClC,EAAS,EAAY,EAAK,MAC1B,SACgC,IAA5B,EAAK,MAAM,eACX,EAAK,iBAAmB,YAAW,WAC/B,EAAK,oBAAsB,aAAY,WACnC,EAAS,EAAY,EAAK,KAC9B,GAAG,EAAK,MAAM,aAClB,GAAG,EAAK,MAAM,WAEtB,CAEA,SAAS,EAAS,GACV,MAAM,EAAK,SACX,EAAK,MAAQ,GAEjB,EAAS,KAAK,MAAM,EAAK,MAAQ,GAAQ,EAAO,GAChD,EAAc,EAAK,SAAU,QACjC,CAEA,SAAS,IACL,aAAa,EAAK,kBAClB,cAAc,EAAK,oBACvB,CAEA,SAAS,IAED,EAAK,SAAS,WACd,EAAK,MAAM,UAAW,EACtB,EAAK,SAAS,gBAAgB,aAElC,EAAK,MAAM,YAAc,EAAK,SAAS,YACvC,EAAK,MAAM,aAAa,YAAa,EAAK,SAAS,aAAa,cAAgB,WAChF,MAAM,EAAW,EAAK,SAAS,SACzB,EAAW,EAAK,SAAS,SAC/B,EAAK,MAAM,SAAW,EACtB,EAAK,MAAM,SAAW,GAAY,EAAK,MAAM,YAC7C,EAAK,gBAAgB,SAAW,GAAY,EAC5C,EAAK,gBAAgB,SAAW,GAAY,GACxC,GAAY,IACZ,IAEJ,MAAM,EAAgB,EAAK,SAAS,WAAa,GACjD,IAAI,EAAa,GACb,kBAAkB,KAAK,GACvB,EAAa,iBACN,kBAAkB,KAAK,KAC9B,EAAa,kBAEjB,MAAM,EAAa,EAAc,QAAQ,2BAA4B,IACrE,EAAK,WAAW,UAAY,eAAiB,EAAa,IAAM,EAAK,MAAM,WAC3E,EAAK,MAAM,UAAY,gBAAkB,EAEzC,EAAK,IAAM,gBAAgB,EAAK,SAAU,OAAQ,KAClD,EAAK,IAAM,gBAAgB,EAAK,SAAU,MAAO,KACjD,EAAK,KAAO,gBAAgB,EAAK,SAAU,OAAQ,IAAM,EAErD,EAAK,SAAS,aAAa,UAC3B,EAAK,WAAW,aAAa,SAAU,EAAK,SAAS,aAAa,WAAa,IAE/E,EAAK,WAAW,gBAAgB,UAEhC,EAAK,SAAS,KACd,EAAK,MAAM,GAAK,EAAK,SAAS,GAAK,iBAC/B,EAAK,OACL,EAAK,MAAM,aAAa,MAAO,EAAK,MAAM,IAGtD,CAiBA,SAAS,EAAc,EAAI,GACvB,EAAK,EAAI,aAAa,SAAU,GACX,IAAb,EAAE,SACF,EAAE,iBACF,EAAS,GAEjB,IACA,EAAK,EAAI,cAAc,SAAU,GACzB,EAAE,YACF,EAAE,iBAEN,EAAS,EACb,GAAG,CAAC,SAAS,IACb,EAAK,EAAI,WAAW,SAAU,GACP,KAAd,EAAE,SAAgC,KAAd,EAAE,SAAoB,IAC3C,GAAoB,EACpB,EAAS,GAEjB,GACJ,CArLA,EAAK,KAAK,MAAO,SAVG,YACZ,GAAe,EAAK,MAAM,aAC9B,EAAK,MAAM,iBAAiB,QAAS,EAAS,CAAC,SAAS,IACxD,GAAa,EACjB,IAOA,EAAK,KAAK,MAAO,OAAQ,GACzB,EAAK,UAAU,KAAK,GAGpB,EAAc,EAAK,iBAAiB,WAC3B,EAAK,gBAAgB,WACtB,GAAe,EACf,GAAc,EAAK,MAE3B,IAEA,EAAc,EAAK,iBAAiB,WAC3B,EAAK,gBAAgB,WACtB,GAAe,EACf,EAAa,EAAK,MAE1B,IAkIqB,EAjIT,SAAS,KAiII,EAjIE,YACF,IAAjB,IACA,IACA,EAAc,EAAK,SAAU,UAC7B,GAAe,EAEvB,EA4HI,EAAK,EAAI,WAAW,SAAU,GAC1B,EAAS,EACb,IACA,EAAK,EAAI,YAAY,SAAU,GAC3B,EAAS,EACb,IACA,EAAK,EAAI,SAAS,SAAU,GACL,KAAd,EAAE,SAAgC,KAAd,EAAE,UACvB,GAAoB,EACpB,EAAS,GAEjB,GAuBR","file":"/npm/bootstrap-input-spinner@5.0.7/src/InputSpinner.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/bootstrap-input-spinner@5.0.7/src/InputSpinner.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * Author and copyright: Stefan Haack (https://shaack.com)\n * Repository: https://github.com/shaack/bootstrap-input-spinner\n * License: MIT, see file 'LICENSE'\n */\n\n// the default editor for parsing and rendering\nconst I18nEditor = function (props, element) {\n    const locale = props.locale || \"en-US\"\n\n    let parseRegexes = null\n    this.parse = function (customFormat) {\n        if (!parseRegexes) {\n            const fmt = new Intl.NumberFormat(locale)\n            const thousandSeparator = fmt.format(11111).replace(/1/g, '') || '.'\n            const decimalSeparator = fmt.format(1.1).replace(/1/g, '')\n            parseRegexes = {\n                space: / /g,\n                thousand: new RegExp('\\\\' + thousandSeparator, 'g'),\n                decimal: new RegExp('\\\\' + decimalSeparator)\n            }\n        }\n        return parseFloat(customFormat\n            .replace(parseRegexes.space, '')\n            .replace(parseRegexes.thousand, '')\n            .replace(parseRegexes.decimal, '.')\n        )\n    }\n\n    let renderFmt = null\n    let renderDecimals = -1\n    let renderGrouping = null\n    this.render = function (number) {\n        const decimals = parseInt(element.getAttribute(\"data-decimals\")) || 0\n        const digitGrouping = !(element.getAttribute(\"data-digit-grouping\") === \"false\")\n        if (!renderFmt || decimals !== renderDecimals || digitGrouping !== renderGrouping) {\n            renderFmt = new Intl.NumberFormat(locale, {\n                minimumFractionDigits: decimals,\n                maximumFractionDigits: decimals,\n                useGrouping: digitGrouping\n            })\n            renderDecimals = decimals\n            renderGrouping = digitGrouping\n        }\n        return renderFmt.format(number)\n    }\n}\n\nfunction parseTemplate(html) {\n    const tpl = document.createElement(\"template\")\n    tpl.innerHTML = html.trim()\n    return tpl.content.firstElementChild\n}\n\nfunction parseNumberAttr(el, name, fallback) {\n    const raw = el.getAttribute(name)\n    if (raw === null || raw === \"\" || isNaN(parseFloat(raw))) {\n        return fallback\n    }\n    return parseFloat(raw)\n}\n\nexport class InputSpinner {\n\n    constructor(element, props) {\n\n        const self = this\n        this.element = element\n\n        this.props = {\n            decrementButton: \"<strong>&minus;</strong>\", // button text\n            incrementButton: \"<strong>&plus;</strong>\", // ..\n            groupClass: \"\", // css class of the resulting input-group\n            buttonsClass: \"btn-outline-secondary\",\n            buttonsWidth: \"2.5rem\",\n            textAlign: \"center\", // alignment of the entered number\n            autoDelay: 500, // ms threshold before auto value change\n            autoInterval: 50, // speed of auto value change, set to `undefined` to disable auto-change\n            buttonsOnly: false, // set this `true` to disable the possibility to enter or paste the number via keyboard\n            keyboardStepping: true, // set this to `false` to disallow the use of the up and down arrow keys to step\n            mouseWheel: false, // set `true` to step the value on wheel when the input is focused. Off by default — modern browsers no longer wheel-step native <input type=\"number\">.\n            locale: navigator.language, // the locale, per default detected automatically from the browser\n            editor: I18nEditor, // the editor (parsing and rendering of the input)\n            template: // the template of the input\n                '<div class=\"input-group ${groupClass}\">' +\n                '<button style=\"min-width: ${buttonsWidth}\" class=\"btn btn-decrement ${buttonsClass} btn-minus\" type=\"button\">${decrementButton}</button>' +\n                '<input type=\"text\" inputmode=\"decimal\" style=\"text-align: ${textAlign}\" class=\"form-control form-control-text-input\"/>' +\n                '<button style=\"min-width: ${buttonsWidth}\" class=\"btn btn-increment ${buttonsClass} btn-plus\" type=\"button\">${incrementButton}</button>' +\n                '</div>'\n        }\n\n        Object.assign(this.props, props)\n\n        const html = this.props.template\n            .replace(/\\${groupClass}/g, this.props.groupClass)\n            .replace(/\\${buttonsWidth}/g, this.props.buttonsWidth)\n            .replace(/\\${buttonsClass}/g, this.props.buttonsClass)\n            .replace(/\\${decrementButton}/g, this.props.decrementButton)\n            .replace(/\\${incrementButton}/g, this.props.incrementButton)\n            .replace(/\\${textAlign}/g, this.props.textAlign)\n\n        if (element[\"bootstrap-input-spinner\"]) {\n            console.warn(\"element\", element, \"is already a bootstrap-input-spinner\")\n            return\n        }\n\n        this.original = element\n        this.original[\"bootstrap-input-spinner\"] = true\n        this.original.style.display = \"none\"\n        this.original.inputSpinnerEditor = new this.props.editor(this.props, element)\n\n        this.autoDelayHandler = null\n        this.autoIntervalHandler = null\n\n        this.inputGroup = parseTemplate(html)\n        this.buttonDecrement = this.inputGroup.querySelector(\".btn-decrement\")\n        this.buttonIncrement = this.inputGroup.querySelector(\".btn-increment\")\n        this.input = this.inputGroup.querySelector(\"input\")\n\n        this.label = null\n        if (this.original.id) {\n            this.label = document.querySelector(\"label[for='\" + this.original.id + \"']\")\n        }\n        if (!this.label) {\n            this.label = this.original.closest(\"label\")\n        }\n\n        this.min = null\n        this.max = null\n        this.step = null\n\n        updateAttributes()\n\n        this.value = parseFloat(this.original.value)\n        let pointerState = false\n\n        const prefix = this.original.getAttribute(\"data-prefix\") || \"\"\n        const suffix = this.original.getAttribute(\"data-suffix\") || \"\"\n\n        if (prefix) {\n            const prefixElement = document.createElement(\"span\")\n            prefixElement.className = \"input-group-text\"\n            prefixElement.textContent = prefix\n            this.input.parentNode.insertBefore(prefixElement, this.input)\n        }\n        if (suffix) {\n            const suffixElement = document.createElement(\"span\")\n            suffixElement.className = \"input-group-text\"\n            suffixElement.textContent = suffix\n            this.input.parentNode.insertBefore(suffixElement, this.input.nextSibling)\n        }\n\n        this.original.setValue = function (newValue) {\n            setValue(newValue)\n        }\n        this.original.destroyInputSpinner = function () {\n            destroy()\n        }\n\n        let triggerKeyPressed = false\n\n        this.observer = new MutationObserver(function () {\n            updateAttributes()\n            setValue(self.value, true)\n        })\n        this.observer.observe(this.original, {attributes: true})\n\n        this.original.parentNode.insertBefore(this.inputGroup, this.original.nextSibling)\n\n        setValue(this.value)\n\n        // Track listeners so destroy() can detach them cleanly.\n        this._teardown = []\n        const bind = function (target, type, handler, options) {\n            target.addEventListener(type, handler, options)\n            self._teardown.push(function () {\n                target.removeEventListener(type, handler, options)\n            })\n        }\n\n        const onInputEvent = function (event) {\n            let newValue = self.input.value\n            const focusOut = event.type === \"focusout\"\n            if (!self.props.buttonsOnly) {\n                newValue = self.original.inputSpinnerEditor.parse(newValue)\n                setValue(newValue, focusOut)\n                dispatchEvent(self.original, event.type)\n            }\n            if (self.props.keyboardStepping && focusOut) { // stop stepping\n                resetTimer()\n            }\n        }\n        bind(this.input, \"paste\", onInputEvent)\n        bind(this.input, \"input\", onInputEvent)\n        bind(this.input, \"change\", onInputEvent)\n        bind(this.input, \"focusout\", onInputEvent)\n\n        bind(this.input, \"keydown\", function (event) {\n            if (!self.props.keyboardStepping) return\n            if (event.key === \"ArrowUp\" || event.keyCode === 38) {\n                event.preventDefault()\n                if (!self.buttonIncrement.disabled) {\n                    stepHandling(self.step)\n                }\n            } else if (event.key === \"ArrowDown\" || event.keyCode === 40) {\n                event.preventDefault()\n                if (!self.buttonDecrement.disabled) {\n                    stepHandling(-self.step)\n                }\n            }\n        })\n        bind(this.input, \"keyup\", function (event) {\n            if (self.props.keyboardStepping &&\n                (event.key === \"ArrowUp\" || event.key === \"ArrowDown\" ||\n                    event.keyCode === 38 || event.keyCode === 40)) {\n                event.preventDefault()\n                resetTimer()\n            }\n        })\n\n        // Focus-gated mouse-wheel stepping: matches native <input type=\"number\">.\n        // The listener is attached on focus and detached on blur, so an\n        // unfocused spinner never hijacks page scroll and no passive-listener\n        // warnings are produced while the input is idle.\n        const onWheel = function (event) {\n            if (self.input.disabled || self.input.readOnly) return\n            if (event.deltaY === 0) return\n            event.preventDefault()\n            // Scroll up → increment (macOS natural-scroll convention:\n            // pushing the wheel/trackpad up yields deltaY > 0).\n            const direction = event.deltaY > 0 ? 1 : -1\n            calcStep(direction * self.step)\n            dispatchEvent(self.original, \"change\")\n        }\n        let wheelBound = false\n        const attachWheel = function () {\n            if (wheelBound || !self.props.mouseWheel) return\n            self.input.addEventListener(\"wheel\", onWheel, {passive: false})\n            wheelBound = true\n        }\n        const detachWheel = function () {\n            if (!wheelBound) return\n            self.input.removeEventListener(\"wheel\", onWheel, {passive: false})\n            wheelBound = false\n        }\n        bind(this.input, \"focus\", attachWheel)\n        bind(this.input, \"blur\", detachWheel)\n        self._teardown.push(detachWheel)\n\n        // decrement button\n        onPointerDown(self.buttonDecrement, function () {\n            if (!self.buttonDecrement.disabled) {\n                pointerState = true\n                stepHandling(-self.step)\n            }\n        })\n        // increment button\n        onPointerDown(self.buttonIncrement, function () {\n            if (!self.buttonIncrement.disabled) {\n                pointerState = true\n                stepHandling(self.step)\n            }\n        })\n        onPointerUp(document.body, function () {\n            if (pointerState === true) {\n                resetTimer()\n                dispatchEvent(self.original, \"change\")\n                pointerState = false\n            }\n        })\n\n        function setValue(newValue, updateInput) {\n            if (updateInput === undefined) {\n                updateInput = true\n            }\n            if (isNaN(newValue) || newValue === \"\") {\n                self.original.value = \"\"\n                if (updateInput) {\n                    self.input.value = \"\"\n                }\n                self.value = NaN\n            } else {\n                newValue = parseFloat(newValue)\n                newValue = Math.min(Math.max(newValue, self.min), self.max)\n                self.original.value = newValue\n                if (updateInput) {\n                    self.input.value = self.original.inputSpinnerEditor.render(newValue)\n                }\n                self.value = newValue\n            }\n        }\n\n        function destroy() {\n            if (self.input.required) {\n                self.original.required = true\n            }\n            self.observer.disconnect()\n            resetTimer()\n            for (const off of self._teardown) off()\n            self._teardown = []\n            self.inputGroup.remove()\n            self.original.style.display = \"\"\n            self.original[\"bootstrap-input-spinner\"] = undefined\n            delete self.original.setValue\n            delete self.original.destroyInputSpinner\n            delete self.original.inputSpinnerEditor\n            if (self.label) {\n                self.label.setAttribute(\"for\", self.original.id || \"\")\n            }\n        }\n\n        function dispatchEvent(target, type) {\n            if (!type) return\n            setTimeout(function () {\n                target.dispatchEvent(new Event(type, {bubbles: true}))\n            })\n        }\n\n        function stepHandling(step) {\n            // Capture only the direction; re-read self.step on every tick so\n            // consumers can change the step attribute mid-hold and have the\n            // new value take effect on the next auto-repeat tick.\n            const direction = step < 0 ? -1 : 1\n            calcStep(direction * self.step)\n            resetTimer()\n            if (self.props.autoInterval !== undefined) {\n                self.autoDelayHandler = setTimeout(function () {\n                    self.autoIntervalHandler = setInterval(function () {\n                        calcStep(direction * self.step)\n                    }, self.props.autoInterval)\n                }, self.props.autoDelay)\n            }\n        }\n\n        function calcStep(step) {\n            if (isNaN(self.value)) {\n                self.value = 0\n            }\n            setValue(Math.round(self.value / step) * step + step)\n            dispatchEvent(self.original, \"input\")\n        }\n\n        function resetTimer() {\n            clearTimeout(self.autoDelayHandler)\n            clearInterval(self.autoIntervalHandler)\n        }\n\n        function updateAttributes() {\n            // copy properties from original to the new input\n            if (self.original.required) {\n                self.input.required = true\n                self.original.removeAttribute(\"required\")\n            }\n            self.input.placeholder = self.original.placeholder\n            self.input.setAttribute(\"inputmode\", self.original.getAttribute(\"inputmode\") || \"decimal\")\n            const disabled = self.original.disabled\n            const readonly = self.original.readOnly\n            self.input.disabled = disabled\n            self.input.readOnly = readonly || self.props.buttonsOnly\n            self.buttonIncrement.disabled = disabled || readonly\n            self.buttonDecrement.disabled = disabled || readonly\n            if (disabled || readonly) {\n                resetTimer()\n            }\n            const originalClass = self.original.className || \"\"\n            let groupClass = \"\"\n            if (/form-control-sm/.test(originalClass)) {\n                groupClass = \"input-group-sm\"\n            } else if (/form-control-lg/.test(originalClass)) {\n                groupClass = \"input-group-lg\"\n            }\n            const inputClass = originalClass.replace(/form-control(-(sm|lg))?/g, \"\")\n            self.inputGroup.className = \"input-group \" + groupClass + \" \" + self.props.groupClass\n            self.input.className = \"form-control \" + inputClass\n\n            self.min = parseNumberAttr(self.original, \"min\", -Infinity)\n            self.max = parseNumberAttr(self.original, \"max\", Infinity)\n            self.step = parseNumberAttr(self.original, \"step\", 1) || 1\n\n            if (self.original.hasAttribute(\"hidden\")) {\n                self.inputGroup.setAttribute(\"hidden\", self.original.getAttribute(\"hidden\") || \"\")\n            } else {\n                self.inputGroup.removeAttribute(\"hidden\")\n            }\n            if (self.original.id) {\n                self.input.id = self.original.id + \":input_spinner\" // give the spinner a unique id...\n                if (self.label) {\n                    self.label.setAttribute(\"for\", self.input.id) // ...to rewire the label\n                }\n            }\n        }\n\n        function onPointerUp(el, callback) {\n            bind(el, \"mouseup\", function (e) {\n                callback(e)\n            })\n            bind(el, \"touchend\", function (e) {\n                callback(e)\n            })\n            bind(el, \"keyup\", function (e) {\n                if ((e.keyCode === 32 || e.keyCode === 13)) {\n                    triggerKeyPressed = false\n                    callback(e)\n                }\n            })\n        }\n\n        function onPointerDown(el, callback) {\n            bind(el, \"mousedown\", function (e) {\n                if (e.button === 0) {\n                    e.preventDefault()\n                    callback(e)\n                }\n            })\n            bind(el, \"touchstart\", function (e) {\n                if (e.cancelable) {\n                    e.preventDefault()\n                }\n                callback(e)\n            }, {passive: false})\n            bind(el, \"keydown\", function (e) {\n                if ((e.keyCode === 32 || e.keyCode === 13) && !triggerKeyPressed) {\n                    triggerKeyPressed = true\n                    callback(e)\n                }\n            })\n        }\n    }\n}\n"]}