@liquid-js/qr-code-styling 4.1.0 → 5.0.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/lib/figures/corner-dot.d.ts +1 -22
- package/lib/figures/corner-square.d.ts +1 -22
- package/lib/figures/dot-elements.d.ts +14 -0
- package/lib/figures/dot.d.ts +1 -29
- package/lib/figures/square-elements.d.ts +8 -0
- package/lib/qr-code-styling-node.js +358 -629
- 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/types/helper.d.ts +6 -12
- package/lib/utils/options.d.ts +4 -4
- package/lib/utils/svg.d.ts +7 -0
- package/package.json +1 -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/corner-dot.ts","../src/figures/corner-square.ts","../src/figures/dot.ts","../src/tools/browser-image-tools.ts","../src/utils/color.ts","../src/core/qr-svg.ts","../src/utils/image.ts","../src/core/qr-code-styling.ts","../src/tools/browser-utils.ts","../src/node.ts"],"sourcesContent":["const isObject = (obj: Record<string, unknown> | undefined): boolean =>\r\n !!obj && typeof obj === 'object' && !Array.isArray(obj)\r\n\r\nexport type UnknownObject = {\r\n [key: string]: any\r\n} | undefined\r\n\r\nexport function mergeDeep(target: UnknownObject, ...sources: UnknownObject[]): UnknownObject {\r\n if (!sources.length) return target\r\n const source = sources.shift()\r\n if (source === undefined || !isObject(target) || !isObject(source)) return target\r\n target = { ...target }\r\n Object.keys(source).forEach((key: string): void => {\r\n const targetValue = target[key]\r\n const sourceValue = source[key]\r\n\r\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\r\n target[key] = sourceValue\r\n } else if (isObject(targetValue) && isObject(sourceValue)) {\r\n target[key] = mergeDeep({ ...targetValue }, sourceValue)\r\n } else {\r\n target[key] = sourceValue\r\n }\r\n })\r\n\r\n return mergeDeep(target, ...sources)\r\n}\r\n","export enum GradientType {\r\n radial = 'radial',\r\n linear = 'linear'\r\n}\r\n\r\nexport interface Gradient {\r\n /**\r\n * Type of gradient spread\r\n *\r\n * @default GradientType.linear\r\n */\r\n type: `${GradientType}`\r\n /**\r\n * Rotation of gradient (in radians, Math.PI === 180 degrees)\r\n *\r\n * @default 0\r\n */\r\n rotation?: number\r\n /** Gradient colors. */\r\n colorStops: Array<{\r\n /** Position of color in gradient range */\r\n offset: number\r\n /** Color of stop in gradient range */\r\n color: string\r\n }>\r\n}\r\n\r\nexport function sanitizeGradient(gradient: Gradient): Gradient {\r\n const newGradient = { ...gradient }\r\n\r\n if (!newGradient.colorStops || !newGradient.colorStops.length) {\r\n throw new Error(\"Field 'colorStops' is required in gradient\")\r\n }\r\n\r\n if (newGradient.rotation) {\r\n newGradient.rotation = Number(newGradient.rotation)\r\n } else {\r\n newGradient.rotation = 0\r\n }\r\n\r\n newGradient.colorStops = newGradient.colorStops.map((colorStop: { offset: number, color: string }) => ({\r\n ...colorStop,\r\n offset: Number(colorStop.offset)\r\n }))\r\n\r\n return newGradient\r\n}\r\n","import { ErrorCorrectionLevel, Mode, TypeNumber } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { browserImageTools } from '../tools/browser-image-tools.js'\r\nimport { Gradient, sanitizeGradient } from './gradient.js'\r\n\r\nexport enum DotType {\r\n dot = 'dot',\r\n randomDot = 'random-dot',\r\n rounded = 'rounded',\r\n extraRounded = 'extra-rounded',\r\n verticalLine = 'vertical-line',\r\n horizontalLine = 'horizontal-line',\r\n classy = 'classy',\r\n classyRounded = 'classy-rounded',\r\n square = 'square',\r\n smallSquare = 'small-square',\r\n tinySquare = 'tiny-square',\r\n diamond = 'diamond',\r\n wave = 'wave'\r\n}\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 outpoint = 'outpoint',\r\n inpoint = 'inpoint'\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 outpoint = 'outpoint',\r\n inpoint = 'inpoint'\r\n}\r\n\r\nexport enum ShapeType {\r\n square = 'square',\r\n circle = 'circle'\r\n}\r\n\r\nexport enum ImageMode {\r\n /**\r\n * Place image in the center of the code\r\n */\r\n center = 'center',\r\n /**\r\n * Place image over the center of the code\r\n */\r\n overlay = 'overlay',\r\n /**\r\n * Use image as background, draw dots over it\r\n */\r\n background = 'background'\r\n}\r\n\r\nexport interface Options {\r\n /** Use a custom DOM domplementation */\r\n document: Document\r\n /** Use a custom image fetching & serializaton implementation */\r\n imageTools?: typeof browserImageTools\r\n /** @ignore */\r\n width: number\r\n /** @ignore */\r\n height: number\r\n /** The data will be encoded in the QR code */\r\n data: string\r\n /** The image will be copied to the center of the QR code */\r\n image?: string | Buffer | Blob\r\n /**\r\n * QR code shape\r\n *\r\n * @default ShapeType.square\r\n */\r\n shape: `${ShapeType}`\r\n /** Options will be passed to `@liquid-js/qrcode-generator` lib */\r\n qrOptions: {\r\n typeNumber: TypeNumber\r\n mode?: `${Mode}`\r\n /** @default ErrorCorrectionLevel.Q */\r\n errorCorrectionLevel: `${ErrorCorrectionLevel}`\r\n }\r\n imageOptions: {\r\n /**\r\n * Image mode\r\n *\r\n * @default ImageMode.center\r\n */\r\n mode: `${ImageMode}`\r\n /**\r\n * Fill blank areas of the code with selected color\r\n */\r\n fill: {\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"rgba(255,255,255,0.75)\"\r\n */\r\n color: string\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient\r\n }\r\n /**\r\n * Coefficient of the image size\r\n *\r\n * @default 0.4\r\n */\r\n imageSize: number\r\n /**\r\n * Margin of the image (in blocks)\r\n *\r\n * @default 0\r\n */\r\n margin: number\r\n /**\r\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLImageElement/crossOrigin)\r\n */\r\n crossOrigin?: string\r\n }\r\n dotsOptions: {\r\n /**\r\n * QR dot size (in pixels)\r\n *\r\n * @default 10\r\n */\r\n size: number\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"#000\"\r\n */\r\n color: string\r\n /** Gradient of QR dots */\r\n gradient?: Gradient\r\n /**\r\n * Style of QR dots\r\n *\r\n * @default DotType.square\r\n */\r\n type: `${DotType}`\r\n }\r\n /** Corners Square options, omitted values match dots */\r\n cornersSquareOptions?: {\r\n /** Color of Corners Square */\r\n color?: string\r\n /** Gradient of Corners Square */\r\n gradient?: Gradient\r\n /** Style of Corners Square */\r\n type?: `${CornerSquareType | DotType}`\r\n }\r\n /** Corners Dot options, omitted values match squares */\r\n cornersDotOptions?: {\r\n /** Color of Corners Dot */\r\n color?: string\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient\r\n /** Style of Corners Dot */\r\n type?: `${CornerDotType | DotType}`\r\n }\r\n /** QR background styling options, false to disable background */\r\n backgroundOptions?: {\r\n /** Background roundnes, from 0 (square) to 1 (circle) */\r\n round?: number\r\n /** Background color */\r\n color?: string\r\n /** Background Gradient */\r\n gradient?: Gradient\r\n /**\r\n * Margin (in blocks) between background and the QR code\r\n *\r\n * @default 0\r\n */\r\n margin?: number\r\n } | false\r\n /** `import { stringToBytesFuncs } from \"@liquid-js/qr-code-styling/kanji\";` to add Kanji support */\r\n stringToBytesFuncs?: { [encoding: string]: (s: string) => number[] }\r\n}\r\n\r\nexport const defaultOptions: Options = {\r\n document: undefined as never,\r\n shape: ShapeType.square,\r\n width: undefined as never,\r\n height: undefined as never,\r\n data: '',\r\n qrOptions: {\r\n typeNumber: TypeNumber[0],\r\n mode: undefined,\r\n errorCorrectionLevel: ErrorCorrectionLevel.Q\r\n },\r\n imageOptions: {\r\n mode: ImageMode.center,\r\n imageSize: 0.4,\r\n crossOrigin: undefined,\r\n margin: 0,\r\n fill: {\r\n color: 'rgba(255,255,255,1)'\r\n }\r\n },\r\n dotsOptions: {\r\n type: DotType.square,\r\n color: '#000',\r\n size: 10\r\n }\r\n}\r\n\r\nexport function sanitizeOptions(options: Options): Options {\r\n const newOptions = { ...options }\r\n\r\n newOptions.imageOptions = {\r\n ...newOptions.imageOptions,\r\n imageSize: Math.min(1, Number(newOptions.imageOptions.imageSize)) || 1,\r\n margin: Number(newOptions.imageOptions.margin),\r\n fill: {\r\n ...newOptions.imageOptions.fill\r\n }\r\n }\r\n\r\n if (newOptions.imageOptions.mode == ImageMode.overlay) newOptions.imageOptions.margin = 0\r\n if (newOptions.imageOptions.fill.gradient) {\r\n newOptions.imageOptions.fill.gradient = sanitizeGradient(newOptions.imageOptions.fill.gradient)\r\n }\r\n\r\n newOptions.dotsOptions = {\r\n ...newOptions.dotsOptions\r\n }\r\n if (newOptions.dotsOptions.gradient) {\r\n newOptions.dotsOptions.gradient = sanitizeGradient(newOptions.dotsOptions.gradient)\r\n }\r\n // Ensure integer dot size\r\n newOptions.dotsOptions.size = Math.round(Math.max(0, newOptions.dotsOptions.size) || 10)\r\n\r\n if (newOptions.cornersSquareOptions) {\r\n newOptions.cornersSquareOptions = {\r\n ...newOptions.cornersSquareOptions\r\n }\r\n if (newOptions.cornersSquareOptions.gradient) {\r\n newOptions.cornersSquareOptions.gradient = sanitizeGradient(newOptions.cornersSquareOptions.gradient)\r\n }\r\n }\r\n\r\n if (newOptions.cornersDotOptions) {\r\n newOptions.cornersDotOptions = {\r\n ...newOptions.cornersDotOptions\r\n }\r\n if (newOptions.cornersDotOptions.gradient) {\r\n newOptions.cornersDotOptions.gradient = sanitizeGradient(newOptions.cornersDotOptions.gradient)\r\n }\r\n }\r\n\r\n if (newOptions.backgroundOptions) {\r\n newOptions.backgroundOptions = {\r\n ...newOptions.backgroundOptions\r\n }\r\n if (newOptions.backgroundOptions.gradient) {\r\n newOptions.backgroundOptions.gradient = sanitizeGradient(newOptions.backgroundOptions.gradient)\r\n }\r\n }\r\n\r\n if (!newOptions.document) newOptions.document = document\r\n\r\n return newOptions\r\n}\r\n","import { ErrorCorrectionLevel, Mode } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\n\r\nexport const ErrorCorrectionPercents = {\r\n [ErrorCorrectionLevel.L]: 0.07,\r\n [ErrorCorrectionLevel.M]: 0.15,\r\n [ErrorCorrectionLevel.Q]: 0.25,\r\n [ErrorCorrectionLevel.H]: 0.3\r\n}\r\n\r\nexport function getMode(data: string): Mode {\r\n switch (true) {\r\n case /^[0-9]*$/.test(data):\r\n return Mode.numeric\r\n case /^[0-9A-Z $%*+\\-./:]*$/.test(data):\r\n return Mode.alphanumeric\r\n\r\n case /[^\\u0000-\\u00ff]/.test(data):\r\n return Mode.unicode\r\n default:\r\n return Mode.byte\r\n }\r\n}\r\n","const rx = /\\.?0+$/\r\n\r\nexport function numToAttr(value: number) {\r\n return value.toFixed(7).replace(rx, '')\r\n}\r\n\r\nexport function svgPath(strings: TemplateStringsArray, ...values: unknown[]) {\r\n return strings\r\n .reduce((t, v, i) => {\r\n let p: unknown = ''\r\n if (i) p = values[i - 1]\r\n if (typeof p == 'number') p = numToAttr(p)\r\n return `${t}${p}${v}`\r\n }, '')\r\n .trim()\r\n .replace(/[\\s\\n\\r]+/gim, ' ')\r\n}\r\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from '../types/helper.js'\r\nimport { CornerDotType } from '../utils/options.js'\r\nimport { numToAttr, svgPath } from '../utils/svg.js'\r\n\r\nexport class QRCornerDot {\r\n private _element?: SVGElement\r\n\r\n get element() {\r\n return this._element\r\n }\r\n\r\n constructor(\r\n private readonly type: `${CornerDotType}`,\r\n private readonly document: Document\r\n ) { }\r\n\r\n draw(args: DrawArgs): void {\r\n const type = this.type\r\n let drawFunction\r\n\r\n switch (type) {\r\n case CornerDotType.square:\r\n drawFunction = this.drawSquare\r\n break\r\n case CornerDotType.heart:\r\n drawFunction = this.drawHeart\r\n break\r\n case CornerDotType.extraRounded:\r\n drawFunction = this.drawRounded\r\n break\r\n case CornerDotType.classy:\r\n drawFunction = this.drawClassy\r\n break\r\n case CornerDotType.inpoint:\r\n drawFunction = this.drawInpoint\r\n break\r\n case CornerDotType.outpoint:\r\n drawFunction = this.drawOutpoint\r\n break\r\n case CornerDotType.dot:\r\n default:\r\n drawFunction = this.drawDot\r\n }\r\n\r\n drawFunction.call(this, args)\r\n }\r\n\r\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n\r\n draw()\r\n this._element?.setAttribute('transform', `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`)\r\n }\r\n\r\n private basicDot(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'circle')\r\n this._element.setAttribute('cx', numToAttr(x + size / 2))\r\n this._element.setAttribute('cy', numToAttr(y + size / 2))\r\n this._element.setAttribute('r', numToAttr(size / 2))\r\n }\r\n })\r\n }\r\n\r\n private basicSquare(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n this._element.setAttribute('x', numToAttr(x))\r\n this._element.setAttribute('y', numToAttr(y))\r\n this._element.setAttribute('width', numToAttr(size))\r\n this._element.setAttribute('height', numToAttr(size))\r\n }\r\n })\r\n }\r\n\r\n private basicHeart(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n const path = [\r\n 'M',\r\n 1,\r\n 0.3262506,\r\n 'c',\r\n 0,\r\n 0.0383376,\r\n -0.0064626,\r\n 0.0758377,\r\n -0.0193751,\r\n 0.1125001,\r\n 's',\r\n -0.0356247,\r\n 0.076875,\r\n -0.0681248,\r\n 0.1206252,\r\n 'c',\r\n -0.0325,\r\n 0.0437499,\r\n -0.0762503,\r\n 0.0931247,\r\n -0.1312501,\r\n 0.1481249,\r\n 'C',\r\n 0.7262502,\r\n 0.7625008,\r\n 0.6566626,\r\n 0.8279132,\r\n 0.5724999,\r\n 0.9037505,\r\n 'L',\r\n 0.5,\r\n 0.9687506,\r\n 'L',\r\n 0.4275001,\r\n 0.9037505,\r\n 'C',\r\n 0.3433374,\r\n 0.8279132,\r\n 0.2737499,\r\n 0.7625005,\r\n 0.21875,\r\n 0.7075007,\r\n 'C',\r\n 0.1637501,\r\n 0.6525008,\r\n 0.1199999,\r\n 0.6031258,\r\n 0.0874999,\r\n 0.5593758,\r\n 'S',\r\n 0.0322876,\r\n 0.4754133,\r\n 0.0193751,\r\n 0.4387506,\r\n 'S',\r\n 0,\r\n 0.3645881,\r\n 0,\r\n 0.3262506,\r\n 'c',\r\n 0,\r\n -0.0783374,\r\n 0.0262499,\r\n -0.1437498,\r\n 0.07875,\r\n -0.1962499,\r\n 's',\r\n 0.1179124,\r\n -0.07875,\r\n 0.1962499,\r\n -0.07875,\r\n 'c',\r\n 0.0433376,\r\n 0,\r\n 0.0845875,\r\n 0.0091625,\r\n 0.12375,\r\n 0.0274999,\r\n 'S',\r\n 0.4716623,\r\n 0.1229131,\r\n 0.5,\r\n 0.1562506,\r\n 'c',\r\n 0.0283374,\r\n -0.0333375,\r\n 0.0620874,\r\n -0.0591625,\r\n 0.1012502,\r\n -0.0775,\r\n 'c',\r\n 0.0391627,\r\n -0.0183375,\r\n 0.0804126,\r\n -0.0274999,\r\n 0.12375,\r\n -0.0274999,\r\n 'c',\r\n 0.0783374,\r\n 0,\r\n 0.1437497,\r\n 0.0262499,\r\n 0.1962501,\r\n 0.07875,\r\n 'S',\r\n 1,\r\n 0.2479131,\r\n 1,\r\n 0.3262506,\r\n 'z'\r\n ]\r\n let move = false\r\n let i = 0\r\n this._element.setAttribute(\r\n 'd',\r\n path\r\n .map((v) => {\r\n if (typeof v == 'string') {\r\n i = 0\r\n move = v.toUpperCase() == v\r\n return v\r\n }\r\n i++\r\n v = v * size\r\n if (move) {\r\n v += i % 2 == 1 ? x : y\r\n }\r\n return numToAttr(v)\r\n })\r\n .join(' ')\r\n )\r\n }\r\n\r\n private basicRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n this._element.setAttribute('x', numToAttr(x))\r\n this._element.setAttribute('y', numToAttr(y))\r\n this._element.setAttribute('width', numToAttr(size))\r\n this._element.setAttribute('height', numToAttr(size))\r\n this._element.setAttribute('rx', numToAttr(size / 4))\r\n this._element.setAttribute('ry', numToAttr(size / 4))\r\n }\r\n })\r\n }\r\n\r\n private basicClassy(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n const dotSize = size / 7\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute('clip-rule', 'evenodd')\r\n this._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 })\r\n }\r\n\r\n private basicInpoint(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n const dotSize = size\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute('clip-rule', 'evenodd')\r\n this._element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + dotSize / 2}\r\n v ${dotSize / 4}\r\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${dotSize / 4}, ${dotSize / 4}\r\n h ${(dotSize / 4) * 3}\r\n v ${(-dotSize / 4) * 3}\r\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${-dotSize / 4}, ${-dotSize / 4}\r\n h ${-dotSize / 2}\r\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${-dotSize / 4}, ${dotSize / 4}\r\n z`\r\n )\r\n }\r\n })\r\n }\r\n\r\n private drawDot({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicDot({ x, y, size, rotation })\r\n }\r\n\r\n private drawSquare({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicSquare({ x, y, size, rotation })\r\n }\r\n\r\n private drawHeart({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicHeart({ x, y, size, rotation })\r\n }\r\n\r\n private drawRounded({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicRounded({ x, y, size, rotation })\r\n }\r\n\r\n private drawClassy({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicClassy({ x, y, size, rotation })\r\n }\r\n\r\n private drawInpoint({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicInpoint({ x, y, size, rotation })\r\n }\r\n\r\n private drawOutpoint({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicInpoint({ x, y, size, rotation: (rotation || 0) + Math.PI })\r\n }\r\n}\r\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from '../types/helper.js'\r\nimport { CornerSquareType } from '../utils/options.js'\r\nimport { numToAttr, svgPath } from '../utils/svg.js'\r\n\r\nexport class QRCornerSquare {\r\n private _element?: SVGElement\r\n private _fill?: SVGElement\r\n\r\n get element() {\r\n return this._element\r\n }\r\n\r\n get fill() {\r\n return this._fill\r\n }\r\n\r\n constructor(\r\n private readonly type: `${CornerSquareType}`,\r\n private readonly document: Document\r\n ) { }\r\n\r\n draw(args: DrawArgs): void {\r\n const type = this.type\r\n let drawFunction\r\n\r\n switch (type) {\r\n case CornerSquareType.square:\r\n drawFunction = this.drawSquare\r\n break\r\n case CornerSquareType.extraRounded:\r\n drawFunction = this.drawExtraRounded\r\n break\r\n case CornerSquareType.classy:\r\n drawFunction = this.drawClassy\r\n break\r\n case CornerSquareType.outpoint:\r\n drawFunction = this.drawOutpoint\r\n break\r\n case CornerSquareType.inpoint:\r\n drawFunction = this.drawInpoint\r\n break\r\n case CornerSquareType.dot:\r\n default:\r\n drawFunction = this.drawDot\r\n }\r\n\r\n drawFunction.call(this, args)\r\n }\r\n\r\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n\r\n draw()\r\n this._element?.setAttribute('transform', `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`)\r\n this._fill?.setAttribute('transform', `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`)\r\n }\r\n\r\n private basicDot(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n const dotSize = size / 7\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute('clip-rule', 'evenodd')\r\n this._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 this._fill = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._fill.setAttribute('clip-rule', 'evenodd')\r\n this._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 })\r\n }\r\n\r\n private basicSquare(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n const dotSize = size / 7\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute('clip-rule', 'evenodd')\r\n this._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 this._fill = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._fill.setAttribute('clip-rule', 'evenodd')\r\n this._fill.setAttribute(\r\n 'd',\r\n svgPath`\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 })\r\n }\r\n\r\n private basicExtraRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n const dotSize = size / 7\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute('clip-rule', 'evenodd')\r\n this._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 this._fill = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._fill.setAttribute('clip-rule', 'evenodd')\r\n this._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 })\r\n }\r\n\r\n private basicClassy(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n const dotSize = size / 7\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute('clip-rule', 'evenodd')\r\n this._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 this._fill = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._fill.setAttribute('clip-rule', 'evenodd')\r\n this._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 })\r\n }\r\n\r\n private basicInpoint(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n const dotSize = size / 7\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute('clip-rule', 'evenodd')\r\n this._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 this._fill = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._fill.setAttribute('clip-rule', 'evenodd')\r\n this._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 })\r\n }\r\n\r\n private drawDot({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicDot({ x, y, size, rotation })\r\n }\r\n\r\n private drawSquare({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicSquare({ x, y, size, rotation })\r\n }\r\n\r\n private drawExtraRounded({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicExtraRounded({ x, y, size, rotation })\r\n }\r\n\r\n private drawClassy({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicClassy({ x, y, size, rotation })\r\n }\r\n\r\n private drawInpoint({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicInpoint({ x, y, size, rotation })\r\n }\r\n\r\n private drawOutpoint({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicInpoint({ x, y, size, rotation: (rotation || 0) + Math.PI })\r\n }\r\n}\r\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from '../types/helper.js'\r\nimport { DotType } from '../utils/options.js'\r\nimport { numToAttr, svgPath } from '../utils/svg.js'\r\n\r\nexport class QRDot {\r\n private _element?: SVGElement\r\n\r\n get element() {\r\n return this._element\r\n }\r\n\r\n constructor(\r\n private readonly type: `${DotType}`,\r\n private readonly document: Document\r\n ) { }\r\n\r\n draw(args: DrawArgs): void {\r\n const type = this.type\r\n let drawFunction\r\n\r\n switch (type) {\r\n case DotType.dot:\r\n drawFunction = this.drawDot\r\n break\r\n case DotType.randomDot:\r\n drawFunction = this.drawRandomDot\r\n break\r\n case DotType.classy:\r\n drawFunction = this.drawClassy\r\n break\r\n case DotType.classyRounded:\r\n drawFunction = this.drawClassyRounded\r\n break\r\n case DotType.rounded:\r\n drawFunction = this.drawRounded\r\n break\r\n case DotType.verticalLine:\r\n drawFunction = this.drawVerticalLine\r\n break\r\n case DotType.horizontalLine:\r\n drawFunction = this.drawHorizontalLine\r\n break\r\n case DotType.extraRounded:\r\n drawFunction = this.drawExtraRounded\r\n break\r\n case DotType.diamond:\r\n drawFunction = this.drawDiamond\r\n break\r\n case DotType.smallSquare:\r\n drawFunction = this.drawSmallSquare\r\n break\r\n case DotType.tinySquare:\r\n drawFunction = this.drawTinySquare\r\n break\r\n case DotType.wave:\r\n drawFunction = this.drawWave\r\n break\r\n case DotType.square:\r\n default:\r\n drawFunction = this.drawSquare\r\n break\r\n }\r\n\r\n drawFunction.call(this, args)\r\n }\r\n\r\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n\r\n draw()\r\n this._element?.setAttribute('transform', `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`)\r\n }\r\n\r\n private basicDot(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'circle')\r\n this._element.setAttribute('cx', numToAttr(x + size / 2))\r\n this._element.setAttribute('cy', numToAttr(y + size / 2))\r\n this._element.setAttribute('r', numToAttr(size / 2))\r\n }\r\n })\r\n }\r\n\r\n private basicSquare(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n this._element.setAttribute('x', numToAttr(x))\r\n this._element.setAttribute('y', numToAttr(y))\r\n this._element.setAttribute('width', numToAttr(size))\r\n this._element.setAttribute('height', numToAttr(size))\r\n }\r\n })\r\n }\r\n\r\n //if rotation === 0 - right side is rounded\r\n private basicSideRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, 0 ${-size}\r\n z`\r\n )\r\n }\r\n })\r\n }\r\n\r\n //if rotation === 0 - top right corner is rounded\r\n private basicCornerRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._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 })\r\n }\r\n\r\n //if rotation === 0 - top right corner is rounded\r\n private basicCornerExtraRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._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 })\r\n }\r\n\r\n //if rotation === 0 - left bottom and right top corners are rounded\r\n private basicCornersRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._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 })\r\n }\r\n\r\n private basicWave(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = 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 * (s1 - s2 * Math.cos(a1))\r\n const c23y = size * (1 - s2 * Math.sin(a1))\r\n\r\n const c31x = -size * Math.cos(a2) / 2\r\n const c31y = -size * Math.sin(a2) / 2\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n this._element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n c 0 ${size * s2} ${c23x} ${c23y} ${size * s1} ${size}\r\n c ${c31x} ${c31y} ${size * (1 - s1)} ${-size / 2} ${size * (1 - s1)} ${-size}\r\n z`\r\n )\r\n }\r\n })\r\n }\r\n\r\n private drawDot({ x, y, size }: DrawArgs): void {\r\n this.basicDot({ x, y, size, rotation: 0 })\r\n }\r\n\r\n private drawRandomDot({ x, y, size }: DrawArgs): void {\r\n const randomFactor = Math.random() * (1 - 0.75) + 0.75\r\n this.basicDot({ x, y, size: size * randomFactor, rotation: 0 })\r\n }\r\n\r\n private drawSquare({ x, y, size }: DrawArgs): void {\r\n this.basicSquare({ x, y, size, rotation: 0 })\r\n }\r\n\r\n private drawSmallSquare({ x, y, size }: DrawArgs): void {\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 this.basicSquare({ x, y, size, rotation: 0 })\r\n }\r\n\r\n private drawTinySquare({ x, y, size }: DrawArgs): void {\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 this.basicSquare({ x, y, size, rotation: 0 })\r\n }\r\n\r\n private drawDiamond({ x, y, size }: DrawArgs): void {\r\n this.basicSquare({ x, y, size, rotation: Math.PI / 4 })\r\n }\r\n\r\n private drawRounded({ x, y, size, getNeighbor }: DrawArgs): void {\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 this.basicDot({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n this.basicSquare({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (neighborsCount === 2) {\r\n let rotation = 0\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n this.basicCornerRounded({ x, y, size, rotation })\r\n return\r\n }\r\n\r\n if (neighborsCount === 1) {\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 this.basicSideRounded({ x, y, size, rotation })\r\n return\r\n }\r\n }\r\n\r\n private drawVerticalLine({ x, y, size, getNeighbor }: DrawArgs): void {\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 (\r\n neighborsCount === 0 ||\r\n (leftNeighbor && !(topNeighbor || bottomNeighbor)) ||\r\n (rightNeighbor && !(topNeighbor || bottomNeighbor))\r\n ) {\r\n this.basicDot({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (topNeighbor && bottomNeighbor) {\r\n this.basicSquare({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (topNeighbor && !bottomNeighbor) {\r\n const rotation = Math.PI / 2\r\n this.basicSideRounded({ x, y, size, rotation })\r\n return\r\n }\r\n\r\n if (bottomNeighbor && !topNeighbor) {\r\n const rotation = -Math.PI / 2\r\n this.basicSideRounded({ x, y, size, rotation })\r\n return\r\n }\r\n }\r\n\r\n private drawHorizontalLine({ x, y, size, getNeighbor }: DrawArgs): void {\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 (\r\n neighborsCount === 0 ||\r\n (topNeighbor && !(leftNeighbor || rightNeighbor)) ||\r\n (bottomNeighbor && !(leftNeighbor || rightNeighbor))\r\n ) {\r\n this.basicDot({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (leftNeighbor && rightNeighbor) {\r\n this.basicSquare({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (leftNeighbor && !rightNeighbor) {\r\n const rotation = 0\r\n this.basicSideRounded({ x, y, size, rotation })\r\n return\r\n }\r\n\r\n if (rightNeighbor && !leftNeighbor) {\r\n const rotation = Math.PI\r\n this.basicSideRounded({ x, y, size, rotation })\r\n return\r\n }\r\n }\r\n\r\n private drawExtraRounded({ x, y, size, getNeighbor }: DrawArgs): void {\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 this.basicDot({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n this.basicSquare({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (neighborsCount === 2) {\r\n let rotation = 0\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n this.basicCornerExtraRounded({ x, y, size, rotation })\r\n return\r\n }\r\n\r\n if (neighborsCount === 1) {\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 this.basicSideRounded({ x, y, size, rotation })\r\n return\r\n }\r\n }\r\n\r\n private drawClassy({ x, y, size, getNeighbor }: DrawArgs): void {\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 this.basicCornersRounded({ x, y, size, rotation: Math.PI / 2 })\r\n return\r\n }\r\n\r\n if (!leftNeighbor && !topNeighbor) {\r\n this.basicCornerRounded({ x, y, size, rotation: -Math.PI / 2 })\r\n return\r\n }\r\n\r\n if (!rightNeighbor && !bottomNeighbor) {\r\n this.basicCornerRounded({ x, y, size, rotation: Math.PI / 2 })\r\n return\r\n }\r\n\r\n this.basicSquare({ x, y, size, rotation: 0 })\r\n }\r\n\r\n private drawClassyRounded({ x, y, size, getNeighbor }: DrawArgs): void {\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 this.basicCornersRounded({ x, y, size, rotation: Math.PI / 2 })\r\n return\r\n }\r\n\r\n if (!leftNeighbor && !topNeighbor) {\r\n this.basicCornerExtraRounded({ x, y, size, rotation: -Math.PI / 2 })\r\n return\r\n }\r\n\r\n if (!rightNeighbor && !bottomNeighbor) {\r\n this.basicCornerExtraRounded({ x, y, size, rotation: Math.PI / 2 })\r\n return\r\n }\r\n\r\n this.basicSquare({ x, y, size, rotation: 0 })\r\n }\r\n\r\n private drawWave({ x, y, size, getNeighbor }: DrawArgs): void {\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 this.basicDot({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n this.basicSquare({ x, y, size, rotation: 0 })\r\n return\r\n }\r\n\r\n if (neighborsCount === 2) {\r\n let rotation = 0\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n this.basicCornerExtraRounded({ x, y, size, rotation })\r\n return\r\n }\r\n\r\n if (neighborsCount === 1) {\r\n let rotation = 0\r\n\r\n if (rightNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (bottomNeighbor) {\r\n rotation = Math.PI\r\n } else if (leftNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n this.basicWave({ x, y, size, rotation })\r\n return\r\n }\r\n }\r\n}\r\n","export const browserImageTools = {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\r\n if (typeof url == 'string' && url.startsWith('data:')) return Promise.resolve(url)\r\n return new Promise((resolve, reject) => {\r\n if (typeof url == 'string') {\r\n const xhr = new XMLHttpRequest()\r\n xhr.onload = () => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result as string)\r\n }\r\n reader.readAsDataURL(xhr.response)\r\n }\r\n xhr.onerror = xhr.onabort = xhr.ontimeout = reject\r\n xhr.open('GET', url, true)\r\n xhr.responseType = 'blob'\r\n xhr.send()\r\n } else {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result as string)\r\n }\r\n reader.readAsDataURL(url as Blob)\r\n }\r\n })\r\n },\r\n getSize: (src: string | Blob | Buffer, crossOrigin?: string): Promise<{ width: number, height: number }> => new Promise((resolve, reject) => {\r\n const image = new Image()\r\n\r\n if (crossOrigin === 'string') {\r\n image.crossOrigin = crossOrigin\r\n }\r\n\r\n image.onload = (): void => {\r\n resolve({ width: image.width, height: image.height })\r\n }\r\n image.onerror = image.onabort = reject\r\n\r\n if (typeof src == 'string') image.src = src\r\n else\r\n browserImageTools\r\n .toDataURL(src)\r\n .then((url) => (image.src = url))\r\n .catch(reject)\r\n })\r\n}\r\n","export function parseColor(cstr: string) {\r\n let m: RegExpExecArray | null\r\n let parts: string[] | number[] = []\r\n let alpha = 1\r\n\r\n cstr = cstr.toLowerCase()\r\n\r\n if (cstr[0] === '#') {\r\n const base = cstr.slice(1)\r\n const size = base.length\r\n const isShort = size <= 4\r\n\r\n if (isShort) {\r\n parts = [parseInt(base[0] + base[0], 16), parseInt(base[1] + base[1], 16), parseInt(base[2] + base[2], 16)]\r\n if (size === 4) {\r\n alpha = parseInt(base[3] + base[3], 16) / 255\r\n }\r\n } else {\r\n parts = [parseInt(base[0] + base[1], 16), parseInt(base[2] + base[3], 16), parseInt(base[4] + base[5], 16)]\r\n if (size === 8) {\r\n alpha = parseInt(base[6] + base[7], 16) / 255\r\n }\r\n }\r\n\r\n if (!parts[0]) parts[0] = 0\r\n if (!parts[1]) parts[1] = 0\r\n if (!parts[2]) parts[2] = 0\r\n } else if ((m = /^((?:rgba?))\\s*\\(([^)]*)\\)/.exec(cstr))) {\r\n const dims = 3\r\n parts = m[2].trim().split(/\\s*[,/]\\s*|\\s+/)\r\n\r\n parts = parts.map((x, i) => {\r\n if (x[x.length - 1] === '%') {\r\n const v = parseFloat(x) / 100\r\n if (i === 3) return v\r\n return v * 255\r\n }\r\n\r\n if (x === 'none') return 0\r\n return parseFloat(x)\r\n })\r\n\r\n alpha = parts.length > dims ? parts.pop()! : 1\r\n } else {\r\n return {\r\n value: cstr,\r\n alpha\r\n }\r\n }\r\n\r\n const value = '#' + parts.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, '0')).join('')\r\n return {\r\n value,\r\n alpha: Math.max(0, Math.min(1, alpha))\r\n }\r\n}\r\n","import { QRCodeMinimal } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { QRUtil } from '@liquid-js/qrcode-generator/lib/qrcode/QRUtil.js'\r\nimport { QRCornerDot } from '../figures/corner-dot.js'\r\nimport { QRCornerSquare } from '../figures/corner-square.js'\r\nimport { QRDot } from '../figures/dot.js'\r\nimport { browserImageTools } from '../tools/browser-image-tools.js'\r\nimport { parseColor } from '../utils/color.js'\r\nimport { Gradient, GradientType } from '../utils/gradient.js'\r\nimport { calculateImageSize } from '../utils/image.js'\r\nimport { CornerDotType, CornerSquareType, DotType, ImageMode, Options, ShapeType } from '../utils/options.js'\r\nimport { numToAttr } from '../utils/svg.js'\r\n\r\nconst squareMask = [\r\n [1, 1, 1, 1, 1, 1, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 1, 1, 1, 1, 1, 1]\r\n]\r\n\r\nconst cornerSquareTypes = new Set<string>(Object.values(CornerSquareType))\r\nfunction isCornerSquareType(val?: string): val is `${CornerSquareType}` {\r\n return !!(val && cornerSquareTypes.has(val))\r\n}\r\n\r\nconst dotMask = [\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0]\r\n]\r\n\r\nconst cornerDotTypes = new Set<string>(Object.values(CornerDotType))\r\nfunction isCornerDotType(val?: string): val is `${CornerDotType}` {\r\n return !!(val && cornerDotTypes.has(val))\r\n}\r\n\r\nexport class QRSVG {\r\n private _element: SVGElement\r\n\r\n get element() {\r\n return this._element\r\n }\r\n\r\n private defs: SVGElement\r\n\r\n private backgroundMask?: SVGElement\r\n private backgroundMaskGroup?: SVGElement\r\n\r\n private dotsMask?: SVGElement\r\n private dotsMaskGroup?: SVGElement\r\n\r\n private lightDotsMask?: SVGElement\r\n private lightDotsMaskGroup?: SVGElement\r\n\r\n private qr?: QRCodeMinimal\r\n private document: Document\r\n private imageTools: typeof browserImageTools\r\n\r\n constructor(\r\n private options: Pick<\r\n Options,\r\n | 'width'\r\n | 'height'\r\n | 'document'\r\n | 'imageTools'\r\n | 'image'\r\n | 'imageOptions'\r\n | 'dotsOptions'\r\n | 'cornersDotOptions'\r\n | 'cornersSquareOptions'\r\n | 'backgroundOptions'\r\n | 'shape'\r\n > & { errorCorrectionPercent: number }\r\n ) {\r\n this.document = options.document\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'svg')\r\n const width = numToAttr(options.width)\r\n const height = numToAttr(options.height)\r\n this._element.setAttribute('width', width)\r\n this._element.setAttribute('height', height)\r\n this._element.setAttribute('viewBox', `0 0 ${width} ${height}`)\r\n this.defs = this.document.createElementNS('http://www.w3.org/2000/svg', 'defs')\r\n this._element.appendChild(this.defs)\r\n this.imageTools = options.imageTools || browserImageTools\r\n }\r\n\r\n get width(): number {\r\n return this.options.width\r\n }\r\n\r\n get height(): number {\r\n return this.options.height\r\n }\r\n\r\n async drawQR(qr: QRCodeMinimal): Promise<void> {\r\n const count = qr.getModuleCount()\r\n const typeNumber = parseInt(((count - 17) / 4).toFixed(0), 10)\r\n const dotSize = this.options.dotsOptions.size\r\n let drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n\r\n this.qr = qr\r\n\r\n if (this.options.image) {\r\n //We need it to get image size\r\n const size = await this.imageTools.getSize(this.options.image, this.options.imageOptions.crossOrigin)\r\n const { imageOptions, errorCorrectionPercent } = this.options\r\n\r\n if (imageOptions.mode == ImageMode.background) {\r\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n const maxWidth = (this.options.width - 2 * margin * dotSize) * imageOptions.imageSize\r\n const maxHeight = (this.options.height - 2 * margin * dotSize) * imageOptions.imageSize\r\n let { width, height } = size\r\n\r\n height = (height / width) * maxWidth\r\n width = maxWidth\r\n\r\n if (height > maxHeight) {\r\n width = (width / height) * maxHeight\r\n height = maxHeight\r\n }\r\n\r\n drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width,\r\n height\r\n }\r\n } else {\r\n const coverLevel = imageOptions.imageSize * errorCorrectionPercent\r\n const alignment = QRUtil.getPatternPosition(typeNumber)\r\n const maxHiddenDots = Math.floor(\r\n coverLevel * (count * count - 3 * 8 * 8 - 2 * (count - 16) - alignment.length ** 2 * 25)\r\n )\r\n\r\n drawImageSize = calculateImageSize({\r\n originalWidth: size.width,\r\n originalHeight: size.height,\r\n maxHiddenDots,\r\n maxHiddenAxisDots: count - 14,\r\n dotSize,\r\n margin: imageOptions.margin\r\n })\r\n }\r\n }\r\n\r\n this.drawBackground()\r\n\r\n if (\r\n this.options.imageOptions.mode != ImageMode.overlay &&\r\n this.options.image &&\r\n drawImageSize.width > 0 &&\r\n drawImageSize.height > 0\r\n ) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize })\r\n }\r\n\r\n this.drawDots((i: number, j: number): boolean => {\r\n if (this.options.imageOptions.mode == ImageMode.center) {\r\n if (\r\n i >= (count - drawImageSize.hideXDots) / 2 &&\r\n i < (count + drawImageSize.hideXDots) / 2 &&\r\n j >= (count - drawImageSize.hideYDots) / 2 &&\r\n j < (count + drawImageSize.hideYDots) / 2\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if ((i < 8 && j < 8) || (i >= count - 8 && j < 8) || (j >= count - 8 && i < 8)) return false\r\n\r\n return true\r\n })\r\n\r\n if (\r\n this.options.imageOptions.mode == ImageMode.overlay &&\r\n this.options.image &&\r\n drawImageSize.width > 0 &&\r\n drawImageSize.height > 0\r\n ) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize })\r\n }\r\n\r\n this.drawCorners()\r\n }\r\n\r\n drawBackground(): void {\r\n const options = this.options\r\n\r\n if (this._element && options.backgroundOptions) {\r\n const gradientOptions = options.backgroundOptions.gradient\r\n const color = options.backgroundOptions.color\r\n\r\n this.createColor({\r\n options: gradientOptions,\r\n color,\r\n additionalRotation: 0,\r\n x: 0,\r\n y: 0,\r\n height: options.height,\r\n width: options.width,\r\n name: 'background-color'\r\n })\r\n\r\n const size = Math.min(options.width, options.height)\r\n const element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n [this.backgroundMask, this.backgroundMaskGroup] = this.createMask('mask-background-color')\r\n this.defs.appendChild(this.backgroundMask)\r\n\r\n element.setAttribute('x', numToAttr((options.width - size) / 2))\r\n element.setAttribute('y', numToAttr((options.height - size) / 2))\r\n element.setAttribute('width', numToAttr(size))\r\n element.setAttribute('height', numToAttr(size))\r\n element.setAttribute('rx', numToAttr((size / 2) * (options.backgroundOptions.round || 0)))\r\n\r\n this.backgroundMaskGroup.appendChild(element)\r\n }\r\n }\r\n\r\n drawDots(filter?: (i: number, j: number) => boolean): void {\r\n if (!this.qr) {\r\n throw new Error('QR code is not defined')\r\n }\r\n\r\n const options = this.options\r\n const count = this.qr.getModuleCount()\r\n\r\n if (count > options.width || count > options.height) {\r\n throw new Error('The canvas is too small')\r\n }\r\n\r\n const dotSize = this.options.dotsOptions.size\r\n let minSize = Math.min(options.width, options.height)\r\n if (options.imageOptions.mode == ImageMode.background) minSize -= 2 * dotSize * (options.imageOptions.margin || 0)\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2)\r\n let dot = new QRDot(options.dotsOptions.type, this.document)\r\n const overlayDot = new QRDot(DotType.tinySquare, this.document)\r\n const markerDot = new QRDot(DotType.square, this.document);\r\n\r\n [this.dotsMask, this.dotsMaskGroup] = this.createMask('mask-dot-color')\r\n this.defs.appendChild(this.dotsMask)\r\n\r\n if (options.imageOptions.mode == ImageMode.background) {\r\n [this.lightDotsMask, this.lightDotsMaskGroup] = this.createMask('mask-light-dot-color')\r\n this.defs.appendChild(this.lightDotsMask)\r\n }\r\n\r\n let margin = 0\r\n let additionalDots = 0\r\n let fakeCount = count\r\n\r\n if (options.shape === ShapeType.circle) {\r\n margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n additionalDots = Math.floor((minSize / dotSize - count - 2 * margin) / 2)\r\n fakeCount = count + additionalDots * 2\r\n } else if (options.imageOptions.mode == ImageMode.background) {\r\n additionalDots = 1\r\n fakeCount = count + additionalDots * 2\r\n }\r\n\r\n const xFakeBeginning = xBeginning - additionalDots * dotSize\r\n const yFakeBeginning = yBeginning - additionalDots * dotSize\r\n const colorX = xFakeBeginning\r\n const colorY = yFakeBeginning\r\n const colorCount = count + additionalDots * 2\r\n const fakeMatrix: Array<Array<boolean | undefined>> = new Array(fakeCount)\r\n const center = Math.floor(fakeCount / 2)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n fakeMatrix[i] = new Array(fakeCount)\r\n for (let j = 0; j < fakeCount; j++) {\r\n if (\r\n i > additionalDots - 1 &&\r\n i < fakeCount - additionalDots &&\r\n j > additionalDots - 1 &&\r\n j < fakeCount - additionalDots\r\n ) {\r\n const ii = i - additionalDots\r\n const jj = j - additionalDots\r\n if (filter && !filter(ii, jj)) fakeMatrix[i][j] = undefined\r\n else fakeMatrix[i][j] = !!this.qr.isDark(jj, ii)\r\n continue\r\n }\r\n\r\n if (\r\n options.shape === ShapeType.circle &&\r\n Math.sqrt((i - center) * (i - center) + (j - center) * (j - center)) > center\r\n ) {\r\n fakeMatrix[i][j] = undefined\r\n continue\r\n }\r\n\r\n if (\r\n i == additionalDots - 1 ||\r\n i == fakeCount - additionalDots ||\r\n j == additionalDots - 1 ||\r\n j == fakeCount - additionalDots\r\n ) {\r\n if (\r\n (j == additionalDots - 1 && (i < additionalDots + 8 || i > fakeCount - additionalDots - 9)) ||\r\n (j == fakeCount - additionalDots && i < additionalDots + 8) ||\r\n (i == additionalDots - 1 && (j < additionalDots + 8 || j > fakeCount - additionalDots - 9)) ||\r\n (i == fakeCount - additionalDots && j < additionalDots + 8)\r\n )\r\n fakeMatrix[i][j] = undefined\r\n else fakeMatrix[i][j] = false\r\n continue\r\n }\r\n\r\n // Get random dots from QR code to show it outside of QR code\r\n fakeMatrix[i][j] = this.qr.isDark(\r\n j - 2 * additionalDots < 0 ? j : j >= count ? j - 2 * additionalDots : j - additionalDots,\r\n i - 2 * additionalDots < 0 ? i : i >= count ? i - 2 * additionalDots : i - additionalDots\r\n )\r\n }\r\n }\r\n\r\n const typeNr = (count - 17) / 4\r\n const alignment = QRUtil.getPatternPosition(typeNr)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n const iAlign = alignment.find((v) => i - additionalDots > v - 3 && i - additionalDots < v + 3)\r\n for (let j = 0; j < fakeCount; j++) {\r\n const jAlign = alignment.find((v) => j - additionalDots > v - 3 && j - additionalDots < v + 3)\r\n if (fakeMatrix[i][j] == undefined) continue\r\n\r\n if (this.lightDotsMask) {\r\n dot =\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 ? markerDot\r\n : overlayDot\r\n }\r\n\r\n if (!fakeMatrix[i][j]) {\r\n if (this.lightDotsMask) {\r\n dot.draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => fakeMatrix[i + xOffset]?.[j + yOffset] === false\r\n })\r\n\r\n if (dot.element && this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(dot.element)\r\n }\r\n }\r\n continue\r\n }\r\n\r\n dot.draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => fakeMatrix[i + xOffset]?.[j + yOffset] === true\r\n })\r\n if (dot.element && this.dotsMaskGroup) {\r\n this.dotsMaskGroup.appendChild(dot.element)\r\n }\r\n }\r\n }\r\n\r\n if (this.lightDotsMask) {\r\n this.createColor({\r\n options: options.imageOptions.fill.gradient,\r\n color: options.imageOptions.fill.color,\r\n additionalRotation: 0,\r\n x: colorX,\r\n y: colorY,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: 'light-dot-color'\r\n })\r\n }\r\n\r\n this.createColor({\r\n options: options.dotsOptions?.gradient,\r\n color: options.dotsOptions.color,\r\n additionalRotation: 0,\r\n x: colorX,\r\n y: colorY,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: 'dot-color'\r\n })\r\n }\r\n\r\n drawCorners(): void {\r\n if (!this.qr) {\r\n throw new Error('QR code is not defined')\r\n }\r\n\r\n const element = this._element\r\n const options = this.options\r\n\r\n if (!element) {\r\n throw new Error('Element code is not defined')\r\n }\r\n\r\n const count = this.qr.getModuleCount()\r\n const dotSize = this.options.dotsOptions.size\r\n const cornersSquareSize = dotSize * 7\r\n const cornersDotSize = dotSize * 3\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\r\n\r\n [\r\n [0, 0, 0],\r\n [1, 0, Math.PI / 2],\r\n [0, 1, -Math.PI / 2]\r\n ].forEach(([column, row, rotation]) => {\r\n const x = xBeginning + column * dotSize * (count - 7)\r\n const y = yBeginning + row * dotSize * (count - 7)\r\n let cornersSquareMask = this.dotsMask\r\n let cornersSquareMaskGroup = this.dotsMaskGroup\r\n let cornersDotMask = this.dotsMask\r\n let cornersDotMaskGroup = this.dotsMaskGroup\r\n\r\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\r\n [cornersSquareMask, cornersSquareMaskGroup] = this.createMask(`mask-corners-square-color-${column}-${row}`)\r\n this.defs.appendChild(cornersSquareMask)\r\n cornersDotMask = cornersSquareMask\r\n cornersDotMaskGroup = cornersSquareMaskGroup\r\n\r\n this.createColor({\r\n options: options.cornersSquareOptions?.gradient,\r\n color: options.cornersSquareOptions?.color,\r\n additionalRotation: rotation,\r\n x,\r\n y,\r\n height: cornersSquareSize,\r\n width: cornersSquareSize,\r\n name: `corners-square-color-${column}-${row}`\r\n })\r\n }\r\n\r\n if (isCornerSquareType(options.cornersSquareOptions?.type)) {\r\n const cornersSquare = new QRCornerSquare(options.cornersSquareOptions.type, this.document)\r\n\r\n cornersSquare.draw({\r\n x,\r\n y,\r\n size: cornersSquareSize,\r\n rotation\r\n })\r\n\r\n if (cornersSquare.element && cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(cornersSquare.element)\r\n }\r\n\r\n if (cornersSquare.fill && this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(cornersSquare.fill)\r\n }\r\n } else {\r\n const dot = new QRDot(options.cornersSquareOptions?.type || options.dotsOptions.type, this.document)\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 dot.draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean =>\r\n !squareMask[i + xOffset]?.[j + yOffset] && !dotMask[i + xOffset]?.[j + yOffset]\r\n })\r\n\r\n if (dot.element && this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(dot.element)\r\n }\r\n }\r\n continue\r\n }\r\n\r\n dot.draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!squareMask[i + xOffset]?.[j + yOffset]\r\n })\r\n\r\n if (dot.element && cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(dot.element)\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 dot.draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\r\n const ii = i + xOffset\r\n const jj = j + yOffset\r\n return ii >= -1 && ii <= 7 && jj >= -1 && jj <= 7 && (ii == -1 || ii == 7 || jj == -1 || jj == 7)\r\n }\r\n })\r\n\r\n if (dot.element && this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(dot.element)\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\r\n [cornersDotMask, cornersDotMaskGroup] = this.createMask(`mask-corners-dot-color-${column}-${row}`)\r\n this.defs.appendChild(cornersDotMask)\r\n\r\n this.createColor({\r\n options: options.cornersDotOptions?.gradient,\r\n color: options.cornersDotOptions?.color,\r\n additionalRotation: rotation,\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n height: cornersDotSize,\r\n width: cornersDotSize,\r\n name: `corners-dot-color-${column}-${row}`\r\n })\r\n }\r\n\r\n if (isCornerDotType(options.cornersDotOptions?.type)) {\r\n const cornersDot = new QRCornerDot(options.cornersDotOptions.type, this.document)\r\n\r\n cornersDot.draw({\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n size: cornersDotSize,\r\n rotation\r\n })\r\n\r\n if (cornersDot.element && cornersDotMaskGroup) {\r\n cornersDotMaskGroup.appendChild(cornersDot.element)\r\n }\r\n } else {\r\n const dot = new QRDot(options.cornersDotOptions?.type || options.dotsOptions.type, this.document)\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 dot.draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!dotMask[i + xOffset]?.[j + yOffset]\r\n })\r\n\r\n if (dot.element && cornersDotMaskGroup) {\r\n cornersDotMaskGroup.appendChild(dot.element)\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n async drawImage({\r\n width,\r\n height,\r\n count,\r\n dotSize\r\n }: {\r\n width: number\r\n height: number\r\n count: number\r\n dotSize: number\r\n }): Promise<void> {\r\n const options = this.options\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2)\r\n let margin = options.imageOptions.margin * dotSize\r\n if (options.imageOptions.mode == ImageMode.background) margin = 0\r\n const dx = xBeginning + margin + (count * dotSize - width) / 2\r\n const dy = yBeginning + margin + (count * dotSize - height) / 2\r\n const dw = width - margin * 2\r\n const dh = height - margin * 2\r\n\r\n const imageUrl = await this.imageTools.toDataURL(options.image || '')\r\n let image: SVGElement = this.document.createElementNS('http://www.w3.org/2000/svg', 'image')\r\n image.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', imageUrl || '')\r\n\r\n if (imageUrl.startsWith('data:image/svg+xml;')) {\r\n let data = imageUrl.substring(19)\r\n const i = data.indexOf(',')\r\n const encoding = data.substring(0, i)\r\n data = data.substring(i + 1)\r\n\r\n switch (encoding) {\r\n case 'base64':\r\n data = typeof atob == 'function' ? atob(data) : Buffer.from(data, 'base64').toString('utf8')\r\n break\r\n default:\r\n data = ''\r\n break\r\n }\r\n\r\n if (data) {\r\n const container = new DOMParser().parseFromString(data, 'text/xml')\r\n const rootEl = Array.from(container.getElementsByTagName('svg'))\r\n if (rootEl.length) {\r\n image = rootEl[0]\r\n image.setAttribute('overflow', 'visible')\r\n }\r\n }\r\n }\r\n\r\n image.setAttribute('x', numToAttr(dx))\r\n image.setAttribute('y', numToAttr(dy))\r\n image.setAttribute('width', `${numToAttr(dw)}px`)\r\n image.setAttribute('height', `${numToAttr(dh)}px`)\r\n\r\n this._element.appendChild(image)\r\n }\r\n\r\n private createColor({\r\n options,\r\n color,\r\n additionalRotation,\r\n x,\r\n y,\r\n height,\r\n width,\r\n name\r\n }: {\r\n options?: Gradient\r\n color?: string\r\n additionalRotation: number\r\n x: number\r\n y: number\r\n height: number\r\n width: number\r\n name: string\r\n }): void {\r\n const size = width > height ? width : height\r\n const rect = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n rect.setAttribute('x', numToAttr(x))\r\n rect.setAttribute('y', numToAttr(y))\r\n rect.setAttribute('height', numToAttr(height))\r\n rect.setAttribute('width', numToAttr(width))\r\n rect.setAttribute('style', `mask:url(#mask-${name})`)\r\n\r\n if (options) {\r\n let gradient: SVGElement\r\n if (options.type === GradientType.radial) {\r\n gradient = this.document.createElementNS('http://www.w3.org/2000/svg', 'radialGradient')\r\n gradient.setAttribute('id', name)\r\n gradient.setAttribute('gradientUnits', 'userSpaceOnUse')\r\n gradient.setAttribute('fx', numToAttr(x + width / 2))\r\n gradient.setAttribute('fy', numToAttr(y + height / 2))\r\n gradient.setAttribute('cx', numToAttr(x + width / 2))\r\n gradient.setAttribute('cy', numToAttr(y + height / 2))\r\n gradient.setAttribute('r', numToAttr(size / 2))\r\n } else {\r\n const rotation = ((options.rotation || 0) + additionalRotation) % (2 * Math.PI)\r\n const positiveRotation = (rotation + 2 * Math.PI) % (2 * Math.PI)\r\n let x0 = x + width / 2\r\n let y0 = y + height / 2\r\n let x1 = x + width / 2\r\n let y1 = y + height / 2\r\n\r\n if (\r\n (positiveRotation >= 0 && positiveRotation <= 0.25 * Math.PI) ||\r\n (positiveRotation > 1.75 * Math.PI && positiveRotation <= 2 * Math.PI)\r\n ) {\r\n x0 = x0 - width / 2\r\n y0 = y0 - (height / 2) * Math.tan(rotation)\r\n x1 = x1 + width / 2\r\n y1 = y1 + (height / 2) * Math.tan(rotation)\r\n } else if (positiveRotation > 0.25 * Math.PI && positiveRotation <= 0.75 * Math.PI) {\r\n y0 = y0 - height / 2\r\n x0 = x0 - width / 2 / Math.tan(rotation)\r\n y1 = y1 + height / 2\r\n x1 = x1 + width / 2 / Math.tan(rotation)\r\n } else if (positiveRotation > 0.75 * Math.PI && positiveRotation <= 1.25 * Math.PI) {\r\n x0 = x0 + width / 2\r\n y0 = y0 + (height / 2) * Math.tan(rotation)\r\n x1 = x1 - width / 2\r\n y1 = y1 - (height / 2) * Math.tan(rotation)\r\n } else if (positiveRotation > 1.25 * Math.PI && positiveRotation <= 1.75 * Math.PI) {\r\n y0 = y0 + height / 2\r\n x0 = x0 + width / 2 / Math.tan(rotation)\r\n y1 = y1 - height / 2\r\n x1 = x1 - width / 2 / Math.tan(rotation)\r\n }\r\n\r\n gradient = this.document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient')\r\n gradient.setAttribute('id', name)\r\n gradient.setAttribute('gradientUnits', 'userSpaceOnUse')\r\n gradient.setAttribute('x1', numToAttr(x0))\r\n gradient.setAttribute('y1', numToAttr(y0))\r\n gradient.setAttribute('x2', numToAttr(x1))\r\n gradient.setAttribute('y2', numToAttr(y1))\r\n }\r\n\r\n options.colorStops.forEach((stopCfg: { offset: number, color: string }) => {\r\n const stop = this.document.createElementNS('http://www.w3.org/2000/svg', 'stop')\r\n stop.setAttribute('offset', `${numToAttr(100 * stopCfg.offset)}%`)\r\n\r\n const parsed = parseColor(stopCfg.color)\r\n stop.setAttribute('stop-color', parsed.value)\r\n if (parsed.alpha < 1) stop.setAttribute('stop-opacity', parsed.alpha.toFixed(7))\r\n gradient.appendChild(stop)\r\n })\r\n\r\n rect.setAttribute('fill', `url(#${name})`)\r\n this.defs.appendChild(gradient)\r\n } else if (color) {\r\n const parsed = parseColor(color)\r\n rect.setAttribute('fill', parsed.value)\r\n if (parsed.alpha < 1) rect.setAttribute('opacity', parsed.alpha.toFixed(7))\r\n }\r\n\r\n this._element.appendChild(rect)\r\n }\r\n\r\n private createMask(id: string) {\r\n const options = this.options\r\n\r\n const mask = this.document.createElementNS('http://www.w3.org/2000/svg', 'mask')\r\n mask.setAttribute('id', id)\r\n mask.setAttribute('maskUnits', 'userSpaceOnUse')\r\n mask.setAttribute('x', '0')\r\n mask.setAttribute('y', '0')\r\n mask.setAttribute('width', numToAttr(options.width))\r\n mask.setAttribute('height', numToAttr(options.height))\r\n\r\n const group = this.document.createElementNS('http://www.w3.org/2000/svg', 'g')\r\n group.setAttribute('fill', '#fff')\r\n mask.appendChild(group)\r\n\r\n return [mask, group]\r\n }\r\n}\r\n","interface ImageSizeOptions {\r\n originalHeight: number\r\n originalWidth: number\r\n maxHiddenDots: number\r\n maxHiddenAxisDots?: number\r\n dotSize: number\r\n margin: number\r\n}\r\n\r\ninterface ImageSizeResult {\r\n height: number\r\n width: number\r\n hideYDots: number\r\n hideXDots: number\r\n}\r\n\r\nexport function calculateImageSize({\r\n originalHeight,\r\n originalWidth,\r\n maxHiddenDots,\r\n maxHiddenAxisDots,\r\n dotSize,\r\n margin\r\n}: ImageSizeOptions): ImageSizeResult {\r\n const hideDots = { x: 0, y: 0 }\r\n const imageSize = { x: 0, y: 0 }\r\n\r\n if (\r\n originalHeight <= 0 ||\r\n originalWidth <= 0 ||\r\n maxHiddenDots <= 0 ||\r\n dotSize <= 0 ||\r\n 4 * margin ** 2 > maxHiddenDots\r\n ) {\r\n return {\r\n height: 0,\r\n width: 0,\r\n hideYDots: 0,\r\n hideXDots: 0\r\n }\r\n }\r\n\r\n //If set, ensure maxHiddenAxisDots is odd and at least 1\r\n if (maxHiddenAxisDots && maxHiddenAxisDots % 2 == 0) maxHiddenAxisDots = Math.max(1, maxHiddenAxisDots - 1)\r\n\r\n //Determine the bigger and smaller image dimension\r\n const dimMax = Math.max(originalWidth, originalHeight)\r\n const dimMin = Math.min(originalWidth, originalHeight)\r\n\r\n //Find max image size along the bigger dimension\r\n let lower = 0\r\n let upper = (maxHiddenAxisDots || maxHiddenDots) - 2 * margin\r\n do {\r\n const newSize = lower + (upper - lower) / 2\r\n let dotsMax = Math.max(1, Math.ceil(newSize + 2 * margin))\r\n if (dotsMax % 2 == 0) dotsMax++\r\n let dotsMin = Math.max(1, Math.ceil((newSize * dimMin) / dimMax + 2 * margin))\r\n if (dotsMin % 2 == 0) dotsMin++\r\n\r\n if (dotsMax * dotsMin > maxHiddenDots) upper = newSize\r\n else lower = newSize\r\n } while (Math.abs(lower - upper) > 0.001)\r\n\r\n //Calculate how many dots the given size corresponds to\r\n const size = lower\r\n let hideMax = Math.max(1, Math.ceil(size + 2 * margin))\r\n if (hideMax % 2 == 0) hideMax++\r\n let hideMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin))\r\n if (hideMin % 2 == 0) hideMin++\r\n\r\n //Set hidden dots along bigger and smaller dimension to the right axis\r\n if (originalWidth > originalHeight) {\r\n hideDots.x = hideMax\r\n hideDots.y = hideMin\r\n } else {\r\n hideDots.x = hideMin\r\n hideDots.y = hideMax\r\n }\r\n\r\n //Fit image to the hidden dots\r\n const maxW = (hideDots.x - 2 * margin) * dotSize\r\n const maxH = (hideDots.y - 2 * margin) * dotSize\r\n imageSize.x = maxW\r\n imageSize.y = (maxW * originalHeight) / originalWidth\r\n if (imageSize.y > maxH) {\r\n imageSize.y = maxH\r\n imageSize.x = (maxH * originalWidth) / originalHeight\r\n }\r\n\r\n return {\r\n height: Math.round(imageSize.y + 2 * margin * dotSize),\r\n width: Math.round(imageSize.x + 2 * margin * dotSize),\r\n hideYDots: hideDots.y,\r\n hideXDots: hideDots.x\r\n }\r\n}\r\n","import { QRCodeMinimal } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { stringToBytes_UTF8 } from '@liquid-js/qrcode-generator/lib/text/stringToBytes_UTF8.js'\r\nimport { RecursivePartial } from '../types/helper.js'\r\nimport { mergeDeep } from '../utils/merge.js'\r\nimport { ImageMode, Options, ShapeType, defaultOptions, sanitizeOptions } from '../utils/options.js'\r\nimport { ErrorCorrectionPercents, getMode } from '../utils/qrcode.js'\r\nimport { QRSVG } from './qr-svg.js'\r\n\r\nObject.assign(QRCodeMinimal.stringToBytesFuncs, stringToBytes_UTF8)\r\n\r\nexport type ExtensionFunction = (svg: SVGElement, options: RecursivePartial<Options>) => void\r\n\r\nexport class QRCodeStyling {\r\n private options: Options\r\n private container?: HTMLElement\r\n private qr?: QRCodeMinimal\r\n private extension?: ExtensionFunction\r\n private svgDrawingPromise?: Promise<void>\r\n private qrSVG?: QRSVG\r\n\r\n get size() {\r\n if (this.qrSVG)\r\n return {\r\n width: this.qrSVG.width,\r\n height: this.qrSVG.height\r\n }\r\n return undefined\r\n }\r\n\r\n constructor(options?: RecursivePartial<Options>) {\r\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions\r\n this.update()\r\n }\r\n\r\n update(\r\n /** The same options as for initialization */\r\n options?: RecursivePartial<Options>\r\n ): void {\r\n if (this.container) this.container.innerHTML = ''\r\n\r\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options\r\n\r\n if (!this.options.data) {\r\n return\r\n }\r\n\r\n if (this.options.stringToBytesFuncs) {\r\n Object.assign(QRCodeMinimal.stringToBytesFuncs, this.options.stringToBytesFuncs)\r\n delete this.options.stringToBytesFuncs\r\n }\r\n\r\n this.qr = new QRCodeMinimal(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel)\r\n const mode = this.options.qrOptions.mode || getMode(this.options.data)\r\n this.qr.addData(this.options.data, mode)\r\n this.qr.make()\r\n\r\n this.setupSvg()\r\n\r\n this.append(this.container)\r\n }\r\n\r\n append(\r\n /** This container will be used for appending of the QR code */\r\n container?: HTMLElement\r\n ): void {\r\n if (!container) {\r\n return\r\n }\r\n\r\n if (this.qrSVG?.element) {\r\n container.appendChild(this.qrSVG.element)\r\n }\r\n\r\n this.container = container\r\n }\r\n\r\n /**\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * const extension = (svg, options) => {\r\n * const { width, height } = options;\r\n * const size = Math.min(width, height);\r\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n * const borderAttributes = {\r\n * fill: \"none\",\r\n * x: (width - size + 40) / 2,\r\n * y: (height - size + 40) / 2,\r\n * width: size - 40,\r\n * height: size - 40,\r\n * stroke: \"black\",\r\n * \"stroke-width\": 40,\r\n * rx: 100\r\n * };\r\n * Object.keys(borderAttributes).forEach((attribute) => {\r\n * border.setAttribute(attribute, borderAttributes[attribute]);\r\n * });\r\n * svg.appendChild(border);\r\n * };\r\n * ```\r\n */\r\n applyExtension(\r\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\r\n extension: ExtensionFunction\r\n ): void {\r\n if (!extension) {\r\n throw new Error('Extension function should be defined.')\r\n }\r\n\r\n this.extension = extension\r\n this.update()\r\n }\r\n\r\n deleteExtension(): void {\r\n this.extension = undefined\r\n this.update()\r\n }\r\n\r\n async serialize(): Promise<string | undefined> {\r\n if (!this.qr) throw new Error('QR code is empty')\r\n\r\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\r\n this.setupSvg()\r\n }\r\n await this.svgDrawingPromise\r\n\r\n if (!this.qrSVG?.element) {\r\n return\r\n }\r\n\r\n const serializer = new XMLSerializer()\r\n let source = serializer.serializeToString(this.qrSVG.element)\r\n\r\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source\r\n return source\r\n }\r\n\r\n private setupSvg(): void {\r\n if (!this.qr) {\r\n return\r\n }\r\n let moduleCount = this.qr.getModuleCount()\r\n if (this.options.imageOptions.mode == ImageMode.background && this.options.shape != ShapeType.circle)\r\n moduleCount += 2\r\n let count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * moduleCount)\r\n if (count % 2 == 0) count -= 1\r\n let margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n if (this.options.imageOptions.mode == ImageMode.background) margin += this.options.imageOptions.margin || 0\r\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin))\r\n this.qrSVG = new QRSVG({\r\n ...this.options,\r\n width: size,\r\n height: size,\r\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\r\n })\r\n\r\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\r\n if (!this.qrSVG?.element) return\r\n this.extension?.(this.qrSVG.element, this.options)\r\n })\r\n }\r\n}\r\n","import { QRCodeStyling } from '../core/qr-code-styling.js'\r\nimport { RecursivePartial } from '../types/helper.js'\r\nimport { CanvasOptions, defaultCanvasOptions, sanitizeCanvasOptions } from '../utils/canvas-options.js'\r\nimport { mergeDeep } from '../utils/merge.js'\r\n\r\nexport enum FileExtension {\r\n svg = 'svg',\r\n png = 'png',\r\n jpeg = 'jpeg',\r\n webp = 'webp'\r\n}\r\n\r\nexport function drawToCanvas(\r\n qrCode: QRCodeStyling,\r\n options?: RecursivePartial<CanvasOptions>\r\n): { canvas: HTMLCanvasElement, canvasDrawingPromise: Promise<void> | undefined } | undefined {\r\n const { width, height, margin } = options\r\n ? sanitizeCanvasOptions(mergeDeep(defaultCanvasOptions, options) as CanvasOptions)\r\n : defaultCanvasOptions\r\n\r\n const canvas = document.createElement('canvas')\r\n canvas.width = width\r\n canvas.height = height\r\n\r\n const size = Math.min(width, height) - 2 * margin\r\n\r\n const canvasDrawingPromise = qrCode.serialize().then((xml) => {\r\n if (!xml) return\r\n const svg64 = btoa(xml)\r\n const image64 = 'data:image/svg+xml;base64,' + svg64\r\n const image = new Image()\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n image.onload = (): void => {\r\n // Ensure pixel-perfect rendering of SVG to avoid artefact, then downscale to requested size\r\n const aaFactor = Math.ceil((2 * size) / Math.min(image.width, image.height))\r\n let aaCanvas: HTMLCanvasElement | OffscreenCanvas\r\n try {\r\n aaCanvas = new OffscreenCanvas(image.width * aaFactor, image.height * aaFactor)\r\n } catch (_) {\r\n // Fallback to regular canvas element\r\n aaCanvas = document.createElement('canvas')\r\n aaCanvas.width = image.width * aaFactor\r\n aaCanvas.height = image.height * aaFactor\r\n }\r\n aaCanvas.getContext('2d')?.drawImage(image, 0, 0, aaCanvas.width, aaCanvas.height)\r\n\r\n canvas?.getContext('2d')?.drawImage(aaCanvas, (width - size) / 2, (height - size) / 2, size, size)\r\n resolve()\r\n }\r\n image.onerror = image.onabort = reject\r\n\r\n image.src = image64\r\n })\r\n })\r\n\r\n return { canvas, canvasDrawingPromise }\r\n}\r\n\r\nexport async function download(\r\n qrCode: QRCodeStyling,\r\n downloadOptions?: { name?: string, extension: `${FileExtension}` },\r\n options?: RecursivePartial<CanvasOptions>\r\n): Promise<void> {\r\n let extension: `${FileExtension}` = FileExtension.png\r\n let name = 'qr'\r\n\r\n if (downloadOptions) {\r\n if (downloadOptions.name) {\r\n name = downloadOptions.name\r\n }\r\n if (downloadOptions.extension) {\r\n extension = downloadOptions.extension\r\n }\r\n }\r\n\r\n if (extension.toLowerCase() === 'svg') {\r\n const source = await qrCode.serialize()\r\n if (!source) return\r\n const url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(source)\r\n downloadURI(url, `${name}.svg`)\r\n } else {\r\n const res = drawToCanvas(qrCode, options)\r\n if (!res) return\r\n const { canvas, canvasDrawingPromise } = res\r\n await canvasDrawingPromise\r\n const url = canvas.toDataURL(`image/${extension}`)\r\n downloadURI(url, `${name}.${extension}`)\r\n }\r\n}\r\n\r\nexport function downloadURI(uri: string, name: string): void {\r\n const link = document.createElement('a')\r\n link.download = name\r\n link.href = uri\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n}\r\n","import { DOMImplementation, DOMParser, XMLSerializer } from '@xmldom/xmldom'\r\nimport { fileTypeFromBuffer } from 'file-type'\r\nimport sharp from 'sharp'\r\nimport { QRCodeStyling as _QRCodeStyling } from './core/qr-code-styling.js'\r\nimport type * as _browserUtils from './tools/browser-utils.js'\r\nimport { RecursivePartial } from './types/helper.js'\r\nimport { Options } from './utils/options.js'\r\nexport { ErrorCorrectionLevel, Mode, TypeNumber } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nexport { type ExtensionFunction } from './core/qr-code-styling.js'\r\nexport { FileExtension } from './tools/browser-utils.js'\r\nexport { type RecursivePartial } from './types/helper.js'\r\nexport { type CanvasOptions } from './utils/canvas-options.js'\r\nexport { GradientType, type Gradient } from './utils/gradient.js'\r\nexport { CornerDotType, CornerSquareType, DotType, ImageMode, ShapeType, type Options } from './utils/options.js'\r\nexport { ErrorCorrectionPercents } from './utils/qrcode.js'\r\n\r\nexport const browserUtils: typeof _browserUtils | undefined = undefined\r\n\r\nexport class QRCodeStyling extends _QRCodeStyling {\r\n constructor(options: RecursivePartial<Options>) {\r\n const dom = new DOMImplementation().createDocument(null, '')\r\n const imageCache = new Map<string, Promise<{ contentType?: string | null, data: Buffer }>>()\r\n\r\n const loadImage = async (url: string | Buffer | Blob) => {\r\n if (typeof url == 'string') {\r\n let pr = imageCache.get(url)\r\n if (pr) return pr\r\n pr = fetch(url).then((res) =>\r\n res\r\n .arrayBuffer()\r\n .then((buff) => Buffer.from(buff))\r\n .then(async (data) => ({\r\n contentType: res.headers.get('Content-Type') || (await fileTypeFromBuffer(data).then((r) => r?.mime)),\r\n data\r\n }))\r\n )\r\n imageCache.set(url, pr)\r\n return pr\r\n } else {\r\n const buff = Buffer.from(url as Buffer)\r\n const mime = await fileTypeFromBuffer(buff).then((r) => r?.mime)\r\n return {\r\n contentType: mime,\r\n data: buff\r\n }\r\n }\r\n }\r\n\r\n global.XMLSerializer = XMLSerializer as any\r\n\r\n global.DOMParser = DOMParser as any\r\n\r\n super({\r\n ...options,\r\n\r\n document: options.document || (dom as any),\r\n imageTools: options.imageTools || {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\r\n if (typeof url == 'string' && url.startsWith('data:')) return Promise.resolve(url)\r\n return loadImage(url).then(\r\n ({ contentType, data }) =>\r\n `data:${contentType?.replace('application/xml', 'image/svg+xml')};base64,${data.toString('base64')}`\r\n )\r\n },\r\n getSize: async (src: string | Blob | Buffer): Promise<{ width: number, height: number }> => {\r\n const { data } = Buffer.isBuffer(options.image) ? { data: options.image } : await loadImage(src)\r\n const meta = await sharp(data).metadata()\r\n return {\r\n width: meta.width!,\r\n\r\n height: meta.height!\r\n }\r\n }\r\n }\r\n })\r\n }\r\n}\r\n"],"names":["obj","ErrorCorrectionLevel","TypeNumber","Mode","QRCodeMinimal","sharp","fileTypeFromBuffer","DOMImplementation","XMLSerializer$1","DOMParser$1","isObject","Array","isArray","target","sources","length","shift","undefined","source","Object","keys","forEach","key","targetValue","sourceValue","mergeDeep","GradientType","DotType","CornerDotType","CornerSquareType","ShapeType","ImageMode","sanitizeGradient","gradient","colorStops","newGradient","Error","rotation","Number","map","colorStop","offset","radial","linear","dot","randomDot","rounded","extraRounded","verticalLine","horizontalLine","classy","classyRounded","square","smallSquare","tinySquare","diamond","wave","heart","outpoint","inpoint","circle","center","overlay","background","defaultOptions","document","shape","width","height","data","qrOptions","typeNumber","mode","errorCorrectionLevel","Q","imageOptions","imageSize","crossOrigin","margin","fill","color","dotsOptions","type","size","sanitizeOptions","options","newOptions","Math","min","round","max","cornersSquareOptions","cornersDotOptions","backgroundOptions","ErrorCorrectionPercents","L","M","H","rx","numToAttr","value","toFixed","replace","strings","values","reduce","t","v","i","p","trim","QRCornerDot","_element","element","this","constructor","draw","args","drawFunction","drawSquare","drawHeart","drawRounded","drawClassy","drawInpoint","drawOutpoint","drawDot","call","rotateFigure","x","y","setAttribute","PI","cx","cy","basicDot","createElementNS","basicSquare","basicHeart","move","path","toUpperCase","join","basicRounded","basicClassy","dotSize","svgPath","basicInpoint","QRCornerSquare","_fill","drawExtraRounded","basicExtraRounded","QRDot","drawRandomDot","drawClassyRounded","drawVerticalLine","drawHorizontalLine","drawDiamond","drawSmallSquare","drawTinySquare","drawWave","basicSideRounded","basicCornerRounded","basicCornerExtraRounded","basicCornersRounded","basicWave","a1","a2","c23x","s1","s2","c23y","c31x","cos","c31y","sin","random","originalSize","getNeighbor","leftNeighbor","rightNeighbor","topNeighbor","neighborsCount","bottomNeighbor","browserImageTools","toDataURL","url","startsWith","Promise","resolve","reject","xhr","XMLHttpRequest","onload","reader","FileReader","onloadend","result","readAsDataURL","response","onerror","onabort","ontimeout","open","responseType","send","getSize","src","image","Image","then","catch","parseColor","cstr","parts","alpha","toLowerCase","base","slice","parseInt","m","exec","split","parseFloat","dims","pop","toString","padStart","squareMask","cornerSquareTypes","Set","dotMask","cornerDotTypes","QRSVG","defs","backgroundMask","backgroundMaskGroup","dotsMask","dotsMaskGroup","lightDotsMask","lightDotsMaskGroup","qr","imageTools","appendChild","drawQR","getModuleCount","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","maxWidth","maxHeight","alignment","QRUtil","getPatternPosition","calculateImageSize","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dimMax","dimMin","lower","upper","newSize","dotsMax","ceil","dotsMin","abs","hideMax","hideMin","maxW","maxH","floor","coverLevel","drawBackground","drawImage","drawDots","j","drawCorners","createColor","additionalRotation","name","createMask","filter","minSize","overlayDot","markerDot","additionalDots","fakeCount","xBeginning","yBeginning","fakeMatrix","ii","jj","isDark","sqrt","iAlign","find","jAlign","xFakeBeginning","yFakeBeginning","xOffset","yOffset","colorCount","cornersSquareSize","cornersDotSize","column","row","cornersSquareMask","cornersSquareMaskGroup","val","cornersDotMask","cornersDotMaskGroup","has","cornersSquare","isCornerDotType","cornersDot","dx","dy","imageUrl","setAttributeNS","substring","indexOf","encoding","atob","Buffer","from","container","parseFromString","DOMParser","rootEl","getElementsByTagName","dw","dh","rect","x0","y0","positiveRotation","tan","x1","y1","stopCfg","stop","parsed","id","mask","group","assign","stringToBytesFuncs","stringToBytes_UTF8","extension","svgDrawingPromise","qrSVG","update","innerHTML","getMode","test","numeric","alphanumeric","unicode","byte","addData","make","setupSvg","append","applyExtension","deleteExtension","serialize","serializeToString","XMLSerializer","moduleCount","FileExtension","svg","png","jpeg","webp","QRCodeStyling","_QRCodeStyling","dom","createDocument","imageCache","Map","loadImage","pr","get","fetch","res","arrayBuffer","buff","async","contentType","headers","r","mime","set","global","super","isBuffer","meta","metadata"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"qr-code-styling-node.js","sources":["../src/utils/merge.ts","../src/utils/gradient.ts","../src/utils/options.ts","../src/utils/qrcode.ts","../src/utils/svg.ts","../src/figures/dot-elements.ts","../src/figures/corner-dot.ts","../src/figures/square-elements.ts","../src/figures/corner-square.ts","../src/figures/dot.ts","../src/tools/browser-image-tools.ts","../src/utils/color.ts","../src/core/qr-svg.ts","../src/utils/image.ts","../src/core/qr-code-styling.ts","../src/tools/browser-utils.ts","../src/node.ts"],"sourcesContent":["const isObject = (obj: Record<string, unknown> | undefined): boolean =>\r\n !!obj && typeof obj === 'object' && !Array.isArray(obj)\r\n\r\nexport type UnknownObject = {\r\n [key: string]: any\r\n} | undefined\r\n\r\nexport function mergeDeep(target: UnknownObject, ...sources: UnknownObject[]): UnknownObject {\r\n if (!sources.length) return target\r\n const source = sources.shift()\r\n if (source === undefined || !isObject(target) || !isObject(source)) return target\r\n target = { ...target }\r\n Object.keys(source).forEach((key: string): void => {\r\n const targetValue = target[key]\r\n const sourceValue = source[key]\r\n\r\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\r\n target[key] = sourceValue\r\n } else if (isObject(targetValue) && isObject(sourceValue)) {\r\n target[key] = mergeDeep({ ...targetValue }, sourceValue)\r\n } else {\r\n target[key] = sourceValue\r\n }\r\n })\r\n\r\n return mergeDeep(target, ...sources)\r\n}\r\n","export enum GradientType {\r\n radial = 'radial',\r\n linear = 'linear'\r\n}\r\n\r\nexport interface Gradient {\r\n /**\r\n * Type of gradient spread\r\n *\r\n * @default GradientType.linear\r\n */\r\n type: `${GradientType}`\r\n /**\r\n * Rotation of gradient (in radians, Math.PI === 180 degrees)\r\n *\r\n * @default 0\r\n */\r\n rotation?: number\r\n /** Gradient colors. */\r\n colorStops: Array<{\r\n /** Position of color in gradient range */\r\n offset: number\r\n /** Color of stop in gradient range */\r\n color: string\r\n }>\r\n}\r\n\r\nexport function sanitizeGradient(gradient: Gradient): Gradient {\r\n const newGradient = { ...gradient }\r\n\r\n if (!newGradient.colorStops || !newGradient.colorStops.length) {\r\n throw new Error(\"Field 'colorStops' is required in gradient\")\r\n }\r\n\r\n if (newGradient.rotation) {\r\n newGradient.rotation = Number(newGradient.rotation)\r\n } else {\r\n newGradient.rotation = 0\r\n }\r\n\r\n newGradient.colorStops = newGradient.colorStops.map((colorStop: { offset: number, color: string }) => ({\r\n ...colorStop,\r\n offset: Number(colorStop.offset)\r\n }))\r\n\r\n return newGradient\r\n}\r\n","import { ErrorCorrectionLevel, Mode, TypeNumber } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { browserImageTools } from '../tools/browser-image-tools.js'\r\nimport { 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}\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}\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}\r\n\r\nexport enum ShapeType {\r\n square = 'square',\r\n circle = 'circle'\r\n}\r\n\r\nexport enum ImageMode {\r\n /**\r\n * Place image in the center of the code\r\n */\r\n center = 'center',\r\n /**\r\n * Place image over the center of the code\r\n */\r\n overlay = 'overlay',\r\n /**\r\n * Use image as background, draw dots over it\r\n */\r\n background = 'background'\r\n}\r\n\r\nexport interface Options {\r\n /** Use a custom DOM domplementation */\r\n document: Document\r\n /** Use a custom image fetching & serializaton implementation */\r\n imageTools?: typeof browserImageTools\r\n /** @ignore */\r\n width: number\r\n /** @ignore */\r\n height: number\r\n /** The data will be encoded in the QR code */\r\n data: string\r\n /** The image will be copied to the center of the QR code */\r\n image?: string | Buffer | Blob\r\n /**\r\n * QR code shape\r\n *\r\n * @default ShapeType.square\r\n */\r\n shape: `${ShapeType}`\r\n /** Options will be passed to `@liquid-js/qrcode-generator` lib */\r\n qrOptions: {\r\n typeNumber: TypeNumber\r\n mode?: `${Mode}`\r\n /** @default ErrorCorrectionLevel.Q */\r\n errorCorrectionLevel: `${ErrorCorrectionLevel}`\r\n }\r\n imageOptions: {\r\n /**\r\n * Image mode\r\n *\r\n * @default ImageMode.center\r\n */\r\n mode: `${ImageMode}`\r\n /**\r\n * Fill blank areas of the code with selected color\r\n */\r\n fill: {\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"rgba(255,255,255,0.75)\"\r\n */\r\n color: string\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient\r\n }\r\n /**\r\n * Coefficient of the image size\r\n *\r\n * @default 0.4\r\n */\r\n imageSize: number\r\n /**\r\n * Margin of the image (in blocks)\r\n *\r\n * @default 0\r\n */\r\n margin: number\r\n /**\r\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLImageElement/crossOrigin)\r\n */\r\n crossOrigin?: string\r\n }\r\n dotsOptions: {\r\n /**\r\n * QR dot size (in pixels)\r\n *\r\n * @default 10\r\n */\r\n size: number\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"#000\"\r\n */\r\n color: string\r\n /** Gradient of QR dots */\r\n gradient?: Gradient\r\n /**\r\n * Style of QR dots\r\n *\r\n * @default DotType.square\r\n */\r\n type: `${DotType}`\r\n }\r\n /** Corners Square options, omitted values match dots */\r\n cornersSquareOptions?: {\r\n /** Color of Corners Square */\r\n color?: string\r\n /** Gradient of Corners Square */\r\n gradient?: Gradient\r\n /** Style of Corners Square */\r\n type?: `${CornerSquareType | DotType}`\r\n }\r\n /** Corners Dot options, omitted values match squares */\r\n cornersDotOptions?: {\r\n /** Color of Corners Dot */\r\n color?: string\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient\r\n /** Style of Corners Dot */\r\n type?: `${CornerDotType | DotType}`\r\n }\r\n /** QR background styling options, false to disable background */\r\n backgroundOptions?: {\r\n /** Background roundnes, from 0 (square) to 1 (circle) */\r\n round?: number\r\n /** Background color */\r\n color?: string\r\n /** Background Gradient */\r\n gradient?: Gradient\r\n /**\r\n * Margin (in blocks) between background and the QR code\r\n *\r\n * @default 0\r\n */\r\n margin?: number\r\n } | false\r\n /** `import { stringToBytesFuncs } from \"@liquid-js/qr-code-styling/kanji\";` to add Kanji support */\r\n stringToBytesFuncs?: { [encoding: string]: (s: string) => number[] }\r\n}\r\n\r\nexport const defaultOptions: Options = {\r\n document: undefined as never,\r\n shape: ShapeType.square,\r\n width: undefined as never,\r\n height: undefined as never,\r\n data: '',\r\n qrOptions: {\r\n typeNumber: TypeNumber[0],\r\n mode: undefined,\r\n errorCorrectionLevel: ErrorCorrectionLevel.Q\r\n },\r\n imageOptions: {\r\n mode: ImageMode.center,\r\n imageSize: 0.4,\r\n crossOrigin: undefined,\r\n margin: 0,\r\n fill: {\r\n color: 'rgba(255,255,255,1)'\r\n }\r\n },\r\n dotsOptions: {\r\n type: DotType.square,\r\n color: '#000',\r\n size: 10\r\n }\r\n}\r\n\r\nexport function sanitizeOptions(options: Options): Options {\r\n const newOptions = { ...options }\r\n\r\n newOptions.imageOptions = {\r\n ...newOptions.imageOptions,\r\n imageSize: Math.min(1, Number(newOptions.imageOptions.imageSize)) || 1,\r\n margin: Number(newOptions.imageOptions.margin),\r\n fill: {\r\n ...newOptions.imageOptions.fill\r\n }\r\n }\r\n\r\n if (newOptions.imageOptions.mode == ImageMode.overlay) newOptions.imageOptions.margin = 0\r\n if (newOptions.imageOptions.fill.gradient) {\r\n newOptions.imageOptions.fill.gradient = sanitizeGradient(newOptions.imageOptions.fill.gradient)\r\n }\r\n\r\n newOptions.dotsOptions = {\r\n ...newOptions.dotsOptions\r\n }\r\n if (newOptions.dotsOptions.gradient) {\r\n newOptions.dotsOptions.gradient = sanitizeGradient(newOptions.dotsOptions.gradient)\r\n }\r\n // Ensure integer dot size\r\n newOptions.dotsOptions.size = Math.round(Math.max(0, newOptions.dotsOptions.size) || 10)\r\n\r\n if (newOptions.cornersSquareOptions) {\r\n newOptions.cornersSquareOptions = {\r\n ...newOptions.cornersSquareOptions\r\n }\r\n if (newOptions.cornersSquareOptions.gradient) {\r\n newOptions.cornersSquareOptions.gradient = sanitizeGradient(newOptions.cornersSquareOptions.gradient)\r\n }\r\n }\r\n\r\n if (newOptions.cornersDotOptions) {\r\n newOptions.cornersDotOptions = {\r\n ...newOptions.cornersDotOptions\r\n }\r\n if (newOptions.cornersDotOptions.gradient) {\r\n newOptions.cornersDotOptions.gradient = sanitizeGradient(newOptions.cornersDotOptions.gradient)\r\n }\r\n }\r\n\r\n if (newOptions.backgroundOptions) {\r\n newOptions.backgroundOptions = {\r\n ...newOptions.backgroundOptions\r\n }\r\n if (newOptions.backgroundOptions.gradient) {\r\n newOptions.backgroundOptions.gradient = sanitizeGradient(newOptions.backgroundOptions.gradient)\r\n }\r\n }\r\n\r\n if (!newOptions.document) newOptions.document = document\r\n\r\n return newOptions\r\n}\r\n","import { ErrorCorrectionLevel, Mode } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\n\r\nexport const ErrorCorrectionPercents = {\r\n [ErrorCorrectionLevel.L]: 0.07,\r\n [ErrorCorrectionLevel.M]: 0.15,\r\n [ErrorCorrectionLevel.Q]: 0.25,\r\n [ErrorCorrectionLevel.H]: 0.3\r\n}\r\n\r\nexport function getMode(data: string): Mode {\r\n switch (true) {\r\n case /^[0-9]*$/.test(data):\r\n return Mode.numeric\r\n case /^[0-9A-Z $%*+\\-./:]*$/.test(data):\r\n return Mode.alphanumeric\r\n\r\n case /[^\\u0000-\\u00ff]/.test(data):\r\n return Mode.unicode\r\n default:\r\n return Mode.byte\r\n }\r\n}\r\n","import { RotateFigureArgs } from '../types/helper.js'\r\n\r\nconst rx = /\\.?0+$/\r\n\r\nexport function numToAttr(value: number) {\r\n return value.toFixed(7).replace(rx, '')\r\n}\r\n\r\nexport function svgPath(strings: TemplateStringsArray, ...values: unknown[]) {\r\n return strings\r\n .reduce((t, v, i) => {\r\n let p: unknown = ''\r\n if (i) p = values[i - 1]\r\n if (typeof p == 'number') p = numToAttr(p)\r\n return `${t}${p}${v}`\r\n }, '')\r\n .trim()\r\n .replace(/[\\s\\n\\r]+/gim, ' ')\r\n}\r\n\r\nexport function rotateFigure<T extends SVGElement | ReadonlyArray<SVGElement>>({ draw, ...args }: RotateFigureArgs<T>) {\r\n const { x, y, size, rotation = 0 } = args\r\n const cx = x + size / 2\r\n const cy = y + size / 2\r\n\r\n const element = draw(args)\r\n if (rotation) (Array.isArray(element) ? element : [element])\r\n .forEach(el => el.setAttribute('transform', `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`))\r\n return element\r\n}\r\n\r\nexport function scalePath(path: Array<string | number>, { x, y, size }: {\r\n x: number\r\n y: number\r\n size: number\r\n}) {\r\n let move = false\r\n let i = 0\r\n return path\r\n .map((v) => {\r\n if (typeof v == 'string') {\r\n i = 0\r\n move = v.toUpperCase() == v\r\n return v\r\n }\r\n i++\r\n v = v * size\r\n if (move) {\r\n v += i % 2 == 1 ? x : y\r\n }\r\n return numToAttr(v)\r\n })\r\n .join(' ')\r\n}\r\n","import { BasicFigureDrawArgs } from '../types/helper.js'\r\nimport { numToAttr, scalePath, svgPath } from '../utils/svg.js'\r\n\r\nexport const DotElements = {\r\n dot: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\r\n element.setAttribute('cx', numToAttr(x + size / 2))\r\n element.setAttribute('cy', numToAttr(y + size / 2))\r\n element.setAttribute('r', numToAttr(size / 2))\r\n\r\n return element\r\n },\r\n square: (args: BasicFigureDrawArgs) => {\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\r\n return element\r\n },\r\n //if rotation === 0 - right side is rounded\r\n sideRounded: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, 0 ${-size}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - top right corner is rounded\r\n cornerRounded: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n v ${-size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - top right corner is rounded\r\n cornerExtraRounded: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n a ${size} ${size}, 0, 0, 0, ${-size} ${-size}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n //if rotation === 0 - left bottom and right top corners are rounded\r\n cornersRounded: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, ${size / 2} ${size / 2}\r\n h ${size / 2}\r\n v ${-size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n wave: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const a1 = 5 * Math.PI / 180\r\n const a2 = 65 * Math.PI / 180\r\n const s1 = 0.95\r\n const s2 = 0.65\r\n\r\n const c23x = size * (s1 - s2 * Math.cos(a1))\r\n const c23y = size * (1 - s2 * Math.sin(a1))\r\n\r\n const c31x = -size * Math.cos(a2) / 2\r\n const c31y = -size * Math.sin(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}\r\n c 0 ${size * s2} ${c23x} ${c23y} ${size * s1} ${size}\r\n c ${c31x} ${c31y} ${size * (1 - s1)} ${-size / 2} ${size * (1 - s1)} ${-size}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n heart: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n scalePath([\r\n 'M',\r\n 1,\r\n 0.31629,\r\n 'c',\r\n -0.00086,\r\n 0.15702,\r\n -0.10534,\r\n 0.26323,\r\n -0.21876,\r\n 0.38123,\r\n 'c',\r\n -0.06736,\r\n 0.06834,\r\n -0.18938,\r\n 0.17948,\r\n -0.28124,\r\n 0.26126,\r\n 'c',\r\n -0.09188,\r\n -0.08178,\r\n -0.2139,\r\n -0.19292,\r\n -0.28124,\r\n -0.26126,\r\n 'c',\r\n -0.11344,\r\n -0.118,\r\n -0.2179,\r\n -0.22422,\r\n -0.21876,\r\n -0.38123,\r\n 'c',\r\n -0.00096,\r\n -0.27136,\r\n 0.33154,\r\n -0.36842,\r\n 0.5,\r\n -0.17,\r\n 'c',\r\n 0.16844,\r\n -0.19842,\r\n 0.50094,\r\n -0.10136,\r\n 0.5,\r\n 0.17,\r\n 'z'\r\n ], { x, y, size })\r\n )\r\n\r\n return element\r\n },\r\n rounded: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n element.setAttribute('x', numToAttr(x))\r\n element.setAttribute('y', numToAttr(y))\r\n element.setAttribute('width', numToAttr(size))\r\n element.setAttribute('height', numToAttr(size))\r\n element.setAttribute('rx', numToAttr(size / 4))\r\n element.setAttribute('ry', numToAttr(size / 4))\r\n\r\n return element\r\n },\r\n classy: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n H ${x}\r\n z`\r\n )\r\n\r\n return element\r\n },\r\n inpoint: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + size / 2}\r\n v ${size / 4}\r\n a ${size / 4}, ${size / 4} 0 0 0 ${size / 4}, ${size / 4}\r\n h ${(size / 4) * 3}\r\n v ${(-size / 4) * 3}\r\n a ${size / 4}, ${size / 4} 0 0 0 ${-size / 4}, ${-size / 4}\r\n h ${-size / 2}\r\n a ${size / 4}, ${size / 4} 0 0 0 ${-size / 4}, ${size / 4}\r\n z`\r\n )\r\n\r\n return element\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { CornerDotType } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\nconst qrCornerDotFigures: { [type in CornerDotType]: (args: DrawArgs) => SVGElement } = {\r\n [CornerDotType.dot]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.dot\r\n }),\r\n [CornerDotType.square]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.square\r\n }),\r\n [CornerDotType.heart]: args => DotElements.heart(args),\r\n [CornerDotType.extraRounded]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.rounded\r\n }),\r\n [CornerDotType.classy]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.classy\r\n }),\r\n [CornerDotType.inpoint]: args => rotateFigure({\r\n ...args,\r\n draw: DotElements.inpoint\r\n }),\r\n [CornerDotType.outpoint]: args => rotateFigure({\r\n ...args,\r\n rotation: (args.rotation || 0) + Math.PI,\r\n draw: DotElements.inpoint\r\n })\r\n}\r\n\r\nexport function getQrCornerDotFigure(type: `${CornerDotType}`) {\r\n return qrCornerDotFigures[type] || qrCornerDotFigures[CornerDotType.square]\r\n}\r\n","import { BasicFigureDrawArgs } from '../types/helper.js'\r\nimport { svgPath } from '../utils/svg.js'\r\n\r\nexport const SquareElements = {\r\n dot: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x + size / 2} ${y}\r\n a ${size / 2} ${size / 2} 0 1 0 0.1 0\r\n z\r\n m 0 ${dotSize}\r\n a ${size / 2 - dotSize} ${size / 2 - dotSize} 0 1 1 -0.1 0\r\n Z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`M ${x + size / 2} ${y - dotSize}\r\n a ${size / 2 + dotSize} ${size / 2 + dotSize} 0 1 0 0.1 0\r\n z`\r\n )\r\n\r\n return [element, fill] as const\r\n },\r\n square: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n v ${-size}\r\n z\r\n M ${x + dotSize} ${y + dotSize}\r\n h ${size - 2 * dotSize}\r\n v ${size - 2 * dotSize}\r\n h ${-size + 2 * dotSize}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\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 return [element, fill] as const\r\n },\r\n extraRounded: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${-dotSize * 2.5}\r\n v ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${dotSize * 1.5}\r\n h ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x - dotSize} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 0, ${dotSize * 3.5} ${dotSize * 3.5}\r\n h ${2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 0, ${dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 0, ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n h ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 0, ${-dotSize * 3.5} ${dotSize * 3.5}\r\n z`\r\n )\r\n\r\n return [element, fill] as const\r\n },\r\n classy: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n H ${x}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${3.5 * dotSize}\r\n h ${-3.5 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-3.5 * dotSize}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x + 0.5 * dotSize} ${y - dotSize}\r\n h ${4 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${dotSize * 3.5} ${dotSize * 3.5}\r\n v ${5.5 * dotSize}\r\n h ${-5.5 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-5.5 * dotSize}\r\n z`\r\n )\r\n\r\n return [element, fill] as const\r\n },\r\n inpoint: (args: BasicFigureDrawArgs) => {\r\n const { size, x, y, document } = args\r\n\r\n const dotSize = size / 7\r\n\r\n const element = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n element.setAttribute('clip-rule', 'evenodd')\r\n element.setAttribute(\r\n 'd',\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${3.5 * dotSize}\r\n h ${-3.5 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}\r\n z`\r\n )\r\n\r\n const fill = document.createElementNS('http://www.w3.org/2000/svg', 'path')\r\n fill.setAttribute('clip-rule', 'evenodd')\r\n fill.setAttribute(\r\n 'd',\r\n svgPath`\r\n M ${x + 0.5 * dotSize} ${y - dotSize}\r\n h ${4 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${dotSize * 3.5} ${dotSize * 3.5}\r\n v ${5.5 * dotSize}\r\n h ${-5.5 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${-dotSize * 3.5} ${-dotSize * 3.5}\r\n v ${-2 * dotSize}\r\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${dotSize * 3.5} ${-dotSize * 3.5}\r\n z`\r\n )\r\n\r\n return [element, fill] as const\r\n }\r\n}\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { CornerSquareType } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { SquareElements } from './square-elements.js'\r\n\r\nconst qrCornerSquareFigures: { [type in CornerSquareType]: (args: DrawArgs) => readonly [SVGPathElement, SVGPathElement] } = {\r\n [CornerSquareType.dot]: args => SquareElements.dot(args),\r\n [CornerSquareType.square]: args => SquareElements.square(args),\r\n [CornerSquareType.extraRounded]: args => SquareElements.extraRounded(args),\r\n [CornerSquareType.classy]: args => rotateFigure({\r\n ...args,\r\n draw: SquareElements.classy\r\n }),\r\n [CornerSquareType.inpoint]: args => rotateFigure({\r\n ...args,\r\n draw: SquareElements.inpoint\r\n }),\r\n [CornerSquareType.outpoint]: ({ rotation, ...args }) => rotateFigure({\r\n ...args,\r\n rotation: (rotation || 0) + Math.PI,\r\n draw: SquareElements.inpoint\r\n })\r\n}\r\n\r\nexport function getQrCornerSquareFigure(type: `${CornerSquareType}`) {\r\n return qrCornerSquareFigures[type] || qrCornerSquareFigures[CornerSquareType.square]\r\n}\r\n\r\n","import { DrawArgs } from '../types/helper.js'\r\nimport { DotType } from '../utils/options.js'\r\nimport { rotateFigure } from '../utils/svg.js'\r\nimport { DotElements } from './dot-elements.js'\r\n\r\nconst qrDotFigures: { [type in DotType]: (args: DrawArgs) => SVGElement } = {\r\n [DotType.dot]: args => DotElements.dot(args),\r\n [DotType.randomDot]: ({ size, ...args }) => {\r\n const randomFactor = Math.random() * (1 - 0.75) + 0.75\r\n return DotElements.dot({\r\n ...args,\r\n size: size * randomFactor\r\n })\r\n },\r\n [DotType.rounded]: ({ x, y, size, document, getNeighbor }) => {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return DotElements.dot({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount === 2) {\r\n let rotation = 0\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.cornerRounded\r\n })\r\n } else {\r\n let rotation = 0\r\n\r\n if (topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.sideRounded\r\n })\r\n }\r\n },\r\n [DotType.extraRounded]: ({ x, y, size, document, getNeighbor }) => {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return DotElements.dot({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount === 2) {\r\n let rotation = 0\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.cornerExtraRounded\r\n })\r\n } else {\r\n let rotation = 0\r\n\r\n if (topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.sideRounded\r\n })\r\n }\r\n },\r\n [DotType.verticalLine]: ({ x, y, size, document, getNeighbor }) => {\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n if (topNeighbor && bottomNeighbor) {\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n } else if (topNeighbor && !bottomNeighbor) {\r\n const rotation = Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.sideRounded\r\n })\r\n } else if (bottomNeighbor && !topNeighbor) {\r\n const rotation = -Math.PI / 2\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.sideRounded\r\n })\r\n }\r\n\r\n return DotElements.dot({\r\n x, y, size,\r\n document\r\n })\r\n },\r\n [DotType.horizontalLine]: ({ x, y, size, document, getNeighbor }) => {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n\r\n if (leftNeighbor && rightNeighbor) {\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n } else if (leftNeighbor && !rightNeighbor) {\r\n const rotation = 0\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.sideRounded\r\n })\r\n } else if (rightNeighbor && !leftNeighbor) {\r\n const rotation = Math.PI\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.sideRounded\r\n })\r\n }\r\n\r\n return DotElements.dot({\r\n x, y, size,\r\n document\r\n })\r\n },\r\n [DotType.classy]: ({ x, y, size, document, getNeighbor }) => {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return rotateFigure({\r\n x, y, size, rotation: Math.PI / 2,\r\n document,\r\n draw: DotElements.cornersRounded\r\n })\r\n } else if (!leftNeighbor && !topNeighbor) {\r\n return rotateFigure({\r\n x, y, size, rotation: -Math.PI / 2,\r\n document,\r\n draw: DotElements.cornerRounded\r\n })\r\n } else if (!rightNeighbor && !bottomNeighbor) {\r\n return rotateFigure({\r\n x, y, size, rotation: Math.PI / 2,\r\n document,\r\n draw: DotElements.cornerRounded\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 [DotType.classyRounded]: ({ x, y, size, document, getNeighbor }) => {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return rotateFigure({\r\n x, y, size, rotation: Math.PI / 2,\r\n document,\r\n draw: DotElements.cornersRounded\r\n })\r\n } else if (!leftNeighbor && !topNeighbor) {\r\n return rotateFigure({\r\n x, y, size, rotation: -Math.PI / 2,\r\n document,\r\n draw: DotElements.cornerExtraRounded\r\n })\r\n } else if (!rightNeighbor && !bottomNeighbor) {\r\n return rotateFigure({\r\n x, y, size, rotation: Math.PI / 2,\r\n document,\r\n draw: DotElements.cornerExtraRounded\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 [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: DotElements.square\r\n }),\r\n [DotType.wave]: ({ x, y, size, document, getNeighbor }) => {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor\r\n\r\n if (neighborsCount === 0) {\r\n return DotElements.dot({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n return DotElements.square({\r\n x, y, size,\r\n document\r\n })\r\n } else if (neighborsCount === 2) {\r\n let rotation = 0\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2\r\n }\r\n\r\n return rotateFigure({\r\n x, y, size, rotation,\r\n document,\r\n draw: DotElements.cornerExtraRounded\r\n })\r\n } else {\r\n let rotation = 0\r\n\r\n if (rightNeighbor) {\r\n rotation = Math.PI / 2\r\n } else if (bottomNeighbor) {\r\n rotation = Math.PI\r\n } else if (leftNeighbor) {\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: DotElements.wave\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport function getQrDotFigure(type: `${DotType}`) {\r\n return qrDotFigures[type] || qrDotFigures[DotType.square]\r\n}\r\n","export const browserImageTools = {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\r\n if (typeof url == 'string' && url.startsWith('data:')) return Promise.resolve(url)\r\n return new Promise((resolve, reject) => {\r\n if (typeof url == 'string') {\r\n const xhr = new XMLHttpRequest()\r\n xhr.onload = () => {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result as string)\r\n }\r\n reader.readAsDataURL(xhr.response)\r\n }\r\n xhr.onerror = xhr.onabort = xhr.ontimeout = reject\r\n xhr.open('GET', url, true)\r\n xhr.responseType = 'blob'\r\n xhr.send()\r\n } else {\r\n const reader = new FileReader()\r\n reader.onloadend = () => {\r\n resolve(reader.result as string)\r\n }\r\n reader.readAsDataURL(url as Blob)\r\n }\r\n })\r\n },\r\n getSize: (src: string | Blob | Buffer, crossOrigin?: string): Promise<{ width: number, height: number }> => new Promise((resolve, reject) => {\r\n const image = new Image()\r\n\r\n if (crossOrigin === 'string') {\r\n image.crossOrigin = crossOrigin\r\n }\r\n\r\n image.onload = (): void => {\r\n resolve({ width: image.width, height: image.height })\r\n }\r\n image.onerror = image.onabort = reject\r\n\r\n if (typeof src == 'string') image.src = src\r\n else\r\n browserImageTools\r\n .toDataURL(src)\r\n .then((url) => (image.src = url))\r\n .catch(reject)\r\n })\r\n}\r\n","export function parseColor(cstr: string) {\r\n let m: RegExpExecArray | null\r\n let parts: string[] | number[] = []\r\n let alpha = 1\r\n\r\n cstr = cstr.toLowerCase()\r\n\r\n if (cstr[0] === '#') {\r\n const base = cstr.slice(1)\r\n const size = base.length\r\n const isShort = size <= 4\r\n\r\n if (isShort) {\r\n parts = [parseInt(base[0] + base[0], 16), parseInt(base[1] + base[1], 16), parseInt(base[2] + base[2], 16)]\r\n if (size === 4) {\r\n alpha = parseInt(base[3] + base[3], 16) / 255\r\n }\r\n } else {\r\n parts = [parseInt(base[0] + base[1], 16), parseInt(base[2] + base[3], 16), parseInt(base[4] + base[5], 16)]\r\n if (size === 8) {\r\n alpha = parseInt(base[6] + base[7], 16) / 255\r\n }\r\n }\r\n\r\n if (!parts[0]) parts[0] = 0\r\n if (!parts[1]) parts[1] = 0\r\n if (!parts[2]) parts[2] = 0\r\n } else if ((m = /^((?:rgba?))\\s*\\(([^)]*)\\)/.exec(cstr))) {\r\n const dims = 3\r\n parts = m[2].trim().split(/\\s*[,/]\\s*|\\s+/)\r\n\r\n parts = parts.map((x, i) => {\r\n if (x[x.length - 1] === '%') {\r\n const v = parseFloat(x) / 100\r\n if (i === 3) return v\r\n return v * 255\r\n }\r\n\r\n if (x === 'none') return 0\r\n return parseFloat(x)\r\n })\r\n\r\n alpha = parts.length > dims ? parts.pop()! : 1\r\n } else {\r\n return {\r\n value: cstr,\r\n alpha\r\n }\r\n }\r\n\r\n const value = '#' + parts.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, '0')).join('')\r\n return {\r\n value,\r\n alpha: Math.max(0, Math.min(1, alpha))\r\n }\r\n}\r\n","import { QRCodeMinimal } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { QRUtil } from '@liquid-js/qrcode-generator/lib/qrcode/QRUtil.js'\r\nimport { getQrCornerDotFigure } from '../figures/corner-dot.js'\r\nimport { getQrCornerSquareFigure } from '../figures/corner-square.js'\r\nimport { getQrDotFigure } from '../figures/dot.js'\r\nimport { browserImageTools } from '../tools/browser-image-tools.js'\r\nimport { parseColor } from '../utils/color.js'\r\nimport { Gradient, GradientType } from '../utils/gradient.js'\r\nimport { calculateImageSize } from '../utils/image.js'\r\nimport { CornerDotType, CornerSquareType, DotType, ImageMode, Options, ShapeType } from '../utils/options.js'\r\nimport { numToAttr } from '../utils/svg.js'\r\n\r\nconst squareMask = [\r\n [1, 1, 1, 1, 1, 1, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 1, 1, 1, 1, 1, 1]\r\n]\r\n\r\nconst cornerSquareTypes = new Set<string>(Object.values(CornerSquareType))\r\nfunction isCornerSquareType(val?: string): val is `${CornerSquareType}` {\r\n return !!(val && cornerSquareTypes.has(val))\r\n}\r\n\r\nconst dotMask = [\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0]\r\n]\r\n\r\nconst cornerDotTypes = new Set<string>(Object.values(CornerDotType))\r\nfunction isCornerDotType(val?: string): val is `${CornerDotType}` {\r\n return !!(val && cornerDotTypes.has(val))\r\n}\r\n\r\nexport class QRSVG {\r\n private _element: SVGElement\r\n\r\n get element() {\r\n return this._element\r\n }\r\n\r\n private defs: SVGElement\r\n\r\n private backgroundMask?: SVGElement\r\n private backgroundMaskGroup?: SVGElement\r\n\r\n private dotsMask?: SVGElement\r\n private dotsMaskGroup?: SVGElement\r\n\r\n private lightDotsMask?: SVGElement\r\n private lightDotsMaskGroup?: SVGElement\r\n\r\n private qr?: QRCodeMinimal\r\n private document: Document\r\n private imageTools: typeof browserImageTools\r\n\r\n constructor(\r\n private options: Pick<\r\n Options,\r\n | 'width'\r\n | 'height'\r\n | 'document'\r\n | 'imageTools'\r\n | 'image'\r\n | 'imageOptions'\r\n | 'dotsOptions'\r\n | 'cornersDotOptions'\r\n | 'cornersSquareOptions'\r\n | 'backgroundOptions'\r\n | 'shape'\r\n > & { errorCorrectionPercent: number }\r\n ) {\r\n this.document = options.document\r\n this._element = this.document.createElementNS('http://www.w3.org/2000/svg', 'svg')\r\n const width = numToAttr(options.width)\r\n const height = numToAttr(options.height)\r\n this._element.setAttribute('width', width)\r\n this._element.setAttribute('height', height)\r\n this._element.setAttribute('viewBox', `0 0 ${width} ${height}`)\r\n this.defs = this.document.createElementNS('http://www.w3.org/2000/svg', 'defs')\r\n this._element.appendChild(this.defs)\r\n this.imageTools = options.imageTools || browserImageTools\r\n }\r\n\r\n get width(): number {\r\n return this.options.width\r\n }\r\n\r\n get height(): number {\r\n return this.options.height\r\n }\r\n\r\n async drawQR(qr: QRCodeMinimal): Promise<void> {\r\n const count = qr.getModuleCount()\r\n const typeNumber = parseInt(((count - 17) / 4).toFixed(0), 10)\r\n const dotSize = this.options.dotsOptions.size\r\n let drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n\r\n this.qr = qr\r\n\r\n if (this.options.image) {\r\n //We need it to get image size\r\n const size = await this.imageTools.getSize(this.options.image, this.options.imageOptions.crossOrigin)\r\n const { imageOptions, errorCorrectionPercent } = this.options\r\n\r\n if (imageOptions.mode == ImageMode.background) {\r\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n const maxWidth = (this.options.width - 2 * margin * dotSize) * imageOptions.imageSize\r\n const maxHeight = (this.options.height - 2 * margin * dotSize) * imageOptions.imageSize\r\n let { width, height } = size\r\n\r\n height = (height / width) * maxWidth\r\n width = maxWidth\r\n\r\n if (height > maxHeight) {\r\n width = (width / height) * maxHeight\r\n height = maxHeight\r\n }\r\n\r\n drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width,\r\n height\r\n }\r\n } else {\r\n const coverLevel = imageOptions.imageSize * errorCorrectionPercent\r\n const alignment = QRUtil.getPatternPosition(typeNumber)\r\n const maxHiddenDots = Math.floor(\r\n coverLevel * (count * count - 3 * 8 * 8 - 2 * (count - 16) - alignment.length ** 2 * 25)\r\n )\r\n\r\n drawImageSize = calculateImageSize({\r\n originalWidth: size.width,\r\n originalHeight: size.height,\r\n maxHiddenDots,\r\n maxHiddenAxisDots: count - 14,\r\n dotSize,\r\n margin: imageOptions.margin\r\n })\r\n }\r\n }\r\n\r\n this.drawBackground()\r\n\r\n if (\r\n this.options.imageOptions.mode != ImageMode.overlay &&\r\n this.options.image &&\r\n drawImageSize.width > 0 &&\r\n drawImageSize.height > 0\r\n ) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize })\r\n }\r\n\r\n this.drawDots((i: number, j: number): boolean => {\r\n if (this.options.imageOptions.mode == ImageMode.center) {\r\n if (\r\n i >= (count - drawImageSize.hideXDots) / 2 &&\r\n i < (count + drawImageSize.hideXDots) / 2 &&\r\n j >= (count - drawImageSize.hideYDots) / 2 &&\r\n j < (count + drawImageSize.hideYDots) / 2\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if ((i < 8 && j < 8) || (i >= count - 8 && j < 8) || (j >= count - 8 && i < 8)) return false\r\n\r\n return true\r\n })\r\n\r\n if (\r\n this.options.imageOptions.mode == ImageMode.overlay &&\r\n this.options.image &&\r\n drawImageSize.width > 0 &&\r\n drawImageSize.height > 0\r\n ) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize })\r\n }\r\n\r\n this.drawCorners()\r\n }\r\n\r\n drawBackground(): void {\r\n const options = this.options\r\n\r\n if (this._element && options.backgroundOptions) {\r\n const gradientOptions = options.backgroundOptions.gradient\r\n const color = options.backgroundOptions.color\r\n\r\n this.createColor({\r\n options: gradientOptions,\r\n color,\r\n additionalRotation: 0,\r\n x: 0,\r\n y: 0,\r\n height: options.height,\r\n width: options.width,\r\n name: 'background-color'\r\n })\r\n\r\n const size = Math.min(options.width, options.height)\r\n const element = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect');\r\n [this.backgroundMask, this.backgroundMaskGroup] = this.createMask('mask-background-color')\r\n this.defs.appendChild(this.backgroundMask)\r\n\r\n element.setAttribute('x', numToAttr((options.width - size) / 2))\r\n element.setAttribute('y', numToAttr((options.height - size) / 2))\r\n element.setAttribute('width', numToAttr(size))\r\n element.setAttribute('height', numToAttr(size))\r\n element.setAttribute('rx', numToAttr((size / 2) * (options.backgroundOptions.round || 0)))\r\n\r\n this.backgroundMaskGroup.appendChild(element)\r\n }\r\n }\r\n\r\n drawDots(filter?: (i: number, j: number) => boolean): void {\r\n if (!this.qr) {\r\n throw new Error('QR code is not defined')\r\n }\r\n\r\n const options = this.options\r\n const count = this.qr.getModuleCount()\r\n\r\n if (count > options.width || count > options.height) {\r\n throw new Error('The canvas is too small')\r\n }\r\n\r\n const dotSize = this.options.dotsOptions.size\r\n let minSize = Math.min(options.width, options.height)\r\n if (options.imageOptions.mode == ImageMode.background) minSize -= 2 * dotSize * (options.imageOptions.margin || 0)\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2)\r\n let draw = getQrDotFigure(options.dotsOptions.type);\r\n\r\n [this.dotsMask, this.dotsMaskGroup] = this.createMask('mask-dot-color')\r\n this.defs.appendChild(this.dotsMask)\r\n\r\n if (options.imageOptions.mode == ImageMode.background) {\r\n [this.lightDotsMask, this.lightDotsMaskGroup] = this.createMask('mask-light-dot-color')\r\n this.defs.appendChild(this.lightDotsMask)\r\n }\r\n\r\n let margin = 0\r\n let additionalDots = 0\r\n let fakeCount = count\r\n\r\n if (options.shape === ShapeType.circle) {\r\n margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n additionalDots = Math.floor((minSize / dotSize - count - 2 * margin) / 2)\r\n fakeCount = count + additionalDots * 2\r\n } else if (options.imageOptions.mode == ImageMode.background) {\r\n additionalDots = 1\r\n fakeCount = count + additionalDots * 2\r\n }\r\n\r\n const xFakeBeginning = xBeginning - additionalDots * dotSize\r\n const yFakeBeginning = yBeginning - additionalDots * dotSize\r\n const colorX = xFakeBeginning\r\n const colorY = yFakeBeginning\r\n const colorCount = count + additionalDots * 2\r\n const fakeMatrix: Array<Array<boolean | undefined>> = new Array(fakeCount)\r\n const center = Math.floor(fakeCount / 2)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n fakeMatrix[i] = new Array(fakeCount)\r\n for (let j = 0; j < fakeCount; j++) {\r\n if (\r\n i > additionalDots - 1 &&\r\n i < fakeCount - additionalDots &&\r\n j > additionalDots - 1 &&\r\n j < fakeCount - additionalDots\r\n ) {\r\n const ii = i - additionalDots\r\n const jj = j - additionalDots\r\n if (filter && !filter(ii, jj)) fakeMatrix[i][j] = undefined\r\n else fakeMatrix[i][j] = !!this.qr.isDark(jj, ii)\r\n continue\r\n }\r\n\r\n if (\r\n options.shape === ShapeType.circle &&\r\n Math.sqrt((i - center) * (i - center) + (j - center) * (j - center)) > center\r\n ) {\r\n fakeMatrix[i][j] = undefined\r\n continue\r\n }\r\n\r\n if (\r\n i == additionalDots - 1 ||\r\n i == fakeCount - additionalDots ||\r\n j == additionalDots - 1 ||\r\n j == fakeCount - additionalDots\r\n ) {\r\n if (\r\n (j == additionalDots - 1 && (i < additionalDots + 8 || i > fakeCount - additionalDots - 9)) ||\r\n (j == fakeCount - additionalDots && i < additionalDots + 8) ||\r\n (i == additionalDots - 1 && (j < additionalDots + 8 || j > fakeCount - additionalDots - 9)) ||\r\n (i == fakeCount - additionalDots && j < additionalDots + 8)\r\n )\r\n fakeMatrix[i][j] = undefined\r\n else fakeMatrix[i][j] = false\r\n continue\r\n }\r\n\r\n // Get random dots from QR code to show it outside of QR code\r\n fakeMatrix[i][j] = this.qr.isDark(\r\n j - 2 * additionalDots < 0 ? j : j >= count ? j - 2 * additionalDots : j - additionalDots,\r\n i - 2 * additionalDots < 0 ? i : i >= count ? i - 2 * additionalDots : i - additionalDots\r\n )\r\n }\r\n }\r\n\r\n const typeNr = (count - 17) / 4\r\n const alignment = QRUtil.getPatternPosition(typeNr)\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n const iAlign = alignment.find((v) => i - additionalDots > v - 3 && i - additionalDots < v + 3)\r\n for (let j = 0; j < fakeCount; j++) {\r\n const jAlign = alignment.find((v) => j - additionalDots > v - 3 && j - additionalDots < v + 3)\r\n if (fakeMatrix[i][j] == undefined) continue\r\n\r\n if (this.lightDotsMask) {\r\n draw =\r\n iAlign &&\r\n jAlign &&\r\n ((iAlign != alignment[0] && jAlign != alignment[0]) ||\r\n (jAlign != alignment[0] && jAlign != alignment[alignment.length - 1]) ||\r\n (iAlign != alignment[0] && iAlign != alignment[alignment.length - 1]))\r\n ? getQrDotFigure(DotType.square)\r\n : getQrDotFigure(DotType.tinySquare)\r\n }\r\n\r\n if (!fakeMatrix[i][j]) {\r\n if (this.lightDotsMask) {\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => fakeMatrix[i + xOffset]?.[j + yOffset] === false\r\n }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (this.dotsMaskGroup) {\r\n this.dotsMaskGroup.appendChild(draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => fakeMatrix[i + xOffset]?.[j + yOffset] === true\r\n }))\r\n }\r\n }\r\n }\r\n\r\n if (this.lightDotsMask) {\r\n this.createColor({\r\n options: options.imageOptions.fill.gradient,\r\n color: options.imageOptions.fill.color,\r\n additionalRotation: 0,\r\n x: colorX,\r\n y: colorY,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: 'light-dot-color'\r\n })\r\n }\r\n\r\n this.createColor({\r\n options: options.dotsOptions?.gradient,\r\n color: options.dotsOptions.color,\r\n additionalRotation: 0,\r\n x: colorX,\r\n y: colorY,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: 'dot-color'\r\n })\r\n }\r\n\r\n drawCorners(): void {\r\n if (!this.qr) {\r\n throw new Error('QR code is not defined')\r\n }\r\n\r\n const element = this._element\r\n const options = this.options\r\n\r\n if (!element) {\r\n throw new Error('Element code is not defined')\r\n }\r\n\r\n const count = this.qr.getModuleCount()\r\n const dotSize = this.options.dotsOptions.size\r\n const cornersSquareSize = dotSize * 7\r\n const cornersDotSize = dotSize * 3\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\r\n\r\n [\r\n [0, 0, 0],\r\n [1, 0, Math.PI / 2],\r\n [0, 1, -Math.PI / 2]\r\n ].forEach(([column, row, rotation]) => {\r\n const x = xBeginning + column * dotSize * (count - 7)\r\n const y = yBeginning + row * dotSize * (count - 7)\r\n let cornersSquareMask = this.dotsMask\r\n let cornersSquareMaskGroup = this.dotsMaskGroup\r\n let cornersDotMask = this.dotsMask\r\n let cornersDotMaskGroup = this.dotsMaskGroup\r\n\r\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\r\n [cornersSquareMask, cornersSquareMaskGroup] = this.createMask(`mask-corners-square-color-${column}-${row}`)\r\n this.defs.appendChild(cornersSquareMask)\r\n cornersDotMask = cornersSquareMask\r\n cornersDotMaskGroup = cornersSquareMaskGroup\r\n\r\n this.createColor({\r\n options: options.cornersSquareOptions?.gradient,\r\n color: options.cornersSquareOptions?.color,\r\n additionalRotation: rotation,\r\n x,\r\n y,\r\n height: cornersSquareSize,\r\n width: cornersSquareSize,\r\n name: `corners-square-color-${column}-${row}`\r\n })\r\n }\r\n\r\n if (isCornerSquareType(options.cornersSquareOptions?.type)) {\r\n const draw = getQrCornerSquareFigure(options.cornersSquareOptions.type)\r\n\r\n const [cornerElement, cornerFill] = draw({\r\n x,\r\n y,\r\n size: cornersSquareSize,\r\n document: this.options.document,\r\n rotation\r\n })\r\n\r\n if (cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(cornerElement)\r\n }\r\n\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(cornerFill)\r\n }\r\n } else {\r\n const draw = getQrDotFigure(options.cornersSquareOptions?.type || options.dotsOptions.type)\r\n\r\n for (let i = 0; i < squareMask.length; i++) {\r\n for (let j = 0; j < squareMask[i].length; j++) {\r\n if (!squareMask[i]?.[j]) {\r\n if (this.lightDotsMask && !dotMask[i]?.[j]) {\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean =>\r\n !squareMask[i + xOffset]?.[j + yOffset] && !dotMask[i + xOffset]?.[j + yOffset]\r\n }))\r\n }\r\n }\r\n continue\r\n }\r\n\r\n if (cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!squareMask[i + xOffset]?.[j + yOffset]\r\n }))\r\n }\r\n }\r\n }\r\n\r\n if (this.lightDotsMask)\r\n for (let i = -1; i < 8; i++) {\r\n for (let j = -1; j < 8; j++) {\r\n if (i == -1 || i == 7 || j == -1 || j == 7) {\r\n if (this.lightDotsMaskGroup) {\r\n this.lightDotsMaskGroup.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\r\n const ii = i + xOffset\r\n const jj = j + yOffset\r\n return ii >= -1 && ii <= 7 && jj >= -1 && jj <= 7 && (ii == -1 || ii == 7 || jj == -1 || jj == 7)\r\n }\r\n }))\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\r\n [cornersDotMask, cornersDotMaskGroup] = this.createMask(`mask-corners-dot-color-${column}-${row}`)\r\n this.defs.appendChild(cornersDotMask)\r\n\r\n this.createColor({\r\n options: options.cornersDotOptions?.gradient,\r\n color: options.cornersDotOptions?.color,\r\n additionalRotation: rotation,\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n height: cornersDotSize,\r\n width: cornersDotSize,\r\n name: `corners-dot-color-${column}-${row}`\r\n })\r\n }\r\n\r\n if (isCornerDotType(options.cornersDotOptions?.type)) {\r\n const draw = getQrCornerDotFigure(options.cornersDotOptions.type)\r\n\r\n if (cornersDotMaskGroup) {\r\n cornersDotMaskGroup.appendChild(draw({\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n size: cornersDotSize,\r\n document: this.document,\r\n rotation\r\n }))\r\n }\r\n } else {\r\n const draw = getQrDotFigure(options.cornersDotOptions?.type || options.dotsOptions.type)\r\n\r\n for (let i = 0; i < dotMask.length; i++) {\r\n for (let j = 0; j < dotMask[i].length; j++) {\r\n if (!dotMask[i]?.[j]) {\r\n continue\r\n }\r\n\r\n if (cornersDotMaskGroup) {\r\n cornersDotMaskGroup.appendChild(draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n document: this.options.document,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!dotMask[i + xOffset]?.[j + yOffset]\r\n }))\r\n }\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n async drawImage({\r\n width,\r\n height,\r\n count,\r\n dotSize\r\n }: {\r\n width: number\r\n height: number\r\n count: number\r\n dotSize: number\r\n }): Promise<void> {\r\n const options = this.options\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2)\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2)\r\n let margin = options.imageOptions.margin * dotSize\r\n if (options.imageOptions.mode == ImageMode.background) margin = 0\r\n const dx = xBeginning + margin + (count * dotSize - width) / 2\r\n const dy = yBeginning + margin + (count * dotSize - height) / 2\r\n const dw = width - margin * 2\r\n const dh = height - margin * 2\r\n\r\n const imageUrl = await this.imageTools.toDataURL(options.image || '')\r\n let image: SVGElement = this.document.createElementNS('http://www.w3.org/2000/svg', 'image')\r\n image.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', imageUrl || '')\r\n\r\n if (imageUrl.startsWith('data:image/svg+xml;')) {\r\n let data = imageUrl.substring(19)\r\n const i = data.indexOf(',')\r\n const encoding = data.substring(0, i)\r\n data = data.substring(i + 1)\r\n\r\n switch (encoding) {\r\n case 'base64':\r\n data = typeof atob == 'function' ? atob(data) : Buffer.from(data, 'base64').toString('utf8')\r\n break\r\n default:\r\n data = ''\r\n break\r\n }\r\n\r\n if (data) {\r\n const container = new DOMParser().parseFromString(data, 'text/xml')\r\n const rootEl = Array.from(container.getElementsByTagName('svg'))\r\n if (rootEl.length) {\r\n image = rootEl[0]\r\n image.setAttribute('overflow', 'visible')\r\n }\r\n }\r\n }\r\n\r\n image.setAttribute('x', numToAttr(dx))\r\n image.setAttribute('y', numToAttr(dy))\r\n image.setAttribute('width', `${numToAttr(dw)}px`)\r\n image.setAttribute('height', `${numToAttr(dh)}px`)\r\n\r\n this._element.appendChild(image)\r\n }\r\n\r\n private createColor({\r\n options,\r\n color,\r\n additionalRotation,\r\n x,\r\n y,\r\n height,\r\n width,\r\n name\r\n }: {\r\n options?: Gradient\r\n color?: string\r\n additionalRotation: number\r\n x: number\r\n y: number\r\n height: number\r\n width: number\r\n name: string\r\n }): void {\r\n const size = width > height ? width : height\r\n const rect = this.document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n rect.setAttribute('x', numToAttr(x))\r\n rect.setAttribute('y', numToAttr(y))\r\n rect.setAttribute('height', numToAttr(height))\r\n rect.setAttribute('width', numToAttr(width))\r\n rect.setAttribute('style', `mask:url(#mask-${name})`)\r\n\r\n if (options) {\r\n let gradient: SVGElement\r\n if (options.type === GradientType.radial) {\r\n gradient = this.document.createElementNS('http://www.w3.org/2000/svg', 'radialGradient')\r\n gradient.setAttribute('id', name)\r\n gradient.setAttribute('gradientUnits', 'userSpaceOnUse')\r\n gradient.setAttribute('fx', numToAttr(x + width / 2))\r\n gradient.setAttribute('fy', numToAttr(y + height / 2))\r\n gradient.setAttribute('cx', numToAttr(x + width / 2))\r\n gradient.setAttribute('cy', numToAttr(y + height / 2))\r\n gradient.setAttribute('r', numToAttr(size / 2))\r\n } else {\r\n const rotation = ((options.rotation || 0) + additionalRotation) % (2 * Math.PI)\r\n const positiveRotation = (rotation + 2 * Math.PI) % (2 * Math.PI)\r\n let x0 = x + width / 2\r\n let y0 = y + height / 2\r\n let x1 = x + width / 2\r\n let y1 = y + height / 2\r\n\r\n if (\r\n (positiveRotation >= 0 && positiveRotation <= 0.25 * Math.PI) ||\r\n (positiveRotation > 1.75 * Math.PI && positiveRotation <= 2 * Math.PI)\r\n ) {\r\n x0 = x0 - width / 2\r\n y0 = y0 - (height / 2) * Math.tan(rotation)\r\n x1 = x1 + width / 2\r\n y1 = y1 + (height / 2) * Math.tan(rotation)\r\n } else if (positiveRotation > 0.25 * Math.PI && positiveRotation <= 0.75 * Math.PI) {\r\n y0 = y0 - height / 2\r\n x0 = x0 - width / 2 / Math.tan(rotation)\r\n y1 = y1 + height / 2\r\n x1 = x1 + width / 2 / Math.tan(rotation)\r\n } else if (positiveRotation > 0.75 * Math.PI && positiveRotation <= 1.25 * Math.PI) {\r\n x0 = x0 + width / 2\r\n y0 = y0 + (height / 2) * Math.tan(rotation)\r\n x1 = x1 - width / 2\r\n y1 = y1 - (height / 2) * Math.tan(rotation)\r\n } else if (positiveRotation > 1.25 * Math.PI && positiveRotation <= 1.75 * Math.PI) {\r\n y0 = y0 + height / 2\r\n x0 = x0 + width / 2 / Math.tan(rotation)\r\n y1 = y1 - height / 2\r\n x1 = x1 - width / 2 / Math.tan(rotation)\r\n }\r\n\r\n gradient = this.document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient')\r\n gradient.setAttribute('id', name)\r\n gradient.setAttribute('gradientUnits', 'userSpaceOnUse')\r\n gradient.setAttribute('x1', numToAttr(x0))\r\n gradient.setAttribute('y1', numToAttr(y0))\r\n gradient.setAttribute('x2', numToAttr(x1))\r\n gradient.setAttribute('y2', numToAttr(y1))\r\n }\r\n\r\n options.colorStops.forEach((stopCfg: { offset: number, color: string }) => {\r\n const stop = this.document.createElementNS('http://www.w3.org/2000/svg', 'stop')\r\n stop.setAttribute('offset', `${numToAttr(100 * stopCfg.offset)}%`)\r\n\r\n const parsed = parseColor(stopCfg.color)\r\n stop.setAttribute('stop-color', parsed.value)\r\n if (parsed.alpha < 1) stop.setAttribute('stop-opacity', parsed.alpha.toFixed(7))\r\n gradient.appendChild(stop)\r\n })\r\n\r\n rect.setAttribute('fill', `url(#${name})`)\r\n this.defs.appendChild(gradient)\r\n } else if (color) {\r\n const parsed = parseColor(color)\r\n rect.setAttribute('fill', parsed.value)\r\n if (parsed.alpha < 1) rect.setAttribute('opacity', parsed.alpha.toFixed(7))\r\n }\r\n\r\n this._element.appendChild(rect)\r\n }\r\n\r\n private createMask(id: string) {\r\n const options = this.options\r\n\r\n const mask = this.document.createElementNS('http://www.w3.org/2000/svg', 'mask')\r\n mask.setAttribute('id', id)\r\n mask.setAttribute('maskUnits', 'userSpaceOnUse')\r\n mask.setAttribute('x', '0')\r\n mask.setAttribute('y', '0')\r\n mask.setAttribute('width', numToAttr(options.width))\r\n mask.setAttribute('height', numToAttr(options.height))\r\n\r\n const group = this.document.createElementNS('http://www.w3.org/2000/svg', 'g')\r\n group.setAttribute('fill', '#fff')\r\n mask.appendChild(group)\r\n\r\n return [mask, group]\r\n }\r\n}\r\n","interface ImageSizeOptions {\r\n originalHeight: number\r\n originalWidth: number\r\n maxHiddenDots: number\r\n maxHiddenAxisDots?: number\r\n dotSize: number\r\n margin: number\r\n}\r\n\r\ninterface ImageSizeResult {\r\n height: number\r\n width: number\r\n hideYDots: number\r\n hideXDots: number\r\n}\r\n\r\nexport function calculateImageSize({\r\n originalHeight,\r\n originalWidth,\r\n maxHiddenDots,\r\n maxHiddenAxisDots,\r\n dotSize,\r\n margin\r\n}: ImageSizeOptions): ImageSizeResult {\r\n const hideDots = { x: 0, y: 0 }\r\n const imageSize = { x: 0, y: 0 }\r\n\r\n if (\r\n originalHeight <= 0 ||\r\n originalWidth <= 0 ||\r\n maxHiddenDots <= 0 ||\r\n dotSize <= 0 ||\r\n 4 * margin ** 2 > maxHiddenDots\r\n ) {\r\n return {\r\n height: 0,\r\n width: 0,\r\n hideYDots: 0,\r\n hideXDots: 0\r\n }\r\n }\r\n\r\n //If set, ensure maxHiddenAxisDots is odd and at least 1\r\n if (maxHiddenAxisDots && maxHiddenAxisDots % 2 == 0) maxHiddenAxisDots = Math.max(1, maxHiddenAxisDots - 1)\r\n\r\n //Determine the bigger and smaller image dimension\r\n const dimMax = Math.max(originalWidth, originalHeight)\r\n const dimMin = Math.min(originalWidth, originalHeight)\r\n\r\n //Find max image size along the bigger dimension\r\n let lower = 0\r\n let upper = (maxHiddenAxisDots || maxHiddenDots) - 2 * margin\r\n do {\r\n const newSize = lower + (upper - lower) / 2\r\n let dotsMax = Math.max(1, Math.ceil(newSize + 2 * margin))\r\n if (dotsMax % 2 == 0) dotsMax++\r\n let dotsMin = Math.max(1, Math.ceil((newSize * dimMin) / dimMax + 2 * margin))\r\n if (dotsMin % 2 == 0) dotsMin++\r\n\r\n if (dotsMax * dotsMin > maxHiddenDots) upper = newSize\r\n else lower = newSize\r\n } while (Math.abs(lower - upper) > 0.001)\r\n\r\n //Calculate how many dots the given size corresponds to\r\n const size = lower\r\n let hideMax = Math.max(1, Math.ceil(size + 2 * margin))\r\n if (hideMax % 2 == 0) hideMax++\r\n let hideMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin))\r\n if (hideMin % 2 == 0) hideMin++\r\n\r\n //Set hidden dots along bigger and smaller dimension to the right axis\r\n if (originalWidth > originalHeight) {\r\n hideDots.x = hideMax\r\n hideDots.y = hideMin\r\n } else {\r\n hideDots.x = hideMin\r\n hideDots.y = hideMax\r\n }\r\n\r\n //Fit image to the hidden dots\r\n const maxW = (hideDots.x - 2 * margin) * dotSize\r\n const maxH = (hideDots.y - 2 * margin) * dotSize\r\n imageSize.x = maxW\r\n imageSize.y = (maxW * originalHeight) / originalWidth\r\n if (imageSize.y > maxH) {\r\n imageSize.y = maxH\r\n imageSize.x = (maxH * originalWidth) / originalHeight\r\n }\r\n\r\n return {\r\n height: Math.round(imageSize.y + 2 * margin * dotSize),\r\n width: Math.round(imageSize.x + 2 * margin * dotSize),\r\n hideYDots: hideDots.y,\r\n hideXDots: hideDots.x\r\n }\r\n}\r\n","import { QRCodeMinimal } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nimport { stringToBytes_UTF8 } from '@liquid-js/qrcode-generator/lib/text/stringToBytes_UTF8.js'\r\nimport { RecursivePartial } from '../types/helper.js'\r\nimport { mergeDeep } from '../utils/merge.js'\r\nimport { ImageMode, Options, ShapeType, defaultOptions, sanitizeOptions } from '../utils/options.js'\r\nimport { ErrorCorrectionPercents, getMode } from '../utils/qrcode.js'\r\nimport { QRSVG } from './qr-svg.js'\r\n\r\nObject.assign(QRCodeMinimal.stringToBytesFuncs, stringToBytes_UTF8)\r\n\r\nexport type ExtensionFunction = (svg: SVGElement, options: RecursivePartial<Options>) => void\r\n\r\nexport class QRCodeStyling {\r\n private options: Options\r\n private container?: HTMLElement\r\n private qr?: QRCodeMinimal\r\n private extension?: ExtensionFunction\r\n private svgDrawingPromise?: Promise<void>\r\n private qrSVG?: QRSVG\r\n\r\n get size() {\r\n if (this.qrSVG)\r\n return {\r\n width: this.qrSVG.width,\r\n height: this.qrSVG.height\r\n }\r\n return undefined\r\n }\r\n\r\n constructor(options?: RecursivePartial<Options>) {\r\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions\r\n this.update()\r\n }\r\n\r\n update(\r\n /** The same options as for initialization */\r\n options?: RecursivePartial<Options>\r\n ): void {\r\n if (this.container) this.container.innerHTML = ''\r\n\r\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options\r\n\r\n if (!this.options.data) {\r\n return\r\n }\r\n\r\n if (this.options.stringToBytesFuncs) {\r\n Object.assign(QRCodeMinimal.stringToBytesFuncs, this.options.stringToBytesFuncs)\r\n delete this.options.stringToBytesFuncs\r\n }\r\n\r\n this.qr = new QRCodeMinimal(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel)\r\n const mode = this.options.qrOptions.mode || getMode(this.options.data)\r\n this.qr.addData(this.options.data, mode)\r\n this.qr.make()\r\n\r\n this.setupSvg()\r\n\r\n this.append(this.container)\r\n }\r\n\r\n append(\r\n /** This container will be used for appending of the QR code */\r\n container?: HTMLElement\r\n ): void {\r\n if (!container) {\r\n return\r\n }\r\n\r\n if (this.qrSVG?.element) {\r\n container.appendChild(this.qrSVG.element)\r\n }\r\n\r\n this.container = container\r\n }\r\n\r\n /**\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * const extension = (svg, options) => {\r\n * const { width, height } = options;\r\n * const size = Math.min(width, height);\r\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n * const borderAttributes = {\r\n * fill: \"none\",\r\n * x: (width - size + 40) / 2,\r\n * y: (height - size + 40) / 2,\r\n * width: size - 40,\r\n * height: size - 40,\r\n * stroke: \"black\",\r\n * \"stroke-width\": 40,\r\n * rx: 100\r\n * };\r\n * Object.keys(borderAttributes).forEach((attribute) => {\r\n * border.setAttribute(attribute, borderAttributes[attribute]);\r\n * });\r\n * svg.appendChild(border);\r\n * };\r\n * ```\r\n */\r\n applyExtension(\r\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\r\n extension: ExtensionFunction\r\n ): void {\r\n if (!extension) {\r\n throw new Error('Extension function should be defined.')\r\n }\r\n\r\n this.extension = extension\r\n this.update()\r\n }\r\n\r\n deleteExtension(): void {\r\n this.extension = undefined\r\n this.update()\r\n }\r\n\r\n async serialize(): Promise<string | undefined> {\r\n if (!this.qr) throw new Error('QR code is empty')\r\n\r\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\r\n this.setupSvg()\r\n }\r\n await this.svgDrawingPromise\r\n\r\n if (!this.qrSVG?.element) {\r\n return\r\n }\r\n\r\n const serializer = new XMLSerializer()\r\n let source = serializer.serializeToString(this.qrSVG.element)\r\n\r\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source\r\n return source\r\n }\r\n\r\n private setupSvg(): void {\r\n if (!this.qr) {\r\n return\r\n }\r\n let moduleCount = this.qr.getModuleCount()\r\n if (this.options.imageOptions.mode == ImageMode.background && this.options.shape != ShapeType.circle)\r\n moduleCount += 2\r\n let count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * moduleCount)\r\n if (count % 2 == 0) count -= 1\r\n let margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0\r\n if (this.options.imageOptions.mode == ImageMode.background) margin += this.options.imageOptions.margin || 0\r\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin))\r\n this.qrSVG = new QRSVG({\r\n ...this.options,\r\n width: size,\r\n height: size,\r\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\r\n })\r\n\r\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\r\n if (!this.qrSVG?.element) return\r\n this.extension?.(this.qrSVG.element, this.options)\r\n })\r\n }\r\n}\r\n","import { QRCodeStyling } from '../core/qr-code-styling.js'\r\nimport { RecursivePartial } from '../types/helper.js'\r\nimport { CanvasOptions, defaultCanvasOptions, sanitizeCanvasOptions } from '../utils/canvas-options.js'\r\nimport { mergeDeep } from '../utils/merge.js'\r\n\r\nexport enum FileExtension {\r\n svg = 'svg',\r\n png = 'png',\r\n jpeg = 'jpeg',\r\n webp = 'webp'\r\n}\r\n\r\nexport function drawToCanvas(\r\n qrCode: QRCodeStyling,\r\n options?: RecursivePartial<CanvasOptions>\r\n): { canvas: HTMLCanvasElement, canvasDrawingPromise: Promise<void> | undefined } | undefined {\r\n const { width, height, margin } = options\r\n ? sanitizeCanvasOptions(mergeDeep(defaultCanvasOptions, options) as CanvasOptions)\r\n : defaultCanvasOptions\r\n\r\n const canvas = document.createElement('canvas')\r\n canvas.width = width\r\n canvas.height = height\r\n\r\n const size = Math.min(width, height) - 2 * margin\r\n\r\n const canvasDrawingPromise = qrCode.serialize().then((xml) => {\r\n if (!xml) return\r\n const svg64 = btoa(xml)\r\n const image64 = 'data:image/svg+xml;base64,' + svg64\r\n const image = new Image()\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n image.onload = (): void => {\r\n // Ensure pixel-perfect rendering of SVG to avoid artefact, then downscale to requested size\r\n const aaFactor = Math.ceil((2 * size) / Math.min(image.width, image.height))\r\n let aaCanvas: HTMLCanvasElement | OffscreenCanvas\r\n try {\r\n aaCanvas = new OffscreenCanvas(image.width * aaFactor, image.height * aaFactor)\r\n } catch (_) {\r\n // Fallback to regular canvas element\r\n aaCanvas = document.createElement('canvas')\r\n aaCanvas.width = image.width * aaFactor\r\n aaCanvas.height = image.height * aaFactor\r\n }\r\n aaCanvas.getContext('2d')?.drawImage(image, 0, 0, aaCanvas.width, aaCanvas.height)\r\n\r\n canvas?.getContext('2d')?.drawImage(aaCanvas, (width - size) / 2, (height - size) / 2, size, size)\r\n resolve()\r\n }\r\n image.onerror = image.onabort = reject\r\n\r\n image.src = image64\r\n })\r\n })\r\n\r\n return { canvas, canvasDrawingPromise }\r\n}\r\n\r\nexport async function download(\r\n qrCode: QRCodeStyling,\r\n downloadOptions?: { name?: string, extension: `${FileExtension}` },\r\n options?: RecursivePartial<CanvasOptions>\r\n): Promise<void> {\r\n let extension: `${FileExtension}` = FileExtension.png\r\n let name = 'qr'\r\n\r\n if (downloadOptions) {\r\n if (downloadOptions.name) {\r\n name = downloadOptions.name\r\n }\r\n if (downloadOptions.extension) {\r\n extension = downloadOptions.extension\r\n }\r\n }\r\n\r\n if (extension.toLowerCase() === 'svg') {\r\n const source = await qrCode.serialize()\r\n if (!source) return\r\n const url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(source)\r\n downloadURI(url, `${name}.svg`)\r\n } else {\r\n const res = drawToCanvas(qrCode, options)\r\n if (!res) return\r\n const { canvas, canvasDrawingPromise } = res\r\n await canvasDrawingPromise\r\n const url = canvas.toDataURL(`image/${extension}`)\r\n downloadURI(url, `${name}.${extension}`)\r\n }\r\n}\r\n\r\nexport function downloadURI(uri: string, name: string): void {\r\n const link = document.createElement('a')\r\n link.download = name\r\n link.href = uri\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n}\r\n","import { DOMImplementation, DOMParser, XMLSerializer } from '@xmldom/xmldom'\r\nimport { fileTypeFromBuffer } from 'file-type'\r\nimport sharp from 'sharp'\r\nimport { QRCodeStyling as _QRCodeStyling } from './core/qr-code-styling.js'\r\nimport type * as _browserUtils from './tools/browser-utils.js'\r\nimport { RecursivePartial } from './types/helper.js'\r\nimport { Options } from './utils/options.js'\r\nexport { ErrorCorrectionLevel, Mode, TypeNumber } from '@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js'\r\nexport { type ExtensionFunction } from './core/qr-code-styling.js'\r\nexport { FileExtension } from './tools/browser-utils.js'\r\nexport { type RecursivePartial } from './types/helper.js'\r\nexport { type CanvasOptions } from './utils/canvas-options.js'\r\nexport { GradientType, type Gradient } from './utils/gradient.js'\r\nexport { CornerDotType, CornerSquareType, DotType, ImageMode, ShapeType, type Options } from './utils/options.js'\r\nexport { ErrorCorrectionPercents } from './utils/qrcode.js'\r\n\r\nexport const browserUtils: typeof _browserUtils | undefined = undefined\r\n\r\nexport class QRCodeStyling extends _QRCodeStyling {\r\n constructor(options: RecursivePartial<Options>) {\r\n const dom = new DOMImplementation().createDocument(null, '')\r\n const imageCache = new Map<string, Promise<{ contentType?: string | null, data: Buffer }>>()\r\n\r\n const loadImage = async (url: string | Buffer | Blob) => {\r\n if (typeof url == 'string') {\r\n let pr = imageCache.get(url)\r\n if (pr) return pr\r\n pr = fetch(url).then((res) =>\r\n res\r\n .arrayBuffer()\r\n .then((buff) => Buffer.from(buff))\r\n .then(async (data) => ({\r\n contentType: res.headers.get('Content-Type') || (await fileTypeFromBuffer(data).then((r) => r?.mime)),\r\n data\r\n }))\r\n )\r\n imageCache.set(url, pr)\r\n return pr\r\n } else {\r\n const buff = Buffer.from(url as Buffer)\r\n const mime = await fileTypeFromBuffer(buff).then((r) => r?.mime)\r\n return {\r\n contentType: mime,\r\n data: buff\r\n }\r\n }\r\n }\r\n\r\n global.XMLSerializer = XMLSerializer as any\r\n\r\n global.DOMParser = DOMParser as any\r\n\r\n super({\r\n ...options,\r\n\r\n document: options.document || (dom as any),\r\n imageTools: options.imageTools || {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\r\n if (typeof url == 'string' && url.startsWith('data:')) return Promise.resolve(url)\r\n return loadImage(url).then(\r\n ({ contentType, data }) =>\r\n `data:${contentType?.replace('application/xml', 'image/svg+xml')};base64,${data.toString('base64')}`\r\n )\r\n },\r\n getSize: async (src: string | Blob | Buffer): Promise<{ width: number, height: number }> => {\r\n const { data } = Buffer.isBuffer(options.image) ? { data: options.image } : await loadImage(src)\r\n const meta = await sharp(data).metadata()\r\n return {\r\n width: meta.width!,\r\n\r\n height: meta.height!\r\n }\r\n }\r\n }\r\n })\r\n }\r\n}\r\n"],"names":["obj","ErrorCorrectionLevel","TypeNumber","Mode","QRCodeMinimal","sharp","fileTypeFromBuffer","DOMImplementation","XMLSerializer$1","DOMParser$1","isObject","Array","isArray","target","sources","length","shift","undefined","source","Object","keys","forEach","key","targetValue","sourceValue","mergeDeep","GradientType","DotType","CornerDotType","CornerSquareType","ShapeType","ImageMode","sanitizeGradient","gradient","colorStops","newGradient","Error","rotation","Number","map","colorStop","offset","radial","linear","dot","randomDot","rounded","extraRounded","verticalLine","horizontalLine","classy","classyRounded","square","smallSquare","tinySquare","diamond","wave","heart","inpoint","outpoint","circle","center","overlay","background","defaultOptions","document","shape","width","height","data","qrOptions","typeNumber","mode","errorCorrectionLevel","Q","imageOptions","imageSize","crossOrigin","margin","fill","color","dotsOptions","type","size","sanitizeOptions","options","newOptions","Math","min","round","max","cornersSquareOptions","cornersDotOptions","backgroundOptions","ErrorCorrectionPercents","L","M","H","rx","numToAttr","value","toFixed","replace","strings","values","reduce","t","v","i","p","trim","rotateFigure","draw","args","x","y","element","el","setAttribute","PI","cx","cy","DotElements","createElementNS","sideRounded","svgPath","cornerRounded","cornerExtraRounded","cornersRounded","a1","a2","c23x","s1","s2","cos","c23y","sin","c31x","c31y","scalePath","path","move","toUpperCase","join","dotSize","qrCornerDotFigures","SquareElements","qrCornerSquareFigures","qrDotFigures","random","getNeighbor","leftNeighbor","rightNeighbor","topNeighbor","neighborsCount","bottomNeighbor","getQrDotFigure","browserImageTools","toDataURL","url","startsWith","Promise","resolve","reject","xhr","XMLHttpRequest","onload","reader","FileReader","onloadend","result","readAsDataURL","response","onerror","onabort","ontimeout","open","responseType","send","getSize","src","image","Image","then","catch","parseColor","cstr","parts","alpha","toLowerCase","base","slice","parseInt","m","exec","split","parseFloat","dims","pop","toString","padStart","squareMask","cornerSquareTypes","Set","dotMask","cornerDotTypes","QRSVG","_element","this","defs","backgroundMask","backgroundMaskGroup","dotsMask","dotsMaskGroup","lightDotsMask","lightDotsMaskGroup","qr","imageTools","constructor","appendChild","drawQR","getModuleCount","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","maxWidth","maxHeight","alignment","QRUtil","getPatternPosition","calculateImageSize","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dimMax","dimMin","lower","upper","newSize","dotsMax","ceil","dotsMin","abs","hideMax","hideMin","maxW","maxH","floor","coverLevel","drawBackground","drawImage","drawDots","j","drawCorners","createColor","additionalRotation","name","createMask","filter","minSize","additionalDots","fakeCount","xBeginning","yBeginning","fakeMatrix","ii","jj","isDark","sqrt","iAlign","find","jAlign","xFakeBeginning","yFakeBeginning","xOffset","yOffset","colorCount","cornersSquareSize","cornersDotSize","column","row","cornersSquareMask","cornersSquareMaskGroup","val","cornersDotMask","cornersDotMaskGroup","has","cornerElement","cornerFill","isCornerDotType","dx","dy","imageUrl","setAttributeNS","substring","indexOf","encoding","atob","Buffer","from","container","parseFromString","DOMParser","rootEl","getElementsByTagName","dw","dh","rect","x0","y0","positiveRotation","tan","x1","y1","stopCfg","stop","parsed","id","mask","group","assign","stringToBytesFuncs","stringToBytes_UTF8","extension","svgDrawingPromise","qrSVG","update","innerHTML","getMode","test","numeric","alphanumeric","unicode","byte","addData","make","setupSvg","append","applyExtension","deleteExtension","serialize","serializeToString","XMLSerializer","moduleCount","FileExtension","svg","png","jpeg","webp","QRCodeStyling","_QRCodeStyling","dom","createDocument","imageCache","Map","loadImage","pr","get","fetch","res","arrayBuffer","buff","async","contentType","headers","r","mime","set","global","super","isBuffer","meta","metadata"],"mappings":"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"}
|