@liquid-js/qr-code-styling 5.6.1 → 5.7.0-0

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