@liquid-js/qr-code-styling 5.3.0 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"qr-code-styling-node.js","sources":["../src/utils/merge.ts","../src/utils/gradient.ts","../src/utils/options.ts","../src/utils/qrcode.ts","../src/utils/svg.ts","../src/figures/dot-elements.ts","../src/figures/corner-dot.ts","../src/figures/square-elements.ts","../src/figures/corner-square.ts","../src/figures/dot-composition.ts","../src/figures/dot.ts","../src/tools/browser-image-tools.ts","../src/utils/color.ts","../src/utils/random.ts","../src/core/qr-svg.ts","../src/utils/image.ts","../src/core/qr-code-styling.ts","../src/tools/resize.ts","../src/tools/browser-utils.ts","../src/node.ts"],"sourcesContent":["const isObject = (obj: Record<string, unknown> | undefined): boolean =>\r\n !!obj && typeof obj === 'object' && !Array.isArray(obj)\r\n\r\nexport type UnknownObject = {\r\n [key: string]: any\r\n} | undefined\r\n\r\nexport function mergeDeep(target: UnknownObject, ...sources: UnknownObject[]): UnknownObject {\r\n if (!sources.length) return target\r\n const source = sources.shift()\r\n if (source === undefined || !isObject(target) || !isObject(source)) return target\r\n target = { ...target }\r\n Object.keys(source).forEach((key: string): void => {\r\n const targetValue = target[key]\r\n const sourceValue = source[key]\r\n\r\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\r\n target[key] = sourceValue\r\n } else if (isObject(targetValue) && isObject(sourceValue)) {\r\n target[key] = mergeDeep({ ...targetValue }, sourceValue)\r\n } else {\r\n target[key] = sourceValue\r\n }\r\n })\r\n\r\n return mergeDeep(target, ...sources)\r\n}\r\n","export enum GradientType {\r\n radial = 'radial',\r\n linear = 'linear'\r\n}\r\n\r\nexport interface Gradient {\r\n /**\r\n * Type of gradient spread\r\n *\r\n * @default GradientType.linear\r\n */\r\n type: `${GradientType}`\r\n /**\r\n * Rotation of gradient (in radians, Math.PI === 180 degrees)\r\n *\r\n * @default 0\r\n */\r\n rotation?: number\r\n /** Gradient colors. */\r\n colorStops: Array<{\r\n /** Position of color in gradient range */\r\n offset: number\r\n /** Color of stop in gradient range */\r\n color: string\r\n }>\r\n}\r\n\r\nexport function sanitizeGradient(gradient: Gradient): Gradient {\r\n const newGradient = { ...gradient }\r\n\r\n if (!newGradient.colorStops || !newGradient.colorStops.length) {\r\n throw new Error(\"Field 'colorStops' is required in gradient\")\r\n }\r\n\r\n if (newGradient.rotation) {\r\n newGradient.rotation = Number(newGradient.rotation)\r\n } else {\r\n newGradient.rotation = 0\r\n }\r\n\r\n newGradient.colorStops = newGradient.colorStops.map((colorStop: { offset: number, color: string }) => ({\r\n ...colorStop,\r\n offset: Number(colorStop.offset)\r\n }))\r\n\r\n return newGradient\r\n}\r\n","import { ErrorCorrectionLevel, Mode, TypeNumber } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { browserImageTools } from '../tools/browser-image-tools.js'\r\nimport { DrawArgs } from '../types/helper.js'\r\nimport { Gradient, sanitizeGradient } from './gradient.js'\r\n\r\nexport enum DotType {\r\n dot = 'dot',\r\n randomDot = 'random-dot',\r\n rounded = 'rounded',\r\n extraRounded = 'extra-rounded',\r\n verticalLine = 'vertical-line',\r\n horizontalLine = 'horizontal-line',\r\n classy = 'classy',\r\n classyRounded = 'classy-rounded',\r\n square = 'square',\r\n smallSquare = 'small-square',\r\n tinySquare = 'tiny-square',\r\n diamond = 'diamond',\r\n wave = 'wave',\r\n heart = 'heart',\r\n star = 'star',\r\n weave = 'weave',\r\n pentagon = 'pentagon',\r\n hexagon = 'hexagon',\r\n zebraHorizontal = 'zebra-horizontal',\r\n zebraVertical = 'zebra-vertical',\r\n blocksHorizontal = 'blocks-horizontal',\r\n blocksVertical = 'blocks-vertical',\r\n blobs = 'blobs'\r\n}\r\n\r\nexport enum CornerDotType {\r\n dot = 'dot',\r\n square = 'square',\r\n heart = 'heart',\r\n extraRounded = 'extra-rounded',\r\n classy = 'classy',\r\n inpoint = 'inpoint',\r\n outpoint = 'outpoint',\r\n star = 'star',\r\n pentagon = 'pentagon',\r\n hexagon = 'hexagon',\r\n diamond = 'diamond'\r\n}\r\n\r\nexport enum CornerSquareType {\r\n dot = 'dot',\r\n square = 'square',\r\n extraRounded = 'extra-rounded',\r\n classy = 'classy',\r\n inpoint = 'inpoint',\r\n outpoint = 'outpoint',\r\n centerCircle = 'center-circle'\r\n}\r\n\r\nexport enum ShapeType {\r\n square = 'square',\r\n circle = 'circle'\r\n}\r\n\r\nexport enum ImageMode {\r\n /**\r\n * Place image in the center of the code\r\n */\r\n center = 'center',\r\n /**\r\n * Place image over the center of the code\r\n */\r\n overlay = 'overlay',\r\n /**\r\n * Use image as background, draw dots over it\r\n */\r\n background = 'background'\r\n}\r\n\r\nexport interface Plugin {\r\n /**\r\n * Draw a single dot\r\n *\r\n * @returns Dot element; if undefined, try to use the next plugin or the default function\r\n */\r\n drawDot?: (args: DrawArgs) => SVGElement | undefined | void\r\n /**\r\n * Draw corner dot\r\n *\r\n * @returns Corner dot element; if undefined, try to use the next plugin or the default function\r\n */\r\n drawCornerDot?: (args: DrawArgs) => SVGElement | undefined | void\r\n /**\r\n * Draw corner square\r\n *\r\n * @returns Corner square element and corner mask (used with ImageMode.background); if undefined, try to use the next plugin or the default function\r\n */\r\n drawCornerSquare?: (args: DrawArgs) => readonly [SVGElement, SVGElement] | undefined | void\r\n /**\r\n * Alter the generated SVG, e.g. add borders\r\n */\r\n postProcess?: (svg: SVGSVGElement, options: Options) => void\r\n}\r\n\r\nexport interface Options {\r\n /** Use a custom DOM domplementation */\r\n document: Document\r\n /** Use a custom image fetching & serializaton implementation */\r\n imageTools?: typeof browserImageTools\r\n /**\r\n * @ignore\r\n * @deprecated kept for compatibility with older extensions, use options.size\r\n */\r\n width: number\r\n /**\r\n * @ignore\r\n * @deprecated kept for compatibility with older extensions, use options.size\r\n */\r\n height: number\r\n /** @ignore */\r\n size: number\r\n /** The data will be encoded in the QR code */\r\n data: string\r\n /** The image will be copied to the center of the QR code */\r\n image?: string | Buffer | Blob\r\n /**\r\n * QR code shape\r\n *\r\n * @default ShapeType.square\r\n */\r\n shape: `${ShapeType}`\r\n /** Options will be passed to `@liquid-js/qrcode-generator` lib */\r\n qrOptions: {\r\n typeNumber: TypeNumber\r\n mode?: `${Mode}`\r\n /** @default ErrorCorrectionLevel.Q */\r\n errorCorrectionLevel: `${ErrorCorrectionLevel}`\r\n }\r\n imageOptions: {\r\n /**\r\n * Image mode\r\n *\r\n * @default ImageMode.center\r\n */\r\n mode: `${ImageMode}`\r\n /**\r\n * Fill blank areas of the code with selected color\r\n */\r\n fill: {\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"rgba(255,255,255,0.75)\"\r\n */\r\n color: string\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient\r\n }\r\n /**\r\n * Coefficient of the image size\r\n *\r\n * @default 0.4\r\n */\r\n imageSize: number\r\n /**\r\n * Margin of the image (in blocks)\r\n *\r\n * @default 0\r\n */\r\n margin: number\r\n /**\r\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLImageElement/crossOrigin)\r\n */\r\n crossOrigin?: string\r\n }\r\n dotsOptions: {\r\n /**\r\n * QR dot size (in pixels)\r\n *\r\n * @default 10\r\n */\r\n size: number\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"#000\"\r\n */\r\n color: string\r\n /** Gradient of QR dots */\r\n gradient?: Gradient\r\n /**\r\n * Style of QR dots\r\n *\r\n * @default DotType.square\r\n */\r\n type: `${DotType}`\r\n }\r\n /** Corners Square options, omitted values match dots */\r\n cornersSquareOptions?: {\r\n /** Color of Corners Square */\r\n color?: string\r\n /** Gradient of Corners Square */\r\n gradient?: Gradient\r\n /** Style of Corners Square */\r\n type?: `${CornerSquareType | DotType}`\r\n }\r\n /** Corners Dot options, omitted values match squares */\r\n cornersDotOptions?: {\r\n /** Color of Corners Dot */\r\n color?: string\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient\r\n /** Style of Corners Dot */\r\n type?: `${CornerDotType | DotType}`\r\n }\r\n /** QR background styling options, false to disable background */\r\n backgroundOptions?: {\r\n /** Background roundnes, from 0 (square) to 1 (circle) */\r\n round?: number\r\n /** Background color */\r\n color?: string\r\n /** Background Gradient */\r\n gradient?: Gradient\r\n /**\r\n * Margin (in blocks) between background and the QR code\r\n *\r\n * @default 0\r\n */\r\n margin?: number\r\n } | false\r\n /** `import { stringToBytesFuncs } from \"@liquid-js/qr-code-styling/kanji\";` to add Kanji support */\r\n stringToBytesFuncs?: { [encoding: string]: (s: string) => number[] }\r\n plugins?: Plugin[]\r\n}\r\n\r\nexport const defaultOptions: Options = {\r\n document: undefined as never,\r\n shape: ShapeType.square,\r\n width: undefined as never,\r\n height: undefined as never,\r\n size: undefined as never,\r\n data: '',\r\n qrOptions: {\r\n typeNumber: TypeNumber[0],\r\n mode: undefined,\r\n errorCorrectionLevel: ErrorCorrectionLevel.Q\r\n },\r\n imageOptions: {\r\n mode: ImageMode.center,\r\n imageSize: 0.4,\r\n crossOrigin: undefined,\r\n margin: 0,\r\n fill: {\r\n color: 'rgba(255,255,255,1)'\r\n }\r\n },\r\n dotsOptions: {\r\n type: DotType.square,\r\n color: '#000',\r\n size: 10\r\n }\r\n}\r\n\r\nexport function sanitizeOptions(options: Options): Options {\r\n const newOptions = { ...options }\r\n\r\n newOptions.imageOptions = {\r\n ...newOptions.imageOptions,\r\n imageSize: Math.min(1, Number(newOptions.imageOptions.imageSize)) || 1,\r\n margin: Number(newOptions.imageOptions.margin),\r\n fill: {\r\n ...newOptions.imageOptions.fill\r\n }\r\n }\r\n\r\n if (newOptions.imageOptions.mode == ImageMode.overlay) newOptions.imageOptions.margin = 0\r\n if (newOptions.imageOptions.fill.gradient) {\r\n newOptions.imageOptions.fill.gradient = sanitizeGradient(newOptions.imageOptions.fill.gradient)\r\n }\r\n\r\n newOptions.dotsOptions = {\r\n ...newOptions.dotsOptions\r\n }\r\n if (newOptions.dotsOptions.gradient) {\r\n newOptions.dotsOptions.gradient = sanitizeGradient(newOptions.dotsOptions.gradient)\r\n }\r\n // Ensure integer dot size\r\n newOptions.dotsOptions.size = Math.round(Math.max(0, newOptions.dotsOptions.size) || 10)\r\n\r\n if (newOptions.cornersSquareOptions) {\r\n newOptions.cornersSquareOptions = {\r\n ...newOptions.cornersSquareOptions\r\n }\r\n if (newOptions.cornersSquareOptions.gradient) {\r\n newOptions.cornersSquareOptions.gradient = sanitizeGradient(newOptions.cornersSquareOptions.gradient)\r\n }\r\n }\r\n\r\n if (newOptions.cornersDotOptions) {\r\n newOptions.cornersDotOptions = {\r\n ...newOptions.cornersDotOptions\r\n }\r\n if (newOptions.cornersDotOptions.gradient) {\r\n newOptions.cornersDotOptions.gradient = sanitizeGradient(newOptions.cornersDotOptions.gradient)\r\n }\r\n }\r\n\r\n if (newOptions.backgroundOptions) {\r\n newOptions.backgroundOptions = {\r\n ...newOptions.backgroundOptions\r\n }\r\n if (newOptions.backgroundOptions.gradient) {\r\n newOptions.backgroundOptions.gradient = sanitizeGradient(newOptions.backgroundOptions.gradient)\r\n }\r\n }\r\n\r\n if (!newOptions.document) newOptions.document = document\r\n\r\n return newOptions\r\n}\r\n","import { ErrorCorrectionLevel, Mode } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\n\r\nexport const ErrorCorrectionPercents = {\r\n [ErrorCorrectionLevel.L]: 0.07,\r\n [ErrorCorrectionLevel.M]: 0.15,\r\n [ErrorCorrectionLevel.Q]: 0.25,\r\n [ErrorCorrectionLevel.H]: 0.3\r\n}\r\n\r\nexport function getMode(data: string): Mode {\r\n switch (true) {\r\n case /^[0-9]*$/.test(data):\r\n return Mode.numeric\r\n case /^[0-9A-Z $%*+\\-./:]*$/.test(data):\r\n return Mode.alphanumeric\r\n\r\n case /[^\\u0000-\\u00ff]/.test(data):\r\n return Mode.unicode\r\n default:\r\n return Mode.byte\r\n }\r\n}\r\n","import { RotateFigureArgs } from '../types/helper.js'\r\n\r\nconst rx = /\\.?0+$/\r\n\r\nexport function numToAttr(value: number | string) {\r\n if (typeof value == 'string') return value\r\n return value.toFixed(7).replace(rx, '')\r\n}\r\n\r\nexport function svgPath(strings: TemplateStringsArray, ...values: unknown[]) {\r\n return strings\r\n .reduce((t, v, i) => {\r\n let p: unknown = ''\r\n if (i) p = values[i - 1]\r\n if (typeof p == 'number') p = numToAttr(p)\r\n return `${t}${p}${v}`\r\n }, '')\r\n .trim()\r\n .replace(/[\\s\\n\\r]+/gim, ' ')\r\n}\r\n\r\nexport function rotateFigure<T extends SVGElement | ReadonlyArray<SVGElement>>({ draw, ...args }: RotateFigureArgs<T>) {\r\n const { x, y, size, rotation = 0 } = args\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n\r\n const element = draw(args)\r\n if (rotation) (Array.isArray(element) ? element : [element])\r\n .forEach(el => el.setAttribute('transform', `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`))\r\n return element\r\n}\r\n\r\nexport function scalePath(path: Array<string | number>, { x, y, size }: {\r\n x: number\r\n y: number\r\n size: number\r\n}) {\r\n let move = false\r\n let i = 0\r\n return path\r\n .map((v) => {\r\n if (typeof v == 'string') {\r\n i = 0\r\n move = v.toUpperCase() == v\r\n return v\r\n }\r\n i++\r\n v = v * size\r\n if (move) {\r\n v += i % 2 == 1 ? x : y\r\n }\r\n return numToAttr(v)\r\n })\r\n .join(' ')\r\n}\r\n\r\nexport function extendSVG(svg: SVGSVGElement, padding: number) {\r\n padding = Math.max(padding, 0)\r\n svg.setAttribute('width', numToAttr(parseFloat(svg.getAttribute('width') || '0') + 2 * padding))\r\n svg.setAttribute('height', numToAttr(parseFloat(svg.getAttribute('height') || '0') + 2 * padding))\r\n const vb = (svg.getAttribute('viewBox') || '').split(' ').map((v, i) => parseFloat(v) + (i < 2 ? -1 : 2) * padding)\r\n svg.setAttribute('viewBox', vb.map(numToAttr).join(' '))\r\n if (vb.length < 4)\r\n return undefined\r\n return {\r\n left: vb[0],\r\n right: vb[2] + vb[0],\r\n top: vb[1],\r\n bottom: vb[3] + vb[1]\r\n }\r\n}\r\n","import { BasicFigureDrawArgs } from '../types/helper.js'\r\nimport { numToAttr, scalePath, svgPath } from '../utils/svg.js'\r\n\r\nexport const DotElements = {\r\n dot: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\r\n element.setAttribute('cx', numToAttr(x + size / 2))\r\n element.setAttribute('cy', numToAttr(y + size / 2))\r\n element.setAttribute('r', numToAttr(size / 2))\r\n\r\n return element\r\n },\r\n square: (args: BasicFigureDrawArgs, { width = args.size, height = args.size } = {}): SVGElement => {\r\n const { x, y, size, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n element.setAttribute('x', numToAttr(x + (size - width) / 2))\r\n element.setAttribute('y', numToAttr(y + (size - height) / 2))\r\n element.setAttribute('width', numToAttr(width))\r\n element.setAttribute('height', numToAttr(height))\r\n\r\n return element\r\n },\r\n //if rotation === 0 - right side is rounded\r\n sideRounded: (args: BasicFigureDrawArgs, { height = args.size } = {}): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + (size - height) / 2}\r\n v ${height}\r\n h ${size / 2}\r\n a ${height / 2} ${height / 2} 0 0 0 0 ${-height}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - top right corner is rounded\r\n cornerRounded: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n v ${-size / 2}\r\n a ${size / 2} ${size / 2} 0 0 0 ${-size / 2} ${-size / 2}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - top right corner is rounded\r\n cornerExtraRounded: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n a ${size} ${size} 0 0 0 ${-size} ${-size}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - bottom left and top right corners are rounded\r\n classyDot: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size / 2}\r\n a ${size / 2} ${size / 2} 0 0 0 ${size / 2} ${size / 2}\r\n h ${size / 2}\r\n v ${-size / 2}\r\n a ${size / 2} ${size / 2} 0 0 0 ${-size / 2} ${-size / 2}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - top right corner is rounded\r\n wave: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const a1 = 5 * Math.PI / 180\r\n const a2 = 65 * Math.PI / 180\r\n const s1 = 0.95\r\n const s2 = 0.65\r\n\r\n const c23x = size * (1 - s2 * Math.sin(a1))\r\n const c23y = -size * (s1 - s2 * Math.cos(a1))\r\n\r\n const c31x = -size * Math.sin(a2) / 2\r\n const c31y = size * Math.cos(a2) / 2\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + size}\r\n c ${size * s2} 0 ${c23x} ${c23y} ${size} ${-size * s1}\r\n c ${c31x} ${c31y} ${-size / 2} ${size * (s1 - 1)} ${-size} ${size * (s1 - 1)} \r\n z`\r\n )\r\n\r\n return element\r\n },\r\n heart: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n scalePath([\r\n 'M',\r\n 1,\r\n 0.31629,\r\n 'c',\r\n -0.00086,\r\n 0.15702,\r\n -0.10534,\r\n 0.26323,\r\n -0.21876,\r\n 0.38123,\r\n 'c',\r\n -0.06736,\r\n 0.06834,\r\n -0.18938,\r\n 0.17948,\r\n -0.28124,\r\n 0.26126,\r\n 'c',\r\n -0.09188,\r\n -0.08178,\r\n -0.2139,\r\n -0.19292,\r\n -0.28124,\r\n -0.26126,\r\n 'c',\r\n -0.11344,\r\n -0.118,\r\n -0.2179,\r\n -0.22422,\r\n -0.21876,\r\n -0.38123,\r\n 'c',\r\n -0.00096,\r\n -0.27136,\r\n 0.33154,\r\n -0.36842,\r\n 0.5,\r\n -0.17,\r\n 'c',\r\n 0.16844,\r\n -0.19842,\r\n 0.50094,\r\n -0.10136,\r\n 0.5,\r\n 0.17,\r\n 'z'\r\n ], { x, y, size })\r\n )\r\n\r\n return element\r\n },\r\n rounded: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n element.setAttribute('x', numToAttr(x))\r\n element.setAttribute('y', numToAttr(y))\r\n element.setAttribute('width', numToAttr(size))\r\n element.setAttribute('height', numToAttr(size))\r\n element.setAttribute('rx', numToAttr(size / 4))\r\n element.setAttribute('ry', numToAttr(size / 4))\r\n\r\n return element\r\n },\r\n classy: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n H ${x}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n inpoint: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + size / 2}\r\n v ${size / 4}\r\n a ${size / 4} ${size / 4} 0 0 0 ${size / 4} ${size / 4}\r\n h ${(size / 4) * 3}\r\n v ${(-size / 4) * 3}\r\n a ${size / 4} ${size / 4} 0 0 0 ${-size / 4} ${-size / 4}\r\n h ${-size / 2}\r\n a ${size / 4} ${size / 4} 0 0 0 ${-size / 4} ${size / 4}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n star: (args: BasicFigureDrawArgs, {\r\n spikes = 5,\r\n outerRadius = args.size / 2,\r\n innerRadius = args.size / 4\r\n } = {}): SVGElement => {\r\n const { size, x, y, document } = args\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n\r\n const angle = Math.PI / spikes\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n Array(2 * spikes).fill(0).map((_, i) => {\r\n const radius = i % 2 === 0 ? outerRadius : innerRadius\r\n const xPoint = cx + radius * Math.sin(i * angle)\r\n const yPoint = cy - radius * Math.cos(i * angle)\r\n return svgPath`${i === 0 ? 'M' : 'L'} ${xPoint} ${yPoint} `\r\n }).join(' ')\r\n )\r\n\r\n return element\r\n },\r\n weave: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const thickness = size * 0.6\r\n const notch = (size - thickness) / 2\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x + notch} ${y}\r\n l ${thickness} 0\r\n l 0 ${notch}\r\n l ${notch} 0\r\n l 0 ${thickness}\r\n l ${-notch} 0\r\n l 0 ${notch}\r\n l ${-thickness} 0\r\n l 0 ${-notch}\r\n l ${-notch} 0\r\n l 0 ${-thickness}\r\n l ${notch} 0\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n blob: (args: BasicFigureDrawArgs, corners: Record<'tl' | 'tr' | 'bl' | 'br', 'round' | 'out' | 'square'>): SVGElement => {\r\n const { size, x, y, document } = args\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n\r\n const parts = [\r\n svgPath`M ${x} ${y + 2.5 * dotSize}`\r\n ]\r\n\r\n let l = 2 * dotSize\r\n\r\n if (corners.bl == 'round') {\r\n parts.push(\r\n svgPath`v ${l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}`\r\n )\r\n l = 2 * dotSize\r\n } else if (corners.bl == 'out') {\r\n parts.push(\r\n svgPath`v ${5 * dotSize + l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 1 ${dotSize * 2.5} ${dotSize * -2.5}`\r\n )\r\n l = 2 * dotSize\r\n } else {\r\n parts.push(\r\n svgPath`v ${2.5 * dotSize + l}`\r\n )\r\n l = 4.5 * dotSize\r\n }\r\n\r\n if (corners.br == 'round') {\r\n parts.push(\r\n svgPath`h ${l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * -2.5}`\r\n )\r\n l = -2 * dotSize\r\n } else if (corners.br == 'out') {\r\n parts.push(\r\n svgPath`h ${5 * dotSize + l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 1 ${dotSize * -2.5} ${dotSize * -2.5}`\r\n )\r\n l = -2 * dotSize\r\n } else {\r\n parts.push(\r\n svgPath`h ${2.5 * dotSize + l}`\r\n )\r\n l = -4.5 * dotSize\r\n }\r\n\r\n if (corners.tr == 'round') {\r\n parts.push(\r\n svgPath`v ${l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * -2.5} ${dotSize * -2.5}`\r\n )\r\n l = -2 * dotSize\r\n } else if (corners.tr == 'out') {\r\n parts.push(\r\n svgPath`v ${-5 * dotSize + l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 1 ${dotSize * -2.5} ${dotSize * 2.5}`\r\n )\r\n l = -2 * dotSize\r\n } else {\r\n parts.push(\r\n svgPath`v ${-2.5 * dotSize + l}`\r\n )\r\n l = -4.5 * dotSize\r\n }\r\n\r\n if (corners.tl == 'round') {\r\n parts.push(\r\n svgPath`h ${l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * -2.5} ${dotSize * 2.5}`\r\n )\r\n } else if (corners.tl == 'out') {\r\n parts.push(\r\n svgPath`h ${-5 * dotSize + l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 1 ${dotSize * 2.5} ${dotSize * 2.5}`\r\n )\r\n } else {\r\n parts.push(\r\n svgPath`h ${-2.5 * dotSize + l}`\r\n )\r\n }\r\n\r\n element.setAttribute(\r\n 'd',\r\n parts.join(' ') + ' z'\r\n )\r\n\r\n return element\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { CornerDotType, Plugin } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\nconst qrCornerDotFigures: { [type in CornerDotType]: (args: DrawArgs) => SVGElement } = {\r\n [CornerDotType.dot]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.dot\r\n }),\r\n [CornerDotType.square]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.square\r\n }),\r\n [CornerDotType.heart]: args => DotElements.heart(args),\r\n [CornerDotType.extraRounded]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.rounded\r\n }),\r\n [CornerDotType.classy]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.classy\r\n }),\r\n [CornerDotType.inpoint]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.inpoint\r\n }),\r\n [CornerDotType.outpoint]: args => rotateFigure({\r\n ...args,\r\n rotation: (args.rotation || 0) + Math.PI,\r\n draw: DotElements.inpoint\r\n }),\r\n [CornerDotType.star]: args => DotElements.star(args),\r\n [CornerDotType.pentagon]: args => DotElements.star(args, {\r\n spikes: 2.5,\r\n outerRadius: args.size / 2,\r\n innerRadius: args.size / 2\r\n }),\r\n [CornerDotType.hexagon]: args => DotElements.star(args, {\r\n spikes: 3,\r\n outerRadius: args.size / 2,\r\n innerRadius: args.size / 2\r\n }),\r\n [CornerDotType.diamond]: args => rotateFigure({\r\n ...args,\r\n rotation: Math.PI / 4,\r\n draw: args2 => DotElements.square(args2, { width: args2.size * 0.85, height: args2.size * 0.85 })\r\n })\r\n}\r\n\r\nexport function getQrCornerDotFigure(type: `${CornerDotType}`) {\r\n return qrCornerDotFigures[type] || qrCornerDotFigures[CornerDotType.square]\r\n}\r\n\r\nexport function drawPluginCornerDot(plugins: Plugin[]) {\r\n return (args: DrawArgs) => {\r\n for (const plugin of plugins) {\r\n const el = plugin.drawCornerDot?.(args)\r\n if (el)\r\n return el\r\n }\r\n return undefined\r\n }\r\n}\r\n","import { BasicFigureDrawArgs } from '../types/helper.js'\r\nimport { svgPath } from '../utils/svg.js'\r\n\r\nexport const SquareElements = {\r\n dot: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x + size / 2} ${y}\r\n a ${size / 2} ${size / 2} 0 1 0 0.1 0\r\n z\r\n m 0 ${dotSize}\r\n a ${size / 2 - dotSize} ${size / 2 - dotSize} 0 1 1 -0.1 0\r\n Z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`M ${x + size / 2} ${y - dotSize}\r\n a ${size / 2 + dotSize} ${size / 2 + dotSize} 0 1 0 0.1 0\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n square: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n v ${-size}\r\n z\r\n M ${x + dotSize} ${y + dotSize}\r\n h ${size - 2 * dotSize}\r\n v ${size - 2 * dotSize}\r\n h ${-size + 2 * dotSize}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`M ${x - dotSize} ${y - dotSize}\r\n h ${size + 2 * dotSize}\r\n v ${size + 2 * dotSize}\r\n h ${-size - 2 * dotSize}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n extraRounded: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${-dotSize * 2.5}\r\n v ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${dotSize * 2.5}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${-dotSize * 1.5} ${dotSize * 1.5}\r\n h ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${-dotSize * 1.5}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x - dotSize} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 0 ${dotSize * 3.5} ${dotSize * 3.5}\r\n h ${2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 0 ${dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 0 ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n h ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 0 ${-dotSize * 3.5} ${dotSize * 3.5}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n classy: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n H ${x}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${3.5 * dotSize}\r\n h ${-3.5 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-3.5 * dotSize}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x + 0.5 * dotSize} ${y - dotSize}\r\n h ${4 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${dotSize * 3.5} ${dotSize * 3.5}\r\n v ${5.5 * dotSize}\r\n h ${-5.5 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-5.5 * dotSize}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n inpoint: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${dotSize * 2.5}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${3.5 * dotSize}\r\n h ${-3.5 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${-dotSize * 1.5}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x + 0.5 * dotSize} ${y - dotSize}\r\n h ${4 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${dotSize * 3.5} ${dotSize * 3.5}\r\n v ${5.5 * dotSize}\r\n h ${-5.5 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${dotSize * 3.5} ${-dotSize * 3.5}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n centerCircle: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { x, y, size, document } = args\r\n\r\n const circleRadius = size / 2.5\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n h ${size}\r\n v ${size}\r\n h ${-size}\r\n z\r\n M ${cx - circleRadius} ${cy}\r\n a ${circleRadius} ${circleRadius} 0 1 0 ${circleRadius * 2} 0\r\n a ${circleRadius} ${circleRadius} 0 1 0 ${-circleRadius * 2} 0\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`M ${x - dotSize} ${y - dotSize}\r\n h ${size + 2 * dotSize}\r\n v ${size + 2 * dotSize}\r\n h ${-size - 2 * dotSize}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { CornerSquareType, Plugin } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { SquareElements } from './square-elements.js'\r\n\r\nconst qrCornerSquareFigures: { [type in CornerSquareType]: (args: DrawArgs) => readonly [SVGElement, SVGElement] } = {\r\n [CornerSquareType.dot]: args => SquareElements.dot(args),\r\n [CornerSquareType.square]: args => SquareElements.square(args),\r\n [CornerSquareType.extraRounded]: args => SquareElements.extraRounded(args),\r\n [CornerSquareType.classy]: args => rotateFigure({\r\n ...args,\r\n draw: SquareElements.classy\r\n }),\r\n [CornerSquareType.inpoint]: args => rotateFigure({\r\n ...args,\r\n draw: SquareElements.inpoint\r\n }),\r\n [CornerSquareType.outpoint]: ({ rotation, ...args }) => rotateFigure({\r\n ...args,\r\n rotation: (rotation || 0) + Math.PI,\r\n draw: SquareElements.inpoint\r\n }),\r\n [CornerSquareType.centerCircle]: args => SquareElements.centerCircle(args)\r\n}\r\n\r\nexport function getQrCornerSquareFigure(type: `${CornerSquareType}`) {\r\n return qrCornerSquareFigures[type] || qrCornerSquareFigures[CornerSquareType.square]\r\n}\r\n\r\nexport function drawPluginCornerSquare(plugins: Plugin[]) {\r\n return (args: DrawArgs) => {\r\n for (const plugin of plugins) {\r\n const el = plugin.drawCornerSquare?.(args)\r\n if (el)\r\n return el\r\n }\r\n return undefined\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\n/**\r\n * Draw square lines with rounded corners and endpoints\r\n */\r\nexport function roundedCorners({ x, y, size, document, getNeighbor }: DrawArgs, { corner = DotElements.cornerRounded, end = DotElements.sideRounded } = {}) {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return DotElements.dot({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount === 2) {\r\n // Rounded corner\r\n let rotation = 0\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: corner\r\n })\r\n } else {\r\n // Endpoint\r\n let rotation = 0\r\n\r\n if (topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: end\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Draw square lines with rounded corners and half-rounded endpoints\r\n */\r\nexport function classy({ x, y, size, document, getNeighbor }: DrawArgs, { corner = DotElements.cornerRounded } = {}) {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return rotateFigure({\r\n x, y, size, rotation: Math.PI / 2,\r\n document,\r\n draw: DotElements.classyDot\r\n })\r\n } else if (!leftNeighbor && !topNeighbor) {\r\n // Top right corner\r\n return rotateFigure({\r\n x, y, size, rotation: -Math.PI / 2,\r\n document,\r\n draw: corner\r\n })\r\n } else if (!rightNeighbor && !bottomNeighbor) {\r\n // Bottom left corner\r\n return rotateFigure({\r\n x, y, size, rotation: Math.PI / 2,\r\n document,\r\n draw: corner\r\n })\r\n }\r\n\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n}\r\n\r\n/**\r\n * Draw stripes with rounded or square endpoints\r\n */\r\nexport function stripes({ x, y, size, document, getNeighbor }: DrawArgs, { stripe = size, rotation = 0, endpoint = DotElements.sideRounded, dot = DotElements.dot } = {}) {\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n if (topNeighbor && bottomNeighbor) {\r\n // Mid-stripe\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: _ => DotElements.square({\r\n x, y, size,\r\n document\r\n }, { width: stripe })\r\n })\r\n } else if (topNeighbor && !bottomNeighbor) {\r\n // Top endpoint\r\n rotation += Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: args => endpoint(args, { height: stripe })\r\n })\r\n } else if (bottomNeighbor && !topNeighbor) {\r\n // Bottom endpoint\r\n rotation -= Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: args => endpoint(args, { height: stripe })\r\n })\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: _ => dot({\r\n x: x + (size - stripe) / 2,\r\n y: y + (size - stripe) / 2,\r\n size: stripe,\r\n document\r\n })\r\n })\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { DotType, Plugin } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { classy, roundedCorners, stripes } from './dot-composition.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\nconst qrDotFigures: { [type in DotType]: (args: DrawArgs) => SVGElement } = {\r\n [DotType.dot]: args => DotElements.dot(args),\r\n [DotType.randomDot]: ({ size, x, y, getPRandom, ...args }) => {\r\n const rnd = (getPRandom || Math.random)\r\n const randomFactor = rnd() * (1 - 0.75) + 0.75\r\n\r\n return DotElements.dot({\r\n ...args,\r\n size: size * randomFactor,\r\n x: x + size * rnd() * (1 - randomFactor),\r\n y: y + size * rnd() * (1 - randomFactor)\r\n })\r\n },\r\n [DotType.rounded]: args => roundedCorners(args),\r\n [DotType.extraRounded]: args => roundedCorners(args, { corner: DotElements.cornerExtraRounded }),\r\n [DotType.verticalLine]: args => stripes(args),\r\n [DotType.horizontalLine]: ({ getNeighbor, ...args }) => stripes({\r\n ...args,\r\n getNeighbor: getNeighbor ? (x, y) => getNeighbor(y, x) : undefined\r\n }, { rotation: -Math.PI / 2 }),\r\n [DotType.classy]: args => classy(args),\r\n [DotType.classyRounded]: args => classy(args, { corner: DotElements.cornerExtraRounded }),\r\n [DotType.square]: args => DotElements.square(args),\r\n [DotType.smallSquare]: ({ x, y, size, document }) => {\r\n const originalSize = size\r\n\r\n size = originalSize * 0.7\r\n x = x + originalSize * 0.15\r\n y = y + originalSize * 0.15\r\n\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n },\r\n [DotType.tinySquare]: ({ x, y, size, document }) => {\r\n const originalSize = size\r\n\r\n size = originalSize * 0.3\r\n x = x + originalSize * 0.35\r\n y = y + originalSize * 0.35\r\n\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n },\r\n [DotType.diamond]: args => rotateFigure({\r\n ...args,\r\n rotation: Math.PI / 4,\r\n draw: args2 => DotElements.square(args2, { width: args2.size * 0.85, height: args2.size * 0.85 })\r\n }),\r\n [DotType.wave]: args => roundedCorners(args, {\r\n corner: DotElements.cornerExtraRounded,\r\n end: DotElements.wave\r\n }),\r\n [DotType.heart]: args => DotElements.heart(args),\r\n [DotType.star]: args => DotElements.star(args),\r\n [DotType.weave]: args => DotElements.weave(args),\r\n [DotType.pentagon]: args => DotElements.star(args, {\r\n spikes: 2.5,\r\n outerRadius: args.size / 2,\r\n innerRadius: args.size / 2\r\n }),\r\n [DotType.hexagon]: args => DotElements.star(args, {\r\n spikes: 3,\r\n outerRadius: args.size / 2,\r\n innerRadius: args.size / 2\r\n }),\r\n [DotType.zebraVertical]: args => stripes(args, { stripe: args.size * 0.8 }),\r\n [DotType.zebraHorizontal]: ({ getNeighbor, ...args }) => stripes({\r\n ...args,\r\n getNeighbor: getNeighbor ? (x, y) => getNeighbor(y, x) : undefined\r\n }, { stripe: args.size * 0.8, rotation: -Math.PI / 2 }),\r\n [DotType.blocksVertical]: args => stripes(args, {\r\n stripe: args.size * 0.8,\r\n endpoint: (_args, _params) => {\r\n const rnd = (args.getPRandom || Math.random)\r\n const width = args.size * (1 - rnd() * 0.25)\r\n const x = args.x - (args.size - width) / 2\r\n return DotElements.square({ ..._args, x }, { ..._params, width })\r\n },\r\n dot: (_args) => {\r\n const rnd = (args.getPRandom || Math.random)\r\n const height = args.size * (1 - rnd() * 0.25)\r\n const y = args.y + (args.size - height) * rnd()\r\n return DotElements.square({ ..._args, y }, { height })\r\n }\r\n }),\r\n [DotType.blocksHorizontal]: ({ getNeighbor, ...args }) => stripes({\r\n ...args,\r\n getNeighbor: getNeighbor ? (x, y) => getNeighbor(y, x) : undefined\r\n }, {\r\n stripe: args.size * 0.8,\r\n rotation: -Math.PI / 2,\r\n endpoint: (_args, _params) => {\r\n const rnd = (args.getPRandom || Math.random)\r\n const width = args.size * (1 - rnd() * 0.25)\r\n const x = args.x - (args.size - width) / 2\r\n return DotElements.square({ ..._args, x }, { ..._params, width })\r\n },\r\n dot: (_args) => {\r\n const rnd = (args.getPRandom || Math.random)\r\n const height = args.size * (1 - rnd() * 0.25)\r\n const y = args.y + (args.size - height) * rnd()\r\n return DotElements.square({ ..._args, y }, { height })\r\n }\r\n }),\r\n [DotType.blobs]: ({ getNeighbor, ...args }) => {\r\n const tl = getNeighbor?.(-1, -1)\r\n const t = getNeighbor?.(0, -1)\r\n const tr = getNeighbor?.(1, -1)\r\n const r = getNeighbor?.(1, 0)\r\n const br = getNeighbor?.(1, 1)\r\n const b = getNeighbor?.(0, 1)\r\n const bl = getNeighbor?.(-1, 1)\r\n const l = getNeighbor?.(-1, 0)\r\n const corners: Record<'tl' | 'tr' | 'bl' | 'br', 'round' | 'out' | 'square'> = {\r\n tl: 'square',\r\n tr: 'square',\r\n bl: 'square',\r\n br: 'square'\r\n }\r\n\r\n if (!l && tl)\r\n corners.tl = 'out'\r\n if (!t && tr)\r\n corners.tr = 'out'\r\n if (!r && br)\r\n corners.br = 'out'\r\n if (!b && bl)\r\n corners.bl = 'out'\r\n\r\n if (!l && !tl && !t)\r\n corners.tl = 'round'\r\n if (!t && !tr && !r)\r\n corners.tr = 'round'\r\n if (!r && !br && !b)\r\n corners.br = 'round'\r\n if (!b && !bl && !l)\r\n corners.bl = 'round'\r\n\r\n return DotElements.blob(args, corners)\r\n }\r\n}\r\n\r\nexport function getQrDotFigure(type: `${DotType}`, plugins?: Plugin[]) {\r\n const defaultDraw = qrDotFigures[type] || qrDotFigures[DotType.square]\r\n if (!plugins?.length)\r\n return defaultDraw\r\n\r\n const drawPlugin = drawPluginDot(plugins)\r\n return (args: DrawArgs) => drawPlugin(args) || defaultDraw(args)\r\n}\r\n\r\nexport function drawPluginDot(plugins: Plugin[]) {\r\n return (args: DrawArgs) => {\r\n for (const plugin of plugins) {\r\n const el = plugin.drawDot?.(args)\r\n if (el)\r\n return el\r\n }\r\n return undefined\r\n }\r\n}\r\n","export const browserImageTools = {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\r\n if (typeof url == 'string' && url.startsWith('data:')) return Promise.resolve(url)\r\n return new Promise((resolve, reject) => {\r\n if (typeof url == 'string') {\r\n const xhr = new XMLHttpRequest()\r\n xhr.onload = () => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result as string)\r\n }\r\n reader.readAsDataURL(xhr.response)\r\n }\r\n xhr.onerror = xhr.onabort = xhr.ontimeout = reject\r\n xhr.open('GET', url, true)\r\n xhr.responseType = 'blob'\r\n xhr.send()\r\n } else {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result as string)\r\n }\r\n reader.readAsDataURL(url as Blob)\r\n }\r\n })\r\n },\r\n getSize: (src: string | Blob | Buffer, crossOrigin?: string): Promise<{ width: number, height: number }> => new Promise((resolve, reject) => {\r\n const image = new Image()\r\n\r\n if (crossOrigin === 'string') {\r\n image.crossOrigin = crossOrigin\r\n }\r\n\r\n image.onload = (): void => {\r\n resolve({ width: image.width, height: image.height })\r\n }\r\n image.onerror = image.onabort = reject\r\n\r\n if (typeof src == 'string') image.src = src\r\n else\r\n browserImageTools\r\n .toDataURL(src)\r\n .then((url) => (image.src = url))\r\n .catch(reject)\r\n })\r\n}\r\n","export function parseColor(cstr: string) {\r\n let m: RegExpExecArray | null\r\n let parts: string[] | number[] = []\r\n let alpha = 1\r\n\r\n cstr = cstr.toLowerCase()\r\n\r\n if (cstr[0] === '#') {\r\n const base = cstr.slice(1)\r\n const size = base.length\r\n const isShort = size <= 4\r\n\r\n if (isShort) {\r\n parts = [parseInt(base[0] + base[0], 16), parseInt(base[1] + base[1], 16), parseInt(base[2] + base[2], 16)]\r\n if (size === 4) {\r\n alpha = parseInt(base[3] + base[3], 16) / 255\r\n }\r\n } else {\r\n parts = [parseInt(base[0] + base[1], 16), parseInt(base[2] + base[3], 16), parseInt(base[4] + base[5], 16)]\r\n if (size === 8) {\r\n alpha = parseInt(base[6] + base[7], 16) / 255\r\n }\r\n }\r\n\r\n if (!parts[0]) parts[0] = 0\r\n if (!parts[1]) parts[1] = 0\r\n if (!parts[2]) parts[2] = 0\r\n } else if ((m = /^((?:rgba?))\\s*\\(([^)]*)\\)/.exec(cstr))) {\r\n const dims = 3\r\n parts = m[2].trim().split(/\\s*[,/]\\s*|\\s+/)\r\n\r\n parts = parts.map((x, i) => {\r\n if (x[x.length - 1] === '%') {\r\n const v = parseFloat(x) / 100\r\n if (i === 3) return v\r\n return v * 255\r\n }\r\n\r\n if (x === 'none') return 0\r\n return parseFloat(x)\r\n })\r\n\r\n alpha = parts.length > dims ? parts.pop()! : 1\r\n } else {\r\n return {\r\n value: cstr,\r\n alpha\r\n }\r\n }\r\n\r\n const value = '#' + parts.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, '0')).join('')\r\n return {\r\n value,\r\n alpha: Math.max(0, Math.min(1, alpha))\r\n }\r\n}\r\n","export function getRng(matrix: Array<Array<boolean | number | undefined>>, i: number, j: number, match: number | boolean = true) {\r\n let seed: number | undefined\r\n return () => {\r\n if (seed == undefined) {\r\n seed = 0\r\n let ix = 0\r\n for (let xOffset = -3; xOffset < 4; xOffset++)\r\n for (let yOffset = -3; yOffset < 4; yOffset++) {\r\n ix++\r\n seed |= Number(matrix[((i + xOffset + matrix.length) << yOffset) % matrix.length]?.[((j + yOffset + matrix.length) << xOffset) % matrix.length] === match) << ix\r\n }\r\n }\r\n let t = seed += 0x6D2B79F5\r\n t = Math.imul(t ^ t >>> 15, t | 1)\r\n t ^= t + Math.imul(t ^ t >>> 7, t | 61)\r\n return ((t ^ t >>> 14) >>> 0) / 4294967296\r\n }\r\n}\r\n","import { QRCodeMinimal } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { QRUtil } from '@liquid-js/qrcode-generator/lib/qrcode/QRUtil.js'\r\nimport { drawPluginCornerDot, getQrCornerDotFigure } from '../figures/corner-dot.js'\r\nimport { drawPluginCornerSquare, getQrCornerSquareFigure } from '../figures/corner-square.js'\r\nimport { getQrDotFigure } from '../figures/dot.js'\r\nimport { browserImageTools } from '../tools/browser-image-tools.js'\r\nimport { parseColor } from '../utils/color.js'\r\nimport { Gradient, GradientType } from '../utils/gradient.js'\r\nimport { calculateImageSize } from '../utils/image.js'\r\nimport { CornerDotType, CornerSquareType, DotType, ImageMode, Options, ShapeType } from '../utils/options.js'\r\nimport { numToAttr } from '../utils/svg.js'\r\nimport { DrawArgs } from '../types/helper.js'\r\nimport { getRng } from '../utils/random.js'\r\n\r\nconst squareMask = [\r\n [1, 1, 1, 1, 1, 1, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 1, 1, 1, 1, 1, 1]\r\n]\r\n\r\nconst cornerSquareTypes = new Set<string>(Object.values(CornerSquareType))\r\nfunction isCornerSquareType(val?: string): val is `${CornerSquareType}` {\r\n return !!(val && cornerSquareTypes.has(val))\r\n}\r\n\r\nconst dotMask = [\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0]\r\n]\r\n\r\nconst cornerDotTypes = new Set<string>(Object.values(CornerDotType))\r\nfunction isCornerDotType(val?: string): val is `${CornerDotType}` {\r\n return !!(val && cornerDotTypes.has(val))\r\n}\r\n\r\nexport class QRSVG {\r\n private _element: SVGSVGElement\r\n private _fakeMatrix?: Array<Array<boolean | undefined>>\r\n\r\n get element() {\r\n return this._element\r\n }\r\n\r\n private defs: SVGElement\r\n\r\n private backgroundMask?: SVGElement\r\n private dotsMask?: SVGElement\r\n private lightDotsMask?: SVGElement\r\n\r\n private qr?: QRCodeMinimal\r\n private document: Document\r\n private imageTools: typeof browserImageTools\r\n\r\n constructor(\r\n private options: Pick<\r\n Options,\r\n | 'width'\r\n | 'height'\r\n | 'size'\r\n | 'document'\r\n | 'imageTools'\r\n | 'image'\r\n | 'imageOptions'\r\n | 'dotsOptions'\r\n | 'cornersDotOptions'\r\n | 'cornersSquareOptions'\r\n | 'backgroundOptions'\r\n | 'shape'\r\n | 'plugins'\r\n > & { errorCorrectionPercent: number }\r\n ) {\r\n this.document = options.document\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'svg')\r\n const size = numToAttr(options.size)\r\n this._element.setAttribute('width', size)\r\n this._element.setAttribute('height', size)\r\n this._element.setAttribute('viewBox', `0 0 ${size} ${size}`)\r\n this.defs = this.document.createElementNS('http://www.w3.org/2000/svg', 'defs')\r\n this._element.appendChild(this.defs)\r\n this.imageTools = options.imageTools || browserImageTools\r\n }\r\n\r\n get width(): number {\r\n return this.options.size\r\n }\r\n\r\n get height(): number {\r\n return this.options.size\r\n }\r\n\r\n async drawQR(qr: QRCodeMinimal): Promise<void> {\r\n const count = qr.getModuleCount()\r\n const typeNumber = parseInt(((count - 17) / 4).toFixed(0), 10)\r\n const dotSize = this.options.dotsOptions.size\r\n let drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n\r\n this.qr = qr\r\n\r\n if (this.options.image) {\r\n //We need it to get image size\r\n const size = await this.imageTools.getSize(this.options.image, this.options.imageOptions.crossOrigin)\r\n const { imageOptions, errorCorrectionPercent } = this.options\r\n\r\n if (imageOptions.mode == ImageMode.background) {\r\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n const maxSize = (this.options.size - 2 * margin * dotSize) * imageOptions.imageSize\r\n let { width, height } = size\r\n\r\n height = (height / width) * maxSize\r\n width = maxSize\r\n\r\n if (height > maxSize) {\r\n width = (width / height) * maxSize\r\n height = maxSize\r\n }\r\n\r\n drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width,\r\n height\r\n }\r\n } else {\r\n const coverLevel = imageOptions.imageSize * errorCorrectionPercent\r\n const alignment = QRUtil.getPatternPosition(typeNumber)\r\n const maxHiddenDots = Math.floor(\r\n coverLevel * (count * count - 3 * 8 * 8 - 2 * (count - 16) - alignment.length ** 2 * 25)\r\n )\r\n\r\n drawImageSize = calculateImageSize({\r\n originalWidth: size.width,\r\n originalHeight: size.height,\r\n maxHiddenDots,\r\n maxHiddenAxisDots: count - 14,\r\n dotSize,\r\n margin: imageOptions.margin\r\n })\r\n }\r\n }\r\n\r\n this.drawBackground()\r\n\r\n if (\r\n this.options.imageOptions.mode != ImageMode.overlay &&\r\n this.options.image &&\r\n drawImageSize.width > 0 &&\r\n drawImageSize.height > 0\r\n ) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize })\r\n }\r\n\r\n this.drawDots((i: number, j: number): boolean => {\r\n if (this.options.imageOptions.mode == ImageMode.center) {\r\n if (\r\n i >= (count - drawImageSize.hideXDots) / 2 &&\r\n i < (count + drawImageSize.hideXDots) / 2 &&\r\n j >= (count - drawImageSize.hideYDots) / 2 &&\r\n j < (count + drawImageSize.hideYDots) / 2\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if ((i < 8 && j < 8) || (i >= count - 8 && j < 8) || (j >= count - 8 && i < 8)) return false\r\n\r\n return true\r\n })\r\n\r\n if (\r\n this.options.imageOptions.mode == ImageMode.overlay &&\r\n this.options.image &&\r\n drawImageSize.width > 0 &&\r\n drawImageSize.height > 0\r\n ) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize })\r\n }\r\n\r\n this.drawCorners()\r\n }\r\n\r\n drawBackground(): void {\r\n const options = this.options\r\n\r\n if (this._element && options.backgroundOptions) {\r\n const gradientOptions = options.backgroundOptions.gradient\r\n const color = options.backgroundOptions.color\r\n\r\n this.createColor({\r\n options: gradientOptions,\r\n color,\r\n additionalRotation: 0,\r\n x: 0,\r\n y: 0,\r\n height: options.size,\r\n width: options.size,\r\n name: 'background-color'\r\n })\r\n\r\n const element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n this.backgroundMask = this.createMask('mask-background-color')\r\n this.defs.appendChild(this.backgroundMask)\r\n\r\n element.setAttribute('x', numToAttr(0))\r\n element.setAttribute('y', numToAttr(0))\r\n element.setAttribute('width', numToAttr(options.size))\r\n element.setAttribute('height', numToAttr(options.size))\r\n element.setAttribute('rx', numToAttr((options.size / 2) * (options.backgroundOptions.round || 0)))\r\n\r\n this.backgroundMask.appendChild(element)\r\n }\r\n }\r\n\r\n drawDots(filter?: (i: number, j: number) => boolean): void {\r\n if (!this.qr) {\r\n throw new Error('QR code is not defined')\r\n }\r\n\r\n const options = this.options\r\n const count = this.qr.getModuleCount()\r\n\r\n if (count > options.size) {\r\n throw new Error('The canvas is too small')\r\n }\r\n\r\n const dotSize = this.options.dotsOptions.size\r\n let size = options.size\r\n if (options.imageOptions.mode == ImageMode.background) size -= 2 * dotSize * (options.imageOptions.margin || 0)\r\n const beginning = Math.floor((options.size - count * dotSize) / 2)\r\n let draw = getQrDotFigure(options.dotsOptions.type, options.plugins)\r\n\r\n this.dotsMask = this.createMask('mask-dot-color')\r\n this.defs.appendChild(this.dotsMask)\r\n\r\n if (options.imageOptions.mode == ImageMode.background) {\r\n this.lightDotsMask = this.createMask('mask-light-dot-color')\r\n this.defs.appendChild(this.lightDotsMask)\r\n }\r\n\r\n let margin = 0\r\n let additionalDots = 0\r\n let fakeCount = count\r\n\r\n if (options.shape === ShapeType.circle) {\r\n margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n additionalDots = Math.floor((size / dotSize - count - 2 * margin) / 2)\r\n fakeCount = count + additionalDots * 2\r\n } else if (options.imageOptions.mode == ImageMode.background) {\r\n additionalDots = 1\r\n fakeCount = count + additionalDots * 2\r\n }\r\n\r\n const fakeBeginning = beginning - additionalDots * dotSize\r\n const colorCount = count + additionalDots * 2\r\n this._fakeMatrix = new Array(fakeCount)\r\n const center = Math.floor(fakeCount / 2)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n this._fakeMatrix[i] = new Array(fakeCount)\r\n for (let j = 0; j < fakeCount; j++) {\r\n if (\r\n i > additionalDots - 1 &&\r\n i < fakeCount - additionalDots &&\r\n j > additionalDots - 1 &&\r\n j < fakeCount - additionalDots\r\n ) {\r\n const ii = i - additionalDots\r\n const jj = j - additionalDots\r\n if (filter && !filter(ii, jj)) this._fakeMatrix[i][j] = undefined\r\n else this._fakeMatrix[i][j] = !!this.qr.isDark(jj, ii)\r\n continue\r\n }\r\n\r\n if (\r\n options.shape === ShapeType.circle &&\r\n Math.sqrt((i - center) * (i - center) + (j - center) * (j - center)) > center\r\n ) {\r\n this._fakeMatrix[i][j] = undefined\r\n continue\r\n }\r\n\r\n if (\r\n i == additionalDots - 1 ||\r\n i == fakeCount - additionalDots ||\r\n j == additionalDots - 1 ||\r\n j == fakeCount - additionalDots\r\n ) {\r\n if (\r\n (j == additionalDots - 1 && (i < additionalDots + 8 || i > fakeCount - additionalDots - 9)) ||\r\n (j == fakeCount - additionalDots && i < additionalDots + 8) ||\r\n (i == additionalDots - 1 && (j < additionalDots + 8 || j > fakeCount - additionalDots - 9)) ||\r\n (i == fakeCount - additionalDots && j < additionalDots + 8)\r\n )\r\n this._fakeMatrix[i][j] = undefined\r\n else this._fakeMatrix[i][j] = false\r\n continue\r\n }\r\n\r\n // Get random dots from QR code to show it outside of QR code\r\n this._fakeMatrix[i][j] = this.qr.isDark(\r\n j - 2 * additionalDots < 0 ? j : j >= count ? j - 2 * additionalDots : j - additionalDots,\r\n i - 2 * additionalDots < 0 ? i : i >= count ? i - 2 * additionalDots : i - additionalDots\r\n )\r\n }\r\n }\r\n\r\n const typeNr = (count - 17) / 4\r\n const alignment = QRUtil.getPatternPosition(typeNr)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n const iAlign = alignment.find((v) => i - additionalDots > v - 3 && i - additionalDots < v + 3)\r\n for (let j = 0; j < fakeCount; j++) {\r\n const jAlign = alignment.find((v) => j - additionalDots > v - 3 && j - additionalDots < v + 3)\r\n if (this._fakeMatrix[i][j] == undefined) continue\r\n\r\n if (this.lightDotsMask) {\r\n draw =\r\n iAlign &&\r\n jAlign &&\r\n ((iAlign != alignment[0] && jAlign != alignment[0]) ||\r\n (jAlign != alignment[0] && jAlign != alignment[alignment.length - 1]) ||\r\n (iAlign != alignment[0] && iAlign != alignment[alignment.length - 1]))\r\n ? getQrDotFigure(DotType.square)\r\n : getQrDotFigure(DotType.tinySquare)\r\n }\r\n\r\n if (!this._fakeMatrix[i][j]) {\r\n if (this.lightDotsMask) {\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(draw({\r\n x: fakeBeginning + i * dotSize,\r\n y: fakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => this._fakeMatrix![i + xOffset]?.[j + yOffset] === false,\r\n getPRandom: getRng(this._fakeMatrix, i, j, false)\r\n }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (this.dotsMask) {\r\n this.dotsMask.appendChild(draw({\r\n x: fakeBeginning + i * dotSize,\r\n y: fakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => this._fakeMatrix![i + xOffset]?.[j + yOffset] === true,\r\n getPRandom: getRng(this._fakeMatrix, i, j)\r\n }))\r\n }\r\n }\r\n }\r\n\r\n if (this.lightDotsMask) {\r\n this.createColor({\r\n options: options.imageOptions.fill.gradient,\r\n color: options.imageOptions.fill.color,\r\n additionalRotation: 0,\r\n x: fakeBeginning,\r\n y: fakeBeginning,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: 'light-dot-color'\r\n })\r\n }\r\n\r\n this.createColor({\r\n options: options.dotsOptions?.gradient,\r\n color: options.dotsOptions.color,\r\n additionalRotation: 0,\r\n x: fakeBeginning,\r\n y: fakeBeginning,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: 'dot-color'\r\n })\r\n }\r\n\r\n drawCorners(): void {\r\n if (!this.qr) {\r\n throw new Error('QR code is not defined')\r\n }\r\n\r\n const element = this._element\r\n const options = this.options\r\n\r\n if (!element) {\r\n throw new Error('Element code is not defined')\r\n }\r\n\r\n const count = this.qr.getModuleCount()\r\n const dotSize = this.options.dotsOptions.size\r\n const cornersSquareSize = dotSize * 7\r\n const cornersDotSize = dotSize * 3\r\n const beginning = Math.floor((options.size - count * dotSize) / 2);\r\n\r\n [\r\n [0, 0, 0],\r\n [1, 0, Math.PI / 2],\r\n [0, 1, -Math.PI / 2]\r\n ].forEach(([column, row, rotation]) => {\r\n const x = beginning + column * dotSize * (count - 7)\r\n const y = beginning + row * dotSize * (count - 7)\r\n let cornersSquareMask = this.dotsMask\r\n let cornersDotMask = this.dotsMask\r\n\r\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\r\n cornersSquareMask = this.createMask(`mask-corners-square-color-${column}-${row}`)\r\n this.defs.appendChild(cornersSquareMask)\r\n cornersDotMask = cornersSquareMask\r\n cornersDotMask = cornersSquareMask\r\n\r\n this.createColor({\r\n options: options.cornersSquareOptions?.gradient,\r\n color: options.cornersSquareOptions?.color,\r\n additionalRotation: rotation,\r\n x,\r\n y,\r\n height: cornersSquareSize,\r\n width: cornersSquareSize,\r\n name: `corners-square-color-${column}-${row}`\r\n })\r\n }\r\n\r\n const squareArgs: DrawArgs = {\r\n x,\r\n y,\r\n size: cornersSquareSize,\r\n document: this.options.document,\r\n rotation\r\n }\r\n const pluinCornerSquare = options.plugins?.length ? drawPluginCornerSquare(options.plugins)(squareArgs) : undefined\r\n\r\n if (pluinCornerSquare) {\r\n const [cornerElement, cornerFill] = pluinCornerSquare\r\n\r\n if (cornersSquareMask) {\r\n cornersSquareMask.appendChild(cornerElement)\r\n }\r\n\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(cornerFill)\r\n }\r\n } else if (isCornerSquareType(options.cornersSquareOptions?.type)) {\r\n const draw = getQrCornerSquareFigure(options.cornersSquareOptions.type)\r\n\r\n const [cornerElement, cornerFill] = draw(squareArgs)\r\n\r\n if (cornersSquareMask) {\r\n cornersSquareMask.appendChild(cornerElement)\r\n }\r\n\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(cornerFill)\r\n }\r\n } else {\r\n const draw = getQrDotFigure(options.cornersSquareOptions?.type || options.dotsOptions.type, options.plugins)\r\n\r\n for (let i = 0; i < squareMask.length; i++) {\r\n for (let j = 0; j < squareMask[i].length; j++) {\r\n if (!squareMask[i]?.[j]) {\r\n if (this.lightDotsMask && !dotMask[i]?.[j]) {\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean =>\r\n !squareMask[i + xOffset]?.[j + yOffset] && !dotMask[i + xOffset]?.[j + yOffset],\r\n getPRandom: getRng(this._fakeMatrix!, x / dotSize + i, y / dotSize + j, false)\r\n }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (cornersSquareMask) {\r\n cornersSquareMask.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!squareMask[i + xOffset]?.[j + yOffset],\r\n getPRandom: getRng(this._fakeMatrix!, x / dotSize + i, y / dotSize + j, false)\r\n }))\r\n }\r\n }\r\n }\r\n\r\n if (this.lightDotsMask)\r\n for (let i = -1; i < 8; i++) {\r\n for (let j = -1; j < 8; j++) {\r\n if (i == -1 || i == 7 || j == -1 || j == 7) {\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\r\n const ii = i + xOffset\r\n const jj = j + yOffset\r\n return ii >= -1 && ii <= 7 && jj >= -1 && jj <= 7 && (ii == -1 || ii == 7 || jj == -1 || jj == 7)\r\n },\r\n getPRandom: getRng(this._fakeMatrix!, x / dotSize + i, y / dotSize + j, false)\r\n }))\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\r\n cornersDotMask = this.createMask(`mask-corners-dot-color-${column}-${row}`)\r\n this.defs.appendChild(cornersDotMask)\r\n\r\n this.createColor({\r\n options: options.cornersDotOptions?.gradient,\r\n color: options.cornersDotOptions?.color,\r\n additionalRotation: rotation,\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n height: cornersDotSize,\r\n width: cornersDotSize,\r\n name: `corners-dot-color-${column}-${row}`\r\n })\r\n }\r\n\r\n const dotArgs: DrawArgs = {\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n size: cornersDotSize,\r\n document: this.document,\r\n rotation\r\n }\r\n const pluinCornerDot = options.plugins?.length ? drawPluginCornerDot(options.plugins)(dotArgs) : undefined\r\n\r\n if (pluinCornerDot) {\r\n if (cornersDotMask) {\r\n cornersDotMask.appendChild(pluinCornerDot)\r\n }\r\n } else if (isCornerDotType(options.cornersDotOptions?.type)) {\r\n const draw = getQrCornerDotFigure(options.cornersDotOptions.type)\r\n\r\n if (cornersDotMask) {\r\n cornersDotMask.appendChild(draw(dotArgs))\r\n }\r\n } else {\r\n const draw = getQrDotFigure(options.cornersDotOptions?.type || options.dotsOptions.type, options.plugins)\r\n\r\n for (let i = 0; i < dotMask.length; i++) {\r\n for (let j = 0; j < dotMask[i].length; j++) {\r\n if (!dotMask[i]?.[j]) {\r\n continue\r\n }\r\n\r\n if (cornersDotMask) {\r\n cornersDotMask.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!dotMask[i + xOffset]?.[j + yOffset],\r\n getPRandom: getRng(this._fakeMatrix!, x / dotSize + i, y / dotSize + j, false)\r\n }))\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n async drawImage({\r\n width,\r\n height,\r\n count,\r\n dotSize\r\n }: {\r\n width: number\r\n height: number\r\n count: number\r\n dotSize: number\r\n }): Promise<void> {\r\n const options = this.options\r\n const beginning = Math.floor((options.size - count * dotSize) / 2)\r\n let margin = options.imageOptions.margin * dotSize\r\n if (options.imageOptions.mode == ImageMode.background) margin = 0\r\n const dx = beginning + margin + (count * dotSize - width) / 2\r\n const dy = beginning + margin + (count * dotSize - height) / 2\r\n const dw = width - margin * 2\r\n const dh = height - margin * 2\r\n\r\n const imageUrl = await this.imageTools.toDataURL(options.image || '')\r\n let image: SVGElement = this.document.createElementNS('http://www.w3.org/2000/svg', 'image')\r\n image.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', imageUrl || '')\r\n\r\n if (imageUrl.startsWith('data:image/svg+xml;')) {\r\n let data = imageUrl.substring(19)\r\n const i = data.indexOf(',')\r\n const encoding = data.substring(0, i)\r\n data = data.substring(i + 1)\r\n\r\n switch (encoding) {\r\n case 'base64':\r\n data = typeof atob == 'function' ? atob(data) : Buffer.from(data, 'base64').toString('utf8')\r\n break\r\n default:\r\n data = ''\r\n break\r\n }\r\n\r\n if (data) {\r\n const container = new DOMParser().parseFromString(data, 'text/xml')\r\n const rootEl = Array.from(container.getElementsByTagName('svg'))\r\n if (rootEl.length) {\r\n image = rootEl[0]\r\n image.setAttribute('overflow', 'visible')\r\n }\r\n }\r\n }\r\n\r\n image.setAttribute('x', numToAttr(dx))\r\n image.setAttribute('y', numToAttr(dy))\r\n image.setAttribute('width', `${numToAttr(dw)}px`)\r\n image.setAttribute('height', `${numToAttr(dh)}px`)\r\n\r\n this._element.appendChild(image)\r\n }\r\n\r\n private createColor({\r\n options,\r\n color,\r\n additionalRotation,\r\n x,\r\n y,\r\n height,\r\n width,\r\n name\r\n }: {\r\n options?: Gradient\r\n color?: string\r\n additionalRotation: number\r\n x: number\r\n y: number\r\n height: number\r\n width: number\r\n name: string\r\n }): void {\r\n const gradientSize = width > height ? width : height\r\n\r\n x -= this.options.dotsOptions.size\r\n y -= this.options.dotsOptions.size\r\n width += 2 * this.options.dotsOptions.size\r\n height += 2 * this.options.dotsOptions.size\r\n\r\n const rect = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n rect.setAttribute('x', numToAttr(x))\r\n rect.setAttribute('y', numToAttr(y))\r\n rect.setAttribute('height', numToAttr(height))\r\n rect.setAttribute('width', numToAttr(width))\r\n rect.setAttribute('clip-path', `url(#mask-${name})`)\r\n\r\n if (options) {\r\n let gradient: SVGElement\r\n if (options.type === GradientType.radial) {\r\n gradient = this.document.createElementNS('http://www.w3.org/2000/svg', 'radialGradient')\r\n gradient.setAttribute('id', name)\r\n gradient.setAttribute('gradientUnits', 'userSpaceOnUse')\r\n gradient.setAttribute('fx', numToAttr(x + width / 2))\r\n gradient.setAttribute('fy', numToAttr(y + height / 2))\r\n gradient.setAttribute('cx', numToAttr(x + width / 2))\r\n gradient.setAttribute('cy', numToAttr(y + height / 2))\r\n gradient.setAttribute('r', numToAttr(gradientSize / 2))\r\n } else {\r\n const rotation = ((options.rotation || 0) + additionalRotation) % (2 * Math.PI)\r\n const positiveRotation = (rotation + 2 * Math.PI) % (2 * Math.PI)\r\n let x0 = x + width / 2\r\n let y0 = y + height / 2\r\n let x1 = x + width / 2\r\n let y1 = y + height / 2\r\n\r\n if (\r\n (positiveRotation >= 0 && positiveRotation <= 0.25 * Math.PI) ||\r\n (positiveRotation > 1.75 * Math.PI && positiveRotation <= 2 * Math.PI)\r\n ) {\r\n x0 = x0 - width / 2\r\n y0 = y0 - (height / 2) * Math.tan(rotation)\r\n x1 = x1 + width / 2\r\n y1 = y1 + (height / 2) * Math.tan(rotation)\r\n } else if (positiveRotation > 0.25 * Math.PI && positiveRotation <= 0.75 * Math.PI) {\r\n y0 = y0 - height / 2\r\n x0 = x0 - width / 2 / Math.tan(rotation)\r\n y1 = y1 + height / 2\r\n x1 = x1 + width / 2 / Math.tan(rotation)\r\n } else if (positiveRotation > 0.75 * Math.PI && positiveRotation <= 1.25 * Math.PI) {\r\n x0 = x0 + width / 2\r\n y0 = y0 + (height / 2) * Math.tan(rotation)\r\n x1 = x1 - width / 2\r\n y1 = y1 - (height / 2) * Math.tan(rotation)\r\n } else if (positiveRotation > 1.25 * Math.PI && positiveRotation <= 1.75 * Math.PI) {\r\n y0 = y0 + height / 2\r\n x0 = x0 + width / 2 / Math.tan(rotation)\r\n y1 = y1 - height / 2\r\n x1 = x1 - width / 2 / Math.tan(rotation)\r\n }\r\n\r\n gradient = this.document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient')\r\n gradient.setAttribute('id', name)\r\n gradient.setAttribute('gradientUnits', 'userSpaceOnUse')\r\n gradient.setAttribute('x1', numToAttr(x0))\r\n gradient.setAttribute('y1', numToAttr(y0))\r\n gradient.setAttribute('x2', numToAttr(x1))\r\n gradient.setAttribute('y2', numToAttr(y1))\r\n }\r\n\r\n options.colorStops.forEach((stopCfg: { offset: number, color: string }) => {\r\n const stop = this.document.createElementNS('http://www.w3.org/2000/svg', 'stop')\r\n stop.setAttribute('offset', `${numToAttr(100 * stopCfg.offset)}%`)\r\n\r\n const parsed = parseColor(stopCfg.color)\r\n stop.setAttribute('stop-color', parsed.value)\r\n if (parsed.alpha < 1) stop.setAttribute('stop-opacity', parsed.alpha.toFixed(7))\r\n gradient.appendChild(stop)\r\n })\r\n\r\n rect.setAttribute('fill', `url(#${name})`)\r\n this.defs.appendChild(gradient)\r\n } else if (color) {\r\n const parsed = parseColor(color)\r\n rect.setAttribute('fill', parsed.value)\r\n if (parsed.alpha < 1) rect.setAttribute('opacity', parsed.alpha.toFixed(7))\r\n }\r\n\r\n this._element.appendChild(rect)\r\n }\r\n\r\n private createMask(id: string) {\r\n const mask = this.document.createElementNS('http://www.w3.org/2000/svg', 'clipPath')\r\n mask.setAttribute('id', id)\r\n mask.setAttribute('clipPathUnits', 'userSpaceOnUse')\r\n\r\n return mask\r\n }\r\n}\r\n","interface ImageSizeOptions {\r\n originalHeight: number\r\n originalWidth: number\r\n maxHiddenDots: number\r\n maxHiddenAxisDots?: number\r\n dotSize: number\r\n margin: number\r\n}\r\n\r\ninterface ImageSizeResult {\r\n height: number\r\n width: number\r\n hideYDots: number\r\n hideXDots: number\r\n}\r\n\r\nexport function calculateImageSize({\r\n originalHeight,\r\n originalWidth,\r\n maxHiddenDots,\r\n maxHiddenAxisDots,\r\n dotSize,\r\n margin\r\n}: ImageSizeOptions): ImageSizeResult {\r\n const hideDots = { x: 0, y: 0 }\r\n const imageSize = { x: 0, y: 0 }\r\n\r\n if (\r\n originalHeight <= 0 ||\r\n originalWidth <= 0 ||\r\n maxHiddenDots <= 0 ||\r\n dotSize <= 0 ||\r\n 4 * margin ** 2 > maxHiddenDots\r\n ) {\r\n return {\r\n height: 0,\r\n width: 0,\r\n hideYDots: 0,\r\n hideXDots: 0\r\n }\r\n }\r\n\r\n //If set, ensure maxHiddenAxisDots is odd and at least 1\r\n if (maxHiddenAxisDots && maxHiddenAxisDots % 2 == 0) maxHiddenAxisDots = Math.max(1, maxHiddenAxisDots - 1)\r\n\r\n //Determine the bigger and smaller image dimension\r\n const dimMax = Math.max(originalWidth, originalHeight)\r\n const dimMin = Math.min(originalWidth, originalHeight)\r\n\r\n //Find max image size along the bigger dimension\r\n let lower = 0\r\n let upper = (maxHiddenAxisDots || maxHiddenDots) - 2 * margin\r\n do {\r\n const newSize = lower + (upper - lower) / 2\r\n let dotsMax = Math.max(1, Math.ceil(newSize + 2 * margin))\r\n if (dotsMax % 2 == 0) dotsMax++\r\n let dotsMin = Math.max(1, Math.ceil((newSize * dimMin) / dimMax + 2 * margin))\r\n if (dotsMin % 2 == 0) dotsMin++\r\n\r\n if (dotsMax * dotsMin > maxHiddenDots) upper = newSize\r\n else lower = newSize\r\n } while (Math.abs(lower - upper) > 0.001)\r\n\r\n //Calculate how many dots the given size corresponds to\r\n const size = lower\r\n let hideMax = Math.max(1, Math.ceil(size + 2 * margin))\r\n if (hideMax % 2 == 0) hideMax++\r\n let hideMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin))\r\n if (hideMin % 2 == 0) hideMin++\r\n\r\n //Set hidden dots along bigger and smaller dimension to the right axis\r\n if (originalWidth > originalHeight) {\r\n hideDots.x = hideMax\r\n hideDots.y = hideMin\r\n } else {\r\n hideDots.x = hideMin\r\n hideDots.y = hideMax\r\n }\r\n\r\n //Fit image to the hidden dots\r\n const maxW = (hideDots.x - 2 * margin) * dotSize\r\n const maxH = (hideDots.y - 2 * margin) * dotSize\r\n imageSize.x = maxW\r\n imageSize.y = (maxW * originalHeight) / originalWidth\r\n if (imageSize.y > maxH) {\r\n imageSize.y = maxH\r\n imageSize.x = (maxH * originalWidth) / originalHeight\r\n }\r\n\r\n return {\r\n height: Math.round(imageSize.y + 2 * margin * dotSize),\r\n width: Math.round(imageSize.x + 2 * margin * dotSize),\r\n hideYDots: hideDots.y,\r\n hideXDots: hideDots.x\r\n }\r\n}\r\n","import { QRCodeMinimal } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\nimport { stringToBytes_UTF8 } from '@liquid-js/qrcode-generator/lib/text/stringToBytes_UTF8.js'\nimport { RecursivePartial } from '../types/helper.js'\nimport { mergeDeep } from '../utils/merge.js'\nimport { ImageMode, Options, ShapeType, defaultOptions, sanitizeOptions } from '../utils/options.js'\nimport { ErrorCorrectionPercents, getMode } from '../utils/qrcode.js'\nimport { QRSVG } from './qr-svg.js'\n\nObject.assign(QRCodeMinimal.stringToBytesFuncs, stringToBytes_UTF8)\n\nexport type ExtensionFunction = (svg: SVGSVGElement, options: Options) => void\n\nexport class QRCodeStyling {\n private options: Options\n private container?: HTMLElement\n private qr?: QRCodeMinimal\n private extension?: ExtensionFunction\n private svgDrawingPromise?: Promise<void>\n private qrSVG?: QRSVG\n\n get size() {\n if (this.qrSVG)\n return {\n width: this.qrSVG.width,\n height: this.qrSVG.height\n }\n return undefined\n }\n\n constructor(options?: RecursivePartial<Options>) {\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions\n this.update()\n }\n\n update(\n /** The same options as for initialization */\n options?: RecursivePartial<Options>\n ): void {\n if (this.container) this.container.innerHTML = ''\n\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options\n\n if (!this.options.data) {\n return\n }\n\n if (this.options.stringToBytesFuncs) {\n Object.assign(QRCodeMinimal.stringToBytesFuncs, this.options.stringToBytesFuncs)\n delete this.options.stringToBytesFuncs\n }\n\n this.qr = new QRCodeMinimal(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel)\n const mode = this.options.qrOptions.mode || getMode(this.options.data)\n this.qr.addData(this.options.data, mode)\n this.qr.make()\n\n this.setupSvg()\n\n this.append(this.container)\n }\n\n append(\n /** This container will be used for appending of the QR code */\n container?: HTMLElement\n ): void {\n if (!container) {\n return\n }\n\n if (this.qrSVG?.element) {\n container.appendChild(this.qrSVG.element)\n }\n\n this.container = container\n }\n\n /**\n * @deprecated Use options.plugins with a postProcess hook\n * @example\n *\n * ```js\n * const extension = (svg, options) => {\n * const { width, height } = options;\n * const size = Math.min(width, height);\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n * const borderAttributes = {\n * fill: \"none\",\n * x: (width - size + 40) / 2,\n * y: (height - size + 40) / 2,\n * width: size - 40,\n * height: size - 40,\n * stroke: \"black\",\n * \"stroke-width\": 40,\n * rx: 100\n * };\n * Object.keys(borderAttributes).forEach((attribute) => {\n * border.setAttribute(attribute, borderAttributes[attribute]);\n * });\n * svg.appendChild(border);\n * };\n * ```\n */\n applyExtension(\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\n extension: ExtensionFunction\n ): void {\n if (!extension) {\n throw new Error('Extension function should be defined.')\n }\n\n this.extension = extension\n this.update()\n }\n\n /**\n * @deprecated Use options.plugins with a postProcess hook\n */\n deleteExtension(): void {\n this.extension = undefined\n this.update()\n }\n\n async serialize(): Promise<string | undefined> {\n if (!this.qr) throw new Error('QR code is empty')\n\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\n this.setupSvg()\n }\n await this.svgDrawingPromise\n\n if (!this.qrSVG?.element) {\n return\n }\n\n const serializer = new XMLSerializer()\n let source = serializer.serializeToString(this.qrSVG.element)\n\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source\n return source\n }\n\n private setupSvg(): void {\n if (!this.qr) {\n return\n }\n let moduleCount = this.qr.getModuleCount()\n if (this.options.imageOptions.mode == ImageMode.background && this.options.shape != ShapeType.circle)\n moduleCount += 2\n let count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * moduleCount)\n if (count % 2 == 0) count -= 1\n let margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\n if (this.options.imageOptions.mode == ImageMode.background) margin += this.options.imageOptions.margin || 0\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin))\n this.qrSVG = new QRSVG({\n ...this.options,\n width: size,\n height: size,\n size,\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\n })\n\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\n if (!this.qrSVG?.element) return\n this.options.plugins?.forEach(plugin => plugin.postProcess?.(this.qrSVG!.element!, {\n ...this.options,\n width: size,\n height: size,\n size\n }))\n this.extension?.(this.qrSVG.element, {\n ...this.options,\n width: size,\n height: size,\n size\n })\n })\n }\n}\n","/**\r\n * @license -------------------------------------------------------------------\r\n * module: Lanczos Resampling\r\n * src: http://blog.yoz.sk/2010/11/lanczos-resampling-with-actionscript/\r\n * authors: Jozef Chutka\r\n * copyright: (c) 2009-2010 Jozef Chutka\r\n * license: MIT\r\n * -------------------------------------------------------------------\r\n * Permission is hereby granted, free of charge, to any person\r\n * obtaining a copy of this software and associated documentation\r\n * files (the \"Software\"), to deal in the Software without\r\n * restriction, including without limitation the rights to use,\r\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the\r\n * Software is furnished to do so, subject to the following\r\n * conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be\r\n * included in all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\n * OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\nexport type Kernel = (size: number, x: number) => number\r\n\r\nexport enum KernelType {\r\n Lanczos = 'lanczos',\r\n Linear = 'linear'\r\n}\r\n\r\nconst CACHE_PRECISION = 1000\r\n\r\nexport const Kernels: { [P in KernelType]: Kernel } = {\r\n [KernelType.Lanczos]: (size, x) => {\r\n if (x >= size || x <= -size) return 0\r\n if (x === 0) return 1\r\n const xpi = x * Math.PI\r\n return size * Math.sin(xpi) * Math.sin(xpi / size) / (xpi * xpi)\r\n },\r\n [KernelType.Linear]: (size, x) => {\r\n x = Math.abs(x)\r\n if (x <= 1) return (1 - x) * size\r\n return 0\r\n }\r\n}\r\n\r\nfunction createCache(kernel: Kernel, cachePrecision: number, filterSize: number) {\r\n const cache: { [key: number]: number } = {}\r\n const max = filterSize * filterSize * cachePrecision\r\n const iPrecision = 1.0 / cachePrecision\r\n for (let cacheKey = 0; cacheKey < max; cacheKey++) {\r\n const value = kernel(filterSize, Math.sqrt(cacheKey * iPrecision))\r\n cache[cacheKey] = value < 0 ? 0 : value\r\n }\r\n return cache\r\n}\r\n\r\nfunction baseLength(val: number | SVGAnimatedLength) {\r\n if (typeof val == 'object') {\r\n val.baseVal.convertToSpecifiedUnits(val.baseVal.SVG_LENGTHTYPE_PX)\r\n return val.baseVal.value\r\n }\r\n return val\r\n}\r\n\r\nexport function lanczosResize(canvas: HTMLCanvasElement | OffscreenCanvas, opt: {\r\n width: number\r\n height: number\r\n}, kernel = Kernels[KernelType.Lanczos]): ImageData {\r\n const cwidth = baseLength((canvas as any).width)\r\n const cheight = baseLength((canvas as any).height)\r\n const ctx = canvas.getContext('2d')!\r\n\r\n const { width, height } = opt\r\n\r\n const src = ctx.getImageData(0, 0, cwidth, cheight)\r\n let dst = ctx.createImageData(width, height)\r\n\r\n // No need to resize\r\n if (src.data.length == dst.data.length) {\r\n dst = src\r\n } else {\r\n const sdata = src.data\r\n const ddata = dst.data\r\n\r\n const values = []\r\n const sX = width / cwidth\r\n const sY = height / cheight\r\n\r\n let filterSize = 3\r\n if (sX > 0.01 && sY > 0.01 && sX < 1 && sY < 1) {\r\n if (sX <= 0.2 || sY <= 0.2) {\r\n filterSize = 2\r\n } else if (sX <= 0.05 || sY <= 0.05) {\r\n filterSize = 1\r\n } else {\r\n filterSize = 3\r\n }\r\n }\r\n const sw1 = cwidth - 1\r\n const sh1 = cheight - 1\r\n const isx = 1.0 / sX\r\n const isy = 1.0 / sX\r\n const cw = 1.0 / width\r\n const ch = 1.0 / height\r\n const csx = Math.min(1, sX) * Math.min(1, sX)\r\n const csy = Math.min(1, sX) * Math.min(1, sX)\r\n const cachePrecision = CACHE_PRECISION\r\n // filterSize = filterSize || FILTER_SIZE\r\n const cache = createCache(kernel, cachePrecision, filterSize)\r\n let y = height\r\n\r\n while (y--) {\r\n const sourcePixelY = (y + 0.5) * isy\r\n let y1b = sourcePixelY - filterSize\r\n if (y1b < 0) y1b = 0\r\n let y1e = sourcePixelY + filterSize\r\n const y1et = y1e\r\n if (y1e != y1et) y1e = y1et + 1\r\n if (y1e > sh1) y1e = sh1\r\n const cy = y * ch - sourcePixelY\r\n const y3 = y * width\r\n let x = width\r\n while (x--) {\r\n const sourcePixelX = (x + 0.5) * isx\r\n let x1b = sourcePixelX - filterSize\r\n if (x1b < 0) x1b = 0\r\n let x1e = sourcePixelX + filterSize\r\n const x1et = x1e\r\n if (x1e != x1et) x1e = x1et + 1\r\n if (x1e > sw1) x1e = sw1\r\n const cx = x * cw - sourcePixelX\r\n let i = 0\r\n let total = 0\r\n for (let y1 = y1b >> 0; y1 <= y1e; y1++) {\r\n const distanceY = (y1 + cy) * (y1 + cy) * csy\r\n for (let x1 = x1b >> 0; x1 <= x1e; x1++) {\r\n total += values[i++] = cache[((x1 + cx) * (x1 + cx) * csx + distanceY) * cachePrecision >> 0] || 0\r\n }\r\n }\r\n total = 1.0 / total\r\n i = 0\r\n let a = 0\r\n let r = 0\r\n let g = 0\r\n let b = 0\r\n for (let y1 = y1b >> 0; y1 <= y1e; y1++) {\r\n const y2 = y1 * cwidth\r\n for (let x1 = x1b >> 0; x1 <= x1e; x1++) {\r\n const value = values[i++] * total\r\n const idxi = ((y2 + x1) >> 0) * 4\r\n r += sdata[idxi] * value\r\n g += sdata[idxi + 1] * value\r\n b += sdata[idxi + 2] * value\r\n a += sdata[idxi + 3] * value\r\n }\r\n }\r\n const idx = ((x + y3) >> 0) * 4\r\n ddata[idx] = r\r\n ddata[idx + 1] = g\r\n ddata[idx + 2] = b\r\n ddata[idx + 3] = a\r\n }\r\n }\r\n }\r\n\r\n return dst\r\n}\r\n","import { QRCodeStyling } from '../core/qr-code-styling.js'\r\nimport { RecursivePartial } from '../types/helper.js'\r\nimport { CanvasOptions, defaultCanvasOptions, sanitizeCanvasOptions } from '../utils/canvas-options.js'\r\nimport { mergeDeep } from '../utils/merge.js'\r\nimport { lanczosResize } from './resize.js'\r\n\r\nexport enum FileExtension {\r\n svg = 'svg',\r\n png = 'png',\r\n jpeg = 'jpeg',\r\n webp = 'webp'\r\n}\r\n\r\nexport function drawToCanvas(\r\n qrCode: QRCodeStyling,\r\n options?: RecursivePartial<CanvasOptions>\r\n): { canvas: HTMLCanvasElement, canvasDrawingPromise: Promise<void> | undefined } | undefined {\r\n const { width, height, margin } = options\r\n ? sanitizeCanvasOptions(mergeDeep(defaultCanvasOptions, options) as CanvasOptions)\r\n : defaultCanvasOptions\r\n\r\n const canvas = document.createElement('canvas')\r\n canvas.width = width\r\n canvas.height = height\r\n\r\n const size = Math.min(width, height) - 2 * margin\r\n\r\n const canvasDrawingPromise = qrCode.serialize().then((xml) => {\r\n if (!xml) return\r\n const viewBox = xml.match(/viewBox=\"([^\"]+)\"/i)![1]\r\n const svg64 = btoa(xml)\r\n const image64 = 'data:image/svg+xml;base64,' + svg64\r\n const image = new Image()\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n image.onload = (): void => {\r\n // Ensure pixel-perfect rendering of SVG to avoid artefact, then downscale to requested size\r\n const aaFactor = Math.ceil((2 * size) / Math.min(image.width, image.height))\r\n const [x, y, w, h] = viewBox.split(/\\s+/g).map(parseFloat).map(v => v * aaFactor)\r\n const dx = ((x % 1) + 1) % 1\r\n const dy = ((y % 1) + 1) % 1\r\n let aaCanvas: HTMLCanvasElement | OffscreenCanvas\r\n try {\r\n aaCanvas = new OffscreenCanvas(Math.ceil(w + dx + 2), Math.ceil(h + dy + 2))\r\n } catch (_) {\r\n // Fallback to regular canvas element\r\n aaCanvas = document.createElement('canvas')\r\n aaCanvas.width = Math.ceil(w + dx + 2)\r\n aaCanvas.height = Math.ceil(h + dy + 2)\r\n }\r\n aaCanvas.getContext('2d')?.drawImage(image, dx + 1, dy + 1, w, h)\r\n const imgData = lanczosResize(aaCanvas, {\r\n width: width - 2 * margin,\r\n height: height - 2 * margin\r\n })\r\n\r\n canvas?.getContext('2d')?.putImageData(imgData, margin, margin)\r\n resolve()\r\n }\r\n image.onerror = image.onabort = reject\r\n\r\n image.src = image64\r\n })\r\n })\r\n\r\n return { canvas, canvasDrawingPromise }\r\n}\r\n\r\nexport async function download(\r\n qrCode: QRCodeStyling,\r\n downloadOptions?: { name?: string, extension: `${FileExtension}` },\r\n options?: RecursivePartial<CanvasOptions>\r\n): Promise<void> {\r\n let extension: `${FileExtension}` = FileExtension.png\r\n let name = 'qr'\r\n\r\n if (downloadOptions) {\r\n if (downloadOptions.name) {\r\n name = downloadOptions.name\r\n }\r\n if (downloadOptions.extension) {\r\n extension = downloadOptions.extension\r\n }\r\n }\r\n\r\n if (extension.toLowerCase() === 'svg') {\r\n const source = await qrCode.serialize()\r\n if (!source) return\r\n const url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(source)\r\n downloadURI(url, `${name}.svg`)\r\n } else {\r\n const res = drawToCanvas(qrCode, options)\r\n if (!res) return\r\n const { canvas, canvasDrawingPromise } = res\r\n await canvasDrawingPromise\r\n const url = canvas.toDataURL(`image/${extension}`)\r\n downloadURI(url, `${name}.${extension}`)\r\n }\r\n}\r\n\r\nexport function downloadURI(uri: string, name: string): void {\r\n const link = document.createElement('a')\r\n link.download = name\r\n link.href = uri\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n}\r\n","import { DOMImplementation, DOMParser, XMLSerializer } from '@xmldom/xmldom'\r\nimport { fileTypeFromBuffer } from 'file-type'\r\nimport sharp from 'sharp'\r\nimport { QRCodeStyling as _QRCodeStyling } from './core/qr-code-styling.js'\r\nimport type * as _browserUtils from './tools/browser-utils.js'\r\nimport { RecursivePartial } from './types/helper.js'\r\nimport { Options } from './utils/options.js'\r\nexport { ErrorCorrectionLevel, Mode, TypeNumber } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nexport { type ExtensionFunction } from './core/qr-code-styling.js'\r\nexport { FileExtension } from './tools/browser-utils.js'\r\nexport { type RecursivePartial } from './types/helper.js'\r\nexport { type CanvasOptions } from './utils/canvas-options.js'\r\nexport { GradientType, type Gradient } from './utils/gradient.js'\r\nexport { CornerDotType, CornerSquareType, DotType, ImageMode, ShapeType, type Options, type Plugin } from './utils/options.js'\r\nexport { ErrorCorrectionPercents } from './utils/qrcode.js'\r\n\r\nexport const browserUtils: typeof _browserUtils | undefined = undefined\r\n\r\nexport class QRCodeStyling extends _QRCodeStyling {\r\n constructor(options: RecursivePartial<Options>) {\r\n const dom = new DOMImplementation().createDocument(null, '')\r\n const imageCache = new Map<string, Promise<{ contentType?: string | null, data: Buffer }>>()\r\n\r\n const loadImage = async (url: string | Buffer | Blob) => {\r\n if (typeof url == 'string') {\r\n let pr = imageCache.get(url)\r\n if (pr) return pr\r\n pr = fetch(url).then((res) =>\r\n res\r\n .arrayBuffer()\r\n .then((buff) => Buffer.from(buff))\r\n .then(async (data) => ({\r\n contentType: res.headers.get('Content-Type') || (await fileTypeFromBuffer(data).then((r) => r?.mime)),\r\n data\r\n }))\r\n )\r\n imageCache.set(url, pr)\r\n return pr\r\n } else {\r\n const buff = Buffer.from(url as Buffer)\r\n const mime = await fileTypeFromBuffer(buff).then((r) => r?.mime)\r\n return {\r\n contentType: mime,\r\n data: buff\r\n }\r\n }\r\n }\r\n\r\n global.XMLSerializer = XMLSerializer as any\r\n\r\n global.DOMParser = DOMParser as any\r\n\r\n super({\r\n ...options,\r\n\r\n document: options.document || (dom as any),\r\n imageTools: options.imageTools || {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\r\n if (typeof url == 'string' && url.startsWith('data:')) return Promise.resolve(url)\r\n return loadImage(url).then(\r\n ({ contentType, data }) =>\r\n `data:${contentType?.replace('application/xml', 'image/svg+xml')};base64,${data.toString('base64')}`\r\n )\r\n },\r\n getSize: async (src: string | Blob | Buffer): Promise<{ width: number, height: number }> => {\r\n const { data } = Buffer.isBuffer(options.image) ? { data: options.image } : await loadImage(src)\r\n const meta = await sharp(data).metadata()\r\n return {\r\n width: meta.width!,\r\n\r\n height: meta.height!\r\n }\r\n }\r\n }\r\n })\r\n }\r\n}\r\n"],"names":["isObject","obj","isArray","target","sources","length","shift","undefined","source","Object","keys","forEach","key","Array","targetValue","sourceValue","mergeDeep","GradientType","DotType","CornerDotType","CornerSquareType","ShapeType","ImageMode","sanitizeGradient","gradient","newGradient","colorStops","Error","rotation","Number","map","colorStop","offset","defaultOptions","document","shape","square","width","height","size","data","qrOptions","typeNumber","TypeNumber","mode","errorCorrectionLevel","ErrorCorrectionLevel","Q","imageOptions","center","imageSize","crossOrigin","margin","fill","color","dotsOptions","type","sanitizeOptions","options","newOptions","Math","min","overlay","round","max","cornersSquareOptions","cornersDotOptions","backgroundOptions","ErrorCorrectionPercents","L","M","H","rx","numToAttr","value","toFixed","replace","strings","values","reduce","t","v","i","p","trim","rotateFigure","draw","args","x","y","element","el","setAttribute","PI","cx","cy","DotElements","dot","createElementNS","sideRounded","svgPath","cornerRounded","cornerExtraRounded","classyDot","wave","a1","a2","c23x","sin","c23y","cos","c31x","c31y","heart","scalePath","path","move","toUpperCase","join","rounded","classy","dotSize","inpoint","star","spikes","outerRadius","innerRadius","angle","_","radius","weave","thickness","notch","blob","corners","parts","l","bl","push","br","tr","tl","qrCornerDotFigures","extraRounded","outpoint","pentagon","hexagon","diamond","args2","SquareElements","centerCircle","circleRadius","qrCornerSquareFigures","roundedCorners","getNeighbor","corner","end","leftNeighbor","rightNeighbor","topNeighbor","bottomNeighbor","neighborsCount","stripe","endpoint","qrDotFigures","randomDot","getPRandom","rnd","random","randomFactor","verticalLine","stripes","horizontalLine","classyRounded","smallSquare","tinySquare","zebraVertical","zebraHorizontal","blocksVertical","_args","_params","blocksHorizontal","blobs","r","b","getQrDotFigure","plugins","defaultDraw","drawPluginDot","plugin","drawDot","drawPlugin","browserImageTools","toDataURL","url","startsWith","Promise","resolve","reject","xhr","XMLHttpRequest","onload","reader","FileReader","onloadend","result","readAsDataURL","response","onerror","onabort","ontimeout","open","responseType","send","getSize","src","image","Image","then","catch","parseColor","cstr","m","alpha","toLowerCase","base","slice","parseInt","exec","dims","split","parseFloat","pop","toString","padStart","getRng","matrix","j","match","seed","ix","xOffset","yOffset","imul","squareMask","cornerSquareTypes","Set","dotMask","cornerDotTypes","QRSVG","_element","_fakeMatrix","this","defs","backgroundMask","dotsMask","lightDotsMask","qr","imageTools","constructor","appendChild","drawQR","getModuleCount","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","background","maxSize","alignment","QRUtil","getPatternPosition","maxHiddenDots","floor","coverLevel","calculateImageSize","originalHeight","originalWidth","maxHiddenAxisDots","hideDots","dimMax","dimMin","lower","upper","newSize","dotsMax","ceil","dotsMin","abs","hideMax","hideMin","maxW","maxH","drawBackground","drawImage","drawDots","drawCorners","createColor","gradientOptions","additionalRotation","name","createMask","filter","additionalDots","fakeCount","circle","beginning","ii","jj","isDark","sqrt","typeNr","iAlign","find","jAlign","fakeBeginning","colorCount","cornersSquareSize","cornersDotSize","column","row","cornersSquareMask","cornersDotMask","squareArgs","drawCornerSquare","drawPluginCornerSquare","val","pluinCornerSquare","cornerFill","cornerElement","has","dotArgs","drawPluginCornerDot","drawCornerDot","pluinCornerDot","isCornerDotType","getQrCornerDotFigure","dx","dy","imageUrl","setAttributeNS","substring","indexOf","encoding","atob","Buffer","from","container","parseFromString","DOMParser","rootEl","getElementsByTagName","dw","dh","gradientSize","rect","radial","x0","y0","x1","y1","positiveRotation","tan","stopCfg","stop","parsed","id","mask","assign","QRCodeMinimal","stringToBytesFuncs","stringToBytes_UTF8","extension","svgDrawingPromise","qrSVG","update","innerHTML","getMode","test","Mode","numeric","alphanumeric","unicode","byte","addData","make","setupSvg","append","applyExtension","deleteExtension","serialize","XMLSerializer","serializeToString","moduleCount","postProcess","KernelType","FileExtension","browserUtils","Lanczos","Linear","QRCodeStyling","_QRCodeStyling","dom","createDocument","DOMImplementation","imageCache","Map","loadImage","pr","get","fetch","res","arrayBuffer","buff","async","contentType","headers","fileTypeFromBuffer","mime","set","global","super","isBuffer","meta","sharp","metadata"],"mappings":"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"}
1
+ {"version":3,"file":"qr-code-styling-node.js","sources":["../src/utils/merge.ts","../src/utils/gradient.ts","../src/utils/options.ts","../src/utils/qrcode.ts","../src/utils/svg.ts","../src/figures/dot-elements.ts","../src/figures/corner-dot.ts","../src/figures/square-elements.ts","../src/figures/corner-square.ts","../src/figures/dot-composition.ts","../src/figures/dot.ts","../src/tools/browser-image-tools.ts","../src/utils/color.ts","../src/utils/random.ts","../src/core/qr-svg.ts","../src/utils/image.ts","../src/core/qr-code-styling.ts","../src/tools/resize.ts","../src/tools/browser-utils.ts","../src/node.ts"],"sourcesContent":["const isObject = (obj: Record<string, unknown> | undefined): boolean =>\r\n !!obj && typeof obj === 'object' && !Array.isArray(obj)\r\n\r\nexport type UnknownObject = {\r\n [key: string]: any\r\n} | undefined\r\n\r\nexport function mergeDeep(target: UnknownObject, ...sources: UnknownObject[]): UnknownObject {\r\n if (!sources.length) return target\r\n const source = sources.shift()\r\n if (source === undefined || !isObject(target) || !isObject(source)) return target\r\n target = { ...target }\r\n Object.keys(source).forEach((key: string): void => {\r\n const targetValue = target[key]\r\n const sourceValue = source[key]\r\n\r\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\r\n target[key] = sourceValue\r\n } else if (isObject(targetValue) && isObject(sourceValue)) {\r\n target[key] = mergeDeep({ ...targetValue }, sourceValue)\r\n } else {\r\n target[key] = sourceValue\r\n }\r\n })\r\n\r\n return mergeDeep(target, ...sources)\r\n}\r\n","export enum GradientType {\r\n radial = 'radial',\r\n linear = 'linear'\r\n}\r\n\r\nexport interface Gradient {\r\n /**\r\n * Type of gradient spread\r\n *\r\n * @default GradientType.linear\r\n */\r\n type: `${GradientType}`\r\n /**\r\n * Rotation of gradient (in radians, Math.PI === 180 degrees)\r\n *\r\n * @default 0\r\n */\r\n rotation?: number\r\n /** Gradient colors. */\r\n colorStops: Array<{\r\n /** Position of color in gradient range */\r\n offset: number\r\n /** Color of stop in gradient range */\r\n color: string\r\n }>\r\n}\r\n\r\nexport function sanitizeGradient(gradient: Gradient): Gradient {\r\n const newGradient = { ...gradient }\r\n\r\n if (!newGradient.colorStops || !newGradient.colorStops.length) {\r\n throw new Error(\"Field 'colorStops' is required in gradient\")\r\n }\r\n\r\n if (newGradient.rotation) {\r\n newGradient.rotation = Number(newGradient.rotation)\r\n } else {\r\n newGradient.rotation = 0\r\n }\r\n\r\n newGradient.colorStops = newGradient.colorStops.map((colorStop: { offset: number, color: string }) => ({\r\n ...colorStop,\r\n offset: Number(colorStop.offset)\r\n }))\r\n\r\n return newGradient\r\n}\r\n","import { ErrorCorrectionLevel, Mode, TypeNumber } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { browserImageTools } from '../tools/browser-image-tools.js'\r\nimport { DrawArgs } from '../types/helper.js'\r\nimport { Gradient, sanitizeGradient } from './gradient.js'\r\n\r\nexport enum DotType {\r\n dot = 'dot',\r\n randomDot = 'random-dot',\r\n rounded = 'rounded',\r\n extraRounded = 'extra-rounded',\r\n verticalLine = 'vertical-line',\r\n horizontalLine = 'horizontal-line',\r\n classy = 'classy',\r\n classyRounded = 'classy-rounded',\r\n square = 'square',\r\n smallSquare = 'small-square',\r\n tinySquare = 'tiny-square',\r\n diamond = 'diamond',\r\n wave = 'wave',\r\n heart = 'heart',\r\n star = 'star',\r\n weave = 'weave',\r\n pentagon = 'pentagon',\r\n hexagon = 'hexagon',\r\n zebraHorizontal = 'zebra-horizontal',\r\n zebraVertical = 'zebra-vertical',\r\n blocksHorizontal = 'blocks-horizontal',\r\n blocksVertical = 'blocks-vertical',\r\n blobs = 'blobs',\r\n soft = 'soft'\r\n}\r\n\r\nexport enum CornerDotType {\r\n dot = 'dot',\r\n square = 'square',\r\n heart = 'heart',\r\n extraRounded = 'extra-rounded',\r\n classy = 'classy',\r\n inpoint = 'inpoint',\r\n outpoint = 'outpoint',\r\n star = 'star',\r\n pentagon = 'pentagon',\r\n hexagon = 'hexagon',\r\n diamond = 'diamond'\r\n}\r\n\r\nexport enum CornerSquareType {\r\n dot = 'dot',\r\n square = 'square',\r\n extraRounded = 'extra-rounded',\r\n classy = 'classy',\r\n inpoint = 'inpoint',\r\n outpoint = 'outpoint',\r\n centerCircle = 'center-circle'\r\n}\r\n\r\nexport enum ShapeType {\r\n square = 'square',\r\n circle = 'circle'\r\n}\r\n\r\nexport enum ImageMode {\r\n /**\r\n * Place image in the center of the code\r\n */\r\n center = 'center',\r\n /**\r\n * Place image over the center of the code\r\n */\r\n overlay = 'overlay',\r\n /**\r\n * Use image as background, draw dots over it\r\n */\r\n background = 'background'\r\n}\r\n\r\nexport interface Plugin {\r\n /**\r\n * Draw a single dot\r\n *\r\n * @returns Dot element; if undefined, try to use the next plugin or the default function\r\n */\r\n drawDot?: (args: DrawArgs) => SVGElement | undefined | void\r\n /**\r\n * Draw corner dot\r\n *\r\n * @returns Corner dot element; if undefined, try to use the next plugin or the default function\r\n */\r\n drawCornerDot?: (args: DrawArgs) => SVGElement | undefined | void\r\n /**\r\n * Draw corner square\r\n *\r\n * @returns Corner square element and corner mask (used with ImageMode.background); if undefined, try to use the next plugin or the default function\r\n */\r\n drawCornerSquare?: (args: DrawArgs) => readonly [SVGElement, SVGElement] | undefined | void\r\n /**\r\n * Alter the generated SVG, e.g. add borders\r\n */\r\n postProcess?: (svg: SVGSVGElement, options: Options) => void\r\n}\r\n\r\nexport interface Options {\r\n /** Use a custom DOM domplementation */\r\n document: Document\r\n /** Use a custom image fetching & serializaton implementation */\r\n imageTools?: typeof browserImageTools\r\n /**\r\n * @ignore\r\n * @deprecated kept for compatibility with older extensions, use options.size\r\n */\r\n width: number\r\n /**\r\n * @ignore\r\n * @deprecated kept for compatibility with older extensions, use options.size\r\n */\r\n height: number\r\n /** @ignore */\r\n size: number\r\n /** The data will be encoded in the QR code */\r\n data: string\r\n /** The image will be copied to the center of the QR code */\r\n image?: string | Buffer | Blob\r\n /**\r\n * QR code shape\r\n *\r\n * @default ShapeType.square\r\n */\r\n shape: `${ShapeType}`\r\n /** Options will be passed to `@liquid-js/qrcode-generator` lib */\r\n qrOptions: {\r\n typeNumber: TypeNumber\r\n mode?: `${Mode}`\r\n /** @default ErrorCorrectionLevel.Q */\r\n errorCorrectionLevel: `${ErrorCorrectionLevel}`\r\n }\r\n imageOptions: {\r\n /**\r\n * Image mode\r\n *\r\n * @default ImageMode.center\r\n */\r\n mode: `${ImageMode}`\r\n /**\r\n * Fill blank areas of the code with selected color\r\n */\r\n fill: {\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"rgba(255,255,255,0.75)\"\r\n */\r\n color: string\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient\r\n }\r\n /**\r\n * Coefficient of the image size\r\n *\r\n * @default 0.4\r\n */\r\n imageSize: number\r\n /**\r\n * Margin of the image (in blocks)\r\n *\r\n * @default 0\r\n */\r\n margin: number\r\n /**\r\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLImageElement/crossOrigin)\r\n */\r\n crossOrigin?: string\r\n }\r\n dotsOptions: {\r\n /**\r\n * QR dot size (in pixels)\r\n *\r\n * @default 10\r\n */\r\n size: number\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"#000\"\r\n */\r\n color: string\r\n /** Gradient of QR dots */\r\n gradient?: Gradient\r\n /**\r\n * Style of QR dots\r\n *\r\n * @default DotType.square\r\n */\r\n type: `${DotType}`\r\n }\r\n /** Corners Square options, omitted values match dots */\r\n cornersSquareOptions?: {\r\n /** Color of Corners Square */\r\n color?: string\r\n /** Gradient of Corners Square */\r\n gradient?: Gradient\r\n /** Style of Corners Square */\r\n type?: `${CornerSquareType | DotType}`\r\n }\r\n /** Corners Dot options, omitted values match squares */\r\n cornersDotOptions?: {\r\n /** Color of Corners Dot */\r\n color?: string\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient\r\n /** Style of Corners Dot */\r\n type?: `${CornerDotType | DotType}`\r\n }\r\n /** QR background styling options, false to disable background */\r\n backgroundOptions?: {\r\n /** Background roundnes, from 0 (square) to 1 (circle) */\r\n round?: number\r\n /** Background color */\r\n color?: string\r\n /** Background Gradient */\r\n gradient?: Gradient\r\n /**\r\n * Margin (in blocks) between background and the QR code\r\n *\r\n * @default 0\r\n */\r\n margin?: number\r\n } | false\r\n /** `import { stringToBytesFuncs } from \"@liquid-js/qr-code-styling/kanji\";` to add Kanji support */\r\n stringToBytesFuncs?: { [encoding: string]: (s: string) => number[] }\r\n plugins?: Plugin[]\r\n}\r\n\r\nexport const defaultOptions: Options = {\r\n document: undefined as never,\r\n shape: ShapeType.square,\r\n width: undefined as never,\r\n height: undefined as never,\r\n size: undefined as never,\r\n data: '',\r\n qrOptions: {\r\n typeNumber: TypeNumber[0],\r\n mode: undefined,\r\n errorCorrectionLevel: ErrorCorrectionLevel.Q\r\n },\r\n imageOptions: {\r\n mode: ImageMode.center,\r\n imageSize: 0.4,\r\n crossOrigin: undefined,\r\n margin: 0,\r\n fill: {\r\n color: 'rgba(255,255,255,1)'\r\n }\r\n },\r\n dotsOptions: {\r\n type: DotType.square,\r\n color: '#000',\r\n size: 10\r\n }\r\n}\r\n\r\nexport function sanitizeOptions(options: Options): Options {\r\n const newOptions = { ...options }\r\n\r\n newOptions.imageOptions = {\r\n ...newOptions.imageOptions,\r\n imageSize: Math.min(1, Number(newOptions.imageOptions.imageSize)) || 1,\r\n margin: Number(newOptions.imageOptions.margin),\r\n fill: {\r\n ...newOptions.imageOptions.fill\r\n }\r\n }\r\n\r\n if (newOptions.imageOptions.mode == ImageMode.overlay) newOptions.imageOptions.margin = 0\r\n if (newOptions.imageOptions.fill.gradient) {\r\n newOptions.imageOptions.fill.gradient = sanitizeGradient(newOptions.imageOptions.fill.gradient)\r\n }\r\n\r\n newOptions.dotsOptions = {\r\n ...newOptions.dotsOptions\r\n }\r\n if (newOptions.dotsOptions.gradient) {\r\n newOptions.dotsOptions.gradient = sanitizeGradient(newOptions.dotsOptions.gradient)\r\n }\r\n // Ensure integer dot size\r\n newOptions.dotsOptions.size = Math.round(Math.max(0, newOptions.dotsOptions.size) || 10)\r\n\r\n if (newOptions.cornersSquareOptions) {\r\n newOptions.cornersSquareOptions = {\r\n ...newOptions.cornersSquareOptions\r\n }\r\n if (newOptions.cornersSquareOptions.gradient) {\r\n newOptions.cornersSquareOptions.gradient = sanitizeGradient(newOptions.cornersSquareOptions.gradient)\r\n }\r\n }\r\n\r\n if (newOptions.cornersDotOptions) {\r\n newOptions.cornersDotOptions = {\r\n ...newOptions.cornersDotOptions\r\n }\r\n if (newOptions.cornersDotOptions.gradient) {\r\n newOptions.cornersDotOptions.gradient = sanitizeGradient(newOptions.cornersDotOptions.gradient)\r\n }\r\n }\r\n\r\n if (newOptions.backgroundOptions) {\r\n newOptions.backgroundOptions = {\r\n ...newOptions.backgroundOptions\r\n }\r\n if (newOptions.backgroundOptions.gradient) {\r\n newOptions.backgroundOptions.gradient = sanitizeGradient(newOptions.backgroundOptions.gradient)\r\n }\r\n }\r\n\r\n if (!newOptions.document) newOptions.document = document\r\n\r\n return newOptions\r\n}\r\n","import { ErrorCorrectionLevel, Mode } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\n\r\nexport const ErrorCorrectionPercents = {\r\n [ErrorCorrectionLevel.L]: 0.07,\r\n [ErrorCorrectionLevel.M]: 0.15,\r\n [ErrorCorrectionLevel.Q]: 0.25,\r\n [ErrorCorrectionLevel.H]: 0.3\r\n}\r\n\r\nexport function getMode(data: string): Mode {\r\n switch (true) {\r\n case /^[0-9]*$/.test(data):\r\n return Mode.numeric\r\n case /^[0-9A-Z $%*+\\-./:]*$/.test(data):\r\n return Mode.alphanumeric\r\n\r\n case /[^\\u0000-\\u00ff]/.test(data):\r\n return Mode.unicode\r\n default:\r\n return Mode.byte\r\n }\r\n}\r\n","import { RotateFigureArgs } from '../types/helper.js'\r\n\r\nconst rx = /\\.?0+$/\r\n\r\nexport function numToAttr(value: number | string) {\r\n if (typeof value == 'string') return value\r\n return value.toFixed(7).replace(rx, '')\r\n}\r\n\r\nexport function svgPath(strings: TemplateStringsArray, ...values: unknown[]) {\r\n return strings\r\n .reduce((t, v, i) => {\r\n let p: unknown = ''\r\n if (i) p = values[i - 1]\r\n if (typeof p == 'number') p = numToAttr(p)\r\n return `${t}${p}${v}`\r\n }, '')\r\n .trim()\r\n .replace(/[\\s\\n\\r]+/gim, ' ')\r\n}\r\n\r\nexport function rotateFigure<T extends SVGElement | ReadonlyArray<SVGElement>>({ draw, ...args }: RotateFigureArgs<T>) {\r\n const { x, y, size, rotation = 0 } = args\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n\r\n const element = draw(args)\r\n if (rotation) (Array.isArray(element) ? element : [element])\r\n .forEach(el => el.setAttribute('transform', `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`))\r\n return element\r\n}\r\n\r\nexport function scalePath(path: Array<string | number>, { x, y, size }: {\r\n x: number\r\n y: number\r\n size: number\r\n}) {\r\n let move = false\r\n let i = 0\r\n return path\r\n .map((v) => {\r\n if (typeof v == 'string') {\r\n i = 0\r\n move = v.toUpperCase() == v\r\n return v\r\n }\r\n i++\r\n v = v * size\r\n if (move) {\r\n v += i % 2 == 1 ? x : y\r\n }\r\n return numToAttr(v)\r\n })\r\n .join(' ')\r\n}\r\n\r\nexport function extendSVG(svg: SVGSVGElement, padding: number) {\r\n padding = Math.max(padding, 0)\r\n svg.setAttribute('width', numToAttr(parseFloat(svg.getAttribute('width') || '0') + 2 * padding))\r\n svg.setAttribute('height', numToAttr(parseFloat(svg.getAttribute('height') || '0') + 2 * padding))\r\n const vb = (svg.getAttribute('viewBox') || '').split(' ').map((v, i) => parseFloat(v) + (i < 2 ? -1 : 2) * padding)\r\n svg.setAttribute('viewBox', vb.map(numToAttr).join(' '))\r\n if (vb.length < 4)\r\n return undefined\r\n return {\r\n left: vb[0],\r\n right: vb[2] + vb[0],\r\n top: vb[1],\r\n bottom: vb[3] + vb[1]\r\n }\r\n}\r\n","import { BasicFigureDrawArgs } from '../types/helper.js'\r\nimport { numToAttr, scalePath, svgPath } from '../utils/svg.js'\r\n\r\nexport const DotElements = {\r\n dot: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\r\n element.setAttribute('cx', numToAttr(x + size / 2))\r\n element.setAttribute('cy', numToAttr(y + size / 2))\r\n element.setAttribute('r', numToAttr(size / 2))\r\n\r\n return element\r\n },\r\n square: (args: BasicFigureDrawArgs, { width = args.size, height = args.size } = {}): SVGElement => {\r\n const { x, y, size, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n element.setAttribute('x', numToAttr(x + (size - width) / 2))\r\n element.setAttribute('y', numToAttr(y + (size - height) / 2))\r\n element.setAttribute('width', numToAttr(width))\r\n element.setAttribute('height', numToAttr(height))\r\n\r\n return element\r\n },\r\n //if rotation === 0 - right side is rounded\r\n sideRounded: (args: BasicFigureDrawArgs, { height = args.size } = {}): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + (size - height) / 2}\r\n v ${height}\r\n h ${size / 2}\r\n a ${height / 2} ${height / 2} 0 0 0 0 ${-height}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - top right corner is rounded\r\n cornerRounded: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n v ${-size / 2}\r\n a ${size / 2} ${size / 2} 0 0 0 ${-size / 2} ${-size / 2}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - top right corner is rounded\r\n cornerExtraRounded: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n a ${size} ${size} 0 0 0 ${-size} ${-size}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - bottom left and top right corners are rounded\r\n classyDot: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size / 2}\r\n a ${size / 2} ${size / 2} 0 0 0 ${size / 2} ${size / 2}\r\n h ${size / 2}\r\n v ${-size / 2}\r\n a ${size / 2} ${size / 2} 0 0 0 ${-size / 2} ${-size / 2}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - top right corner is rounded\r\n wave: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const a1 = 5 * Math.PI / 180\r\n const a2 = 65 * Math.PI / 180\r\n const s1 = 0.95\r\n const s2 = 0.65\r\n\r\n const c23x = size * (1 - s2 * Math.sin(a1))\r\n const c23y = -size * (s1 - s2 * Math.cos(a1))\r\n\r\n const c31x = -size * Math.sin(a2) / 2\r\n const c31y = size * Math.cos(a2) / 2\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + size}\r\n c ${size * s2} 0 ${c23x} ${c23y} ${size} ${-size * s1}\r\n c ${c31x} ${c31y} ${-size / 2} ${size * (s1 - 1)} ${-size} ${size * (s1 - 1)} \r\n z`\r\n )\r\n\r\n return element\r\n },\r\n heart: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n scalePath([\r\n 'M',\r\n 1,\r\n 0.31629,\r\n 'c',\r\n -0.00086,\r\n 0.15702,\r\n -0.10534,\r\n 0.26323,\r\n -0.21876,\r\n 0.38123,\r\n 'c',\r\n -0.06736,\r\n 0.06834,\r\n -0.18938,\r\n 0.17948,\r\n -0.28124,\r\n 0.26126,\r\n 'c',\r\n -0.09188,\r\n -0.08178,\r\n -0.2139,\r\n -0.19292,\r\n -0.28124,\r\n -0.26126,\r\n 'c',\r\n -0.11344,\r\n -0.118,\r\n -0.2179,\r\n -0.22422,\r\n -0.21876,\r\n -0.38123,\r\n 'c',\r\n -0.00096,\r\n -0.27136,\r\n 0.33154,\r\n -0.36842,\r\n 0.5,\r\n -0.17,\r\n 'c',\r\n 0.16844,\r\n -0.19842,\r\n 0.50094,\r\n -0.10136,\r\n 0.5,\r\n 0.17,\r\n 'z'\r\n ], { x, y, size })\r\n )\r\n\r\n return element\r\n },\r\n rounded: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n element.setAttribute('x', numToAttr(x))\r\n element.setAttribute('y', numToAttr(y))\r\n element.setAttribute('width', numToAttr(size))\r\n element.setAttribute('height', numToAttr(size))\r\n element.setAttribute('rx', numToAttr(size / 4))\r\n element.setAttribute('ry', numToAttr(size / 4))\r\n\r\n return element\r\n },\r\n classy: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n H ${x}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n inpoint: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + size / 2}\r\n v ${size / 4}\r\n a ${size / 4} ${size / 4} 0 0 0 ${size / 4} ${size / 4}\r\n h ${(size / 4) * 3}\r\n v ${(-size / 4) * 3}\r\n a ${size / 4} ${size / 4} 0 0 0 ${-size / 4} ${-size / 4}\r\n h ${-size / 2}\r\n a ${size / 4} ${size / 4} 0 0 0 ${-size / 4} ${size / 4}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n star: (args: BasicFigureDrawArgs, {\r\n spikes = 5,\r\n outerRadius = args.size / 2,\r\n innerRadius = args.size / 4\r\n } = {}): SVGElement => {\r\n const { size, x, y, document } = args\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n\r\n const angle = Math.PI / spikes\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n Array(2 * spikes).fill(0).map((_, i) => {\r\n const radius = i % 2 === 0 ? outerRadius : innerRadius\r\n const xPoint = cx + radius * Math.sin(i * angle)\r\n const yPoint = cy - radius * Math.cos(i * angle)\r\n return svgPath`${i === 0 ? 'M' : 'L'} ${xPoint} ${yPoint} `\r\n }).join(' ')\r\n )\r\n\r\n return element\r\n },\r\n weave: (args: BasicFigureDrawArgs): SVGElement => {\r\n const { size, x, y, document } = args\r\n\r\n const thickness = size * 0.6\r\n const notch = (size - thickness) / 2\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x + notch} ${y}\r\n l ${thickness} 0\r\n l 0 ${notch}\r\n l ${notch} 0\r\n l 0 ${thickness}\r\n l ${-notch} 0\r\n l 0 ${notch}\r\n l ${-thickness} 0\r\n l 0 ${-notch}\r\n l ${-notch} 0\r\n l 0 ${-thickness}\r\n l ${notch} 0\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n blob: (args: BasicFigureDrawArgs, corners: Record<'tl' | 'tr' | 'bl' | 'br', 'round' | 'out' | 'square'>): SVGElement => {\r\n const { size, x, y, document } = args\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n\r\n const parts = [\r\n svgPath`M ${x} ${y + 2.5 * dotSize}`\r\n ]\r\n\r\n let l = 2 * dotSize\r\n\r\n if (corners.bl == 'round') {\r\n parts.push(\r\n svgPath`v ${l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}`\r\n )\r\n l = 2 * dotSize\r\n } else if (corners.bl == 'out') {\r\n parts.push(\r\n svgPath`v ${5 * dotSize + l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 1 ${dotSize * 2.5} ${dotSize * -2.5}`\r\n )\r\n l = 2 * dotSize\r\n } else {\r\n parts.push(\r\n svgPath`v ${2.5 * dotSize + l}`\r\n )\r\n l = 4.5 * dotSize\r\n }\r\n\r\n if (corners.br == 'round') {\r\n parts.push(\r\n svgPath`h ${l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * -2.5}`\r\n )\r\n l = -2 * dotSize\r\n } else if (corners.br == 'out') {\r\n parts.push(\r\n svgPath`h ${5 * dotSize + l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 1 ${dotSize * -2.5} ${dotSize * -2.5}`\r\n )\r\n l = -2 * dotSize\r\n } else {\r\n parts.push(\r\n svgPath`h ${2.5 * dotSize + l}`\r\n )\r\n l = -4.5 * dotSize\r\n }\r\n\r\n if (corners.tr == 'round') {\r\n parts.push(\r\n svgPath`v ${l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * -2.5} ${dotSize * -2.5}`\r\n )\r\n l = -2 * dotSize\r\n } else if (corners.tr == 'out') {\r\n parts.push(\r\n svgPath`v ${-5 * dotSize + l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 1 ${dotSize * -2.5} ${dotSize * 2.5}`\r\n )\r\n l = -2 * dotSize\r\n } else {\r\n parts.push(\r\n svgPath`v ${-2.5 * dotSize + l}`\r\n )\r\n l = -4.5 * dotSize\r\n }\r\n\r\n if (corners.tl == 'round') {\r\n parts.push(\r\n svgPath`h ${l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * -2.5} ${dotSize * 2.5}`\r\n )\r\n } else if (corners.tl == 'out') {\r\n parts.push(\r\n svgPath`h ${-5 * dotSize + l}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 1 ${dotSize * 2.5} ${dotSize * 2.5}`\r\n )\r\n } else {\r\n parts.push(\r\n svgPath`h ${-2.5 * dotSize + l}`\r\n )\r\n }\r\n\r\n element.setAttribute(\r\n 'd',\r\n parts.join(' ') + ' z'\r\n )\r\n\r\n return element\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { CornerDotType, Plugin } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\nconst qrCornerDotFigures: { [type in CornerDotType]: (args: DrawArgs) => SVGElement } = {\r\n [CornerDotType.dot]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.dot\r\n }),\r\n [CornerDotType.square]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.square\r\n }),\r\n [CornerDotType.heart]: args => DotElements.heart(args),\r\n [CornerDotType.extraRounded]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.rounded\r\n }),\r\n [CornerDotType.classy]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.classy\r\n }),\r\n [CornerDotType.inpoint]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.inpoint\r\n }),\r\n [CornerDotType.outpoint]: args => rotateFigure({\r\n ...args,\r\n rotation: (args.rotation || 0) + Math.PI,\r\n draw: DotElements.inpoint\r\n }),\r\n [CornerDotType.star]: args => DotElements.star(args),\r\n [CornerDotType.pentagon]: args => DotElements.star(args, {\r\n spikes: 2.5,\r\n outerRadius: args.size / 2,\r\n innerRadius: args.size / 2\r\n }),\r\n [CornerDotType.hexagon]: args => DotElements.star(args, {\r\n spikes: 3,\r\n outerRadius: args.size / 2,\r\n innerRadius: args.size / 2\r\n }),\r\n [CornerDotType.diamond]: args => rotateFigure({\r\n ...args,\r\n rotation: Math.PI / 4,\r\n draw: args2 => DotElements.square(args2, { width: args2.size * 0.85, height: args2.size * 0.85 })\r\n })\r\n}\r\n\r\nexport function getQrCornerDotFigure(type: `${CornerDotType}`) {\r\n return qrCornerDotFigures[type] || qrCornerDotFigures[CornerDotType.square]\r\n}\r\n\r\nexport function drawPluginCornerDot(plugins: Plugin[]) {\r\n return (args: DrawArgs) => {\r\n for (const plugin of plugins) {\r\n const el = plugin.drawCornerDot?.(args)\r\n if (el)\r\n return el\r\n }\r\n return undefined\r\n }\r\n}\r\n","import { BasicFigureDrawArgs } from '../types/helper.js'\r\nimport { svgPath } from '../utils/svg.js'\r\n\r\nexport const SquareElements = {\r\n dot: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x + size / 2} ${y}\r\n a ${size / 2} ${size / 2} 0 1 0 0.1 0\r\n z\r\n m 0 ${dotSize}\r\n a ${size / 2 - dotSize} ${size / 2 - dotSize} 0 1 1 -0.1 0\r\n Z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`M ${x + size / 2} ${y - dotSize}\r\n a ${size / 2 + dotSize} ${size / 2 + dotSize} 0 1 0 0.1 0\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n square: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n v ${-size}\r\n z\r\n M ${x + dotSize} ${y + dotSize}\r\n h ${size - 2 * dotSize}\r\n v ${size - 2 * dotSize}\r\n h ${-size + 2 * dotSize}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`M ${x - dotSize} ${y - dotSize}\r\n h ${size + 2 * dotSize}\r\n v ${size + 2 * dotSize}\r\n h ${-size - 2 * dotSize}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n extraRounded: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${-dotSize * 2.5}\r\n v ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${dotSize * 2.5}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${-dotSize * 1.5} ${dotSize * 1.5}\r\n h ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${-dotSize * 1.5}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x - dotSize} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 0 ${dotSize * 3.5} ${dotSize * 3.5}\r\n h ${2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 0 ${dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 0 ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n h ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 0 ${-dotSize * 3.5} ${dotSize * 3.5}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n classy: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n H ${x}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${3.5 * dotSize}\r\n h ${-3.5 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-3.5 * dotSize}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x + 0.5 * dotSize} ${y - dotSize}\r\n h ${4 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${dotSize * 3.5} ${dotSize * 3.5}\r\n v ${5.5 * dotSize}\r\n h ${-5.5 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-5.5 * dotSize}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n inpoint: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize} 0 0 0 ${-dotSize * 2.5} ${dotSize * 2.5}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${3.5 * dotSize}\r\n h ${-3.5 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize} 0 0 1 ${dotSize * 1.5} ${-dotSize * 1.5}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x + 0.5 * dotSize} ${y - dotSize}\r\n h ${4 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${dotSize * 3.5} ${dotSize * 3.5}\r\n v ${5.5 * dotSize}\r\n h ${-5.5 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize} 0 0 1 ${dotSize * 3.5} ${-dotSize * 3.5}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n },\r\n centerCircle: (args: BasicFigureDrawArgs): [SVGElement, SVGElement] => {\r\n const { x, y, size, document } = args\r\n\r\n const circleRadius = size / 2.5\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n h ${size}\r\n v ${size}\r\n h ${-size}\r\n z\r\n M ${cx - circleRadius} ${cy}\r\n a ${circleRadius} ${circleRadius} 0 1 0 ${circleRadius * 2} 0\r\n a ${circleRadius} ${circleRadius} 0 1 0 ${-circleRadius * 2} 0\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`M ${x - dotSize} ${y - dotSize}\r\n h ${size + 2 * dotSize}\r\n v ${size + 2 * dotSize}\r\n h ${-size - 2 * dotSize}\r\n z`\r\n )\r\n\r\n return [element, fill]\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { CornerSquareType, Plugin } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { SquareElements } from './square-elements.js'\r\n\r\nconst qrCornerSquareFigures: { [type in CornerSquareType]: (args: DrawArgs) => readonly [SVGElement, SVGElement] } = {\r\n [CornerSquareType.dot]: args => SquareElements.dot(args),\r\n [CornerSquareType.square]: args => SquareElements.square(args),\r\n [CornerSquareType.extraRounded]: args => SquareElements.extraRounded(args),\r\n [CornerSquareType.classy]: args => rotateFigure({\r\n ...args,\r\n draw: SquareElements.classy\r\n }),\r\n [CornerSquareType.inpoint]: args => rotateFigure({\r\n ...args,\r\n draw: SquareElements.inpoint\r\n }),\r\n [CornerSquareType.outpoint]: ({ rotation, ...args }) => rotateFigure({\r\n ...args,\r\n rotation: (rotation || 0) + Math.PI,\r\n draw: SquareElements.inpoint\r\n }),\r\n [CornerSquareType.centerCircle]: args => SquareElements.centerCircle(args)\r\n}\r\n\r\nexport function getQrCornerSquareFigure(type: `${CornerSquareType}`) {\r\n return qrCornerSquareFigures[type] || qrCornerSquareFigures[CornerSquareType.square]\r\n}\r\n\r\nexport function drawPluginCornerSquare(plugins: Plugin[]) {\r\n return (args: DrawArgs) => {\r\n for (const plugin of plugins) {\r\n const el = plugin.drawCornerSquare?.(args)\r\n if (el)\r\n return el\r\n }\r\n return undefined\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\n/**\r\n * Draw square lines with rounded corners and endpoints\r\n */\r\nexport function roundedCorners({ x, y, size, document, getNeighbor }: DrawArgs, { corner = DotElements.cornerRounded, end = DotElements.sideRounded } = {}) {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return DotElements.dot({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount === 2) {\r\n // Rounded corner\r\n let rotation = 0\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: corner\r\n })\r\n } else {\r\n // Endpoint\r\n let rotation = 0\r\n\r\n if (topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: end\r\n })\r\n }\r\n}\r\n\r\n/**\r\n * Draw square lines with rounded corners and half-rounded endpoints\r\n */\r\nexport function classy({ x, y, size, document, getNeighbor }: DrawArgs, { corner = DotElements.cornerRounded } = {}) {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return rotateFigure({\r\n x, y, size, rotation: Math.PI / 2,\r\n document,\r\n draw: DotElements.classyDot\r\n })\r\n } else if (!leftNeighbor && !topNeighbor) {\r\n // Top right corner\r\n return rotateFigure({\r\n x, y, size, rotation: -Math.PI / 2,\r\n document,\r\n draw: corner\r\n })\r\n } else if (!rightNeighbor && !bottomNeighbor) {\r\n // Bottom left corner\r\n return rotateFigure({\r\n x, y, size, rotation: Math.PI / 2,\r\n document,\r\n draw: corner\r\n })\r\n }\r\n\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n}\r\n\r\n/**\r\n * Draw stripes with rounded or square endpoints\r\n */\r\nexport function stripes({ x, y, size, document, getNeighbor }: DrawArgs, { stripe = size, rotation = 0, endpoint = DotElements.sideRounded, dot = DotElements.dot } = {}) {\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n if (topNeighbor && bottomNeighbor) {\r\n // Mid-stripe\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: _ => DotElements.square({\r\n x, y, size,\r\n document\r\n }, { width: stripe })\r\n })\r\n } else if (topNeighbor && !bottomNeighbor) {\r\n // Top endpoint\r\n rotation += Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: args => endpoint(args, { height: stripe })\r\n })\r\n } else if (bottomNeighbor && !topNeighbor) {\r\n // Bottom endpoint\r\n rotation -= Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: args => endpoint(args, { height: stripe })\r\n })\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: _ => dot({\r\n x: x + (size - stripe) / 2,\r\n y: y + (size - stripe) / 2,\r\n size: stripe,\r\n document\r\n })\r\n })\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { DotType, Plugin } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { classy, roundedCorners, stripes } from './dot-composition.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\nconst qrDotFigures: { [type in DotType]: (args: DrawArgs) => SVGElement } = {\r\n [DotType.dot]: args => DotElements.dot(args),\r\n [DotType.randomDot]: ({ size, x, y, getPRandom, ...args }) => {\r\n const rnd = (getPRandom || Math.random)\r\n const randomFactor = rnd() * (1 - 0.75) + 0.75\r\n\r\n return DotElements.dot({\r\n ...args,\r\n size: size * randomFactor,\r\n x: x + size * rnd() * (1 - randomFactor),\r\n y: y + size * rnd() * (1 - randomFactor)\r\n })\r\n },\r\n [DotType.rounded]: args => roundedCorners(args),\r\n [DotType.extraRounded]: args => roundedCorners(args, { corner: DotElements.cornerExtraRounded }),\r\n [DotType.verticalLine]: args => stripes(args),\r\n [DotType.horizontalLine]: ({ getNeighbor, ...args }) => stripes({\r\n ...args,\r\n getNeighbor: getNeighbor ? (x, y) => getNeighbor(y, x) : undefined\r\n }, { rotation: -Math.PI / 2 }),\r\n [DotType.classy]: args => classy(args),\r\n [DotType.classyRounded]: args => classy(args, { corner: DotElements.cornerExtraRounded }),\r\n [DotType.square]: args => DotElements.square(args),\r\n [DotType.smallSquare]: ({ x, y, size, document }) => {\r\n const originalSize = size\r\n\r\n size = originalSize * 0.7\r\n x = x + originalSize * 0.15\r\n y = y + originalSize * 0.15\r\n\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n },\r\n [DotType.tinySquare]: ({ x, y, size, document }) => {\r\n const originalSize = size\r\n\r\n size = originalSize * 0.3\r\n x = x + originalSize * 0.35\r\n y = y + originalSize * 0.35\r\n\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n },\r\n [DotType.diamond]: args => rotateFigure({\r\n ...args,\r\n rotation: Math.PI / 4,\r\n draw: args2 => DotElements.square(args2, { width: args2.size * 0.85, height: args2.size * 0.85 })\r\n }),\r\n [DotType.wave]: args => roundedCorners(args, {\r\n corner: DotElements.cornerExtraRounded,\r\n end: DotElements.wave\r\n }),\r\n [DotType.heart]: args => DotElements.heart(args),\r\n [DotType.star]: args => DotElements.star(args),\r\n [DotType.weave]: args => DotElements.weave(args),\r\n [DotType.pentagon]: args => DotElements.star(args, {\r\n spikes: 2.5,\r\n outerRadius: args.size / 2,\r\n innerRadius: args.size / 2\r\n }),\r\n [DotType.hexagon]: args => DotElements.star(args, {\r\n spikes: 3,\r\n outerRadius: args.size / 2,\r\n innerRadius: args.size / 2\r\n }),\r\n [DotType.zebraVertical]: args => stripes(args, { stripe: args.size * 0.8 }),\r\n [DotType.zebraHorizontal]: ({ getNeighbor, ...args }) => stripes({\r\n ...args,\r\n getNeighbor: getNeighbor ? (x, y) => getNeighbor(y, x) : undefined\r\n }, { stripe: args.size * 0.8, rotation: -Math.PI / 2 }),\r\n [DotType.blocksVertical]: args => stripes(args, {\r\n stripe: args.size * 0.8,\r\n endpoint: (_args, _params) => {\r\n const rnd = (args.getPRandom || Math.random)\r\n const width = args.size * (1 - rnd() * 0.25)\r\n const x = args.x - (args.size - width) / 2\r\n return DotElements.square({ ..._args, x }, { ..._params, width })\r\n },\r\n dot: (_args) => {\r\n const rnd = (args.getPRandom || Math.random)\r\n const height = args.size * (1 - rnd() * 0.25)\r\n const y = args.y + (args.size - height) * rnd()\r\n return DotElements.square({ ..._args, y }, { height })\r\n }\r\n }),\r\n [DotType.blocksHorizontal]: ({ getNeighbor, ...args }) => stripes({\r\n ...args,\r\n getNeighbor: getNeighbor ? (x, y) => getNeighbor(y, x) : undefined\r\n }, {\r\n stripe: args.size * 0.8,\r\n rotation: -Math.PI / 2,\r\n endpoint: (_args, _params) => {\r\n const rnd = (args.getPRandom || Math.random)\r\n const width = args.size * (1 - rnd() * 0.25)\r\n const x = args.x - (args.size - width) / 2\r\n return DotElements.square({ ..._args, x }, { ..._params, width })\r\n },\r\n dot: (_args) => {\r\n const rnd = (args.getPRandom || Math.random)\r\n const height = args.size * (1 - rnd() * 0.25)\r\n const y = args.y + (args.size - height) * rnd()\r\n return DotElements.square({ ..._args, y }, { height })\r\n }\r\n }),\r\n [DotType.blobs]: ({ getNeighbor, ...args }) => {\r\n const tl = getNeighbor?.(-1, -1)\r\n const t = getNeighbor?.(0, -1)\r\n const tr = getNeighbor?.(1, -1)\r\n const r = getNeighbor?.(1, 0)\r\n const br = getNeighbor?.(1, 1)\r\n const b = getNeighbor?.(0, 1)\r\n const bl = getNeighbor?.(-1, 1)\r\n const l = getNeighbor?.(-1, 0)\r\n const corners: Record<'tl' | 'tr' | 'bl' | 'br', 'round' | 'out' | 'square'> = {\r\n tl: 'square',\r\n tr: 'square',\r\n bl: 'square',\r\n br: 'square'\r\n }\r\n\r\n if (!l && tl)\r\n corners.tl = 'out'\r\n if (!t && tr)\r\n corners.tr = 'out'\r\n if (!r && br)\r\n corners.br = 'out'\r\n if (!b && bl)\r\n corners.bl = 'out'\r\n\r\n if (!l && !tl && !t)\r\n corners.tl = 'round'\r\n if (!t && !tr && !r)\r\n corners.tr = 'round'\r\n if (!r && !br && !b)\r\n corners.br = 'round'\r\n if (!b && !bl && !l)\r\n corners.bl = 'round'\r\n\r\n return DotElements.blob(args, corners)\r\n },\r\n [DotType.soft]: ({ getNeighbor, ...args }) => {\r\n const tl = getNeighbor?.(-1, -1)\r\n const t = getNeighbor?.(0, -1)\r\n const tr = getNeighbor?.(1, -1)\r\n const r = getNeighbor?.(1, 0)\r\n const br = getNeighbor?.(1, 1)\r\n const b = getNeighbor?.(0, 1)\r\n const bl = getNeighbor?.(-1, 1)\r\n const l = getNeighbor?.(-1, 0)\r\n const corners: Record<'tl' | 'tr' | 'bl' | 'br', 'round' | 'out' | 'square'> = {\r\n tl: 'square',\r\n tr: 'square',\r\n bl: 'square',\r\n br: 'square'\r\n }\r\n\r\n if (!l && tl && t)\r\n corners.tl = 'out'\r\n if (!t && tr && r)\r\n corners.tr = 'out'\r\n if (!r && br && b)\r\n corners.br = 'out'\r\n if (!b && bl && l)\r\n corners.bl = 'out'\r\n\r\n if (!l && !t)\r\n corners.tl = 'round'\r\n if (!t && !r)\r\n corners.tr = 'round'\r\n if (!r && !b)\r\n corners.br = 'round'\r\n if (!b && !l)\r\n corners.bl = 'round'\r\n\r\n return DotElements.blob(args, corners)\r\n }\r\n}\r\n\r\nexport function getQrDotFigure(type: `${DotType}`, plugins?: Plugin[]) {\r\n const defaultDraw = qrDotFigures[type] || qrDotFigures[DotType.square]\r\n if (!plugins?.length)\r\n return defaultDraw\r\n\r\n const drawPlugin = drawPluginDot(plugins)\r\n return (args: DrawArgs) => drawPlugin(args) || defaultDraw(args)\r\n}\r\n\r\nexport function drawPluginDot(plugins: Plugin[]) {\r\n return (args: DrawArgs) => {\r\n for (const plugin of plugins) {\r\n const el = plugin.drawDot?.(args)\r\n if (el)\r\n return el\r\n }\r\n return undefined\r\n }\r\n}\r\n","export const browserImageTools = {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\r\n if (typeof url == 'string' && url.startsWith('data:')) return Promise.resolve(url)\r\n return new Promise((resolve, reject) => {\r\n if (typeof url == 'string') {\r\n const xhr = new XMLHttpRequest()\r\n xhr.onload = () => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result as string)\r\n }\r\n reader.readAsDataURL(xhr.response)\r\n }\r\n xhr.onerror = xhr.onabort = xhr.ontimeout = reject\r\n xhr.open('GET', url, true)\r\n xhr.responseType = 'blob'\r\n xhr.send()\r\n } else {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result as string)\r\n }\r\n reader.readAsDataURL(url as Blob)\r\n }\r\n })\r\n },\r\n getSize: (src: string | Blob | Buffer, crossOrigin?: string): Promise<{ width: number, height: number }> => new Promise((resolve, reject) => {\r\n const image = new Image()\r\n\r\n if (crossOrigin === 'string') {\r\n image.crossOrigin = crossOrigin\r\n }\r\n\r\n image.onload = (): void => {\r\n resolve({ width: image.width, height: image.height })\r\n }\r\n image.onerror = image.onabort = reject\r\n\r\n if (typeof src == 'string') image.src = src\r\n else\r\n browserImageTools\r\n .toDataURL(src)\r\n .then((url) => (image.src = url))\r\n .catch(reject)\r\n })\r\n}\r\n","export function parseColor(cstr: string) {\r\n let m: RegExpExecArray | null\r\n let parts: string[] | number[] = []\r\n let alpha = 1\r\n\r\n cstr = cstr.toLowerCase()\r\n\r\n if (cstr[0] === '#') {\r\n const base = cstr.slice(1)\r\n const size = base.length\r\n const isShort = size <= 4\r\n\r\n if (isShort) {\r\n parts = [parseInt(base[0] + base[0], 16), parseInt(base[1] + base[1], 16), parseInt(base[2] + base[2], 16)]\r\n if (size === 4) {\r\n alpha = parseInt(base[3] + base[3], 16) / 255\r\n }\r\n } else {\r\n parts = [parseInt(base[0] + base[1], 16), parseInt(base[2] + base[3], 16), parseInt(base[4] + base[5], 16)]\r\n if (size === 8) {\r\n alpha = parseInt(base[6] + base[7], 16) / 255\r\n }\r\n }\r\n\r\n if (!parts[0]) parts[0] = 0\r\n if (!parts[1]) parts[1] = 0\r\n if (!parts[2]) parts[2] = 0\r\n } else if ((m = /^((?:rgba?))\\s*\\(([^)]*)\\)/.exec(cstr))) {\r\n const dims = 3\r\n parts = m[2].trim().split(/\\s*[,/]\\s*|\\s+/)\r\n\r\n parts = parts.map((x, i) => {\r\n if (x[x.length - 1] === '%') {\r\n const v = parseFloat(x) / 100\r\n if (i === 3) return v\r\n return v * 255\r\n }\r\n\r\n if (x === 'none') return 0\r\n return parseFloat(x)\r\n })\r\n\r\n alpha = parts.length > dims ? parts.pop()! : 1\r\n } else {\r\n return {\r\n value: cstr,\r\n alpha\r\n }\r\n }\r\n\r\n const value = '#' + parts.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, '0')).join('')\r\n return {\r\n value,\r\n alpha: Math.max(0, Math.min(1, alpha))\r\n }\r\n}\r\n","export function getRng(matrix: Array<Array<boolean | number | undefined>>, i: number, j: number, match: number | boolean = true) {\r\n let seed: number | undefined\r\n return () => {\r\n if (seed == undefined) {\r\n seed = 0\r\n let ix = 0\r\n for (let xOffset = -3; xOffset < 4; xOffset++)\r\n for (let yOffset = -3; yOffset < 4; yOffset++) {\r\n ix++\r\n seed |= Number(matrix[((i + xOffset + matrix.length) << yOffset) % matrix.length]?.[((j + yOffset + matrix.length) << xOffset) % matrix.length] === match) << ix\r\n }\r\n }\r\n let t = seed += 0x6D2B79F5\r\n t = Math.imul(t ^ t >>> 15, t | 1)\r\n t ^= t + Math.imul(t ^ t >>> 7, t | 61)\r\n return ((t ^ t >>> 14) >>> 0) / 4294967296\r\n }\r\n}\r\n","import { QRCodeMinimal } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { QRUtil } from '@liquid-js/qrcode-generator/lib/qrcode/QRUtil.js'\r\nimport { drawPluginCornerDot, getQrCornerDotFigure } from '../figures/corner-dot.js'\r\nimport { drawPluginCornerSquare, getQrCornerSquareFigure } from '../figures/corner-square.js'\r\nimport { getQrDotFigure } from '../figures/dot.js'\r\nimport { browserImageTools } from '../tools/browser-image-tools.js'\r\nimport { parseColor } from '../utils/color.js'\r\nimport { Gradient, GradientType } from '../utils/gradient.js'\r\nimport { calculateImageSize } from '../utils/image.js'\r\nimport { CornerDotType, CornerSquareType, DotType, ImageMode, Options, ShapeType } from '../utils/options.js'\r\nimport { numToAttr } from '../utils/svg.js'\r\nimport { DrawArgs } from '../types/helper.js'\r\nimport { getRng } from '../utils/random.js'\r\n\r\nconst squareMask = [\r\n [1, 1, 1, 1, 1, 1, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 1, 1, 1, 1, 1, 1]\r\n]\r\n\r\nconst cornerSquareTypes = new Set<string>(Object.values(CornerSquareType))\r\nfunction isCornerSquareType(val?: string): val is `${CornerSquareType}` {\r\n return !!(val && cornerSquareTypes.has(val))\r\n}\r\n\r\nconst dotMask = [\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0]\r\n]\r\n\r\nconst cornerDotTypes = new Set<string>(Object.values(CornerDotType))\r\nfunction isCornerDotType(val?: string): val is `${CornerDotType}` {\r\n return !!(val && cornerDotTypes.has(val))\r\n}\r\n\r\nexport class QRSVG {\r\n private _element: SVGSVGElement\r\n private _fakeMatrix?: Array<Array<boolean | undefined>>\r\n\r\n get element() {\r\n return this._element\r\n }\r\n\r\n private defs: SVGElement\r\n\r\n private backgroundMask?: SVGElement\r\n private dotsMask?: SVGElement\r\n private lightDotsMask?: SVGElement\r\n\r\n private qr?: QRCodeMinimal\r\n private document: Document\r\n private imageTools: typeof browserImageTools\r\n\r\n constructor(\r\n private options: Pick<\r\n Options,\r\n | 'width'\r\n | 'height'\r\n | 'size'\r\n | 'document'\r\n | 'imageTools'\r\n | 'image'\r\n | 'imageOptions'\r\n | 'dotsOptions'\r\n | 'cornersDotOptions'\r\n | 'cornersSquareOptions'\r\n | 'backgroundOptions'\r\n | 'shape'\r\n | 'plugins'\r\n > & { errorCorrectionPercent: number }\r\n ) {\r\n this.document = options.document\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'svg')\r\n const size = numToAttr(options.size)\r\n this._element.setAttribute('width', size)\r\n this._element.setAttribute('height', size)\r\n this._element.setAttribute('viewBox', `0 0 ${size} ${size}`)\r\n this.defs = this.document.createElementNS('http://www.w3.org/2000/svg', 'defs')\r\n this._element.appendChild(this.defs)\r\n this.imageTools = options.imageTools || browserImageTools\r\n }\r\n\r\n get width(): number {\r\n return this.options.size\r\n }\r\n\r\n get height(): number {\r\n return this.options.size\r\n }\r\n\r\n async drawQR(qr: QRCodeMinimal): Promise<void> {\r\n const count = qr.getModuleCount()\r\n const typeNumber = parseInt(((count - 17) / 4).toFixed(0), 10)\r\n const dotSize = this.options.dotsOptions.size\r\n let drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n\r\n this.qr = qr\r\n\r\n if (this.options.image) {\r\n //We need it to get image size\r\n const size = await this.imageTools.getSize(this.options.image, this.options.imageOptions.crossOrigin)\r\n const { imageOptions, errorCorrectionPercent } = this.options\r\n\r\n if (imageOptions.mode == ImageMode.background) {\r\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n const maxSize = (this.options.size - 2 * margin * dotSize) * imageOptions.imageSize\r\n let { width, height } = size\r\n\r\n height = (height / width) * maxSize\r\n width = maxSize\r\n\r\n if (height > maxSize) {\r\n width = (width / height) * maxSize\r\n height = maxSize\r\n }\r\n\r\n drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width,\r\n height\r\n }\r\n } else {\r\n const coverLevel = imageOptions.imageSize * errorCorrectionPercent\r\n const alignment = QRUtil.getPatternPosition(typeNumber)\r\n const maxHiddenDots = Math.floor(\r\n coverLevel * (count * count - 3 * 8 * 8 - 2 * (count - 16) - alignment.length ** 2 * 25)\r\n )\r\n\r\n drawImageSize = calculateImageSize({\r\n originalWidth: size.width,\r\n originalHeight: size.height,\r\n maxHiddenDots,\r\n maxHiddenAxisDots: count - 14,\r\n dotSize,\r\n margin: imageOptions.margin\r\n })\r\n }\r\n }\r\n\r\n this.drawBackground()\r\n\r\n if (\r\n this.options.imageOptions.mode != ImageMode.overlay &&\r\n this.options.image &&\r\n drawImageSize.width > 0 &&\r\n drawImageSize.height > 0\r\n ) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize })\r\n }\r\n\r\n this.drawDots((i: number, j: number): boolean => {\r\n if (this.options.imageOptions.mode == ImageMode.center) {\r\n if (\r\n i >= (count - drawImageSize.hideXDots) / 2 &&\r\n i < (count + drawImageSize.hideXDots) / 2 &&\r\n j >= (count - drawImageSize.hideYDots) / 2 &&\r\n j < (count + drawImageSize.hideYDots) / 2\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if ((i < 8 && j < 8) || (i >= count - 8 && j < 8) || (j >= count - 8 && i < 8)) return false\r\n\r\n return true\r\n })\r\n\r\n if (\r\n this.options.imageOptions.mode == ImageMode.overlay &&\r\n this.options.image &&\r\n drawImageSize.width > 0 &&\r\n drawImageSize.height > 0\r\n ) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize })\r\n }\r\n\r\n this.drawCorners()\r\n }\r\n\r\n drawBackground(): void {\r\n const options = this.options\r\n\r\n if (this._element && options.backgroundOptions) {\r\n const gradientOptions = options.backgroundOptions.gradient\r\n const color = options.backgroundOptions.color\r\n\r\n this.createColor({\r\n options: gradientOptions,\r\n color,\r\n additionalRotation: 0,\r\n x: 0,\r\n y: 0,\r\n height: options.size,\r\n width: options.size,\r\n name: 'background-color'\r\n })\r\n\r\n const element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n this.backgroundMask = this.createMask('mask-background-color')\r\n this.defs.appendChild(this.backgroundMask)\r\n\r\n element.setAttribute('x', numToAttr(0))\r\n element.setAttribute('y', numToAttr(0))\r\n element.setAttribute('width', numToAttr(options.size))\r\n element.setAttribute('height', numToAttr(options.size))\r\n element.setAttribute('rx', numToAttr((options.size / 2) * (options.backgroundOptions.round || 0)))\r\n\r\n this.backgroundMask.appendChild(element)\r\n }\r\n }\r\n\r\n drawDots(filter?: (i: number, j: number) => boolean): void {\r\n if (!this.qr) {\r\n throw new Error('QR code is not defined')\r\n }\r\n\r\n const options = this.options\r\n const count = this.qr.getModuleCount()\r\n\r\n if (count > options.size) {\r\n throw new Error('The canvas is too small')\r\n }\r\n\r\n const dotSize = this.options.dotsOptions.size\r\n let size = options.size\r\n if (options.imageOptions.mode == ImageMode.background) size -= 2 * dotSize * (options.imageOptions.margin || 0)\r\n const beginning = Math.floor((options.size - count * dotSize) / 2)\r\n let draw = getQrDotFigure(options.dotsOptions.type, options.plugins)\r\n\r\n this.dotsMask = this.createMask('mask-dot-color')\r\n this.defs.appendChild(this.dotsMask)\r\n\r\n if (options.imageOptions.mode == ImageMode.background) {\r\n this.lightDotsMask = this.createMask('mask-light-dot-color')\r\n this.defs.appendChild(this.lightDotsMask)\r\n }\r\n\r\n let margin = 0\r\n let additionalDots = 0\r\n let fakeCount = count\r\n\r\n if (options.shape === ShapeType.circle) {\r\n margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n additionalDots = Math.floor((size / dotSize - count - 2 * margin) / 2)\r\n fakeCount = count + additionalDots * 2\r\n } else if (options.imageOptions.mode == ImageMode.background) {\r\n additionalDots = 1\r\n fakeCount = count + additionalDots * 2\r\n }\r\n\r\n const fakeBeginning = beginning - additionalDots * dotSize\r\n const colorCount = count + additionalDots * 2\r\n this._fakeMatrix = new Array(fakeCount)\r\n const center = Math.floor(fakeCount / 2)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n this._fakeMatrix[i] = new Array(fakeCount)\r\n for (let j = 0; j < fakeCount; j++) {\r\n if (\r\n i > additionalDots - 1 &&\r\n i < fakeCount - additionalDots &&\r\n j > additionalDots - 1 &&\r\n j < fakeCount - additionalDots\r\n ) {\r\n const ii = i - additionalDots\r\n const jj = j - additionalDots\r\n if (filter && !filter(ii, jj)) this._fakeMatrix[i][j] = undefined\r\n else this._fakeMatrix[i][j] = !!this.qr.isDark(jj, ii)\r\n continue\r\n }\r\n\r\n if (\r\n options.shape === ShapeType.circle &&\r\n Math.sqrt((i - center) * (i - center) + (j - center) * (j - center)) > center\r\n ) {\r\n this._fakeMatrix[i][j] = undefined\r\n continue\r\n }\r\n\r\n if (\r\n i == additionalDots - 1 ||\r\n i == fakeCount - additionalDots ||\r\n j == additionalDots - 1 ||\r\n j == fakeCount - additionalDots\r\n ) {\r\n if (\r\n (j == additionalDots - 1 && (i < additionalDots + 8 || i > fakeCount - additionalDots - 9)) ||\r\n (j == fakeCount - additionalDots && i < additionalDots + 8) ||\r\n (i == additionalDots - 1 && (j < additionalDots + 8 || j > fakeCount - additionalDots - 9)) ||\r\n (i == fakeCount - additionalDots && j < additionalDots + 8)\r\n )\r\n this._fakeMatrix[i][j] = undefined\r\n else this._fakeMatrix[i][j] = false\r\n continue\r\n }\r\n\r\n // Get random dots from QR code to show it outside of QR code\r\n this._fakeMatrix[i][j] = this.qr.isDark(\r\n j - 2 * additionalDots < 0 ? j : j >= count ? j - 2 * additionalDots : j - additionalDots,\r\n i - 2 * additionalDots < 0 ? i : i >= count ? i - 2 * additionalDots : i - additionalDots\r\n )\r\n }\r\n }\r\n\r\n const typeNr = (count - 17) / 4\r\n const alignment = QRUtil.getPatternPosition(typeNr)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n const iAlign = alignment.find((v) => i - additionalDots > v - 3 && i - additionalDots < v + 3)\r\n for (let j = 0; j < fakeCount; j++) {\r\n const jAlign = alignment.find((v) => j - additionalDots > v - 3 && j - additionalDots < v + 3)\r\n if (this._fakeMatrix[i][j] == undefined) continue\r\n\r\n if (this.lightDotsMask) {\r\n draw =\r\n iAlign &&\r\n jAlign &&\r\n ((iAlign != alignment[0] && jAlign != alignment[0]) ||\r\n (jAlign != alignment[0] && jAlign != alignment[alignment.length - 1]) ||\r\n (iAlign != alignment[0] && iAlign != alignment[alignment.length - 1]))\r\n ? getQrDotFigure(DotType.square)\r\n : getQrDotFigure(DotType.tinySquare)\r\n }\r\n\r\n if (!this._fakeMatrix[i][j]) {\r\n if (this.lightDotsMask) {\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(draw({\r\n x: fakeBeginning + i * dotSize,\r\n y: fakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => this._fakeMatrix![i + xOffset]?.[j + yOffset] === false,\r\n getPRandom: getRng(this._fakeMatrix, i, j, false)\r\n }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (this.dotsMask) {\r\n this.dotsMask.appendChild(draw({\r\n x: fakeBeginning + i * dotSize,\r\n y: fakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => this._fakeMatrix![i + xOffset]?.[j + yOffset] === true,\r\n getPRandom: getRng(this._fakeMatrix, i, j)\r\n }))\r\n }\r\n }\r\n }\r\n\r\n if (this.lightDotsMask) {\r\n this.createColor({\r\n options: options.imageOptions.fill.gradient,\r\n color: options.imageOptions.fill.color,\r\n additionalRotation: 0,\r\n x: fakeBeginning,\r\n y: fakeBeginning,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: 'light-dot-color'\r\n })\r\n }\r\n\r\n this.createColor({\r\n options: options.dotsOptions?.gradient,\r\n color: options.dotsOptions.color,\r\n additionalRotation: 0,\r\n x: fakeBeginning,\r\n y: fakeBeginning,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: 'dot-color'\r\n })\r\n }\r\n\r\n drawCorners(): void {\r\n if (!this.qr) {\r\n throw new Error('QR code is not defined')\r\n }\r\n\r\n const element = this._element\r\n const options = this.options\r\n\r\n if (!element) {\r\n throw new Error('Element code is not defined')\r\n }\r\n\r\n const count = this.qr.getModuleCount()\r\n const dotSize = this.options.dotsOptions.size\r\n const cornersSquareSize = dotSize * 7\r\n const cornersDotSize = dotSize * 3\r\n const beginning = Math.floor((options.size - count * dotSize) / 2);\r\n\r\n [\r\n [0, 0, 0],\r\n [1, 0, Math.PI / 2],\r\n [0, 1, -Math.PI / 2]\r\n ].forEach(([column, row, rotation]) => {\r\n const x = beginning + column * dotSize * (count - 7)\r\n const y = beginning + row * dotSize * (count - 7)\r\n let cornersSquareMask = this.dotsMask\r\n let cornersDotMask = this.dotsMask\r\n\r\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\r\n cornersSquareMask = this.createMask(`mask-corners-square-color-${column}-${row}`)\r\n this.defs.appendChild(cornersSquareMask)\r\n cornersDotMask = cornersSquareMask\r\n cornersDotMask = cornersSquareMask\r\n\r\n this.createColor({\r\n options: options.cornersSquareOptions?.gradient,\r\n color: options.cornersSquareOptions?.color,\r\n additionalRotation: rotation,\r\n x,\r\n y,\r\n height: cornersSquareSize,\r\n width: cornersSquareSize,\r\n name: `corners-square-color-${column}-${row}`\r\n })\r\n }\r\n\r\n const squareArgs: DrawArgs = {\r\n x,\r\n y,\r\n size: cornersSquareSize,\r\n document: this.options.document,\r\n rotation\r\n }\r\n const pluinCornerSquare = options.plugins?.length ? drawPluginCornerSquare(options.plugins)(squareArgs) : undefined\r\n\r\n if (pluinCornerSquare) {\r\n const [cornerElement, cornerFill] = pluinCornerSquare\r\n\r\n if (cornersSquareMask) {\r\n cornersSquareMask.appendChild(cornerElement)\r\n }\r\n\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(cornerFill)\r\n }\r\n } else if (isCornerSquareType(options.cornersSquareOptions?.type)) {\r\n const draw = getQrCornerSquareFigure(options.cornersSquareOptions.type)\r\n\r\n const [cornerElement, cornerFill] = draw(squareArgs)\r\n\r\n if (cornersSquareMask) {\r\n cornersSquareMask.appendChild(cornerElement)\r\n }\r\n\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(cornerFill)\r\n }\r\n } else {\r\n const draw = getQrDotFigure(options.cornersSquareOptions?.type || options.dotsOptions.type, options.plugins)\r\n\r\n for (let i = 0; i < squareMask.length; i++) {\r\n for (let j = 0; j < squareMask[i].length; j++) {\r\n if (!squareMask[i]?.[j]) {\r\n if (this.lightDotsMask && !dotMask[i]?.[j]) {\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean =>\r\n !squareMask[i + xOffset]?.[j + yOffset] && !dotMask[i + xOffset]?.[j + yOffset],\r\n getPRandom: getRng(this._fakeMatrix!, x / dotSize + i, y / dotSize + j, false)\r\n }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (cornersSquareMask) {\r\n cornersSquareMask.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!squareMask[i + xOffset]?.[j + yOffset],\r\n getPRandom: getRng(this._fakeMatrix!, x / dotSize + i, y / dotSize + j, false)\r\n }))\r\n }\r\n }\r\n }\r\n\r\n if (this.lightDotsMask)\r\n for (let i = -1; i < 8; i++) {\r\n for (let j = -1; j < 8; j++) {\r\n if (i == -1 || i == 7 || j == -1 || j == 7) {\r\n if (this.lightDotsMask) {\r\n this.lightDotsMask.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\r\n const ii = i + xOffset\r\n const jj = j + yOffset\r\n return ii >= -1 && ii <= 7 && jj >= -1 && jj <= 7 && (ii == -1 || ii == 7 || jj == -1 || jj == 7)\r\n },\r\n getPRandom: getRng(this._fakeMatrix!, x / dotSize + i, y / dotSize + j, false)\r\n }))\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\r\n cornersDotMask = this.createMask(`mask-corners-dot-color-${column}-${row}`)\r\n this.defs.appendChild(cornersDotMask)\r\n\r\n this.createColor({\r\n options: options.cornersDotOptions?.gradient,\r\n color: options.cornersDotOptions?.color,\r\n additionalRotation: rotation,\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n height: cornersDotSize,\r\n width: cornersDotSize,\r\n name: `corners-dot-color-${column}-${row}`\r\n })\r\n }\r\n\r\n const dotArgs: DrawArgs = {\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n size: cornersDotSize,\r\n document: this.document,\r\n rotation\r\n }\r\n const pluinCornerDot = options.plugins?.length ? drawPluginCornerDot(options.plugins)(dotArgs) : undefined\r\n\r\n if (pluinCornerDot) {\r\n if (cornersDotMask) {\r\n cornersDotMask.appendChild(pluinCornerDot)\r\n }\r\n } else if (isCornerDotType(options.cornersDotOptions?.type)) {\r\n const draw = getQrCornerDotFigure(options.cornersDotOptions.type)\r\n\r\n if (cornersDotMask) {\r\n cornersDotMask.appendChild(draw(dotArgs))\r\n }\r\n } else {\r\n const draw = getQrDotFigure(options.cornersDotOptions?.type || options.dotsOptions.type, options.plugins)\r\n\r\n for (let i = 0; i < dotMask.length; i++) {\r\n for (let j = 0; j < dotMask[i].length; j++) {\r\n if (!dotMask[i]?.[j]) {\r\n continue\r\n }\r\n\r\n if (cornersDotMask) {\r\n cornersDotMask.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!dotMask[i + xOffset]?.[j + yOffset],\r\n getPRandom: getRng(this._fakeMatrix!, x / dotSize + i, y / dotSize + j, false)\r\n }))\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n async drawImage({\r\n width,\r\n height,\r\n count,\r\n dotSize\r\n }: {\r\n width: number\r\n height: number\r\n count: number\r\n dotSize: number\r\n }): Promise<void> {\r\n const options = this.options\r\n const beginning = Math.floor((options.size - count * dotSize) / 2)\r\n let margin = options.imageOptions.margin * dotSize\r\n if (options.imageOptions.mode == ImageMode.background) margin = 0\r\n const dx = beginning + margin + (count * dotSize - width) / 2\r\n const dy = beginning + margin + (count * dotSize - height) / 2\r\n const dw = width - margin * 2\r\n const dh = height - margin * 2\r\n\r\n const imageUrl = await this.imageTools.toDataURL(options.image || '')\r\n let image: SVGElement = this.document.createElementNS('http://www.w3.org/2000/svg', 'image')\r\n image.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', imageUrl || '')\r\n\r\n if (imageUrl.startsWith('data:image/svg+xml;')) {\r\n let data = imageUrl.substring(19)\r\n const i = data.indexOf(',')\r\n const encoding = data.substring(0, i)\r\n data = data.substring(i + 1)\r\n\r\n switch (encoding) {\r\n case 'base64':\r\n data = typeof atob == 'function' ? atob(data) : Buffer.from(data, 'base64').toString('utf8')\r\n break\r\n default:\r\n data = ''\r\n break\r\n }\r\n\r\n if (data) {\r\n const container = new DOMParser().parseFromString(data, 'text/xml')\r\n const rootEl = Array.from(container.getElementsByTagName('svg'))\r\n if (rootEl.length) {\r\n image = rootEl[0]\r\n image.setAttribute('overflow', 'visible')\r\n }\r\n }\r\n }\r\n\r\n image.setAttribute('x', numToAttr(dx))\r\n image.setAttribute('y', numToAttr(dy))\r\n image.setAttribute('width', `${numToAttr(dw)}px`)\r\n image.setAttribute('height', `${numToAttr(dh)}px`)\r\n\r\n this._element.appendChild(image)\r\n }\r\n\r\n private createColor({\r\n options,\r\n color,\r\n additionalRotation,\r\n x,\r\n y,\r\n height,\r\n width,\r\n name\r\n }: {\r\n options?: Gradient\r\n color?: string\r\n additionalRotation: number\r\n x: number\r\n y: number\r\n height: number\r\n width: number\r\n name: string\r\n }): void {\r\n const gradientSize = width > height ? width : height\r\n\r\n x -= this.options.dotsOptions.size\r\n y -= this.options.dotsOptions.size\r\n width += 2 * this.options.dotsOptions.size\r\n height += 2 * this.options.dotsOptions.size\r\n\r\n const rect = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n rect.setAttribute('x', numToAttr(x))\r\n rect.setAttribute('y', numToAttr(y))\r\n rect.setAttribute('height', numToAttr(height))\r\n rect.setAttribute('width', numToAttr(width))\r\n rect.setAttribute('clip-path', `url(#mask-${name})`)\r\n\r\n if (options) {\r\n let gradient: SVGElement\r\n if (options.type === GradientType.radial) {\r\n gradient = this.document.createElementNS('http://www.w3.org/2000/svg', 'radialGradient')\r\n gradient.setAttribute('id', name)\r\n gradient.setAttribute('gradientUnits', 'userSpaceOnUse')\r\n gradient.setAttribute('fx', numToAttr(x + width / 2))\r\n gradient.setAttribute('fy', numToAttr(y + height / 2))\r\n gradient.setAttribute('cx', numToAttr(x + width / 2))\r\n gradient.setAttribute('cy', numToAttr(y + height / 2))\r\n gradient.setAttribute('r', numToAttr(gradientSize / 2))\r\n } else {\r\n const rotation = ((options.rotation || 0) + additionalRotation) % (2 * Math.PI)\r\n const positiveRotation = (rotation + 2 * Math.PI) % (2 * Math.PI)\r\n let x0 = x + width / 2\r\n let y0 = y + height / 2\r\n let x1 = x + width / 2\r\n let y1 = y + height / 2\r\n\r\n if (\r\n (positiveRotation >= 0 && positiveRotation <= 0.25 * Math.PI) ||\r\n (positiveRotation > 1.75 * Math.PI && positiveRotation <= 2 * Math.PI)\r\n ) {\r\n x0 = x0 - width / 2\r\n y0 = y0 - (height / 2) * Math.tan(rotation)\r\n x1 = x1 + width / 2\r\n y1 = y1 + (height / 2) * Math.tan(rotation)\r\n } else if (positiveRotation > 0.25 * Math.PI && positiveRotation <= 0.75 * Math.PI) {\r\n y0 = y0 - height / 2\r\n x0 = x0 - width / 2 / Math.tan(rotation)\r\n y1 = y1 + height / 2\r\n x1 = x1 + width / 2 / Math.tan(rotation)\r\n } else if (positiveRotation > 0.75 * Math.PI && positiveRotation <= 1.25 * Math.PI) {\r\n x0 = x0 + width / 2\r\n y0 = y0 + (height / 2) * Math.tan(rotation)\r\n x1 = x1 - width / 2\r\n y1 = y1 - (height / 2) * Math.tan(rotation)\r\n } else if (positiveRotation > 1.25 * Math.PI && positiveRotation <= 1.75 * Math.PI) {\r\n y0 = y0 + height / 2\r\n x0 = x0 + width / 2 / Math.tan(rotation)\r\n y1 = y1 - height / 2\r\n x1 = x1 - width / 2 / Math.tan(rotation)\r\n }\r\n\r\n gradient = this.document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient')\r\n gradient.setAttribute('id', name)\r\n gradient.setAttribute('gradientUnits', 'userSpaceOnUse')\r\n gradient.setAttribute('x1', numToAttr(x0))\r\n gradient.setAttribute('y1', numToAttr(y0))\r\n gradient.setAttribute('x2', numToAttr(x1))\r\n gradient.setAttribute('y2', numToAttr(y1))\r\n }\r\n\r\n options.colorStops.forEach((stopCfg: { offset: number, color: string }) => {\r\n const stop = this.document.createElementNS('http://www.w3.org/2000/svg', 'stop')\r\n stop.setAttribute('offset', `${numToAttr(100 * stopCfg.offset)}%`)\r\n\r\n const parsed = parseColor(stopCfg.color)\r\n stop.setAttribute('stop-color', parsed.value)\r\n if (parsed.alpha < 1) stop.setAttribute('stop-opacity', parsed.alpha.toFixed(7))\r\n gradient.appendChild(stop)\r\n })\r\n\r\n rect.setAttribute('fill', `url(#${name})`)\r\n this.defs.appendChild(gradient)\r\n } else if (color) {\r\n const parsed = parseColor(color)\r\n rect.setAttribute('fill', parsed.value)\r\n if (parsed.alpha < 1) rect.setAttribute('opacity', parsed.alpha.toFixed(7))\r\n }\r\n\r\n this._element.appendChild(rect)\r\n }\r\n\r\n private createMask(id: string) {\r\n const mask = this.document.createElementNS('http://www.w3.org/2000/svg', 'clipPath')\r\n mask.setAttribute('id', id)\r\n mask.setAttribute('clipPathUnits', 'userSpaceOnUse')\r\n\r\n return mask\r\n }\r\n}\r\n","interface ImageSizeOptions {\r\n originalHeight: number\r\n originalWidth: number\r\n maxHiddenDots: number\r\n maxHiddenAxisDots?: number\r\n dotSize: number\r\n margin: number\r\n}\r\n\r\ninterface ImageSizeResult {\r\n height: number\r\n width: number\r\n hideYDots: number\r\n hideXDots: number\r\n}\r\n\r\nexport function calculateImageSize({\r\n originalHeight,\r\n originalWidth,\r\n maxHiddenDots,\r\n maxHiddenAxisDots,\r\n dotSize,\r\n margin\r\n}: ImageSizeOptions): ImageSizeResult {\r\n const hideDots = { x: 0, y: 0 }\r\n const imageSize = { x: 0, y: 0 }\r\n\r\n if (\r\n originalHeight <= 0 ||\r\n originalWidth <= 0 ||\r\n maxHiddenDots <= 0 ||\r\n dotSize <= 0 ||\r\n 4 * margin ** 2 > maxHiddenDots\r\n ) {\r\n return {\r\n height: 0,\r\n width: 0,\r\n hideYDots: 0,\r\n hideXDots: 0\r\n }\r\n }\r\n\r\n //If set, ensure maxHiddenAxisDots is odd and at least 1\r\n if (maxHiddenAxisDots && maxHiddenAxisDots % 2 == 0) maxHiddenAxisDots = Math.max(1, maxHiddenAxisDots - 1)\r\n\r\n //Determine the bigger and smaller image dimension\r\n const dimMax = Math.max(originalWidth, originalHeight)\r\n const dimMin = Math.min(originalWidth, originalHeight)\r\n\r\n //Find max image size along the bigger dimension\r\n let lower = 0\r\n let upper = (maxHiddenAxisDots || maxHiddenDots) - 2 * margin\r\n do {\r\n const newSize = lower + (upper - lower) / 2\r\n let dotsMax = Math.max(1, Math.ceil(newSize + 2 * margin))\r\n if (dotsMax % 2 == 0) dotsMax++\r\n let dotsMin = Math.max(1, Math.ceil((newSize * dimMin) / dimMax + 2 * margin))\r\n if (dotsMin % 2 == 0) dotsMin++\r\n\r\n if (dotsMax * dotsMin > maxHiddenDots) upper = newSize\r\n else lower = newSize\r\n } while (Math.abs(lower - upper) > 0.001)\r\n\r\n //Calculate how many dots the given size corresponds to\r\n const size = lower\r\n let hideMax = Math.max(1, Math.ceil(size + 2 * margin))\r\n if (hideMax % 2 == 0) hideMax++\r\n let hideMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin))\r\n if (hideMin % 2 == 0) hideMin++\r\n\r\n //Set hidden dots along bigger and smaller dimension to the right axis\r\n if (originalWidth > originalHeight) {\r\n hideDots.x = hideMax\r\n hideDots.y = hideMin\r\n } else {\r\n hideDots.x = hideMin\r\n hideDots.y = hideMax\r\n }\r\n\r\n //Fit image to the hidden dots\r\n const maxW = (hideDots.x - 2 * margin) * dotSize\r\n const maxH = (hideDots.y - 2 * margin) * dotSize\r\n imageSize.x = maxW\r\n imageSize.y = (maxW * originalHeight) / originalWidth\r\n if (imageSize.y > maxH) {\r\n imageSize.y = maxH\r\n imageSize.x = (maxH * originalWidth) / originalHeight\r\n }\r\n\r\n return {\r\n height: Math.round(imageSize.y + 2 * margin * dotSize),\r\n width: Math.round(imageSize.x + 2 * margin * dotSize),\r\n hideYDots: hideDots.y,\r\n hideXDots: hideDots.x\r\n }\r\n}\r\n","import { QRCodeMinimal } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\nimport { stringToBytes_UTF8 } from '@liquid-js/qrcode-generator/lib/text/stringToBytes_UTF8.js'\nimport { RecursivePartial } from '../types/helper.js'\nimport { mergeDeep } from '../utils/merge.js'\nimport { ImageMode, Options, ShapeType, defaultOptions, sanitizeOptions } from '../utils/options.js'\nimport { ErrorCorrectionPercents, getMode } from '../utils/qrcode.js'\nimport { QRSVG } from './qr-svg.js'\n\nObject.assign(QRCodeMinimal.stringToBytesFuncs, stringToBytes_UTF8)\n\nexport type ExtensionFunction = (svg: SVGSVGElement, options: Options) => void\n\nexport class QRCodeStyling {\n private options: Options\n private container?: HTMLElement\n private qr?: QRCodeMinimal\n private extension?: ExtensionFunction\n private svgDrawingPromise?: Promise<void>\n private qrSVG?: QRSVG\n\n get size() {\n if (this.qrSVG)\n return {\n width: this.qrSVG.width,\n height: this.qrSVG.height\n }\n return undefined\n }\n\n constructor(options?: RecursivePartial<Options>) {\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions\n this.update()\n }\n\n update(\n /** The same options as for initialization */\n options?: RecursivePartial<Options>\n ): void {\n if (this.container) this.container.innerHTML = ''\n\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options\n\n if (!this.options.data) {\n return\n }\n\n if (this.options.stringToBytesFuncs) {\n Object.assign(QRCodeMinimal.stringToBytesFuncs, this.options.stringToBytesFuncs)\n delete this.options.stringToBytesFuncs\n }\n\n this.qr = new QRCodeMinimal(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel)\n const mode = this.options.qrOptions.mode || getMode(this.options.data)\n this.qr.addData(this.options.data, mode)\n this.qr.make()\n\n this.setupSvg()\n\n this.append(this.container)\n }\n\n append(\n /** This container will be used for appending of the QR code */\n container?: HTMLElement\n ): void {\n if (!container) {\n return\n }\n\n if (this.qrSVG?.element) {\n container.appendChild(this.qrSVG.element)\n }\n\n this.container = container\n }\n\n /**\n * @deprecated Use options.plugins with a postProcess hook\n * @example\n *\n * ```js\n * const extension = (svg, options) => {\n * const { width, height } = options;\n * const size = Math.min(width, height);\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n * const borderAttributes = {\n * fill: \"none\",\n * x: (width - size + 40) / 2,\n * y: (height - size + 40) / 2,\n * width: size - 40,\n * height: size - 40,\n * stroke: \"black\",\n * \"stroke-width\": 40,\n * rx: 100\n * };\n * Object.keys(borderAttributes).forEach((attribute) => {\n * border.setAttribute(attribute, borderAttributes[attribute]);\n * });\n * svg.appendChild(border);\n * };\n * ```\n */\n applyExtension(\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\n extension: ExtensionFunction\n ): void {\n if (!extension) {\n throw new Error('Extension function should be defined.')\n }\n\n this.extension = extension\n this.update()\n }\n\n /**\n * @deprecated Use options.plugins with a postProcess hook\n */\n deleteExtension(): void {\n this.extension = undefined\n this.update()\n }\n\n async serialize(): Promise<string | undefined> {\n if (!this.qr) throw new Error('QR code is empty')\n\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\n this.setupSvg()\n }\n await this.svgDrawingPromise\n\n if (!this.qrSVG?.element) {\n return\n }\n\n const serializer = new XMLSerializer()\n let source = serializer.serializeToString(this.qrSVG.element)\n\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source\n return source\n }\n\n private setupSvg(): void {\n if (!this.qr) {\n return\n }\n let moduleCount = this.qr.getModuleCount()\n if (this.options.imageOptions.mode == ImageMode.background && this.options.shape != ShapeType.circle)\n moduleCount += 2\n let count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * moduleCount)\n if (count % 2 == 0) count -= 1\n let margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\n if (this.options.imageOptions.mode == ImageMode.background) margin += this.options.imageOptions.margin || 0\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin))\n this.qrSVG = new QRSVG({\n ...this.options,\n width: size,\n height: size,\n size,\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\n })\n\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\n if (!this.qrSVG?.element) return\n this.options.plugins?.forEach(plugin => plugin.postProcess?.(this.qrSVG!.element!, {\n ...this.options,\n width: size,\n height: size,\n size\n }))\n this.extension?.(this.qrSVG.element, {\n ...this.options,\n width: size,\n height: size,\n size\n })\n })\n }\n}\n","/**\r\n * @license -------------------------------------------------------------------\r\n * module: Lanczos Resampling\r\n * src: http://blog.yoz.sk/2010/11/lanczos-resampling-with-actionscript/\r\n * authors: Jozef Chutka\r\n * copyright: (c) 2009-2010 Jozef Chutka\r\n * license: MIT\r\n * -------------------------------------------------------------------\r\n * Permission is hereby granted, free of charge, to any person\r\n * obtaining a copy of this software and associated documentation\r\n * files (the \"Software\"), to deal in the Software without\r\n * restriction, including without limitation the rights to use,\r\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the\r\n * Software is furnished to do so, subject to the following\r\n * conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be\r\n * included in all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\n * OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\nexport type Kernel = (size: number, x: number) => number\r\n\r\nexport enum KernelType {\r\n Lanczos = 'lanczos',\r\n Linear = 'linear'\r\n}\r\n\r\nconst CACHE_PRECISION = 1000\r\n\r\nexport const Kernels: { [P in KernelType]: Kernel } = {\r\n [KernelType.Lanczos]: (size, x) => {\r\n if (x >= size || x <= -size) return 0\r\n if (x === 0) return 1\r\n const xpi = x * Math.PI\r\n return size * Math.sin(xpi) * Math.sin(xpi / size) / (xpi * xpi)\r\n },\r\n [KernelType.Linear]: (size, x) => {\r\n x = Math.abs(x)\r\n if (x <= 1) return (1 - x) * size\r\n return 0\r\n }\r\n}\r\n\r\nfunction createCache(kernel: Kernel, cachePrecision: number, filterSize: number) {\r\n const cache: { [key: number]: number } = {}\r\n const max = filterSize * filterSize * cachePrecision\r\n const iPrecision = 1.0 / cachePrecision\r\n for (let cacheKey = 0; cacheKey < max; cacheKey++) {\r\n const value = kernel(filterSize, Math.sqrt(cacheKey * iPrecision))\r\n cache[cacheKey] = value < 0 ? 0 : value\r\n }\r\n return cache\r\n}\r\n\r\nfunction baseLength(val: number | SVGAnimatedLength) {\r\n if (typeof val == 'object') {\r\n val.baseVal.convertToSpecifiedUnits(val.baseVal.SVG_LENGTHTYPE_PX)\r\n return val.baseVal.value\r\n }\r\n return val\r\n}\r\n\r\nexport function lanczosResize(canvas: HTMLCanvasElement | OffscreenCanvas, opt: {\r\n width: number\r\n height: number\r\n}, kernel = Kernels[KernelType.Lanczos]): ImageData {\r\n const cwidth = baseLength((canvas as any).width)\r\n const cheight = baseLength((canvas as any).height)\r\n const ctx = canvas.getContext('2d')!\r\n\r\n const { width, height } = opt\r\n\r\n const src = ctx.getImageData(0, 0, cwidth, cheight)\r\n let dst = ctx.createImageData(width, height)\r\n\r\n // No need to resize\r\n if (src.data.length == dst.data.length) {\r\n dst = src\r\n } else {\r\n const sdata = src.data\r\n const ddata = dst.data\r\n\r\n const values = []\r\n const sX = width / cwidth\r\n const sY = height / cheight\r\n\r\n let filterSize = 3\r\n if (sX > 0.01 && sY > 0.01 && sX < 1 && sY < 1) {\r\n if (sX <= 0.2 || sY <= 0.2) {\r\n filterSize = 2\r\n } else if (sX <= 0.05 || sY <= 0.05) {\r\n filterSize = 1\r\n } else {\r\n filterSize = 3\r\n }\r\n }\r\n const sw1 = cwidth - 1\r\n const sh1 = cheight - 1\r\n const isx = 1.0 / sX\r\n const isy = 1.0 / sX\r\n const cw = 1.0 / width\r\n const ch = 1.0 / height\r\n const csx = Math.min(1, sX) * Math.min(1, sX)\r\n const csy = Math.min(1, sX) * Math.min(1, sX)\r\n const cachePrecision = CACHE_PRECISION\r\n // filterSize = filterSize || FILTER_SIZE\r\n const cache = createCache(kernel, cachePrecision, filterSize)\r\n let y = height\r\n\r\n while (y--) {\r\n const sourcePixelY = (y + 0.5) * isy\r\n let y1b = sourcePixelY - filterSize\r\n if (y1b < 0) y1b = 0\r\n let y1e = sourcePixelY + filterSize\r\n const y1et = y1e\r\n if (y1e != y1et) y1e = y1et + 1\r\n if (y1e > sh1) y1e = sh1\r\n const cy = y * ch - sourcePixelY\r\n const y3 = y * width\r\n let x = width\r\n while (x--) {\r\n const sourcePixelX = (x + 0.5) * isx\r\n let x1b = sourcePixelX - filterSize\r\n if (x1b < 0) x1b = 0\r\n let x1e = sourcePixelX + filterSize\r\n const x1et = x1e\r\n if (x1e != x1et) x1e = x1et + 1\r\n if (x1e > sw1) x1e = sw1\r\n const cx = x * cw - sourcePixelX\r\n let i = 0\r\n let total = 0\r\n for (let y1 = y1b >> 0; y1 <= y1e; y1++) {\r\n const distanceY = (y1 + cy) * (y1 + cy) * csy\r\n for (let x1 = x1b >> 0; x1 <= x1e; x1++) {\r\n total += values[i++] = cache[((x1 + cx) * (x1 + cx) * csx + distanceY) * cachePrecision >> 0] || 0\r\n }\r\n }\r\n total = 1.0 / total\r\n i = 0\r\n let a = 0\r\n let r = 0\r\n let g = 0\r\n let b = 0\r\n for (let y1 = y1b >> 0; y1 <= y1e; y1++) {\r\n const y2 = y1 * cwidth\r\n for (let x1 = x1b >> 0; x1 <= x1e; x1++) {\r\n const value = values[i++] * total\r\n const idxi = ((y2 + x1) >> 0) * 4\r\n r += sdata[idxi] * value\r\n g += sdata[idxi + 1] * value\r\n b += sdata[idxi + 2] * value\r\n a += sdata[idxi + 3] * value\r\n }\r\n }\r\n const idx = ((x + y3) >> 0) * 4\r\n ddata[idx] = r\r\n ddata[idx + 1] = g\r\n ddata[idx + 2] = b\r\n ddata[idx + 3] = a\r\n }\r\n }\r\n }\r\n\r\n return dst\r\n}\r\n","import { QRCodeStyling } from '../core/qr-code-styling.js'\r\nimport { RecursivePartial } from '../types/helper.js'\r\nimport { CanvasOptions, defaultCanvasOptions, sanitizeCanvasOptions } from '../utils/canvas-options.js'\r\nimport { mergeDeep } from '../utils/merge.js'\r\nimport { lanczosResize } from './resize.js'\r\n\r\nexport enum FileExtension {\r\n svg = 'svg',\r\n png = 'png',\r\n jpeg = 'jpeg',\r\n webp = 'webp'\r\n}\r\n\r\nexport function drawToCanvas(\r\n qrCode: QRCodeStyling,\r\n options?: RecursivePartial<CanvasOptions>\r\n): { canvas: HTMLCanvasElement, canvasDrawingPromise: Promise<void> | undefined } | undefined {\r\n const { width, height, margin } = options\r\n ? sanitizeCanvasOptions(mergeDeep(defaultCanvasOptions, options) as CanvasOptions)\r\n : defaultCanvasOptions\r\n\r\n const canvas = document.createElement('canvas')\r\n canvas.width = width\r\n canvas.height = height\r\n\r\n const size = Math.min(width, height) - 2 * margin\r\n\r\n const canvasDrawingPromise = qrCode.serialize().then((xml) => {\r\n if (!xml) return\r\n const viewBox = xml.match(/viewBox=\"([^\"]+)\"/i)![1]\r\n const svg64 = btoa(xml)\r\n const image64 = 'data:image/svg+xml;base64,' + svg64\r\n const image = new Image()\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n image.onload = (): void => {\r\n // Ensure pixel-perfect rendering of SVG to avoid artefact, then downscale to requested size\r\n const aaFactor = Math.ceil((2 * size) / Math.min(image.width, image.height))\r\n const [x, y, w, h] = viewBox.split(/\\s+/g).map(parseFloat).map(v => v * aaFactor)\r\n const dx = ((x % 1) + 1) % 1\r\n const dy = ((y % 1) + 1) % 1\r\n let aaCanvas: HTMLCanvasElement | OffscreenCanvas\r\n try {\r\n aaCanvas = new OffscreenCanvas(Math.ceil(w + dx + 2), Math.ceil(h + dy + 2))\r\n } catch (_) {\r\n // Fallback to regular canvas element\r\n aaCanvas = document.createElement('canvas')\r\n aaCanvas.width = Math.ceil(w + dx + 2)\r\n aaCanvas.height = Math.ceil(h + dy + 2)\r\n }\r\n aaCanvas.getContext('2d')?.drawImage(image, dx + 1, dy + 1, w, h)\r\n const imgData = lanczosResize(aaCanvas, {\r\n width: width - 2 * margin,\r\n height: height - 2 * margin\r\n })\r\n\r\n canvas?.getContext('2d')?.putImageData(imgData, margin, margin)\r\n resolve()\r\n }\r\n image.onerror = image.onabort = reject\r\n\r\n image.src = image64\r\n })\r\n })\r\n\r\n return { canvas, canvasDrawingPromise }\r\n}\r\n\r\nexport async function download(\r\n qrCode: QRCodeStyling,\r\n downloadOptions?: { name?: string, extension: `${FileExtension}` },\r\n options?: RecursivePartial<CanvasOptions>\r\n): Promise<void> {\r\n let extension: `${FileExtension}` = FileExtension.png\r\n let name = 'qr'\r\n\r\n if (downloadOptions) {\r\n if (downloadOptions.name) {\r\n name = downloadOptions.name\r\n }\r\n if (downloadOptions.extension) {\r\n extension = downloadOptions.extension\r\n }\r\n }\r\n\r\n if (extension.toLowerCase() === 'svg') {\r\n const source = await qrCode.serialize()\r\n if (!source) return\r\n const url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(source)\r\n downloadURI(url, `${name}.svg`)\r\n } else {\r\n const res = drawToCanvas(qrCode, options)\r\n if (!res) return\r\n const { canvas, canvasDrawingPromise } = res\r\n await canvasDrawingPromise\r\n const url = canvas.toDataURL(`image/${extension}`)\r\n downloadURI(url, `${name}.${extension}`)\r\n }\r\n}\r\n\r\nexport function downloadURI(uri: string, name: string): void {\r\n const link = document.createElement('a')\r\n link.download = name\r\n link.href = uri\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n}\r\n","import { DOMImplementation, DOMParser, XMLSerializer } from '@xmldom/xmldom'\r\nimport { fileTypeFromBuffer } from 'file-type'\r\nimport sharp from 'sharp'\r\nimport { QRCodeStyling as _QRCodeStyling } from './core/qr-code-styling.js'\r\nimport type * as _browserUtils from './tools/browser-utils.js'\r\nimport { RecursivePartial } from './types/helper.js'\r\nimport { Options } from './utils/options.js'\r\nexport { ErrorCorrectionLevel, Mode, TypeNumber } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nexport { type ExtensionFunction } from './core/qr-code-styling.js'\r\nexport { FileExtension } from './tools/browser-utils.js'\r\nexport { type RecursivePartial } from './types/helper.js'\r\nexport { type CanvasOptions } from './utils/canvas-options.js'\r\nexport { GradientType, type Gradient } from './utils/gradient.js'\r\nexport { CornerDotType, CornerSquareType, DotType, ImageMode, ShapeType, type Options, type Plugin } from './utils/options.js'\r\nexport { ErrorCorrectionPercents } from './utils/qrcode.js'\r\n\r\nexport const browserUtils: typeof _browserUtils | undefined = undefined\r\n\r\nexport class QRCodeStyling extends _QRCodeStyling {\r\n constructor(options: RecursivePartial<Options>) {\r\n const dom = new DOMImplementation().createDocument(null, '')\r\n const imageCache = new Map<string, Promise<{ contentType?: string | null, data: Buffer }>>()\r\n\r\n const loadImage = async (url: string | Buffer | Blob) => {\r\n if (typeof url == 'string') {\r\n let pr = imageCache.get(url)\r\n if (pr) return pr\r\n pr = fetch(url).then((res) =>\r\n res\r\n .arrayBuffer()\r\n .then((buff) => Buffer.from(buff))\r\n .then(async (data) => ({\r\n contentType: res.headers.get('Content-Type') || (await fileTypeFromBuffer(data).then((r) => r?.mime)),\r\n data\r\n }))\r\n )\r\n imageCache.set(url, pr)\r\n return pr\r\n } else {\r\n const buff = Buffer.from(url as Buffer)\r\n const mime = await fileTypeFromBuffer(buff).then((r) => r?.mime)\r\n return {\r\n contentType: mime,\r\n data: buff\r\n }\r\n }\r\n }\r\n\r\n global.XMLSerializer = XMLSerializer as any\r\n\r\n global.DOMParser = DOMParser as any\r\n\r\n super({\r\n ...options,\r\n\r\n document: options.document || (dom as any),\r\n imageTools: options.imageTools || {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\r\n if (typeof url == 'string' && url.startsWith('data:')) return Promise.resolve(url)\r\n return loadImage(url).then(\r\n ({ contentType, data }) =>\r\n `data:${contentType?.replace('application/xml', 'image/svg+xml')};base64,${data.toString('base64')}`\r\n )\r\n },\r\n getSize: async (src: string | Blob | Buffer): Promise<{ width: number, height: number }> => {\r\n const { data } = Buffer.isBuffer(options.image) ? { data: options.image } : await loadImage(src)\r\n const meta = await sharp(data).metadata()\r\n return {\r\n width: meta.width!,\r\n\r\n height: meta.height!\r\n }\r\n }\r\n }\r\n })\r\n }\r\n}\r\n"],"names":["isObject","obj","isArray","target","sources","length","shift","undefined","source","Object","keys","forEach","key","Array","targetValue","sourceValue","mergeDeep","GradientType","DotType","CornerDotType","CornerSquareType","ShapeType","ImageMode","sanitizeGradient","gradient","newGradient","colorStops","Error","rotation","Number","map","colorStop","offset","defaultOptions","document","shape","square","width","height","size","data","qrOptions","typeNumber","TypeNumber","mode","errorCorrectionLevel","ErrorCorrectionLevel","Q","imageOptions","center","imageSize","crossOrigin","margin","fill","color","dotsOptions","type","sanitizeOptions","options","newOptions","Math","min","overlay","round","max","cornersSquareOptions","cornersDotOptions","backgroundOptions","ErrorCorrectionPercents","L","M","H","rx","numToAttr","value","toFixed","replace","strings","values","reduce","t","v","i","p","trim","rotateFigure","draw","args","x","y","element","el","setAttribute","PI","cx","cy","DotElements","dot","createElementNS","sideRounded","svgPath","cornerRounded","cornerExtraRounded","classyDot","wave","a1","a2","c23x","sin","c23y","cos","c31x","c31y","heart","scalePath","path","move","toUpperCase","join","rounded","classy","dotSize","inpoint","star","spikes","outerRadius","innerRadius","angle","_","radius","weave","thickness","notch","blob","corners","parts","l","bl","push","br","tr","tl","qrCornerDotFigures","extraRounded","outpoint","pentagon","hexagon","diamond","args2","SquareElements","centerCircle","circleRadius","qrCornerSquareFigures","roundedCorners","getNeighbor","corner","end","leftNeighbor","rightNeighbor","topNeighbor","bottomNeighbor","neighborsCount","stripe","endpoint","qrDotFigures","randomDot","getPRandom","rnd","random","randomFactor","verticalLine","stripes","horizontalLine","classyRounded","smallSquare","tinySquare","zebraVertical","zebraHorizontal","blocksVertical","_args","_params","blocksHorizontal","blobs","r","b","soft","getQrDotFigure","plugins","defaultDraw","drawPluginDot","plugin","drawDot","drawPlugin","browserImageTools","toDataURL","url","startsWith","Promise","resolve","reject","xhr","XMLHttpRequest","onload","reader","FileReader","onloadend","result","readAsDataURL","response","onerror","onabort","ontimeout","open","responseType","send","getSize","src","image","Image","then","catch","parseColor","cstr","m","alpha","toLowerCase","base","slice","parseInt","exec","dims","split","parseFloat","pop","toString","padStart","getRng","matrix","j","match","seed","ix","xOffset","yOffset","imul","squareMask","cornerSquareTypes","Set","dotMask","cornerDotTypes","QRSVG","_element","_fakeMatrix","this","defs","backgroundMask","dotsMask","lightDotsMask","qr","imageTools","constructor","appendChild","drawQR","getModuleCount","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","background","maxSize","alignment","QRUtil","getPatternPosition","maxHiddenDots","floor","coverLevel","calculateImageSize","originalHeight","originalWidth","maxHiddenAxisDots","hideDots","dimMax","dimMin","lower","upper","newSize","dotsMax","ceil","dotsMin","abs","hideMax","hideMin","maxW","maxH","drawBackground","drawImage","drawDots","drawCorners","createColor","gradientOptions","additionalRotation","name","createMask","filter","additionalDots","fakeCount","circle","beginning","ii","jj","isDark","sqrt","typeNr","iAlign","find","jAlign","fakeBeginning","colorCount","cornersSquareSize","cornersDotSize","column","row","cornersSquareMask","cornersDotMask","squareArgs","drawCornerSquare","drawPluginCornerSquare","val","pluinCornerSquare","cornerFill","cornerElement","has","dotArgs","drawPluginCornerDot","drawCornerDot","pluinCornerDot","isCornerDotType","getQrCornerDotFigure","dx","dy","imageUrl","setAttributeNS","substring","indexOf","encoding","atob","Buffer","from","container","parseFromString","DOMParser","rootEl","getElementsByTagName","dw","dh","gradientSize","rect","radial","x0","y0","x1","y1","positiveRotation","tan","stopCfg","stop","parsed","id","mask","assign","QRCodeMinimal","stringToBytesFuncs","stringToBytes_UTF8","extension","svgDrawingPromise","qrSVG","update","innerHTML","getMode","test","Mode","numeric","alphanumeric","unicode","byte","addData","make","setupSvg","append","applyExtension","deleteExtension","serialize","XMLSerializer","serializeToString","moduleCount","postProcess","KernelType","FileExtension","browserUtils","Lanczos","Linear","QRCodeStyling","_QRCodeStyling","dom","createDocument","DOMImplementation","imageCache","Map","loadImage","pr","get","fetch","res","arrayBuffer","buff","async","contentType","headers","fileTypeFromBuffer","mime","set","global","super","isBuffer","meta","sharp","metadata"],"mappings":"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"}