@liquid-js/qr-code-styling 5.0.0-2 → 5.0.0-3

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.ts","../src/tools/browser-image-tools.ts","../src/utils/color.ts","../src/core/qr-svg.ts","../src/utils/image.ts","../src/core/qr-code-styling.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 { 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}\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 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 /** @ignore */\r\n width: number\r\n /** @ignore */\r\n height: 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}\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 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) {\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","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) => {\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 } = {}) => {\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 } = {}) => {\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) => {\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) => {\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 - left bottom and right top corners are rounded\r\n cornersRounded: (args: BasicFigureDrawArgs) => {\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 wave: (args: BasicFigureDrawArgs) => {\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) => {\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) => {\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) => {\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) => {\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 } = {}) => {\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) => {\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}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { CornerDotType } 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","import { BasicFigureDrawArgs } from '../types/helper.js'\r\nimport { svgPath } from '../utils/svg.js'\r\n\r\nexport const SquareElements = {\r\n dot: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n square: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n extraRounded: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n classy: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n inpoint: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n centerCircle: (args: BasicFigureDrawArgs) => {\r\n const { x, y, size } = 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] as const\r\n },\r\n cornerCut: (args: BasicFigureDrawArgs) => {\r\n const { x, y, size } = args\r\n\r\n const dotSize = size / 8\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 `\r\n M ${x} ${y}\r\n L ${x + size} ${y}\r\n L ${x + size} ${y + size - dotSize}\r\n Q ${x + size} ${y + size} ${x + size - dotSize} ${y + size}\r\n L ${x + dotSize} ${y + size}\r\n Q ${x} ${y + size - dotSize} ${x} ${y + size - dotSize}\r\n Z\r\n M ${x + dotSize} ${y + dotSize}\r\n L ${x + size - dotSize} ${y + dotSize}\r\n L ${x + size - dotSize} ${y + size - dotSize}\r\n L ${x + dotSize} ${y + size - dotSize}\r\n Z\r\n `\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] as const\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { CornerSquareType } 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 [SVGPathElement, SVGPathElement] } = {\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\n","import { DrawArgs } from '../types/helper.js'\r\nimport { DotType } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\nconst compoundDots = {\r\n rounded: ({ 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 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 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 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.cornersRounded\r\n })\r\n } else if (!leftNeighbor && !topNeighbor) {\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 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 line: ({ x, y, size, document, getNeighbor }: DrawArgs, { stripe = size, rotation = 0 } = {}) => {\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 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 rotation += Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: args => DotElements.sideRounded(args, { height: stripe })\r\n })\r\n } else if (bottomNeighbor && !topNeighbor) {\r\n rotation -= Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: args => DotElements.sideRounded(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: _ => DotElements.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}\r\n\r\nconst qrDotFigures: { [type in DotType]: (args: DrawArgs) => SVGElement } = {\r\n [DotType.dot]: args => DotElements.dot(args),\r\n [DotType.randomDot]: ({ size, ...args }) => {\r\n const randomFactor = Math.random() * (1 - 0.75) + 0.75\r\n return DotElements.dot({\r\n ...args,\r\n size: size * randomFactor\r\n })\r\n },\r\n [DotType.rounded]: args => compoundDots.rounded(args),\r\n [DotType.extraRounded]: args => compoundDots.rounded(args, { corner: DotElements.cornerExtraRounded }),\r\n [DotType.verticalLine]: args => compoundDots.line(args),\r\n [DotType.horizontalLine]: ({ getNeighbor, ...args }) => compoundDots.line({\r\n ...args,\r\n getNeighbor: getNeighbor ? (x, y) => getNeighbor(y, x) : undefined\r\n }, { rotation: -Math.PI / 2 }),\r\n [DotType.classy]: args => compoundDots.classy(args),\r\n [DotType.classyRounded]: args => compoundDots.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 => compoundDots.rounded(args, { corner: DotElements.cornerExtraRounded, end: DotElements.wave }),\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 => compoundDots.line(args, { stripe: args.size * 0.8 }),\r\n [DotType.zebraHorizontal]: ({ getNeighbor, ...args }) => compoundDots.line({\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}\r\n\r\nexport function getQrDotFigure(type: `${DotType}`) {\r\n return qrDotFigures[type] || qrDotFigures[DotType.square]\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","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 { getQrCornerDotFigure } from '../figures/corner-dot.js'\r\nimport { 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\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: SVGElement\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 backgroundMaskGroup?: SVGElement\r\n\r\n private dotsMask?: SVGElement\r\n private dotsMaskGroup?: SVGElement\r\n\r\n private lightDotsMask?: SVGElement\r\n private lightDotsMaskGroup?: 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 | '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 > & { 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 width = numToAttr(options.width)\r\n const height = numToAttr(options.height)\r\n this._element.setAttribute('width', width)\r\n this._element.setAttribute('height', height)\r\n this._element.setAttribute('viewBox', `0 0 ${width} ${height}`)\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.width\r\n }\r\n\r\n get height(): number {\r\n return this.options.height\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 maxWidth = (this.options.width - 2 * margin * dotSize) * imageOptions.imageSize\r\n const maxHeight = (this.options.height - 2 * margin * dotSize) * imageOptions.imageSize\r\n let { width, height } = size\r\n\r\n height = (height / width) * maxWidth\r\n width = maxWidth\r\n\r\n if (height > maxHeight) {\r\n width = (width / height) * maxHeight\r\n height = maxHeight\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.height,\r\n width: options.width,\r\n name: 'background-color'\r\n })\r\n\r\n const size = Math.min(options.width, options.height)\r\n const element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n [this.backgroundMask, this.backgroundMaskGroup] = this.createMask('mask-background-color')\r\n this.defs.appendChild(this.backgroundMask)\r\n\r\n element.setAttribute('x', numToAttr((options.width - size) / 2))\r\n element.setAttribute('y', numToAttr((options.height - size) / 2))\r\n element.setAttribute('width', numToAttr(size))\r\n element.setAttribute('height', numToAttr(size))\r\n element.setAttribute('rx', numToAttr((size / 2) * (options.backgroundOptions.round || 0)))\r\n\r\n this.backgroundMaskGroup.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.width || count > options.height) {\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 minSize = Math.min(options.width, options.height)\r\n if (options.imageOptions.mode == ImageMode.background) minSize -= 2 * dotSize * (options.imageOptions.margin || 0)\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2)\r\n let draw = getQrDotFigure(options.dotsOptions.type);\r\n\r\n [this.dotsMask, this.dotsMaskGroup] = 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.lightDotsMaskGroup] = 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((minSize / 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 xFakeBeginning = xBeginning - additionalDots * dotSize\r\n const yFakeBeginning = yBeginning - additionalDots * dotSize\r\n const colorX = xFakeBeginning\r\n const colorY = yFakeBeginning\r\n const colorCount = count + additionalDots * 2\r\n const fakeMatrix: Array<Array<boolean | undefined>> = new Array(fakeCount)\r\n const center = Math.floor(fakeCount / 2)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n 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)) fakeMatrix[i][j] = undefined\r\n else 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 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 fakeMatrix[i][j] = undefined\r\n else 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 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 (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 (!fakeMatrix[i][j]) {\r\n if (this.lightDotsMask) {\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => fakeMatrix[i + xOffset]?.[j + yOffset] === false\r\n }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (this.dotsMaskGroup) {\r\n this.dotsMaskGroup.appendChild(draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => fakeMatrix[i + xOffset]?.[j + yOffset] === true\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: colorX,\r\n y: colorY,\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: colorX,\r\n y: colorY,\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 xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - 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 = xBeginning + column * dotSize * (count - 7)\r\n const y = yBeginning + row * dotSize * (count - 7)\r\n let cornersSquareMask = this.dotsMask\r\n let cornersSquareMaskGroup = this.dotsMaskGroup\r\n let cornersDotMask = this.dotsMask\r\n let cornersDotMaskGroup = this.dotsMaskGroup\r\n\r\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\r\n [cornersSquareMask, cornersSquareMaskGroup] = this.createMask(`mask-corners-square-color-${column}-${row}`)\r\n this.defs.appendChild(cornersSquareMask)\r\n cornersDotMask = cornersSquareMask\r\n cornersDotMaskGroup = cornersSquareMaskGroup\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 if (isCornerSquareType(options.cornersSquareOptions?.type)) {\r\n const draw = getQrCornerSquareFigure(options.cornersSquareOptions.type)\r\n\r\n const [cornerElement, cornerFill] = draw({\r\n x,\r\n y,\r\n size: cornersSquareSize,\r\n document: this.options.document,\r\n rotation\r\n })\r\n\r\n if (cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(cornerElement)\r\n }\r\n\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(cornerFill)\r\n }\r\n } else {\r\n const draw = getQrDotFigure(options.cornersSquareOptions?.type || options.dotsOptions.type)\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.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.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 }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.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 }))\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.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.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 }))\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\r\n [cornersDotMask, cornersDotMaskGroup] = 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 if (isCornerDotType(options.cornersDotOptions?.type)) {\r\n const draw = getQrCornerDotFigure(options.cornersDotOptions.type)\r\n\r\n if (cornersDotMaskGroup) {\r\n cornersDotMaskGroup.appendChild(draw({\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 }\r\n } else {\r\n const draw = getQrDotFigure(options.cornersDotOptions?.type || options.dotsOptions.type)\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 (cornersDotMaskGroup) {\r\n cornersDotMaskGroup.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 }))\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 xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - 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 = xBeginning + margin + (count * dotSize - width) / 2\r\n const dy = yBeginning + 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('style', `mask: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 options = this.options\r\n\r\n const mask = this.document.createElementNS('http://www.w3.org/2000/svg', 'mask')\r\n mask.setAttribute('id', id)\r\n mask.setAttribute('maskUnits', 'userSpaceOnUse')\r\n mask.setAttribute('x', '0')\r\n mask.setAttribute('y', '0')\r\n mask.setAttribute('width', numToAttr(options.width))\r\n mask.setAttribute('height', numToAttr(options.height))\r\n\r\n const group = this.document.createElementNS('http://www.w3.org/2000/svg', 'g')\r\n group.setAttribute('fill', '#fff')\r\n mask.appendChild(group)\r\n\r\n return [mask, group]\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'\r\nimport { stringToBytes_UTF8 } from '@liquid-js/qrcode-generator/lib/text/stringToBytes_UTF8.js'\r\nimport { RecursivePartial } from '../types/helper.js'\r\nimport { mergeDeep } from '../utils/merge.js'\r\nimport { ImageMode, Options, ShapeType, defaultOptions, sanitizeOptions } from '../utils/options.js'\r\nimport { ErrorCorrectionPercents, getMode } from '../utils/qrcode.js'\r\nimport { QRSVG } from './qr-svg.js'\r\n\r\nObject.assign(QRCodeMinimal.stringToBytesFuncs, stringToBytes_UTF8)\r\n\r\nexport type ExtensionFunction = (svg: SVGElement, options: RecursivePartial<Options>) => void\r\n\r\nexport class QRCodeStyling {\r\n private options: Options\r\n private container?: HTMLElement\r\n private qr?: QRCodeMinimal\r\n private extension?: ExtensionFunction\r\n private svgDrawingPromise?: Promise<void>\r\n private qrSVG?: QRSVG\r\n\r\n get size() {\r\n if (this.qrSVG)\r\n return {\r\n width: this.qrSVG.width,\r\n height: this.qrSVG.height\r\n }\r\n return undefined\r\n }\r\n\r\n constructor(options?: RecursivePartial<Options>) {\r\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions\r\n this.update()\r\n }\r\n\r\n update(\r\n /** The same options as for initialization */\r\n options?: RecursivePartial<Options>\r\n ): void {\r\n if (this.container) this.container.innerHTML = ''\r\n\r\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options\r\n\r\n if (!this.options.data) {\r\n return\r\n }\r\n\r\n if (this.options.stringToBytesFuncs) {\r\n Object.assign(QRCodeMinimal.stringToBytesFuncs, this.options.stringToBytesFuncs)\r\n delete this.options.stringToBytesFuncs\r\n }\r\n\r\n this.qr = new QRCodeMinimal(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel)\r\n const mode = this.options.qrOptions.mode || getMode(this.options.data)\r\n this.qr.addData(this.options.data, mode)\r\n this.qr.make()\r\n\r\n this.setupSvg()\r\n\r\n this.append(this.container)\r\n }\r\n\r\n append(\r\n /** This container will be used for appending of the QR code */\r\n container?: HTMLElement\r\n ): void {\r\n if (!container) {\r\n return\r\n }\r\n\r\n if (this.qrSVG?.element) {\r\n container.appendChild(this.qrSVG.element)\r\n }\r\n\r\n this.container = container\r\n }\r\n\r\n /**\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * const extension = (svg, options) => {\r\n * const { width, height } = options;\r\n * const size = Math.min(width, height);\r\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n * const borderAttributes = {\r\n * fill: \"none\",\r\n * x: (width - size + 40) / 2,\r\n * y: (height - size + 40) / 2,\r\n * width: size - 40,\r\n * height: size - 40,\r\n * stroke: \"black\",\r\n * \"stroke-width\": 40,\r\n * rx: 100\r\n * };\r\n * Object.keys(borderAttributes).forEach((attribute) => {\r\n * border.setAttribute(attribute, borderAttributes[attribute]);\r\n * });\r\n * svg.appendChild(border);\r\n * };\r\n * ```\r\n */\r\n applyExtension(\r\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\r\n extension: ExtensionFunction\r\n ): void {\r\n if (!extension) {\r\n throw new Error('Extension function should be defined.')\r\n }\r\n\r\n this.extension = extension\r\n this.update()\r\n }\r\n\r\n deleteExtension(): void {\r\n this.extension = undefined\r\n this.update()\r\n }\r\n\r\n async serialize(): Promise<string | undefined> {\r\n if (!this.qr) throw new Error('QR code is empty')\r\n\r\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\r\n this.setupSvg()\r\n }\r\n await this.svgDrawingPromise\r\n\r\n if (!this.qrSVG?.element) {\r\n return\r\n }\r\n\r\n const serializer = new XMLSerializer()\r\n let source = serializer.serializeToString(this.qrSVG.element)\r\n\r\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source\r\n return source\r\n }\r\n\r\n private setupSvg(): void {\r\n if (!this.qr) {\r\n return\r\n }\r\n let moduleCount = this.qr.getModuleCount()\r\n if (this.options.imageOptions.mode == ImageMode.background && this.options.shape != ShapeType.circle)\r\n moduleCount += 2\r\n let count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * moduleCount)\r\n if (count % 2 == 0) count -= 1\r\n let margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n if (this.options.imageOptions.mode == ImageMode.background) margin += this.options.imageOptions.margin || 0\r\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin))\r\n this.qrSVG = new QRSVG({\r\n ...this.options,\r\n width: size,\r\n height: size,\r\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\r\n })\r\n\r\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\r\n if (!this.qrSVG?.element) return\r\n this.extension?.(this.qrSVG.element, {\r\n ...this.options,\r\n width: size,\r\n height: size\r\n })\r\n })\r\n }\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\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 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 let aaCanvas: HTMLCanvasElement | OffscreenCanvas\r\n try {\r\n aaCanvas = new OffscreenCanvas(image.width * aaFactor, image.height * aaFactor)\r\n } catch (_) {\r\n // Fallback to regular canvas element\r\n aaCanvas = document.createElement('canvas')\r\n aaCanvas.width = image.width * aaFactor\r\n aaCanvas.height = image.height * aaFactor\r\n }\r\n aaCanvas.getContext('2d')?.drawImage(image, 0, 0, aaCanvas.width, aaCanvas.height)\r\n\r\n canvas?.getContext('2d')?.drawImage(aaCanvas, (width - size) / 2, (height - size) / 2, size, size)\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 } 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":["obj","ErrorCorrectionLevel","TypeNumber","Mode","QRCodeMinimal","sharp","fileTypeFromBuffer","DOMImplementation","XMLSerializer$1","DOMParser$1","isObject","Array","isArray","target","sources","length","shift","undefined","source","Object","keys","forEach","key","targetValue","sourceValue","mergeDeep","GradientType","DotType","CornerDotType","CornerSquareType","ShapeType","ImageMode","sanitizeGradient","gradient","colorStops","newGradient","Error","rotation","Number","map","colorStop","offset","radial","linear","dot","randomDot","rounded","extraRounded","verticalLine","horizontalLine","classy","classyRounded","square","smallSquare","tinySquare","diamond","wave","heart","star","weave","pentagon","hexagon","zebraHorizontal","zebraVertical","inpoint","outpoint","centerCircle","circle","center","overlay","background","defaultOptions","document","shape","width","height","data","qrOptions","typeNumber","mode","errorCorrectionLevel","Q","imageOptions","imageSize","crossOrigin","margin","fill","color","dotsOptions","type","size","sanitizeOptions","options","newOptions","Math","min","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","createElementNS","sideRounded","svgPath","cornerRounded","cornerExtraRounded","cornersRounded","a1","a2","c23x","s2","sin","c23y","s1","cos","c31x","c31y","scalePath","path","move","toUpperCase","join","dotSize","spikes","outerRadius","innerRadius","angle","_","radius","notch","thickness","qrCornerDotFigures","args2","SquareElements","circleRadius","cornerCut","qrCornerSquareFigures","compoundDots","getNeighbor","corner","end","leftNeighbor","rightNeighbor","topNeighbor","neighborsCount","bottomNeighbor","stripe","qrDotFigures","random","getQrDotFigure","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","parts","alpha","toLowerCase","base","slice","parseInt","m","exec","split","parseFloat","dims","pop","toString","padStart","squareMask","cornerSquareTypes","Set","dotMask","cornerDotTypes","QRSVG","_element","this","defs","backgroundMask","backgroundMaskGroup","dotsMask","dotsMaskGroup","lightDotsMask","lightDotsMaskGroup","qr","imageTools","constructor","appendChild","drawQR","getModuleCount","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","maxWidth","maxHeight","alignment","QRUtil","getPatternPosition","calculateImageSize","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dimMax","dimMin","lower","upper","newSize","dotsMax","ceil","dotsMin","abs","hideMax","hideMin","maxW","maxH","floor","coverLevel","drawBackground","drawImage","drawDots","j","drawCorners","createColor","additionalRotation","name","createMask","filter","minSize","additionalDots","fakeCount","xBeginning","yBeginning","fakeMatrix","ii","jj","isDark","sqrt","iAlign","find","jAlign","xFakeBeginning","yFakeBeginning","xOffset","yOffset","colorCount","cornersSquareSize","cornersDotSize","column","row","cornersSquareMask","cornersSquareMaskGroup","val","cornersDotMask","cornersDotMaskGroup","has","cornerElement","cornerFill","isCornerDotType","dx","dy","imageUrl","setAttributeNS","substring","indexOf","encoding","atob","Buffer","from","container","parseFromString","DOMParser","rootEl","getElementsByTagName","dw","dh","gradientSize","rect","x0","y0","positiveRotation","tan","x1","y1","stopCfg","stop","parsed","id","mask","group","assign","stringToBytesFuncs","stringToBytes_UTF8","extension","svgDrawingPromise","qrSVG","update","innerHTML","getMode","test","numeric","alphanumeric","unicode","byte","addData","make","setupSvg","append","applyExtension","deleteExtension","serialize","serializeToString","XMLSerializer","moduleCount","FileExtension","svg","png","jpeg","webp","QRCodeStyling","_QRCodeStyling","dom","createDocument","imageCache","Map","loadImage","pr","get","fetch","res","arrayBuffer","buff","async","contentType","headers","r","mime","set","global","super","isBuffer","meta","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.ts","../src/tools/browser-image-tools.ts","../src/utils/color.ts","../src/core/qr-svg.ts","../src/utils/image.ts","../src/core/qr-code-styling.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}\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\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\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\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 /** @ignore */\r\n width: number\r\n /** @ignore */\r\n height: 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 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 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) => {\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 } = {}) => {\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 } = {}) => {\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) => {\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) => {\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 - left bottom and right top corners are rounded\r\n cornersRounded: (args: BasicFigureDrawArgs) => {\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 wave: (args: BasicFigureDrawArgs) => {\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) => {\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) => {\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) => {\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) => {\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 } = {}) => {\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) => {\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}\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) => {\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] as const\r\n },\r\n square: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n extraRounded: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n classy: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n inpoint: (args: BasicFigureDrawArgs) => {\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] as const\r\n },\r\n centerCircle: (args: BasicFigureDrawArgs) => {\r\n const { x, y, size } = 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] as const\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 [SVGPathElement, SVGPathElement] } = {\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 { DotType, Plugin } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\nconst compoundDots = {\r\n rounded: ({ 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 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 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 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.cornersRounded\r\n })\r\n } else if (!leftNeighbor && !topNeighbor) {\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 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 line: ({ x, y, size, document, getNeighbor }: DrawArgs, { stripe = size, rotation = 0 } = {}) => {\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 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 rotation += Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: args => DotElements.sideRounded(args, { height: stripe })\r\n })\r\n } else if (bottomNeighbor && !topNeighbor) {\r\n rotation -= Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: args => DotElements.sideRounded(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: _ => DotElements.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}\r\n\r\nconst qrDotFigures: { [type in DotType]: (args: DrawArgs) => SVGElement } = {\r\n [DotType.dot]: args => DotElements.dot(args),\r\n [DotType.randomDot]: ({ size, ...args }) => {\r\n const randomFactor = Math.random() * (1 - 0.75) + 0.75\r\n return DotElements.dot({\r\n ...args,\r\n size: size * randomFactor\r\n })\r\n },\r\n [DotType.rounded]: args => compoundDots.rounded(args),\r\n [DotType.extraRounded]: args => compoundDots.rounded(args, { corner: DotElements.cornerExtraRounded }),\r\n [DotType.verticalLine]: args => compoundDots.line(args),\r\n [DotType.horizontalLine]: ({ getNeighbor, ...args }) => compoundDots.line({\r\n ...args,\r\n getNeighbor: getNeighbor ? (x, y) => getNeighbor(y, x) : undefined\r\n }, { rotation: -Math.PI / 2 }),\r\n [DotType.classy]: args => compoundDots.classy(args),\r\n [DotType.classyRounded]: args => compoundDots.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 => compoundDots.rounded(args, { corner: DotElements.cornerExtraRounded, end: DotElements.wave }),\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 => compoundDots.line(args, { stripe: args.size * 0.8 }),\r\n [DotType.zebraHorizontal]: ({ getNeighbor, ...args }) => compoundDots.line({\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}\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","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\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\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 backgroundMaskGroup?: SVGElement\r\n\r\n private dotsMask?: SVGElement\r\n private dotsMaskGroup?: SVGElement\r\n\r\n private lightDotsMask?: SVGElement\r\n private lightDotsMaskGroup?: 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 | '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 width = numToAttr(options.width)\r\n const height = numToAttr(options.height)\r\n this._element.setAttribute('width', width)\r\n this._element.setAttribute('height', height)\r\n this._element.setAttribute('viewBox', `0 0 ${width} ${height}`)\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.width\r\n }\r\n\r\n get height(): number {\r\n return this.options.height\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 maxWidth = (this.options.width - 2 * margin * dotSize) * imageOptions.imageSize\r\n const maxHeight = (this.options.height - 2 * margin * dotSize) * imageOptions.imageSize\r\n let { width, height } = size\r\n\r\n height = (height / width) * maxWidth\r\n width = maxWidth\r\n\r\n if (height > maxHeight) {\r\n width = (width / height) * maxHeight\r\n height = maxHeight\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.height,\r\n width: options.width,\r\n name: 'background-color'\r\n })\r\n\r\n const size = Math.min(options.width, options.height)\r\n const element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n [this.backgroundMask, this.backgroundMaskGroup] = this.createMask('mask-background-color')\r\n this.defs.appendChild(this.backgroundMask)\r\n\r\n element.setAttribute('x', numToAttr((options.width - size) / 2))\r\n element.setAttribute('y', numToAttr((options.height - size) / 2))\r\n element.setAttribute('width', numToAttr(size))\r\n element.setAttribute('height', numToAttr(size))\r\n element.setAttribute('rx', numToAttr((size / 2) * (options.backgroundOptions.round || 0)))\r\n\r\n this.backgroundMaskGroup.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.width || count > options.height) {\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 minSize = Math.min(options.width, options.height)\r\n if (options.imageOptions.mode == ImageMode.background) minSize -= 2 * dotSize * (options.imageOptions.margin || 0)\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2)\r\n let draw = getQrDotFigure(options.dotsOptions.type, options.plugins);\r\n\r\n [this.dotsMask, this.dotsMaskGroup] = 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.lightDotsMaskGroup] = 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((minSize / 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 xFakeBeginning = xBeginning - additionalDots * dotSize\r\n const yFakeBeginning = yBeginning - additionalDots * dotSize\r\n const colorX = xFakeBeginning\r\n const colorY = yFakeBeginning\r\n const colorCount = count + additionalDots * 2\r\n const fakeMatrix: Array<Array<boolean | undefined>> = new Array(fakeCount)\r\n const center = Math.floor(fakeCount / 2)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n 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)) fakeMatrix[i][j] = undefined\r\n else 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 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 fakeMatrix[i][j] = undefined\r\n else 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 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 (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 (!fakeMatrix[i][j]) {\r\n if (this.lightDotsMask) {\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => fakeMatrix[i + xOffset]?.[j + yOffset] === false\r\n }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (this.dotsMaskGroup) {\r\n this.dotsMaskGroup.appendChild(draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => fakeMatrix[i + xOffset]?.[j + yOffset] === true\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: colorX,\r\n y: colorY,\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: colorX,\r\n y: colorY,\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 xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - 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 = xBeginning + column * dotSize * (count - 7)\r\n const y = yBeginning + row * dotSize * (count - 7)\r\n let cornersSquareMask = this.dotsMask\r\n let cornersSquareMaskGroup = this.dotsMaskGroup\r\n let cornersDotMask = this.dotsMask\r\n let cornersDotMaskGroup = this.dotsMaskGroup\r\n\r\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\r\n [cornersSquareMask, cornersSquareMaskGroup] = this.createMask(`mask-corners-square-color-${column}-${row}`)\r\n this.defs.appendChild(cornersSquareMask)\r\n cornersDotMask = cornersSquareMask\r\n cornersDotMaskGroup = cornersSquareMaskGroup\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 (cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(cornerElement)\r\n }\r\n\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.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 (cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(cornerElement)\r\n }\r\n\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.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.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.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 }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.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 }))\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.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.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 }))\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\r\n [cornersDotMask, cornersDotMaskGroup] = 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 (cornersDotMaskGroup) {\r\n cornersDotMaskGroup.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 (cornersDotMaskGroup) {\r\n cornersDotMaskGroup.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 (cornersDotMaskGroup) {\r\n cornersDotMaskGroup.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 }))\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 xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - 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 = xBeginning + margin + (count * dotSize - width) / 2\r\n const dy = yBeginning + 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('style', `mask: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 options = this.options\r\n\r\n const mask = this.document.createElementNS('http://www.w3.org/2000/svg', 'mask')\r\n mask.setAttribute('id', id)\r\n mask.setAttribute('maskUnits', 'userSpaceOnUse')\r\n mask.setAttribute('x', '0')\r\n mask.setAttribute('y', '0')\r\n mask.setAttribute('width', numToAttr(options.width))\r\n mask.setAttribute('height', numToAttr(options.height))\r\n\r\n const group = this.document.createElementNS('http://www.w3.org/2000/svg', 'g')\r\n group.setAttribute('fill', '#fff')\r\n mask.appendChild(group)\r\n\r\n return [mask, group]\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'\r\nimport { stringToBytes_UTF8 } from '@liquid-js/qrcode-generator/lib/text/stringToBytes_UTF8.js'\r\nimport { RecursivePartial } from '../types/helper.js'\r\nimport { mergeDeep } from '../utils/merge.js'\r\nimport { ImageMode, Options, ShapeType, defaultOptions, sanitizeOptions } from '../utils/options.js'\r\nimport { ErrorCorrectionPercents, getMode } from '../utils/qrcode.js'\r\nimport { QRSVG } from './qr-svg.js'\r\n\r\nObject.assign(QRCodeMinimal.stringToBytesFuncs, stringToBytes_UTF8)\r\n\r\nexport type ExtensionFunction = (svg: SVGSVGElement, options: Options) => void\r\n\r\nexport class QRCodeStyling {\r\n private options: Options\r\n private container?: HTMLElement\r\n private qr?: QRCodeMinimal\r\n private extension?: ExtensionFunction\r\n private svgDrawingPromise?: Promise<void>\r\n private qrSVG?: QRSVG\r\n\r\n get size() {\r\n if (this.qrSVG)\r\n return {\r\n width: this.qrSVG.width,\r\n height: this.qrSVG.height\r\n }\r\n return undefined\r\n }\r\n\r\n constructor(options?: RecursivePartial<Options>) {\r\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions\r\n this.update()\r\n }\r\n\r\n update(\r\n /** The same options as for initialization */\r\n options?: RecursivePartial<Options>\r\n ): void {\r\n if (this.container) this.container.innerHTML = ''\r\n\r\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options\r\n\r\n if (!this.options.data) {\r\n return\r\n }\r\n\r\n if (this.options.stringToBytesFuncs) {\r\n Object.assign(QRCodeMinimal.stringToBytesFuncs, this.options.stringToBytesFuncs)\r\n delete this.options.stringToBytesFuncs\r\n }\r\n\r\n this.qr = new QRCodeMinimal(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel)\r\n const mode = this.options.qrOptions.mode || getMode(this.options.data)\r\n this.qr.addData(this.options.data, mode)\r\n this.qr.make()\r\n\r\n this.setupSvg()\r\n\r\n this.append(this.container)\r\n }\r\n\r\n append(\r\n /** This container will be used for appending of the QR code */\r\n container?: HTMLElement\r\n ): void {\r\n if (!container) {\r\n return\r\n }\r\n\r\n if (this.qrSVG?.element) {\r\n container.appendChild(this.qrSVG.element)\r\n }\r\n\r\n this.container = container\r\n }\r\n\r\n /**\r\n * @deprecated Use options.plugins\r\n * @example\r\n *\r\n * ```js\r\n * const extension = (svg, options) => {\r\n * const { width, height } = options;\r\n * const size = Math.min(width, height);\r\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n * const borderAttributes = {\r\n * fill: \"none\",\r\n * x: (width - size + 40) / 2,\r\n * y: (height - size + 40) / 2,\r\n * width: size - 40,\r\n * height: size - 40,\r\n * stroke: \"black\",\r\n * \"stroke-width\": 40,\r\n * rx: 100\r\n * };\r\n * Object.keys(borderAttributes).forEach((attribute) => {\r\n * border.setAttribute(attribute, borderAttributes[attribute]);\r\n * });\r\n * svg.appendChild(border);\r\n * };\r\n * ```\r\n */\r\n applyExtension(\r\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\r\n extension: ExtensionFunction\r\n ): void {\r\n if (!extension) {\r\n throw new Error('Extension function should be defined.')\r\n }\r\n\r\n this.extension = extension\r\n this.update()\r\n }\r\n\r\n /**\r\n * @deprecated Use options.plugins\r\n */\r\n deleteExtension(): void {\r\n this.extension = undefined\r\n this.update()\r\n }\r\n\r\n async serialize(): Promise<string | undefined> {\r\n if (!this.qr) throw new Error('QR code is empty')\r\n\r\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\r\n this.setupSvg()\r\n }\r\n await this.svgDrawingPromise\r\n\r\n if (!this.qrSVG?.element) {\r\n return\r\n }\r\n\r\n const serializer = new XMLSerializer()\r\n let source = serializer.serializeToString(this.qrSVG.element)\r\n\r\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source\r\n return source\r\n }\r\n\r\n private setupSvg(): void {\r\n if (!this.qr) {\r\n return\r\n }\r\n let moduleCount = this.qr.getModuleCount()\r\n if (this.options.imageOptions.mode == ImageMode.background && this.options.shape != ShapeType.circle)\r\n moduleCount += 2\r\n let count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * moduleCount)\r\n if (count % 2 == 0) count -= 1\r\n let margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n if (this.options.imageOptions.mode == ImageMode.background) margin += this.options.imageOptions.margin || 0\r\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin))\r\n this.qrSVG = new QRSVG({\r\n ...this.options,\r\n width: size,\r\n height: size,\r\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\r\n })\r\n\r\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\r\n if (!this.qrSVG?.element) return\r\n this.options.plugins?.forEach(plugin => plugin.postProcess?.(this.qrSVG!.element!, {\r\n ...this.options,\r\n width: size,\r\n height: size\r\n }))\r\n this.extension?.(this.qrSVG.element, {\r\n ...this.options,\r\n width: size,\r\n height: size\r\n })\r\n })\r\n }\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\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 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 let aaCanvas: HTMLCanvasElement | OffscreenCanvas\r\n try {\r\n aaCanvas = new OffscreenCanvas(image.width * aaFactor, image.height * aaFactor)\r\n } catch (_) {\r\n // Fallback to regular canvas element\r\n aaCanvas = document.createElement('canvas')\r\n aaCanvas.width = image.width * aaFactor\r\n aaCanvas.height = image.height * aaFactor\r\n }\r\n aaCanvas.getContext('2d')?.drawImage(image, 0, 0, aaCanvas.width, aaCanvas.height)\r\n\r\n canvas?.getContext('2d')?.drawImage(aaCanvas, (width - size) / 2, (height - size) / 2, size, size)\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":["ErrorCorrectionLevel","TypeNumber","Mode","QRCodeMinimal","sharp","fileTypeFromBuffer","DOMImplementation","XMLSerializer$1","DOMParser$1","isObject","obj","Array","isArray","target","sources","length","shift","undefined","source","Object","keys","forEach","key","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","data","qrOptions","typeNumber","mode","errorCorrectionLevel","Q","imageOptions","center","imageSize","crossOrigin","margin","fill","color","dotsOptions","type","size","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","cornersRounded","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","qrCornerDotFigures","extraRounded","outpoint","pentagon","hexagon","diamond","args2","SquareElements","centerCircle","circleRadius","qrCornerSquareFigures","compoundDots","getNeighbor","corner","end","leftNeighbor","rightNeighbor","topNeighbor","bottomNeighbor","neighborsCount","stripe","qrDotFigures","randomDot","randomFactor","random","verticalLine","horizontalLine","classyRounded","smallSquare","tinySquare","zebraVertical","zebraHorizontal","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","parts","alpha","toLowerCase","base","slice","parseInt","exec","dims","split","parseFloat","pop","toString","padStart","squareMask","cornerSquareTypes","Set","dotMask","cornerDotTypes","QRSVG","_element","this","defs","backgroundMask","backgroundMaskGroup","dotsMask","dotsMaskGroup","lightDotsMask","lightDotsMaskGroup","qr","imageTools","constructor","appendChild","drawQR","getModuleCount","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","background","maxWidth","maxHeight","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","j","drawCorners","createColor","gradientOptions","additionalRotation","name","createMask","filter","minSize","additionalDots","fakeCount","circle","xBeginning","yBeginning","colorX","xFakeBeginning","colorY","yFakeBeginning","fakeMatrix","ii","jj","isDark","sqrt","typeNr","iAlign","find","jAlign","xOffset","yOffset","colorCount","cornersSquareSize","cornersDotSize","column","row","cornersSquareMask","cornersSquareMaskGroup","cornersDotMask","cornersDotMaskGroup","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","group","assign","stringToBytesFuncs","stringToBytes_UTF8","extension","svgDrawingPromise","qrSVG","update","innerHTML","getMode","test","numeric","alphanumeric","unicode","byte","addData","make","setupSvg","append","applyExtension","deleteExtension","serialize","XMLSerializer","serializeToString","moduleCount","postProcess","FileExtension","browserUtils","QRCodeStyling","_QRCodeStyling","dom","createDocument","imageCache","Map","loadImage","pr","get","fetch","res","arrayBuffer","buff","async","contentType","headers","r","mime","set","global","super","isBuffer","meta","metadata"],"mappings":"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"}