ngx-qrcode-styling
Version:
This library is built for the purpose for generating QR codes with a logo and styling.
1 lines • 62.8 kB
Source Map (JSON)
{"version":3,"file":"ngx-qrcode-styling.mjs","sources":["../../../projects/ngx-qrcode-styling/src/lib/ngx-qrcode-styling.templates.ts","../../../projects/ngx-qrcode-styling/src/lib/ngx-qrcode-styling.helper.ts","../../../projects/ngx-qrcode-styling/src/lib/ngx-qrcode-styling.service.ts","../../../projects/ngx-qrcode-styling/src/lib/ngx-qrcode-styling.component.ts","../../../projects/ngx-qrcode-styling/src/public-api.ts","../../../projects/ngx-qrcode-styling/src/ngx-qrcode-styling.ts"],"sourcesContent":["import { Options } from './ngx-qrcode-styling.options';\r\n\r\nexport const Templates = (name: string) => {\r\n switch (name) {\r\n case 'default':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#202020',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n } as Options;\r\n case 'ocean':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n type: 'dots',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#36CDA5',\r\n },\r\n {\r\n offset: 1,\r\n color: '#1582AE',\r\n },\r\n {\r\n offset: 2,\r\n color: '#0277BD',\r\n },\r\n ],\r\n },\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n cornersSquareOptions: {\r\n type: 'square',\r\n },\r\n } as Options;\r\n case 'sunflower':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n type: 'dots',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#BB8412',\r\n },\r\n {\r\n offset: 1,\r\n color: '#4D762E',\r\n },\r\n {\r\n offset: 2,\r\n color: '#2F702F',\r\n },\r\n ],\r\n },\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n cornersDotOptions: {\r\n color: '#006B3B',\r\n type: 'dot',\r\n },\r\n cornersSquareOptions: {\r\n color: '#006B3B',\r\n type: 'extra-rounded',\r\n },\r\n } as Options;\r\n case 'luxury':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n type: 'classy-rounded',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#E29C0F',\r\n },\r\n {\r\n offset: 1,\r\n color: '#913C0C',\r\n },\r\n {\r\n offset: 2,\r\n color: '#732E0C',\r\n },\r\n ],\r\n },\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n cornersDotOptions: {\r\n color: '#732E0C',\r\n type: 'dot',\r\n },\r\n cornersSquareOptions: {\r\n color: '#732E0C',\r\n type: 'extra-rounded',\r\n },\r\n } as Options;\r\n case 'bitcoin':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#3a3a3a',\r\n type: 'dots',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n cornersDotOptions: {\r\n color: '#ff9900',\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded',\r\n },\r\n } as Options;\r\n case 'starbucks':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#3a3a3a',\r\n type: 'dots',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n cornersDotOptions: {\r\n color: '#00643C',\r\n type: 'dot',\r\n },\r\n cornersSquareOptions: {\r\n color: '#00643C',\r\n type: 'extra-rounded',\r\n },\r\n } as Options;\r\n case 'angular':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#c3002f',\r\n type: 'dots',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n } as Options;\r\n case 'facebook':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#4D72A9',\r\n type: 'dots',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n } as Options;\r\n case 'beans':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#416B2C',\r\n type: 'dots',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n cornersDotOptions: {\r\n color: '#60A541',\r\n type: 'dot',\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded',\r\n },\r\n } as Options;\r\n case 'green':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#006B3B',\r\n type: 'dots',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n cornersDotOptions: {\r\n color: '#006B3B',\r\n type: 'dot',\r\n },\r\n cornersSquareOptions: {\r\n color: '#006B3B',\r\n type: 'extra-rounded',\r\n },\r\n } as Options;\r\n case 'sky':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#2c7597',\r\n type: 'rounded',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n } as Options;\r\n case 'mosaic':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n type: 'rounded',\r\n gradient: {\r\n rotation: 190,\r\n type: 'linear',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#0277BD',\r\n },\r\n {\r\n offset: 1,\r\n color: '#943A40',\r\n },\r\n {\r\n offset: 2,\r\n color: '#A13535',\r\n },\r\n ],\r\n },\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n } as Options;\r\n case 'coffee':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#5E4F39',\r\n type: 'dots',\r\n },\r\n backgroundOptions: {\r\n color: '#FAEDE7',\r\n },\r\n } as Options;\r\n case 'vintage':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#2D7363',\r\n type: 'extra-rounded',\r\n },\r\n backgroundOptions: {\r\n color: '#E7E5C5',\r\n },\r\n cornersDotOptions: {\r\n color: '#BE8C49',\r\n },\r\n cornersSquareOptions: {\r\n color: '#2D7363',\r\n },\r\n } as Options;\r\n case 'stamp':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#2a3c16',\r\n type: 'square',\r\n },\r\n backgroundOptions: {\r\n color: '#9cc66e',\r\n },\r\n cornersDotOptions: {\r\n color: '#4c692c',\r\n },\r\n cornersSquareOptions: {\r\n color: '#2a3c16',\r\n },\r\n } as Options;\r\n case 'chess':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#F4EAA5',\r\n type: 'dots',\r\n },\r\n backgroundOptions: {\r\n color: '#494B49',\r\n },\r\n } as Options;\r\n case 'jungle':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n type: 'classy-rounded',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#84b931',\r\n },\r\n {\r\n offset: 1,\r\n color: '#537234',\r\n },\r\n {\r\n offset: 2,\r\n color: '#537234',\r\n },\r\n ],\r\n },\r\n },\r\n cornersSquareOptions: {\r\n color: '#434343',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#84b931',\r\n },\r\n {\r\n offset: 1,\r\n color: '#537234',\r\n },\r\n {\r\n offset: 2,\r\n color: '#537234',\r\n },\r\n ],\r\n },\r\n },\r\n } as Options;\r\n case 'arabic':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n type: 'classy-rounded',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#393939',\r\n },\r\n {\r\n offset: 1,\r\n color: '#393939',\r\n },\r\n {\r\n offset: 2,\r\n color: '#393939',\r\n },\r\n ],\r\n },\r\n },\r\n cornersSquareOptions: {\r\n color: '#434343',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#393939',\r\n },\r\n {\r\n offset: 1,\r\n color: '#72a28b',\r\n },\r\n {\r\n offset: 2,\r\n color: '#72a28b',\r\n },\r\n ],\r\n },\r\n },\r\n } as Options;\r\n case 'tea':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n type: 'extra-rounded',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#72b0b4',\r\n },\r\n {\r\n offset: 1,\r\n color: '#035558',\r\n },\r\n {\r\n offset: 2,\r\n color: '#035558',\r\n },\r\n ],\r\n },\r\n },\r\n cornersSquareOptions: {\r\n color: '#434343',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#72b0b4',\r\n },\r\n {\r\n offset: 1,\r\n color: '#035558',\r\n },\r\n {\r\n offset: 2,\r\n color: '#035558',\r\n },\r\n ],\r\n },\r\n },\r\n } as Options;\r\n case 'grape':\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n type: 'rounded',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#7076ae',\r\n },\r\n {\r\n offset: 1,\r\n color: '#2a3240',\r\n },\r\n {\r\n offset: 2,\r\n color: '#2a3240',\r\n },\r\n ],\r\n },\r\n },\r\n cornersSquareOptions: {\r\n color: '#434343',\r\n gradient: {\r\n type: 'radial',\r\n colorStops: [\r\n {\r\n offset: 0,\r\n color: '#7b7cb5',\r\n },\r\n {\r\n offset: 1,\r\n color: '#2a3240',\r\n },\r\n {\r\n offset: 2,\r\n color: '#2a3240',\r\n },\r\n ],\r\n },\r\n },\r\n } as Options;\r\n default:\r\n return {\r\n data: '',\r\n qrOptions: {\r\n errorCorrectionLevel: 'Q',\r\n },\r\n dotsOptions: {\r\n color: '#202020',\r\n },\r\n backgroundOptions: {\r\n color: '#ffffff',\r\n },\r\n } as Options;\r\n }\r\n};\r\n","import QRCodeStyling from 'qr-code-styling';\r\nimport { AsyncSubject } from 'rxjs';\r\n\r\nimport { Options } from './ngx-qrcode-styling.options';\r\nimport { Templates } from './ngx-qrcode-styling.templates';\r\n\r\n/**\r\n * drawQrcode\r\n * @param config\r\n * @param container\r\n * @returns\r\n */\r\nexport function drawQrcode(\r\n config: Options,\r\n container:\r\n | HTMLElement\r\n | HTMLVideoElement\r\n | HTMLCanvasElement\r\n | SVGElement\r\n | any\r\n): AsyncSubject<any> {\r\n const subject = new AsyncSubject();\r\n\r\n // Reject\r\n if (!config || !container) {\r\n subject.error('Container or Config not available!');\r\n subject.complete();\r\n return subject;\r\n }\r\n\r\n const element = document.createElement('div');\r\n\r\n /**\r\n * QRCODE_NONE_FRAME\r\n * @returns\r\n */\r\n const QRCODE_NONE_FRAME = () => {\r\n if (config?.frameOptions) {\r\n return false;\r\n } else {\r\n const encodeConfig = () => {\r\n let deep = config && JSON.parse(JSON.stringify(config)); // deep\r\n return Object.assign(\r\n {\r\n data: (window as any).unescape(\r\n encodeURIComponent(deep?.data ?? '')\r\n ),\r\n },\r\n deep\r\n );\r\n };\r\n // removeChild\r\n while (container.firstChild) {\r\n container.removeChild(container.lastChild);\r\n }\r\n const CR = new QRCodeStyling(encodeConfig() as Options);\r\n // append to container\r\n CR.append(container);\r\n return true;\r\n }\r\n };\r\n\r\n const styleName = config?.frameOptions?.style ?? 'F_020';\r\n const height = config?.frameOptions?.height ?? 300;\r\n const width = config?.frameOptions?.width ?? 300;\r\n const x = config?.frameOptions?.x ?? 50;\r\n const y = config?.frameOptions?.y ?? 50;\r\n\r\n /**\r\n * ADD_FRAME_SVG_TO_ELEMENT\r\n * @returns\r\n */\r\n const ADD_FRAME_SVG_TO_ELEMENT = () => {\r\n const http = fetch(\r\n `https://cdn.jsdelivr.net/gh/id1945/ngx-qrcode-styling/svg/1.2.9/${styleName}.svg`,\r\n { method: 'GET' }\r\n );\r\n return new Promise((resolve, reject) => {\r\n http\r\n .then((response) => response.text())\r\n .then((result) => {\r\n if (result !== '404: Not Found') {\r\n upgradeSvg(result);\r\n }\r\n resolve(result);\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n reject(error);\r\n });\r\n });\r\n };\r\n\r\n const upgradeSvg = (result: string) => {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(result, 'image/svg+xml');\r\n if (doc) {\r\n const svgEl = (doc.documentElement.children as any)[styleName + '_svg'];\r\n if (!svgEl) return;\r\n const textEls = svgEl.getElementsByClassName('frame-text');\r\n const contentEls = svgEl.getElementsByClassName('frame-content');\r\n const containerEls = svgEl.getElementsByClassName('frame-container');\r\n config?.frameOptions?.background &&\r\n svgEl.setAttribute(\r\n 'style',\r\n `background: ${\r\n config?.frameOptions?.background\r\n };${svgEl?.getAttribute('style')}`\r\n );\r\n const updateStyle = (el: any, config: any) => {\r\n if (el) {\r\n for (const key in config) {\r\n if ((['x', 'y', 'transform'] as any).includes(key)) {\r\n el.setAttribute(key, config && config[key]);\r\n } else if ((['textContent'] as any).includes(key)) {\r\n el[key] = config && config[key];\r\n } else {\r\n el.style[key] = config && config[key];\r\n }\r\n }\r\n }\r\n };\r\n\r\n const createElementNS = (config: any) => {\r\n const svgNS = 'http://www.w3.org/2000/svg';\r\n const newText = document.createElementNS(svgNS, 'text');\r\n updateStyle(newText, config);\r\n svgEl.appendChild(newText);\r\n };\r\n\r\n if (config?.frameOptions?.texts) {\r\n [...config.frameOptions.texts].forEach((text: any, i: any) => {\r\n const el = [...textEls]?.[i];\r\n el ? updateStyle(el, text) : createElementNS(text);\r\n });\r\n }\r\n\r\n if (config?.frameOptions?.containers) {\r\n [...containerEls].forEach((el: any, i: any) => {\r\n updateStyle(el, config?.frameOptions?.containers?.[i]);\r\n });\r\n }\r\n\r\n if (config?.frameOptions?.contents) {\r\n [...contentEls].forEach((el: any, i: any) => {\r\n updateStyle(el, config?.frameOptions?.contents?.[i]);\r\n });\r\n }\r\n\r\n element.appendChild(doc.documentElement);\r\n }\r\n };\r\n\r\n /**\r\n * UPDATE_POSITION_QRCODE_ON_FRAME\r\n * @returns HTMLElement\r\n */\r\n const UPDATE_POSITION_QRCODE_ON_FRAME = () => {\r\n const after = element.querySelector('.ngx_qrcode_styling_after');\r\n if (after && config?.zIndex === 1) {\r\n after?.setAttribute('transform', `translate(${x},${y})`);\r\n return after as HTMLElement;\r\n }\r\n const before = element.querySelector('.ngx_qrcode_styling_before');\r\n before?.setAttribute('transform', `translate(${x},${y})`);\r\n return before as HTMLElement;\r\n };\r\n\r\n /**\r\n * UPDATE_ROTATE_SCALE_QRCODE_ON_FRAME\r\n * @param svg\r\n * @returns void\r\n */\r\n const UPDATE_ROTATE_SCALE_QRCODE_ON_FRAME = (svg: HTMLElement) => {\r\n if (svg && config?.rotate) {\r\n svg?.childNodes?.[0]?.childNodes?.forEach((node: any) => {\r\n if (node.nodeName === 'rect') {\r\n node.style.transformOrigin = `50% 50%`;\r\n node.style.transform = `rotate(${config?.rotate ?? 0}deg)`;\r\n }\r\n });\r\n }\r\n if (svg && config?.scale) {\r\n svg?.childNodes?.[0]?.childNodes?.forEach((node: any) => {\r\n if (node.nodeName === 'rect') {\r\n node.style.scale = config?.scale ?? 0;\r\n }\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * CREATE_QRCODE_INTO_FRAME\r\n * @param addsvg\r\n * @returns\r\n */\r\n const CREATE_QRCODE_INTO_FRAME = (addsvg: HTMLElement) => {\r\n const defaultConfig = () => {\r\n let deep = config && JSON.parse(JSON.stringify(config)); // deep\r\n deep = {\r\n ...deep,\r\n ...{\r\n type: 'svg',\r\n data: (window as any).unescape(encodeURIComponent(deep?.data ?? '')),\r\n },\r\n };\r\n delete deep.frameOptions;\r\n delete deep.template;\r\n return deep;\r\n };\r\n // removeChild\r\n while (container?.firstChild) {\r\n container.removeChild(container.lastChild);\r\n }\r\n const CR = new QRCodeStyling(defaultConfig() as Options);\r\n return CR?._svgDrawingPromise\r\n ?.then(() => {\r\n CR.append(addsvg);\r\n })\r\n .catch((error: any) => console.error(error));\r\n };\r\n\r\n /**\r\n * QRCODE_TYPE_SVG\r\n * @returns\r\n */\r\n const QRCODE_TYPE_SVG = () => {\r\n if (config?.type === 'svg') {\r\n UPDATE_SIZE_SVG();\r\n container.appendChild(element);\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n /**\r\n * CREATE_CANVAS_WITH_SIZE\r\n * @returns\r\n */\r\n const CREATE_CANVAS_WITH_SIZE = () => {\r\n const canvas = document.createElement('canvas');\r\n canvas.height = height;\r\n canvas.width = width;\r\n container.appendChild(canvas);\r\n return canvas;\r\n };\r\n\r\n /**\r\n * ELEMENT_CONVERT_TO_BASE64\r\n * @param s1\r\n * @returns\r\n */\r\n const ELEMENT_CONVERT_TO_BASE64 = (s1: HTMLElement) => {\r\n let b64 = 'data:image/svg+xml;base64,';\r\n const xml = s1 && new XMLSerializer().serializeToString(s1);\r\n return (b64 += xml && btoa(unescape(encodeURIComponent(xml))));\r\n };\r\n\r\n /**\r\n * UPDATE_SIZE_SVG\r\n * @returns\r\n */\r\n const UPDATE_SIZE_SVG = () => {\r\n const s1 = element.querySelector(`#${styleName}_svg`);\r\n s1 && s1.setAttribute('height', `${height}px`);\r\n s1 && s1.setAttribute('width', `${width}px`);\r\n return s1 as HTMLElement;\r\n };\r\n\r\n /**\r\n * BASE64_TO_BLOB\r\n * @param base64Image\r\n * @returns\r\n */\r\n const BASE64_TO_BLOB = (base64Image: string) => {\r\n // Split into two parts\r\n const parts = base64Image.split(';base64,');\r\n // Hold the content type\r\n const imageType = parts[0].split(':')[1];\r\n // Decode Base64 string\r\n const decodedData = window.atob(parts[1]);\r\n // Create UNIT8ARRAY of size same as row data length\r\n const uInt8Array = new Uint8Array(decodedData.length);\r\n // Insert all character code into uInt8Array\r\n for (let i = 0; i < decodedData.length; ++i) {\r\n uInt8Array[i] = decodedData.charCodeAt(i);\r\n }\r\n // Return BLOB image after conversion\r\n return new Blob([uInt8Array], { type: imageType });\r\n };\r\n\r\n /**\r\n * CREATE_IMAGE\r\n */\r\n const CREATE_IMAGE = () => {\r\n const img = new Image();\r\n const ctx = CREATE_CANVAS_WITH_SIZE().getContext('2d');\r\n img.onload = function () {\r\n ctx && ctx.drawImage(img, 0, 0);\r\n };\r\n const blob = BASE64_TO_BLOB(ELEMENT_CONVERT_TO_BASE64(UPDATE_SIZE_SVG()));\r\n const blobUrl = URL.createObjectURL(blob);\r\n img.src = blobUrl;\r\n };\r\n\r\n /**\r\n * MAIN\r\n */\r\n (async function () {\r\n if (QRCODE_NONE_FRAME()) {\r\n subject.next({ config, container });\r\n subject.complete();\r\n return; // Mode qrcode basic\r\n } else {\r\n await ADD_FRAME_SVG_TO_ELEMENT();\r\n const ADDSVG = UPDATE_POSITION_QRCODE_ON_FRAME();\r\n await CREATE_QRCODE_INTO_FRAME(ADDSVG);\r\n UPDATE_ROTATE_SCALE_QRCODE_ON_FRAME(ADDSVG);\r\n if (QRCODE_TYPE_SVG()) {\r\n // Mode qrcode + frame type svg\r\n subject.next({ config, container });\r\n subject.complete();\r\n } else {\r\n // Mode qrcode + frame type canvas\r\n CREATE_IMAGE();\r\n subject.next({ config, container });\r\n subject.complete();\r\n }\r\n }\r\n })();\r\n\r\n return subject;\r\n}\r\n\r\n/**\r\n * defaultTemplate\r\n * @param config\r\n * @returns\r\n */\r\nexport const defaultTemplate = (config?: Options): Options => {\r\n let deep = config && JSON.parse(JSON.stringify(config));\r\n return config?.template\r\n ? { ...Templates(config.template.toLocaleLowerCase()), ...deep }\r\n : deep;\r\n};\r\n\r\n/**\r\n * deepUpdate\r\n * @param config\r\n * @param configUpdate\r\n * @returns\r\n */\r\nexport const deepUpdate = async (\r\n config: Options,\r\n configUpdate: Options\r\n): Promise<Options> => {\r\n const origin = config && JSON.parse(JSON.stringify(config));\r\n let clone = { ...origin, ...configUpdate };\r\n const keys = [\r\n 'frameOptions',\r\n 'qrOptions',\r\n 'imageOptions',\r\n 'dotsOptions',\r\n 'cornersSquareOptions',\r\n 'cornersDotOptions',\r\n 'backgroundOptions',\r\n ];\r\n for await (const key of keys) {\r\n if (key in configUpdate) {\r\n const update = {\r\n [key]: { ...origin[key], ...(configUpdate as any)[key] },\r\n };\r\n clone = { ...clone, ...update };\r\n }\r\n }\r\n return clone;\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { AsyncSubject } from 'rxjs';\r\n\r\nimport {\r\n deepUpdate,\r\n defaultTemplate,\r\n drawQrcode,\r\n} from './ngx-qrcode-styling.helper';\r\nimport { Options } from './ngx-qrcode-styling.options';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NgxQrcodeStylingService {\r\n /**\r\n * create\r\n * @param config\r\n * @param container\r\n * @returns\r\n */\r\n public create(\r\n config: Options,\r\n container:\r\n | HTMLElement\r\n | HTMLVideoElement\r\n | HTMLCanvasElement\r\n | SVGElement\r\n | any\r\n ): AsyncSubject<any> {\r\n return drawQrcode(defaultTemplate(config), container);\r\n }\r\n\r\n /**\r\n * update\r\n * @param config\r\n * @param configUpdate\r\n * @param container\r\n * @returns\r\n */\r\n public update(\r\n config: Options,\r\n configUpdate: Options,\r\n container:\r\n | HTMLElement\r\n | HTMLVideoElement\r\n | HTMLCanvasElement\r\n | SVGElement\r\n | any\r\n ): AsyncSubject<any> {\r\n const subject = new AsyncSubject();\r\n (async function () {\r\n const conf = await deepUpdate(\r\n defaultTemplate(config),\r\n defaultTemplate(configUpdate)\r\n );\r\n drawQrcode(conf, container).subscribe((s) => {\r\n subject.next(s);\r\n subject.complete();\r\n });\r\n })();\r\n return subject;\r\n }\r\n\r\n /**\r\n * download image\r\n * @param fileName eg: demo.png\r\n * @param container\r\n * @param timeout\r\n * @returns\r\n */\r\n public download(\r\n container:\r\n | HTMLElement\r\n | HTMLVideoElement\r\n | HTMLCanvasElement\r\n | SVGElement\r\n | any,\r\n fileName = '',\r\n timeout = 0\r\n ): AsyncSubject<any> {\r\n const subject = new AsyncSubject();\r\n\r\n const _fileName = (type: string) => {\r\n if (!fileName) {\r\n fileName = `ngx_qrcode_styling_${Date.now()}.${type}`;\r\n }\r\n };\r\n\r\n const _download = (dataURL: string) => {\r\n const link = document.createElement('a');\r\n link.download = fileName;\r\n link.href = dataURL;\r\n link.click();\r\n link.remove();\r\n };\r\n\r\n const _complete = (url: string) => {\r\n if (url) {\r\n _download(url);\r\n subject.next({ fileName, container, url: url });\r\n subject.complete();\r\n } else {\r\n subject.error('Container not found!');\r\n subject.complete();\r\n }\r\n };\r\n\r\n setTimeout(() => {\r\n const canvas = container?.querySelector('canvas');\r\n if (canvas) {\r\n _fileName('png');\r\n const typeImg = fileName\r\n ? fileName?.split('.')?.slice(-1)?.toString()\r\n : 'png';\r\n canvas.toBlob(\r\n (blob: any) => _complete(URL.createObjectURL(blob)),\r\n 'image/' + typeImg\r\n );\r\n } else {\r\n const svg = container?.querySelector('svg');\r\n if (svg) {\r\n _fileName('svg');\r\n const svgData = svg.outerHTML;\r\n const svgBlob = new Blob([svgData], {\r\n type: 'image/svg+xml;charset=utf-8',\r\n });\r\n const svgUrl = URL.createObjectURL(svgBlob);\r\n _complete(svgUrl);\r\n } else {\r\n _complete('');\r\n }\r\n }\r\n }, timeout);\r\n return subject;\r\n }\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnInit,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { AsyncSubject } from 'rxjs';\r\n\r\nimport {\r\n CornerDotType,\r\n CornerSquareType,\r\n DotType,\r\n DrawType,\r\n ErrorCorrectionLevel,\r\n FrameStyle,\r\n Gradient,\r\n Mode,\r\n Options,\r\n ShapeType,\r\n TemplateType,\r\n TypeNumber,\r\n UnknownObject,\r\n} from './ngx-qrcode-styling.options';\r\nimport { NgxQrcodeStylingService } from './ngx-qrcode-styling.service';\r\n\r\n@Component({\r\n selector: 'ngx-qrcode-styling',\r\n template: '<ng-content></ng-content>',\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NgxQrcodeStylingComponent implements OnInit {\r\n /**\r\n * Options\r\n */\r\n @Input()\r\n public config!: Options;\r\n\r\n /**\r\n * TemplateType\r\n */\r\n @Input()\r\n public template: TemplateType = 'default';\r\n\r\n /**\r\n * DrawType\r\n */\r\n @Input()\r\n public type!: DrawType;\r\n\r\n /**\r\n * ShapeType\r\n */\r\n @Input()\r\n public shape!: ShapeType;\r\n\r\n /**\r\n * number\r\n */\r\n @Input()\r\n public width!: number;\r\n\r\n /**\r\n * number\r\n */\r\n @Input()\r\n public height!: number;\r\n\r\n /**\r\n * number\r\n */\r\n @Input()\r\n public margin!: number;\r\n\r\n /**\r\n * string\r\n */\r\n @Input()\r\n public data!: string;\r\n\r\n /**\r\n * string\r\n */\r\n @Input()\r\n public image!: string;\r\n\r\n /**\r\n * number\r\n */\r\n @Input()\r\n public scale: number = 0;\r\n\r\n /**\r\n * number\r\n */\r\n @Input()\r\n public rotate: number = 0;\r\n\r\n /**\r\n * number\r\n */\r\n @Input()\r\n public zIndex: 1 | 2 = 2;\r\n\r\n /**\r\n * object\r\n */\r\n @Input()\r\n public frameOptions!: {\r\n style?: FrameStyle;\r\n height?: number;\r\n width?: number;\r\n x?: number;\r\n y?: number;\r\n background?: string;\r\n texts?: UnknownObject[];\r\n contents?: UnknownObject[];\r\n containers?: UnknownObject[];\r\n };\r\n\r\n /**\r\n * object\r\n */\r\n @Input()\r\n qrOptions!: {\r\n typeNumber?: TypeNumber;\r\n mode?: Mode;\r\n errorCorrectionLevel?: ErrorCorrectionLevel;\r\n };\r\n\r\n /**\r\n * object\r\n */\r\n @Input()\r\n imageOptions!: {\r\n hideBackgroundDots?: boolean;\r\n imageSize?: number;\r\n crossOrigin?: string;\r\n margin?: number;\r\n };\r\n\r\n /**\r\n * object\r\n */\r\n @Input()\r\n dotsOptions!: {\r\n type?: DotType;\r\n color?: string;\r\n gradient?: Gradient;\r\n };\r\n\r\n /**\r\n * object\r\n */\r\n @Input()\r\n cornersSquareOptions!: {\r\n type?: CornerSquareType;\r\n color?: string;\r\n gradient?: Gradient;\r\n };\r\n\r\n /**\r\n * object\r\n */\r\n @Input()\r\n cornersDotOptions!: {\r\n type?: CornerDotType;\r\n color?: string;\r\n gradient?: Gradient;\r\n };\r\n\r\n /**\r\n * object\r\n */\r\n @Input()\r\n backgroundOptions!: {\r\n round?: number;\r\n color?: string;\r\n gradient?: Gradient;\r\n };\r\n\r\n constructor(\r\n private canvas: ElementRef,\r\n private service: NgxQrcodeStylingService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.canvas) {\r\n /**\r\n * @Input override\r\n */\r\n if (this.template)\r\n this.config = {\r\n ...this.config,\r\n template: this.template,\r\n };\r\n\r\n if (this.type)\r\n this.config = {\r\n ...this.config,\r\n type: this.type,\r\n };\r\n\r\n if (this.shape)\r\n this.config = {\r\n ...this.config,\r\n shape: this.shape,\r\n };\r\n\r\n if (this.width)\r\n this.config = {\r\n ...this.config,\r\n width: this.width,\r\n };\r\n\r\n if (this.height)\r\n this.config = {\r\n ...this.config,\r\n height: this.height,\r\n };\r\n\r\n if (this.margin)\r\n this.config = {\r\n ...this.config,\r\n margin: this.margin,\r\n };\r\n\r\n if (this.data)\r\n this.config = {\r\n ...this.config,\r\n data: this.data,\r\n };\r\n\r\n if (this.image)\r\n this.config = {\r\n ...this.config,\r\n image: this.image,\r\n };\r\n\r\n if (this.scale)\r\n this.config = {\r\n ...this.config,\r\n scale: this.scale,\r\n };\r\n\r\n if (this.rotate)\r\n this.config = {\r\n ...this.config,\r\n rotate: this.rotate,\r\n };\r\n\r\n if (this.zIndex)\r\n this.config = {\r\n ...this.config,\r\n zIndex: this.zIndex,\r\n };\r\n\r\n if (this.frameOptions)\r\n this.config = {\r\n ...this.config,\r\n frameOptions: this.frameOptions,\r\n };\r\n\r\n if (this.qrOptions)\r\n this.config = {\r\n ...this.config,\r\n qrOptions: this.qrOptions,\r\n };\r\n\r\n if (this.imageOptions)\r\n this.config = {\r\n ...this.config,\r\n imageOptions: this.imageOptions,\r\n };\r\n\r\n if (this.dotsOptions)\r\n this.config = {\r\n ...this.config,\r\n dotsOptions: this.dotsOptions,\r\n };\r\n\r\n if (this.cornersSquareOptions)\r\n this.config = {\r\n ...this.config,\r\n cornersSquareOptions: this.cornersSquareOptions,\r\n };\r\n\r\n if (this.cornersDotOptions)\r\n this.config = {\r\n ...this.config,\r\n cornersDotOptions: this.cornersDotOptions,\r\n };\r\n\r\n if (this.backgroundOptions)\r\n this.config = {\r\n ...this.config,\r\n backgroundOptions: this.backgroundOptions,\r\n };\r\n\r\n this.create(this.config);\r\n }\r\n }\r\n\r\n /**\r\n * create\r\n * @param config\r\n * @returns\r\n */\r\n public create(config: Options): AsyncSubject<any> {\r\n return this.service.create(config, this.canvas.nativeElement);\r\n }\r\n\r\n /**\r\n * update\r\n * @param config\r\n * @param configUpdate\r\n * @returns\r\n */\r\n public update(config: Options, configUpdate: Options): AsyncSubject<any> {\r\n return this.service.update(config, configUpdate, this.canvas.nativeElement);\r\n }\r\n\r\n /**\r\n * download image\r\n * @param fileName eg: demo.png\r\n * @param timeout\r\n * @returns\r\n */\r\n public download(fileName?: string, timeout = 0): AsyncSubject<any> {\r\n return this.service.download(this.canvas.nativeElement, fileName, timeout);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-qrcode-styling\r\n */\r\n\r\nexport * from './lib/ngx-qrcode-styling.templates';\r\nexport * from './lib/ngx-qrcode-styling.options';\r\nexport * from './lib/ngx-qrcode-styling.service';\r\nexport * from './lib/ngx-qrcode-styling.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxQrcodeStylingService"],"mappings":"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