@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.
- package/README.md +253 -231
- package/lib/border-plugin.js +1 -1
- package/lib/border-plugin.js.map +1 -1
- package/lib/color-dpqpq3zE.js +2 -0
- package/lib/color-dpqpq3zE.js.map +1 -0
- package/lib/core/qr-svg.d.ts +14 -1
- package/lib/event-plugin.js +1 -1
- package/lib/event-plugin.js.map +1 -1
- package/lib/image-BdYCSwfG.js +2 -0
- package/lib/image-BdYCSwfG.js.map +1 -0
- package/lib/image-mask-plugin.js +2 -0
- package/lib/image-mask-plugin.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/node.d.ts +1 -1
- package/lib/plugin-utils.js +1 -1
- package/lib/plugin-utils.js.map +1 -1
- package/lib/plugins/image-mask/index.d.ts +63 -0
- package/lib/plugins/image-mask/raster.d.ts +58 -0
- package/lib/qr-code-styling-node.js +317 -112
- package/lib/qr-code-styling-node.js.map +1 -1
- package/lib/qr-code-styling.js +1 -1
- package/lib/qr-code-styling.js.map +1 -1
- package/lib/utils/image.d.ts +9 -0
- package/lib/utils/options.d.ts +48 -1
- package/lib/utils/svg.d.ts +32 -2
- package/package.json +6 -5
- package/lib/color-dXYWdVDW.js +0 -2
- package/lib/color-dXYWdVDW.js.map +0 -1
|
@@ -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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"}
|