{"version":3,"sources":["jsdelivr-header.js","/npm/@undecaf/vue-barcode-scanner@0.9.3/dist/main.js"],"names":[],"mappings":"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","file":"/npm/@undecaf/vue-barcode-scanner@0.9.3/dist/main.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/@undecaf/vue-barcode-scanner@0.9.3/dist/main.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 * @undecaf/vue-barcode-scanner v0.9.3\n * A barcode/QR code scanner for Vue 2\n * Built 2022-01-18T18:41:52.697Z\n * (c) 2021-present Ferdinand Kasper <fkasper@modus-operandi.at>\n * Released under the MIT license\n */\nconst e=\"bcs-started\",n=\"bcs-stopped\",t=\"bcs-scanned\",s=\"bcs-error\",r=[\"img\",\"canvas\",\"video\"],a=r.join(\", \"),o={[null]:\"MODE_STOPPED\",[false]:\"MODE_SINGLE\",[true]:\"MODE_START_REPEATING\"};function i(e){const n=/^\\s*(\\d+)(\\S+)\\s*$/.exec(e),t={};if(n){const e=Number(n[1]),s=n[2];\"/s\"===s&&e>0?t.scanInterval=1e3/e:\"%\"===s&&e>0&&e<=100&&(t.loadFactor=e/100)}return t}function c(e){return e.videoWidth||e.naturalWidth||e.width}function l(e){return e.videoHeight||e.naturalHeight||e.height}function h(e){return e.toLowerCase().replace(/_/g,\"-\")}const d={name:\"BarcodeScanner\",props:{source:{default:null},formats:{type:Array,default:null},scanning:{type:Boolean,default:!1},rate:{type:String,default:`${Math.round(20)}/s`,validator:e=>Object.keys(i(e)).length},maskCss:{type:String,default:null},highlightCss:{type:String,default:void 0},debug:{type:Boolean,default:!1}},data:()=>({srcElem:null,srcRendererTag:null,srcObserver:null,mode:null,barcodes:[]}),computed:{detector(){return new BarcodeDetector({formats:this.formats||void 0})},parsedRate(){return i(this.rate)},maskClasses(){if(this.maskCss){const e=this.barcodes.map((e=>e.format));return e.push(...e.map(h)),e.length&&e.push(\"detected\"),e.push(this.maskCss),e}return[]},highlights(){const e=void 0!==this.highlightCss?this.highlightCss:\"f0212f9f-41b5-40d0-8e40-87c97a8a9f28\",n=this.srcElem;return e&&n?this.barcodes.map((t=>{const s=100/c(n),r=100/l(n),a=t.boundingBox;return{style:{left:a.x*s+\"%\",top:a.y*r+\"%\",width:a.width*s+\"%\",height:a.height*r+\"%\"},classes:[e,t.format,h(t.format)]}})):[]},srcElemTag(){return this.srcElem&&this.srcElem.tagName.toLowerCase()},log(){return this.debug?e=>{\"function\"==typeof e&&(e=e()),console.log(`${this.$options.name}: ${e}`)}:()=>{}}},watch:{source(){this.log(\"source prop changed\"),this.attach()},formats(){this.log(\"formats changed\"),null===this.mode&&this.start()},maskCss(){this.log(\"maskCss changed\"),null===this.mode&&this.$nextTick((()=>this.start()))},scanning(e){e&&null===this.mode?(this.log(\"scanning changed: start\"),this.start(\"video\"===this.srcElemTag)):!e&&this.mode&&(this.log(\"scanning changed: stop\"),this.stop())}},mounted(){this.log(\"mounted()\"),this.srcObserver=new MutationObserver((()=>this.attach())),this.srcObserver.observe(this.$refs.clientSrcContainer,{subtree:!0,childList:!0,attributeFilter:[\"src\",\"srcObject\"]}),this.attach()},beforeDestroy(){this.log(\"beforeDestroy()\"),this.detach(),this.srcObserver.disconnect()},methods:{detect(){const e=this.srcElem;if(!e)return this.log(\"detect(): ignored\"),Promise.resolve();const n=this.maskRect();return(this.maskCss?createImageBitmap(e,n.x,n.y,n.width,n.height):Promise.resolve(e)).then((e=>this.detector.detect(e))).then((e=>{e.forEach((e=>{e.cornerPoints.forEach((e=>{e.x+=n.x,e.y+=n.y}));const t=e.boundingBox,s=DOMRectReadOnly.fromRect({x:t.x+n.x,y:t.y+n.y,width:t.width,height:t.height});e.boundingBox=s})),this.log((()=>`detected ${e.length} barcode(s)`)),this.barcodes=e,this.emit(\"bcs-scanned\",e)})).catch((e=>{this.handleError(e)}))},start(e){this.log((()=>`start(${o[e]||\"\"})`));const n=this.srcElem;if(!n||n.ended||n.paused||n.error||null===e)return n&&n.error&&this.handleError(n.error.message,n.error),void this.stop();if(void 0!==e&&(null===this.mode&&this.emit(\"bcs-started\"),this.mode=e),this.setScanning(!0),this.mode){const e=performance.now();this.detect().then((n=>{if(this.mode){const n=performance.now()-e,t=(this.parsedRate.scanInterval||n/this.parsedRate.loadFactor||50)-n;this.mode=setTimeout((()=>this.start()),Math.max(t,1))}})).catch((e=>{this.handleError(e),this.stop()}))}else this.detect().finally((()=>{this.stop()}))},stop(){this.log(\"stop()\"),null!==this.mode&&(clearTimeout(this.mode),this.mode=null,this.setScanning(!1),this.emit(\"bcs-stopped\"))},attach(){const e=n=>(this.srcRendererTag=n,new Promise((t=>{this.$nextTick((()=>{this.currentSrcRendererTag()===n?t(this.$refs.srcRendererElem):e(n)}))}))),n=n=>{e(null).then((()=>e(\"img\"))).then((e=>{e.crossorigin=\"anonymous\",e.srcObject=null,e.src=URL.createObjectURL(n),e.decode().then((()=>{this.log((()=>`attaching image renderer for ${n.constructor.name}`)),URL.revokeObjectURL(n),this.srcElem=e,this.start(false)})).catch((e=>this.handleError(e)))}))},t=({blob:n=null,mediaStream:t=null})=>{e(null).then((()=>e(\"video\"))).then((e=>{e.addEventListener(\"play\",(()=>{this.log(\"attached video plays\"),this.srcElem=e,this.start(true)})),e.addEventListener(\"ended\",(()=>{this.log(\"attached video ended\"),n&&URL.revokeObjectURL(n)})),e.addEventListener(\"error\",(()=>{n&&URL.revokeObjectURL(n),this.handleError(\"error loading video\")})),this.log((()=>`attaching video renderer for ${(n||t).constructor.name}`)),e.crossorigin=\"anonymous\",e.muted=!0,e.playsinline=!0,e.autoplay=!0,e.srcObject=t,e.src=n?URL.createObjectURL(n):\"\"}))},s=({source:n,image:t=n,drawMethod:s})=>{e(null).then((()=>e(\"canvas\"))).then((e=>{this.log((()=>`attaching canvas renderer for ${n.constructor.name}`)),e.width=n.width,e.height=n.height,e.getContext(\"2d\")[s](t,0,0),this.srcElem=e,this.start(false)}))};this.detach(),this.log(\"attach()\");const o=this.source,i=(this.$slots.default||[]).filter((e=>e.tag));if(i.length)if(this.srcRendererTag=null,1===i.length){const e=i[0],n=e.tag.toLowerCase(),t=o||a,s=this.$refs.clientSrcContainer.querySelector(t);if(r.includes(n))this.log((()=>`attaching client <${e.elm.tagName}>`)),this.srcElem=e.elm;else{if(!s)return void this.handleError(`source element not found, one of ${t} was expected.`);this.log((()=>`attaching client <${s.tagName}>`)),this.srcElem=s}\"video\"===this.srcElemTag?this.start(true):\"img\"===this.srcElemTag?this.srcElem.decode().then((()=>this.start(false))).catch((e=>this.handleError(e))):this.start(false)}else this.handleError(`${i.length} children found but only one was expected.`);else o?\"function\"==typeof Blob&&o instanceof Blob?o.type.startsWith(\"image/\")?n(o):o.type.startsWith(\"video/\")?t({blob:o}):this.handleError(`source has type ${$source.type} but image/* or video/* was expected.`):\"function\"==typeof MediaStream&&o instanceof MediaStream?t({mediaStream:o}):\"function\"==typeof ImageData&&o instanceof ImageData?s({source:o,drawMethod:\"putImageData\"}):\"function\"==typeof ImageBitmap&&o instanceof ImageBitmap?s({source:o,drawMethod:\"drawImage\"}):\"function\"==typeof OffscreenCanvas&&o instanceof OffscreenCanvas?s({source:o,image:o.transferToImageBitmap(),drawMethod:\"drawImage\"}):this.handleError(`source is ${o} but one of Blob, MediaStream, ImageData, ImageBitmap or OffscreenCanvas was expected.`):this.log(\"attaching no source\")},detach(){this.log(\"detach()\"),this.srcElem&&this.srcElem.srcObject&&(this.log((()=>`detach: stopping ${this.srcElem.srcObject.getTracks().length} track(s)`)),this.srcElem.srcObject.getTracks().forEach((e=>e.stop()))),this.stop(),this.barcodes=[],this.srcRendererTag=null,this.srcElem=null},currentSrcRendererTag(){const e=this.$refs.srcRendererElem;return e&&e.tagName.toLowerCase()||null},maskRect(){const e=this.srcElem;if(this.maskCss){const{offsetLeft:n,offsetTop:t,offsetWidth:s,offsetHeight:r}=this.$refs.mask,{clientWidth:a,clientHeight:o}=this.$refs.viewport,i=c(e)/a,h=l(e)/o;return{x:Math.round(n*i),y:Math.round(t*h),width:Math.round(s*i),height:Math.round(r*h)}}return{x:0,y:0,width:c(e),height:l(e)}},setScanning(e){Boolean(this.scanning)!==Boolean(e)&&this.emit(\"update:scanning\",e,!0)},emit(e,n,t=!1){this.log((()=>t?`emit('${e}', ${n}) `:`emit('${e}')`)),this.$emit(e,n)},handleError(e,n=e){console.error(`${this.$options.name}: ${e}`),this.emit(\"bcs-error\",n,!0)}}};function m(e,n,t,s,r,a,o,i,c,l){\"boolean\"!=typeof o&&(c=i,i=o,o=!1);const h=\"function\"==typeof t?t.options:t;let d;if(e&&e.render&&(h.render=e.render,h.staticRenderFns=e.staticRenderFns,h._compiled=!0,r&&(h.functional=!0)),s&&(h._scopeId=s),a?(d=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),n&&n.call(this,c(e)),e&&e._registeredComponents&&e._registeredComponents.add(a)},h._ssrRegister=d):n&&(d=o?function(e){n.call(this,l(e,this.$root.$options.shadowRoot))}:function(e){n.call(this,i(e))}),d)if(h.functional){const e=h.render;h.render=function(n,t){return d.call(t),e(n,t)}}else{const e=h.beforeCreate;h.beforeCreate=e?[].concat(e,d):[d]}return t}const u=\"undefined\"!=typeof navigator&&/msie [6-9]\\\\b/.test(navigator.userAgent.toLowerCase());function g(e){return(e,n)=>function(e,n){const t=u?n.media||\"default\":e,s=p[t]||(p[t]={ids:new Set,styles:[]});if(!s.ids.has(e)){s.ids.add(e);let t=n.source;if(n.map&&(t+=\"\\n/*# sourceURL=\"+n.map.sources[0]+\" */\",t+=\"\\n/*# sourceMappingURL=data:application/json;base64,\"+btoa(unescape(encodeURIComponent(JSON.stringify(n.map))))+\" */\"),s.element||(s.element=document.createElement(\"style\"),s.element.type=\"text/css\",n.media&&s.element.setAttribute(\"media\",n.media),void 0===f&&(f=document.head||document.getElementsByTagName(\"head\")[0]),f.appendChild(s.element)),\"styleSheet\"in s.element)s.styles.push(t),s.element.styleSheet.cssText=s.styles.filter(Boolean).join(\"\\n\");else{const e=s.ids.size-1,n=document.createTextNode(t),r=s.element.childNodes;r[e]&&s.element.removeChild(r[e]),r.length?s.element.insertBefore(n,r[e]):s.element.appendChild(n)}}}(e,n)}let f;const p={};const E=d;var b=function(){var e=this,n=e.$createElement,t=e._self._c||n;return t(\"div\",[t(\"div\",{ref:\"viewport\",staticClass:\"viewport\"},[t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.maskCss,expression:\"maskCss\"}],ref:\"mask\",class:e.maskClasses,staticStyle:{position:\"absolute\",\"box-sizing\":\"border-box\",\"z-index\":\"1\"}}),e._v(\" \"),e._l(e.highlights,(function(e,n){return t(\"div\",{key:n,class:e.classes,staticStyle:{position:\"absolute\",\"box-sizing\":\"border-box\",\"z-index\":\"1\"},style:e.style})})),e._v(\" \"),t(\"div\",{ref:\"clientSrcContainer\"},[e._t(\"default\")],2),e._v(\" \"),e.srcRendererTag?t(e.srcRendererTag,{ref:\"srcRendererElem\",tag:\"component\"}):e._e()],2)])};b._withStripped=!0;const v=m({render:b,staticRenderFns:[]},(function(e){e&&e(\"data-v-0f3f6463_0\",{source:\"\\n.viewport[data-v-0f3f6463] {\\n    display: inline-block;\\n    position: relative;\\n    overflow: hidden;\\n}\\n\\n/* Source element, source renderer */\\n.viewport img[data-v-0f3f6463],\\n.viewport canvas[data-v-0f3f6463],\\n.viewport video[data-v-0f3f6463],\\n.viewport[data-v-0f3f6463] > :last-child {\\n    display: block;\\n    height: auto;\\n    max-width: 100%;\\n}\\n\\n/* Default style of barcode highlights */\\n.viewport .f0212f9f-41b5-40d0-8e40-87c97a8a9f28[data-v-0f3f6463] {\\n    border: #80ff80 solid 2px;\\n    background-color: rgba(128, 255, 128, 0.3);\\n}\\n\",map:{version:3,sources:[\"/home/kasper/Projekte/vue.js/vue-barcode-scanner/src/BarcodeScanner.vue\"],names:[],mappings:\";AAkwBA;IACA,qBAAA;IACA,kBAAA;IACA,gBAAA;AACA;;AAEA,oCAAA;AACA;;;;IAIA,cAAA;IACA,YAAA;IACA,eAAA;AACA;;AAEA,wCAAA;AACA;IACA,yBAAA;IACA,0CAAA;AACA\",file:\"BarcodeScanner.vue\",sourcesContent:[\"<template>\\n  <div>\\n    <div class=\\\"viewport\\\" ref=\\\"viewport\\\">\\n      \\x3c!-- Scan area mask --\\x3e\\n      <div\\n        ref=\\\"mask\\\"\\n        v-show=\\\"maskCss\\\"\\n        :class=\\\"maskClasses\\\"\\n        style=\\\"position: absolute; box-sizing: border-box; z-index: 1;\\\"\\n      >\\n      </div>\\n\\n      \\x3c!-- Barcode highlights --\\x3e\\n      <div\\n        v-for=\\\"(highlight, index) in highlights\\\"\\n        :class=\\\"highlight.classes\\\"\\n        :key=\\\"index\\\"\\n        :style=\\\"highlight.style\\\"\\n        style=\\\"position: absolute; box-sizing: border-box; z-index: 1;\\\"\\n      >\\n      </div>\\n\\n      <div ref=\\\"clientSrcContainer\\\">\\n        \\x3c!-- Source element provided by the client --\\x3e\\n        <slot></slot>\\n      </div>\\n\\n      \\x3c!-- Renderer for sources that are passed as 'source' prop --\\x3e\\n      <component ref=\\\"srcRendererElem\\\" v-if=\\\"srcRendererTag\\\" :is=\\\"srcRendererTag\\\" />\\n    </div>\\n  </div>\\n</template>\\n\\n\\n<script>\\n// Event names\\nexport const STARTED_EVENT = 'bcs-started'\\nexport const STOPPED_EVENT = 'bcs-stopped'\\nexport const SCANNED_EVENT = 'bcs-scanned'\\nexport const ERROR_EVENT = 'bcs-error'\\n\\n\\n// Acceptable source elements\\nconst\\n    SOURCE_ELEMENT_TAGS = ['img', 'canvas', 'video'],\\n    SOURCE_ELEMENT_SELECTOR = SOURCE_ELEMENT_TAGS.join(', ');\\n\\n\\n// Scan interval in ms if the specified rate is invalid\\nconst DEFAULT_SCAN_INTERVAL = 50\\n\\n\\n// Scanning mode: truthy if repating, falsy if stopped or for a single scan\\nconst\\n    MODE_STOPPED = null,\\n    MODE_SINGLE = false,\\n    MODE_START_REPEATING = true;\\n    // MODE_IS_REPEATING: the id returned by setTimeout()\\n\\nconst MODES = {\\n    [MODE_STOPPED]: 'MODE_STOPPED',\\n    [MODE_SINGLE]: 'MODE_SINGLE',\\n    [MODE_START_REPEATING]: 'MODE_START_REPEATING',\\n}\\n\\n\\n/**\\n * Returns the parsed rate argument as an object with properties 'scanInterval'\\n * (in ms) and 'loadFactor' (between 0 and 1). Exactly one of them is present\\n * if the rate could be parsed, or else both are missing.\\n */\\nfunction parseRate(rate) {\\n    const\\n        parts = /^\\\\s*(\\\\d+)(\\\\S+)\\\\s*$/.exec(rate),\\n        parsedRate = {};\\n\\n    if (parts) {\\n        const\\n            value = Number(parts[1]),\\n            suffix = parts[2];\\n\\n        if ((suffix === '/s') && (value > 0)) {\\n            // Scan interval in ms\\n            parsedRate.scanInterval = 1000 / value\\n\\n        } else if ((suffix === '%') && (value > 0) && (value <= 100)) {\\n            // Load factor in\\n            parsedRate.loadFactor = value / 100\\n        }\\n    }\\n\\n    return parsedRate\\n}\\n\\n\\n/**\\n * Returns the intrinsic (as opposed to the rendered) with of a DOM element.\\n */\\nfunction intrinsicWidth(htmlElement) {\\n    return htmlElement.videoWidth || htmlElement.naturalWidth || htmlElement.width\\n}\\n\\n\\n/**\\n * Returns the intrinsic (as opposed to the rendered) height of a DOM element.\\n */\\nfunction intrinsicHeight(htmlElement) {\\n    return htmlElement.videoHeight || htmlElement.naturalHeight || htmlElement.height\\n}\\n\\n\\n/**\\n * Expects the argument to be an identifier in snake case and converts it to kebab case.\\n */\\nfunction snakeToKebab(name) {\\n    return name.toLowerCase().replace(/_/g, '-')\\n}\\n\\n\\n/**\\n *\\n */\\nexport default {\\n    name: 'BarcodeScanner',\\n\\n\\n    props: {\\n        source: {\\n            default: null,\\n        },\\n\\n        formats: {\\n            type: Array,\\n            default: null,\\n        },\\n\\n        scanning: {\\n            type: Boolean,\\n            default: false,\\n        },\\n\\n        rate: {\\n            type: String,\\n            default: `${Math.round(1000 / DEFAULT_SCAN_INTERVAL)}/s`,\\n            validator: value => Object.keys(parseRate(value)).length,\\n        },\\n\\n        maskCss: {\\n            type: String,\\n            default: null,\\n        },\\n\\n        highlightCss: {\\n            type: String,\\n            default: undefined,\\n        },\\n\\n        debug: {\\n            type: Boolean,\\n            default: false,\\n        },\\n    },\\n\\n\\n    data() {\\n        return {\\n            // DOM element that is examined for barcodes, or null; may be an element\\n            // provided by the client, or a source renderer created by this component\\n            srcElem: null,\\n\\n            // Requested type (tag name) of source renderer, or null if srcElem is provided by the client\\n            srcRendererTag: null,\\n\\n            // Observes changes of the source element\\n            srcObserver: null,\\n\\n            // Scanning mode, see the constants defined above\\n            mode: MODE_STOPPED,\\n\\n            // Detected barcodes as returned from BarcodeDetector.detect()\\n            barcodes: [],\\n        }\\n    },\\n\\n\\n    computed: {\\n        /**\\n         * Returns a BarcodeDetector configured for the current 'formats' prop.\\n         */\\n        detector() {\\n            return new BarcodeDetector({ formats: this.formats || undefined })\\n        },\\n\\n\\n        /**\\n         * Returns the parsed 'rate' prop as an object with properties 'scanInterval'\\n         * (in ms) and 'loadFactor' (between 0 and 1). Exactly one of them is present\\n         * if the rate could be parsed, or else both are missing.\\n         */\\n        parsedRate() {\\n            return parseRate(this.rate)\\n        },\\n\\n\\n        maskClasses() {\\n            if (this.maskCss) {\\n                const classes = this.barcodes.map(barcode => barcode.format)\\n                classes.push(...classes.map(snakeToKebab))\\n                if (classes.length) {\\n                    classes.push('detected')\\n                }\\n                classes.push(this.maskCss)\\n\\n                return classes\\n\\n            } else {\\n                return []\\n            }\\n        },\\n\\n\\n        /**\\n         * Returns an array of objects that describe positions, dimensions and CSS styles\\n         * of the barcode highlights relative to the viewport.\\n         * The array contains one object for each detected barcode.\\n         * An empty array is returned iff the highlightCss prop is null or if there is\\n         * no source element.\\n         */\\n        highlights() {\\n            const\\n                highlightCss = (typeof this.highlightCss !== 'undefined')\\n                    ? this.highlightCss\\n                    // Class name of default highlighting style\\n                    : 'f0212f9f-41b5-40d0-8e40-87c97a8a9f28',\\n                srcElem = this.srcElem;\\n\\n            if (highlightCss && srcElem) {\\n                return this.barcodes.map(barcode => {\\n                    const\\n                        xScale = 100 / intrinsicWidth(srcElem),\\n                        yScale = 100 / intrinsicHeight(srcElem),\\n                        box = barcode.boundingBox;\\n\\n                    return {\\n                        style: {\\n                            left: `${box.x * xScale}%`,\\n                            top: `${box.y * yScale}%`,\\n                            width: `${box.width * xScale}%`,\\n                            height: `${box.height * yScale}%`,\\n                        },\\n                        classes: [ highlightCss, barcode.format, snakeToKebab(barcode.format) ],\\n                    }\\n                })\\n\\n            } else {\\n                // this.highlightCss === null, no highlighting\\n                return []\\n            }\\n        },\\n\\n        srcElemTag() {\\n            return this.srcElem && this.srcElem.tagName.toLowerCase()\\n        },\\n\\n        log() {\\n            return this.debug\\n                ? (msg) => {\\n                    if (typeof msg === 'function') {\\n                        // Factory function\\n                        msg = msg()\\n                    }\\n                    console.log(`${this.$options.name}: ${msg}`)\\n                }\\n                : () => {}\\n        },\\n    },\\n\\n\\n    watch: {\\n        source() {\\n            this.log('source prop changed')\\n            this.attach()\\n        },\\n\\n        formats() {\\n            this.log('formats changed')\\n            if (this.mode === MODE_STOPPED) {\\n                this.start()\\n            }\\n        },\\n\\n        maskCss() {\\n            this.log('maskCss changed')\\n            if (this.mode === MODE_STOPPED) {\\n                // The browser needs to render the new mask\\n                // before coordinates and dimensions are available\\n                this.$nextTick(() => this.start())\\n            }\\n        },\\n\\n        scanning(newValue) {\\n            if (newValue && (this.mode === MODE_STOPPED)) {\\n                this.log('scanning changed: start')\\n                this.start((this.srcElemTag === 'video') ? MODE_START_REPEATING : MODE_SINGLE)\\n\\n            } else if (!newValue && this.mode) {\\n                // Stop repeated scanning\\n                this.log('scanning changed: stop')\\n                this.stop()\\n            }\\n        },\\n    },\\n\\n\\n    mounted() {\\n        this.log('mounted()')\\n\\n        // Re-attach whenever the source element or a src/srcObject attribute is changed\\n        this.srcObserver = new MutationObserver(() => this.attach())\\n        this.srcObserver.observe(\\n            this.$refs.clientSrcContainer,\\n            { subtree: true, childList: true, attributeFilter: ['src', 'srcObject'] }\\n        )\\n\\n        this.attach()\\n    },\\n\\n\\n    beforeDestroy() {\\n        this.log('beforeDestroy()')\\n\\n        this.detach()\\n        this.srcObserver.disconnect()\\n    },\\n\\n\\n    methods: {\\n        /**\\n         * Returns a Promise for having detected and stored\\n         * the barcodes found on the source element.\\n         */\\n        detect() {\\n            const srcElem = this.srcElem\\n\\n            if (!srcElem) {\\n                // Ignore spurious invocations by watchers\\n                this.log('detect(): ignored')\\n\\n                return Promise.resolve()\\n            }\\n\\n            const\\n                maskRect = this.maskRect(),\\n                imagePromise = this.maskCss\\n                  ? createImageBitmap(srcElem, maskRect.x, maskRect.y, maskRect.width, maskRect.height)\\n                  : Promise.resolve(srcElem);\\n\\n            return imagePromise\\n                .then(image => this.detector.detect(image))\\n                .then(barcodes => {\\n                    barcodes.forEach(barcode => {\\n                        // Transform corner points and bounding box to viewport coordinates\\n                        barcode.cornerPoints.forEach(p => {\\n                            p.x += maskRect.x\\n                            p.y += maskRect.y\\n                        })\\n\\n                        const\\n                            box = barcode.boundingBox,\\n                            rect = DOMRectReadOnly.fromRect({\\n                                x: box.x + maskRect.x,\\n                                y: box.y + maskRect.y,\\n                                width: box.width,\\n                                height: box.height,\\n                            });\\n\\n                        barcode.boundingBox = rect\\n                    });\\n\\n                    this.log(() => `detected ${barcodes.length} barcode(s)`)\\n\\n                    this.barcodes = barcodes\\n                    this.emit(SCANNED_EVENT, barcodes)\\n                })\\n\\n                .catch(error => {\\n                    this.handleError(error)\\n                })\\n        },\\n\\n\\n        start(mode) {\\n            this.log(() => `start(${MODES[mode] || ''})`)\\n\\n            const srcElem = this.srcElem\\n\\n            if (!srcElem || srcElem.ended || srcElem.paused || srcElem.error || (mode === MODE_STOPPED)) {\\n                if (srcElem && srcElem.error) {\\n                    this.handleError(srcElem.error.message, srcElem.error)\\n                }\\n\\n                this.stop()\\n                return\\n            }\\n\\n            if (typeof mode !== 'undefined') {\\n                if (this.mode === MODE_STOPPED) {\\n                    // First invocation after being stopped\\n                    this.emit(STARTED_EVENT)\\n                }\\n\\n                this.mode = mode\\n            }\\n\\n            this.setScanning(true)\\n\\n            if (this.mode) {\\n                const startedAt = performance.now()\\n\\n                this.detect()\\n                    .then(barcodes => {\\n                        // Continue only if scanning has not been stopped while detection was in progress\\n                        if (this.mode) {\\n                            const\\n                                duration = performance.now() - startedAt,\\n                                delay = (\\n                                    this.parsedRate.scanInterval ||\\n                                    duration / this.parsedRate.loadFactor ||\\n                                    DEFAULT_SCAN_INTERVAL\\n                                ) - duration\\n\\n                            this.mode = setTimeout(() => this.start(), Math.max(delay, 1))\\n                        }\\n                    })\\n                    .catch(error => {\\n                        this.handleError(error)\\n                        this.stop()\\n                    })\\n\\n            } else {\\n                this.detect()\\n                    .finally(() => {\\n                        this.stop()\\n                    })\\n            }\\n        },\\n\\n\\n        stop() {\\n            this.log('stop()')\\n\\n            if (this.mode !== MODE_STOPPED) {\\n                clearTimeout(this.mode)\\n                this.mode = MODE_STOPPED\\n\\n                this.setScanning(false)\\n                this.emit(STOPPED_EVENT)\\n            }\\n        },\\n\\n\\n        /**\\n         * Attaches the source element/property to this component\\n         * and starts scanning.\\n         */\\n        attach() {\\n            /**\\n             * Returns a Promise for a new source renderer element\\n             * with the specified tag.\\n             */\\n            const createSrcRenderer = (tag) => {\\n                this.srcRendererTag = tag\\n\\n                return new Promise(resolve => {\\n                    this.$nextTick(() => {\\n                        // Do we have the requested source renderer now?\\n                        if (this.currentSrcRendererTag() === tag) {\\n                            resolve(this.$refs.srcRendererElem)\\n\\n                        } else {\\n                            // Wait for one next tick\\n                            createSrcRenderer(tag)\\n                        }\\n                    })\\n                })\\n            }\\n\\n            /**\\n             * Installs a new <img> element as source renderer and\\n             * renders the specified Blob.\\n             */\\n            const installImgRenderer = (blob) => {\\n                // First destroy the previous renderer (if any) to get rid of event listeners\\n                createSrcRenderer(null)\\n                    .then(() => createSrcRenderer('img'))\\n                    .then(srcElem => {\\n                        srcElem.crossorigin = 'anonymous'\\n                        srcElem.srcObject = null\\n                        srcElem.src = URL.createObjectURL(blob)\\n                        srcElem\\n                            .decode()\\n                            .then(() => {\\n                                this.log(() => `attaching image renderer for ${blob.constructor.name}`)\\n\\n                                URL.revokeObjectURL(blob)\\n                                this.srcElem = srcElem\\n                                this.start(MODE_SINGLE)\\n                            })\\n                            .catch(error => this.handleError(error))\\n                    })\\n            }\\n\\n            /**\\n             * Installs a new <video> element as source renderer\\n             * and starts playing the specified Blob or MediaStream.\\n             */\\n            const installVideoRenderer = ({ blob = null, mediaStream = null }) => {\\n                // First destroy the previous renderer (if any) to get rid of event listeners\\n                createSrcRenderer(null)\\n                    .then(() => createSrcRenderer('video'))\\n                    .then(srcElem => {\\n                        srcElem.addEventListener('play', () => {\\n                            this.log('attached video plays')\\n\\n                            this.srcElem = srcElem\\n                            this.start(MODE_START_REPEATING)\\n                        })\\n\\n                        srcElem.addEventListener('ended', () => {\\n                            this.log('attached video ended')\\n\\n                            blob && URL.revokeObjectURL(blob)\\n                        })\\n\\n                        srcElem.addEventListener('error', () => {\\n                            blob && URL.revokeObjectURL(blob)\\n                            this.handleError(`error loading video`)\\n                        })\\n\\n                        this.log(() => `attaching video renderer for ${(blob || mediaStream).constructor.name}`)\\n\\n                        srcElem.crossorigin = 'anonymous'\\n                        srcElem.muted = true\\n                        srcElem.playsinline = true\\n                        srcElem.autoplay = true\\n                        srcElem.srcObject = mediaStream\\n                        srcElem.src = blob ? URL.createObjectURL(blob) : ''\\n                    })\\n            }\\n\\n            /**\\n             * Installs a new <canvas> element as source renderer and draws\\n             * the specified image onto it.\\n             */\\n            const installCanvasRenderer = ({ source, image = source, drawMethod }) => {\\n                // First destroy the previous renderer (if any) to get rid of event listeners\\n                createSrcRenderer(null)\\n                    .then(() => createSrcRenderer('canvas'))\\n                    .then(srcElem => {\\n                        this.log(() => `attaching canvas renderer for ${source.constructor.name}`)\\n\\n                        srcElem.width = source.width\\n                        srcElem.height = source.height\\n                        srcElem.getContext('2d')[drawMethod](image, 0, 0)\\n\\n                        this.srcElem = srcElem\\n                        this.start(MODE_SINGLE)\\n                    })\\n            }\\n\\n\\n            this.detach()\\n\\n            this.log('attach()')\\n\\n            const\\n                source = this.source,\\n                // Ignore text and comment nodes\\n                srcVNodes = (this.$slots.default || []).filter(vnode => vnode.tag);\\n\\n            if (srcVNodes.length) {\\n                // The source element/container is provided by the client\\n                this.srcRendererTag = null\\n\\n                if (srcVNodes.length === 1) {\\n                    const\\n                        srcVNode = srcVNodes[0],\\n                        srcVNodeTag = srcVNode.tag.toLowerCase(),\\n                        selector = source || SOURCE_ELEMENT_SELECTOR,\\n                        selected = this.$refs.clientSrcContainer.querySelector(selector);\\n\\n                    if (SOURCE_ELEMENT_TAGS.includes(srcVNodeTag)) {\\n                        // Plain source element\\n                        this.log(() => `attaching client <${srcVNode.elm.tagName}>`)\\n\\n                        this.srcElem = srcVNode.elm\\n\\n                    } else if (selected) {\\n                        // Source element in a container\\n                        this.log(() => `attaching client <${selected.tagName}>`)\\n\\n                        this.srcElem = selected\\n\\n                    } else {\\n                        this.handleError(`source element not found, one of ${selector} was expected.`)\\n                        return\\n                    }\\n\\n                    if (this.srcElemTag === 'video') {\\n                        // Start repeated scanning immediately\\n                        this.start(MODE_START_REPEATING)\\n\\n                    } else if (this.srcElemTag === 'img') {\\n                        // Wait until the image has been decoded then start a single scan\\n                        this.srcElem.decode()\\n                            .then(() => this.start(MODE_SINGLE))\\n                            .catch(error => this.handleError(error))\\n\\n                    } else {\\n                        // Start a single scan on a canvas\\n                        this.start(MODE_SINGLE)\\n                    }\\n\\n                } else {\\n                    this.handleError(`${srcVNodes.length} children found but only one was expected.`)\\n                }\\n\\n            } else if (source) {\\n                // A source renderer is required\\n\\n                // Taking into account that not all of these classes may exist in every browser\\n                if ((typeof Blob === 'function') && (source instanceof Blob)) {\\n                    if (source.type.startsWith('image/')) {\\n                        // Render the blob in an img element\\n                        installImgRenderer(source)\\n\\n                    } else if (source.type.startsWith('video/')) {\\n                        // Play the blob in a video element\\n                        installVideoRenderer({ blob: source })\\n\\n                    } else {\\n                        this.handleError(`source has type ${$source.type} but image/* or video/* was expected.`)\\n                    }\\n\\n                } else if ((typeof MediaStream === 'function') && (source instanceof MediaStream)) {\\n                    // Play the media stream in a video element\\n                    installVideoRenderer({ mediaStream: source})\\n\\n                } else if ((typeof ImageData === 'function') && (source instanceof ImageData)) {\\n                    // Draw the image on a canvas element\\n                    installCanvasRenderer({ source, drawMethod: 'putImageData' })\\n\\n                } else if ((typeof ImageBitmap === 'function') && (source instanceof ImageBitmap)) {\\n                    // Draw the bitmap on a canvas element\\n                    installCanvasRenderer({ source, drawMethod: 'drawImage' })\\n\\n                } else if ((typeof OffscreenCanvas === 'function') && (source instanceof OffscreenCanvas)) {\\n                    // Draw the offscreen canvas on a canvas element\\n                    installCanvasRenderer({ source, image: source.transferToImageBitmap(), drawMethod: 'drawImage' })\\n\\n                } else {\\n                    this.handleError(\\n                        `source is ${source} but one of ` +\\n                        'Blob, MediaStream, ImageData, ImageBitmap or OffscreenCanvas was expected.'\\n                    )\\n                }\\n\\n            } else {\\n                // No source, already detached\\n                this.log('attaching no source')\\n            }\\n        },\\n\\n\\n        /**\\n         * Stops barcode detection, removes barcode highlights, stops media streams\\n         * and detaches the source element/property from this component.\\n         */\\n        detach() {\\n            this.log('detach()')\\n\\n            if (this.srcElem && this.srcElem.srcObject) {\\n                // Stop media stream tracks\\n                this.log(() => `detach: stopping ${this.srcElem.srcObject.getTracks().length} track(s)`)\\n\\n                this.srcElem.srcObject.getTracks().forEach(track => track.stop())\\n            }\\n\\n            this.stop()\\n            this.barcodes = []\\n            this.srcRendererTag = null\\n            this.srcElem = null\\n        },\\n\\n        /**\\n         * Returns the tag name of the current source renderer element,\\n         * or null if there is none.\\n         * On source renderer changes, this will likely be different\\n         * from this.srcRendererTag for one or more ticks until Vue\\n         * has updated the srcRendererElem.\\n         */\\n        currentSrcRendererTag() {\\n            const srcRendererElem = this.$refs.srcRendererElem\\n\\n            return srcRendererElem && srcRendererElem.tagName.toLowerCase() || null\\n        },\\n\\n\\n        /**\\n         * Returns the intrinsic (as opposed to the offset) coordinates and dimensions\\n         * of the source element\\n         */\\n        maskRect() {\\n            const srcElem = this.srcElem\\n\\n            if (this.maskCss) {\\n                // The source rectangle covers the border box of the mask\\n                const\\n                    { offsetLeft, offsetTop, offsetWidth, offsetHeight } = this.$refs.mask,\\n                    { clientWidth, clientHeight } = this.$refs.viewport,\\n                    sourceXScale = intrinsicWidth(srcElem) / clientWidth,\\n                    sourceYScale = intrinsicHeight(srcElem) / clientHeight;\\n\\n                return {\\n                    x: Math.round(offsetLeft * sourceXScale),\\n                    y: Math.round(offsetTop * sourceYScale),\\n                    width: Math.round(offsetWidth * sourceXScale),\\n                    height: Math.round(offsetHeight * sourceYScale),\\n                }\\n\\n            } else {\\n                // The source rectangle covers the source element completely\\n                return { x: 0, y: 0, width: intrinsicWidth(srcElem), height: intrinsicHeight(srcElem) }\\n            }\\n        },\\n\\n\\n        /**\\n         * Updates prop 'scanning' with a new value if necessary.\\n         */\\n        setScanning(scanning) {\\n           if (Boolean(this.scanning) !== Boolean(scanning)) {\\n               this.emit('update:scanning', scanning, true)\\n           }\\n        },\\n\\n\\n        /**\\n         * Emits an event and eventually logs it.\\n         */\\n        emit(name, payload, logPayload = false) {\\n            this.log(() => logPayload ? `emit('${name}', ${payload}) ` : `emit('${name}')`)\\n            this.$emit(name, payload)\\n        },\\n\\n\\n        /**\\n         * Emits an ERROR_EVENT with the specified error\\n         * and logs the message at the console.\\n         */\\n        handleError(msg, error = msg) {\\n            console.error(`${this.$options.name}: ${msg}`)\\n            this.emit(ERROR_EVENT, error, true)\\n        },\\n    },\\n}\\n<\\/script>\\n\\n\\n<style scoped>\\n.viewport {\\n    display: inline-block;\\n    position: relative;\\n    overflow: hidden;\\n}\\n\\n/* Source element, source renderer */\\n.viewport img,\\n.viewport canvas,\\n.viewport video,\\n.viewport > :last-child {\\n    display: block;\\n    height: auto;\\n    max-width: 100%;\\n}\\n\\n/* Default style of barcode highlights */\\n.viewport .f0212f9f-41b5-40d0-8e40-87c97a8a9f28 {\\n    border: #80ff80 solid 2px;\\n    background-color: rgba(128, 255, 128, 0.3);\\n}\\n</style>\"]},media:void 0})}),E,\"data-v-0f3f6463\",false,undefined,!1,g,void 0,void 0);export{s as ERROR_EVENT,t as SCANNED_EVENT,e as STARTED_EVENT,n as STOPPED_EVENT,v as default};\n"]}