@liquid-js/qr-code-styling 4.0.6 → 4.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +147 -141
- package/lib/core/qr-code-styling.d.ts +2 -2
- package/lib/core/qr-svg.d.ts +3 -3
- package/lib/figures/corner-dot.d.ts +2 -2
- package/lib/figures/corner-square.d.ts +2 -2
- package/lib/figures/dot.d.ts +2 -2
- package/lib/index.d.ts +9 -9
- package/lib/kanji.js +1 -1
- package/lib/kanji.js.map +1 -1
- package/lib/node.d.ts +12 -12
- package/lib/qr-code-styling-node.js +115 -86
- 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/tools/browser-image-tools.d.ts +2 -2
- package/lib/tools/browser-utils.d.ts +3 -3
- package/lib/types/helper.d.ts +7 -7
- package/lib/utils/gradient.d.ts +4 -4
- package/lib/utils/options.d.ts +3 -3
- package/lib/utils/qrcode.d.ts +1 -1
- package/package.json +1 -15
|
@@ -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 =>\n !!obj && typeof obj === \"object\" && !Array.isArray(obj);\n\nexport type UnknownObject =\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n }\n | undefined;\n\nexport function mergeDeep(target: UnknownObject, ...sources: UnknownObject[]): UnknownObject {\n if (!sources.length) return target;\n const source = sources.shift();\n if (source === undefined || !isObject(target) || !isObject(source)) return target;\n target = { ...target };\n Object.keys(source).forEach((key: string): void => {\n const targetValue = target[key];\n const sourceValue = source[key];\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n target[key] = sourceValue;\n } else if (isObject(targetValue) && isObject(sourceValue)) {\n target[key] = mergeDeep(Object.assign({}, targetValue), sourceValue);\n } else {\n target[key] = sourceValue;\n }\n });\n\n return mergeDeep(target, ...sources);\n}\n","export enum GradientType {\n radial = \"radial\",\n linear = \"linear\"\n}\n\nexport type Gradient = {\n /**\n * Type of gradient spread\n *\n * @default GradientType.linear\n */\n type: `${GradientType}`;\n /**\n * Rotation of gradient (in radians, Math.PI === 180 degrees)\n *\n * @default 0\n */\n rotation?: number;\n /** Gradient colors. */\n colorStops: {\n /** Position of color in gradient range */\n offset: number;\n /** Color of stop in gradient range */\n color: string;\n }[];\n};\n\nexport function sanitizeGradient(gradient: Gradient): Gradient {\n const newGradient = { ...gradient };\n\n if (!newGradient.colorStops || !newGradient.colorStops.length) {\n throw \"Field 'colorStops' is required in gradient\";\n }\n\n if (newGradient.rotation) {\n newGradient.rotation = Number(newGradient.rotation);\n } else {\n newGradient.rotation = 0;\n }\n\n newGradient.colorStops = newGradient.colorStops.map((colorStop: { offset: number; color: string }) => ({\n ...colorStop,\n offset: Number(colorStop.offset)\n }));\n\n return newGradient;\n}\n","import { ErrorCorrectionLevel, Mode, TypeNumber } from \"@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js\";\nimport { browserImageTools } from \"../tools/browser-image-tools.js\";\nimport { Gradient, sanitizeGradient } from \"./gradient.js\";\n\nexport enum DotType {\n dot = \"dot\",\n randomDot = \"random-dot\",\n rounded = \"rounded\",\n extraRounded = \"extra-rounded\",\n verticalLine = \"vertical-line\",\n horizontalLine = \"horizontal-line\",\n classy = \"classy\",\n classyRounded = \"classy-rounded\",\n square = \"square\",\n smallSquare = \"small-square\",\n tinySquare = \"tiny-square\",\n diamond = \"diamond\"\n}\n\nexport enum CornerDotType {\n dot = \"dot\",\n square = \"square\",\n heart = \"heart\",\n extraRounded = \"extra-rounded\",\n classy = \"classy\",\n outpoint = \"outpoint\",\n inpoint = \"inpoint\"\n}\n\nexport enum CornerSquareType {\n dot = \"dot\",\n square = \"square\",\n extraRounded = \"extra-rounded\",\n classy = \"classy\",\n outpoint = \"outpoint\",\n inpoint = \"inpoint\"\n}\n\nexport enum ShapeType {\n square = \"square\",\n circle = \"circle\"\n}\n\nexport enum ImageMode {\n /**\n * Place image in the center of the code\n */\n center = \"center\",\n /**\n * Place image over the center of the code\n */\n overlay = \"overlay\",\n /**\n * Use image as background, draw dots over it\n */\n background = \"background\"\n}\n\nexport interface Options {\n /** Use a custom DOM domplementation */\n document: Document;\n /** Use a custom image fetching & serializaton implementation */\n imageTools?: typeof browserImageTools;\n /** @ignore */\n width: number;\n /** @ignore */\n height: number;\n /** The data will be encoded in the QR code */\n data: string;\n /** The image will be copied to the center of the QR code */\n image?: string | Buffer | Blob;\n /**\n * QR code shape\n *\n * @default ShapeType.square\n */\n shape: `${ShapeType}`;\n /** Options will be passed to `@liquid-js/qrcode-generator` lib */\n qrOptions: {\n typeNumber: TypeNumber;\n mode?: `${Mode}`;\n /** @default ErrorCorrectionLevel.Q */\n errorCorrectionLevel: `${ErrorCorrectionLevel}`;\n };\n imageOptions: {\n /**\n * Image mode\n *\n * @default ImageMode.center\n */\n mode: `${ImageMode}`;\n /**\n * Fill blank areas of the code with selected color\n */\n fill: {\n /**\n * Color of QR dots\n *\n * @default \"rgba(255,255,255,0.75)\"\n */\n color: string;\n /** Gradient of Corners Dot */\n gradient?: Gradient;\n };\n /**\n * Coefficient of the image size\n *\n * @default 0.4\n */\n imageSize: number;\n /**\n * Margin of the image (in blocks)\n *\n * @default 0\n */\n margin: number;\n /**\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLImageElement/crossOrigin)\n */\n crossOrigin?: string;\n };\n dotsOptions: {\n /**\n * QR dot size (in pixels)\n *\n * @default 10\n */\n size: number;\n /**\n * Color of QR dots\n *\n * @default \"#000\"\n */\n color: string;\n /** Gradient of QR dots */\n gradient?: Gradient;\n /**\n * Style of QR dots\n *\n * @default DotType.square\n */\n type: `${DotType}`;\n };\n /** Corners Square options, omitted values match dots */\n cornersSquareOptions?: {\n /** Color of Corners Square */\n color?: string;\n /** Gradient of Corners Square */\n gradient?: Gradient;\n /** Style of Corners Square */\n type?: `${CornerSquareType}`;\n };\n /** Corners Dot options, omitted values match squares */\n cornersDotOptions?: {\n /** Color of Corners Dot */\n color?: string;\n /** Gradient of Corners Dot */\n gradient?: Gradient;\n /** Style of Corners Dot */\n type?: `${CornerDotType}`;\n };\n /** QR background styling options, false to disable background */\n backgroundOptions?:\n | {\n /** Background roundnes, from 0 (square) to 1 (circle) */\n round?: number;\n /** Background color */\n color?: string;\n /** Background Gradient */\n gradient?: Gradient;\n /**\n * Margin (in blocks) between background and the QR code\n *\n * @default 0\n */\n margin?: number;\n }\n | false;\n /** `import { stringToBytesFuncs } from \"@liquid-js/qr-code-styling/kanji\";` to add Kanji support */\n stringToBytesFuncs?: { [encoding: string]: (s: string) => number[] };\n}\n\nexport const defaultOptions: Options = {\n document: undefined as never,\n shape: ShapeType.square,\n width: undefined as never,\n height: undefined as never,\n data: \"\",\n qrOptions: {\n typeNumber: TypeNumber[0],\n mode: undefined,\n errorCorrectionLevel: ErrorCorrectionLevel.Q\n },\n imageOptions: {\n mode: ImageMode.center,\n imageSize: 0.4,\n crossOrigin: undefined,\n margin: 0,\n fill: {\n color: \"rgba(255,255,255,1)\"\n }\n },\n dotsOptions: {\n type: DotType.square,\n color: \"#000\",\n size: 10\n }\n};\n\nexport function sanitizeOptions(options: Options): Options {\n const newOptions = { ...options };\n\n newOptions.imageOptions = {\n ...newOptions.imageOptions,\n imageSize: Math.min(1, Number(newOptions.imageOptions.imageSize)) || 1,\n margin: Number(newOptions.imageOptions.margin),\n fill: {\n ...newOptions.imageOptions.fill\n }\n };\n\n if (newOptions.imageOptions.mode == ImageMode.overlay) newOptions.imageOptions.margin = 0;\n if (newOptions.imageOptions.fill.gradient) {\n newOptions.imageOptions.fill.gradient = sanitizeGradient(newOptions.imageOptions.fill.gradient);\n }\n\n newOptions.dotsOptions = {\n ...newOptions.dotsOptions\n };\n if (newOptions.dotsOptions.gradient) {\n newOptions.dotsOptions.gradient = sanitizeGradient(newOptions.dotsOptions.gradient);\n }\n // Ensure integer dot size\n newOptions.dotsOptions.size = Math.round(Math.max(0, newOptions.dotsOptions.size) || 10);\n\n if (newOptions.cornersSquareOptions) {\n newOptions.cornersSquareOptions = {\n ...newOptions.cornersSquareOptions\n };\n if (newOptions.cornersSquareOptions.gradient) {\n newOptions.cornersSquareOptions.gradient = sanitizeGradient(newOptions.cornersSquareOptions.gradient);\n }\n }\n\n if (newOptions.cornersDotOptions) {\n newOptions.cornersDotOptions = {\n ...newOptions.cornersDotOptions\n };\n if (newOptions.cornersDotOptions.gradient) {\n newOptions.cornersDotOptions.gradient = sanitizeGradient(newOptions.cornersDotOptions.gradient);\n }\n }\n\n if (newOptions.backgroundOptions) {\n newOptions.backgroundOptions = {\n ...newOptions.backgroundOptions\n };\n if (newOptions.backgroundOptions.gradient) {\n newOptions.backgroundOptions.gradient = sanitizeGradient(newOptions.backgroundOptions.gradient);\n }\n }\n\n if (!newOptions.document) newOptions.document = document;\n\n return newOptions;\n}\n","import { ErrorCorrectionLevel, Mode } from \"@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js\";\n\nexport const ErrorCorrectionPercents = {\n [ErrorCorrectionLevel.L]: 0.07,\n [ErrorCorrectionLevel.M]: 0.15,\n [ErrorCorrectionLevel.Q]: 0.25,\n [ErrorCorrectionLevel.H]: 0.3\n};\n\nexport function getMode(data: string): Mode {\n switch (true) {\n case /^[0-9]*$/.test(data):\n return Mode.numeric;\n case /^[0-9A-Z $%*+\\-./:]*$/.test(data):\n return Mode.alphanumeric;\n // eslint-disable-next-line no-control-regex\n case /[^\\u0000-\\u00ff]/.test(data):\n return Mode.unicode;\n default:\n return Mode.byte;\n }\n}\n","const rx = /\\.?0+$/;\n\nexport function numToAttr(value: number) {\n return value.toFixed(7).replace(rx, \"\");\n}\n\nexport function svgPath(strings: TemplateStringsArray, ...values: unknown[]) {\n return strings\n .reduce((t, v, i) => {\n let p: unknown = \"\";\n if (i) p = values[i - 1];\n if (typeof p == \"number\") p = numToAttr(p);\n return `${t}${p}${v}`;\n }, \"\")\n .trim()\n .replace(/[\\s\\n\\r]+/gim, \" \");\n}\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\nimport { CornerDotType } from \"../utils/options.js\";\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\n\nexport class QRCornerDot {\n private _element?: SVGElement;\n\n get element() {\n return this._element;\n }\n\n constructor(\n private readonly type: `${CornerDotType}`,\n private readonly document: Document\n ) {}\n\n draw(args: DrawArgs): void {\n const type = this.type;\n let drawFunction;\n\n switch (type) {\n case CornerDotType.square:\n drawFunction = this.drawSquare;\n break;\n case CornerDotType.heart:\n drawFunction = this.drawHeart;\n break;\n case CornerDotType.extraRounded:\n drawFunction = this.drawRounded;\n break;\n case CornerDotType.classy:\n drawFunction = this.drawClassy;\n break;\n case CornerDotType.inpoint:\n drawFunction = this.drawInpoint;\n break;\n case CornerDotType.outpoint:\n drawFunction = this.drawOutpoint;\n break;\n case CornerDotType.dot:\n default:\n drawFunction = this.drawDot;\n }\n\n drawFunction.call(this, args);\n }\n\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n const cx = x + size / 2;\n const cy = y + size / 2;\n\n draw();\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\n }\n\n private basicDot(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n this._element.setAttribute(\"cx\", numToAttr(x + size / 2));\n this._element.setAttribute(\"cy\", numToAttr(y + size / 2));\n this._element.setAttribute(\"r\", numToAttr(size / 2));\n }\n });\n }\n\n private basicSquare(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n this._element.setAttribute(\"x\", numToAttr(x));\n this._element.setAttribute(\"y\", numToAttr(y));\n this._element.setAttribute(\"width\", numToAttr(size));\n this._element.setAttribute(\"height\", numToAttr(size));\n }\n });\n }\n\n private basicHeart(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const path = [\n \"M\",\n 1,\n 0.3262506,\n \"c\",\n 0,\n 0.0383376,\n -0.0064626,\n 0.0758377,\n -0.0193751,\n 0.1125001,\n \"s\",\n -0.0356247,\n 0.076875,\n -0.0681248,\n 0.1206252,\n \"c\",\n -0.0325,\n 0.0437499,\n -0.0762503,\n 0.0931247,\n -0.1312501,\n 0.1481249,\n \"C\",\n 0.7262502,\n 0.7625008,\n 0.6566626,\n 0.8279132,\n 0.5724999,\n 0.9037505,\n \"L\",\n 0.5,\n 0.9687506,\n \"L\",\n 0.4275001,\n 0.9037505,\n \"C\",\n 0.3433374,\n 0.8279132,\n 0.2737499,\n 0.7625005,\n 0.21875,\n 0.7075007,\n \"C\",\n 0.1637501,\n 0.6525008,\n 0.1199999,\n 0.6031258,\n 0.0874999,\n 0.5593758,\n \"S\",\n 0.0322876,\n 0.4754133,\n 0.0193751,\n 0.4387506,\n \"S\",\n 0,\n 0.3645881,\n 0,\n 0.3262506,\n \"c\",\n 0,\n -0.0783374,\n 0.0262499,\n -0.1437498,\n 0.07875,\n -0.1962499,\n \"s\",\n 0.1179124,\n -0.07875,\n 0.1962499,\n -0.07875,\n \"c\",\n 0.0433376,\n 0,\n 0.0845875,\n 0.0091625,\n 0.12375,\n 0.0274999,\n \"S\",\n 0.4716623,\n 0.1229131,\n 0.5,\n 0.1562506,\n \"c\",\n 0.0283374,\n -0.0333375,\n 0.0620874,\n -0.0591625,\n 0.1012502,\n -0.0775,\n \"c\",\n 0.0391627,\n -0.0183375,\n 0.0804126,\n -0.0274999,\n 0.12375,\n -0.0274999,\n \"c\",\n 0.0783374,\n 0,\n 0.1437497,\n 0.0262499,\n 0.1962501,\n 0.07875,\n \"S\",\n 1,\n 0.2479131,\n 1,\n 0.3262506,\n \"z\"\n ];\n let move = false;\n let i = 0;\n this._element.setAttribute(\n \"d\",\n path\n .map((v) => {\n if (typeof v == \"string\") {\n i = 0;\n move = v.toUpperCase() == v;\n return v;\n }\n i++;\n v = v * size;\n if (move) {\n v += i % 2 == 1 ? x : y;\n }\n return numToAttr(v);\n })\n .join(\" \")\n );\n }\n\n private basicRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n this._element.setAttribute(\"x\", numToAttr(x));\n this._element.setAttribute(\"y\", numToAttr(y));\n this._element.setAttribute(\"width\", numToAttr(size));\n this._element.setAttribute(\"height\", numToAttr(size));\n this._element.setAttribute(\"rx\", numToAttr(size / 4));\n this._element.setAttribute(\"ry\", numToAttr(size / 4));\n }\n });\n }\n\n private basicClassy(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\n h ${4.5 * dotSize}\n v ${-4.5 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\n h ${-2 * dotSize}\n H ${x}\n z`\n );\n }\n });\n }\n\n private basicInpoint(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + dotSize / 2}\n v ${dotSize / 4}\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${dotSize / 4}, ${dotSize / 4}\n h ${(dotSize / 4) * 3}\n v ${(-dotSize / 4) * 3}\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${-dotSize / 4}, ${-dotSize / 4}\n h ${-dotSize / 2}\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${-dotSize / 4}, ${dotSize / 4}\n z`\n );\n }\n });\n }\n\n private drawDot({ x, y, size, rotation }: DrawArgs): void {\n this.basicDot({ x, y, size, rotation });\n }\n\n private drawSquare({ x, y, size, rotation }: DrawArgs): void {\n this.basicSquare({ x, y, size, rotation });\n }\n\n private drawHeart({ x, y, size, rotation }: DrawArgs): void {\n this.basicHeart({ x, y, size, rotation });\n }\n\n private drawRounded({ x, y, size, rotation }: DrawArgs): void {\n this.basicRounded({ x, y, size, rotation });\n }\n\n private drawClassy({ x, y, size, rotation }: DrawArgs): void {\n this.basicClassy({ x, y, size, rotation });\n }\n\n private drawInpoint({ x, y, size, rotation }: DrawArgs): void {\n this.basicInpoint({ x, y, size, rotation });\n }\n\n private drawOutpoint({ x, y, size, rotation }: DrawArgs): void {\n this.basicInpoint({ x, y, size, rotation: (rotation || 0) + Math.PI });\n }\n}\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\nimport { CornerSquareType } from \"../utils/options.js\";\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\n\nexport class QRCornerSquare {\n private _element?: SVGElement;\n private _fill?: SVGElement;\n\n get element() {\n return this._element;\n }\n\n get fill() {\n return this._fill;\n }\n\n constructor(\n private readonly type: `${CornerSquareType}`,\n private readonly document: Document\n ) {}\n\n draw(args: DrawArgs): void {\n const type = this.type;\n let drawFunction;\n\n switch (type) {\n case CornerSquareType.square:\n drawFunction = this.drawSquare;\n break;\n case CornerSquareType.extraRounded:\n drawFunction = this.drawExtraRounded;\n break;\n case CornerSquareType.classy:\n drawFunction = this.drawClassy;\n break;\n case CornerSquareType.outpoint:\n drawFunction = this.drawOutpoint;\n break;\n case CornerSquareType.inpoint:\n drawFunction = this.drawInpoint;\n break;\n case CornerSquareType.dot:\n default:\n drawFunction = this.drawDot;\n }\n\n drawFunction.call(this, args);\n }\n\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n const cx = x + size / 2;\n const cy = y + size / 2;\n\n draw();\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\n this._fill?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\n }\n\n private basicDot(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x + size / 2} ${y}\n a ${size / 2} ${size / 2} 0 1 0 0.1 0\n z\n m 0 ${dotSize}\n a ${size / 2 - dotSize} ${size / 2 - dotSize} 0 1 1 -0.1 0\n Z`\n );\n this._fill = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._fill.setAttribute(\"clip-rule\", \"evenodd\");\n this._fill.setAttribute(\n \"d\",\n svgPath`M ${x + size / 2} ${y - dotSize}\n a ${size / 2 + dotSize} ${size / 2 + dotSize} 0 1 0 0.1 0\n z`\n );\n }\n });\n }\n\n private basicSquare(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size}\n h ${size}\n v ${-size}\n z\n M ${x + dotSize} ${y + dotSize}\n h ${size - 2 * dotSize}\n v ${size - 2 * dotSize}\n h ${-size + 2 * dotSize}\n z`\n );\n this._fill = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._fill.setAttribute(\"clip-rule\", \"evenodd\");\n this._fill.setAttribute(\n \"d\",\n svgPath`\n M ${x - dotSize} ${y - dotSize}\n h ${size + 2 * dotSize}\n v ${size + 2 * dotSize}\n h ${-size - 2 * dotSize}\n z`\n );\n }\n });\n }\n\n private basicExtraRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\n h ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${-dotSize * 2.5}\n v ${-2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\n h ${-2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}\n z\n M ${x + 2.5 * dotSize} ${y + dotSize}\n h ${2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\n v ${2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${dotSize * 1.5}\n h ${-2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\n v ${-2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}\n z`\n );\n this._fill = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._fill.setAttribute(\"clip-rule\", \"evenodd\");\n this._fill.setAttribute(\n \"d\",\n svgPath`\n M ${x - dotSize} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 0, ${dotSize * 3.5} ${dotSize * 3.5}\n h ${2 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 0, ${dotSize * 3.5} ${-dotSize * 3.5}\n v ${-2 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 0, ${-dotSize * 3.5} ${-dotSize * 3.5}\n h ${-2 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 0, ${-dotSize * 3.5} ${dotSize * 3.5}\n z`\n );\n }\n });\n }\n\n private basicClassy(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\n h ${4.5 * dotSize}\n v ${-4.5 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\n h ${-2 * dotSize}\n H ${x}\n z\n M ${x + 2.5 * dotSize} ${y + dotSize}\n h ${2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\n v ${3.5 * dotSize}\n h ${-3.5 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\n v ${-3.5 * dotSize}\n z`\n );\n this._fill = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._fill.setAttribute(\"clip-rule\", \"evenodd\");\n this._fill.setAttribute(\n \"d\",\n svgPath`\n M ${x + 0.5 * dotSize} ${y - dotSize}\n h ${4 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${dotSize * 3.5} ${dotSize * 3.5}\n v ${5.5 * dotSize}\n h ${-5.5 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${-dotSize * 3.5} ${-dotSize * 3.5}\n v ${-5.5 * dotSize}\n z`\n );\n }\n });\n }\n\n private basicInpoint(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\n h ${4.5 * dotSize}\n v ${-4.5 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\n h ${-2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}\n z\n M ${x + 2.5 * dotSize} ${y + dotSize}\n h ${2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\n v ${3.5 * dotSize}\n h ${-3.5 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\n v ${-2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}\n z`\n );\n this._fill = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._fill.setAttribute(\"clip-rule\", \"evenodd\");\n this._fill.setAttribute(\n \"d\",\n svgPath`\n M ${x + 0.5 * dotSize} ${y - dotSize}\n h ${4 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${dotSize * 3.5} ${dotSize * 3.5}\n v ${5.5 * dotSize}\n h ${-5.5 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${-dotSize * 3.5} ${-dotSize * 3.5}\n v ${-2 * dotSize}\n a ${3.5 * dotSize} ${3.5 * dotSize}, 0, 0, 1, ${dotSize * 3.5} ${-dotSize * 3.5}\n z`\n );\n }\n });\n }\n\n private drawDot({ x, y, size, rotation }: DrawArgs): void {\n this.basicDot({ x, y, size, rotation });\n }\n\n private drawSquare({ x, y, size, rotation }: DrawArgs): void {\n this.basicSquare({ x, y, size, rotation });\n }\n\n private drawExtraRounded({ x, y, size, rotation }: DrawArgs): void {\n this.basicExtraRounded({ x, y, size, rotation });\n }\n\n private drawClassy({ x, y, size, rotation }: DrawArgs): void {\n this.basicClassy({ x, y, size, rotation });\n }\n\n private drawInpoint({ x, y, size, rotation }: DrawArgs): void {\n this.basicInpoint({ x, y, size, rotation });\n }\n\n private drawOutpoint({ x, y, size, rotation }: DrawArgs): void {\n this.basicInpoint({ x, y, size, rotation: (rotation || 0) + Math.PI });\n }\n}\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\nimport { DotType } from \"../utils/options.js\";\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\n\nexport class QRDot {\n private _element?: SVGElement;\n\n get element() {\n return this._element;\n }\n\n constructor(\n private readonly type: `${DotType}`,\n private readonly document: Document\n ) {}\n\n draw(args: DrawArgs): void {\n const type = this.type;\n let drawFunction;\n\n switch (type) {\n case DotType.dot:\n drawFunction = this.drawDot;\n break;\n case DotType.randomDot:\n drawFunction = this.drawRandomDot;\n break;\n case DotType.classy:\n drawFunction = this.drawClassy;\n break;\n case DotType.classyRounded:\n drawFunction = this.drawClassyRounded;\n break;\n case DotType.rounded:\n drawFunction = this.drawRounded;\n break;\n case DotType.verticalLine:\n drawFunction = this.drawVerticalLine;\n break;\n case DotType.horizontalLine:\n drawFunction = this.drawHorizontalLine;\n break;\n case DotType.extraRounded:\n drawFunction = this.drawExtraRounded;\n break;\n case DotType.diamond:\n drawFunction = this.drawDiamond;\n break;\n case DotType.smallSquare:\n drawFunction = this.drawSmallSquare;\n break;\n case DotType.tinySquare:\n drawFunction = this.drawTinySquare;\n break;\n case DotType.square:\n default:\n drawFunction = this.drawSquare;\n }\n\n drawFunction.call(this, args);\n }\n\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n const cx = x + size / 2;\n const cy = y + size / 2;\n\n draw();\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\n }\n\n private basicDot(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n this._element.setAttribute(\"cx\", numToAttr(x + size / 2));\n this._element.setAttribute(\"cy\", numToAttr(y + size / 2));\n this._element.setAttribute(\"r\", numToAttr(size / 2));\n }\n });\n }\n\n private basicSquare(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n this._element.setAttribute(\"x\", numToAttr(x));\n this._element.setAttribute(\"y\", numToAttr(y));\n this._element.setAttribute(\"width\", numToAttr(size));\n this._element.setAttribute(\"height\", numToAttr(size));\n }\n });\n }\n\n //if rotation === 0 - right side is rounded\n private basicSideRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size}\n h ${size / 2}\n a ${size / 2} ${size / 2}, 0, 0, 0, 0 ${-size}\n z`\n );\n }\n });\n }\n\n //if rotation === 0 - top right corner is rounded\n private basicCornerRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size}\n h ${size}\n v ${-size / 2}\n a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}\n z`\n );\n }\n });\n }\n\n //if rotation === 0 - top right corner is rounded\n private basicCornerExtraRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size}\n h ${size}\n a ${size} ${size}, 0, 0, 0, ${-size} ${-size}\n z`\n );\n }\n });\n }\n\n //if rotation === 0 - left bottom and right top corners are rounded\n private basicCornersRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size / 2}\n a ${size / 2} ${size / 2}, 0, 0, 0, ${size / 2} ${size / 2}\n h ${size / 2}\n v ${-size / 2}\n a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}\n z`\n );\n }\n });\n }\n\n private drawDot({ x, y, size }: DrawArgs): void {\n this.basicDot({ x, y, size, rotation: 0 });\n }\n\n private drawRandomDot({ x, y, size }: DrawArgs): void {\n const randomFactor = Math.random() * (1 - 0.75) + 0.75;\n this.basicDot({ x, y, size: size * randomFactor, rotation: 0 });\n }\n\n private drawSquare({ x, y, size }: DrawArgs): void {\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n\n private drawSmallSquare({ x, y, size }: DrawArgs): void {\n const originalSize = size;\n\n size = originalSize * 0.7;\n x = x + originalSize * 0.15;\n y = y + originalSize * 0.15;\n\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n\n private drawTinySquare({ x, y, size }: DrawArgs): void {\n const originalSize = size;\n\n size = originalSize * 0.3;\n x = x + originalSize * 0.35;\n y = y + originalSize * 0.35;\n\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n\n private drawDiamond({ x, y, size }: DrawArgs): void {\n this.basicSquare({ x, y, size, rotation: Math.PI / 4 });\n }\n\n private drawRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (neighborsCount === 0) {\n this.basicDot({ x, y, size, rotation: 0 });\n return;\n }\n\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\n this.basicSquare({ x, y, size, rotation: 0 });\n return;\n }\n\n if (neighborsCount === 2) {\n let rotation = 0;\n\n if (leftNeighbor && topNeighbor) {\n rotation = Math.PI / 2;\n } else if (topNeighbor && rightNeighbor) {\n rotation = Math.PI;\n } else if (rightNeighbor && bottomNeighbor) {\n rotation = -Math.PI / 2;\n }\n\n this.basicCornerRounded({ x, y, size, rotation });\n return;\n }\n\n if (neighborsCount === 1) {\n let rotation = 0;\n\n if (topNeighbor) {\n rotation = Math.PI / 2;\n } else if (rightNeighbor) {\n rotation = Math.PI;\n } else if (bottomNeighbor) {\n rotation = -Math.PI / 2;\n }\n\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n }\n\n private drawVerticalLine({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (\n neighborsCount === 0 ||\n (leftNeighbor && !(topNeighbor || bottomNeighbor)) ||\n (rightNeighbor && !(topNeighbor || bottomNeighbor))\n ) {\n this.basicDot({ x, y, size, rotation: 0 });\n return;\n }\n\n if (topNeighbor && bottomNeighbor) {\n this.basicSquare({ x, y, size, rotation: 0 });\n return;\n }\n\n if (topNeighbor && !bottomNeighbor) {\n const rotation = Math.PI / 2;\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n\n if (bottomNeighbor && !topNeighbor) {\n const rotation = -Math.PI / 2;\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n }\n\n private drawHorizontalLine({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (\n neighborsCount === 0 ||\n (topNeighbor && !(leftNeighbor || rightNeighbor)) ||\n (bottomNeighbor && !(leftNeighbor || rightNeighbor))\n ) {\n this.basicDot({ x, y, size, rotation: 0 });\n return;\n }\n\n if (leftNeighbor && rightNeighbor) {\n this.basicSquare({ x, y, size, rotation: 0 });\n return;\n }\n\n if (leftNeighbor && !rightNeighbor) {\n const rotation = 0;\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n\n if (rightNeighbor && !leftNeighbor) {\n const rotation = Math.PI;\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n }\n\n private drawExtraRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (neighborsCount === 0) {\n this.basicDot({ x, y, size, rotation: 0 });\n return;\n }\n\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\n this.basicSquare({ x, y, size, rotation: 0 });\n return;\n }\n\n if (neighborsCount === 2) {\n let rotation = 0;\n\n if (leftNeighbor && topNeighbor) {\n rotation = Math.PI / 2;\n } else if (topNeighbor && rightNeighbor) {\n rotation = Math.PI;\n } else if (rightNeighbor && bottomNeighbor) {\n rotation = -Math.PI / 2;\n }\n\n this.basicCornerExtraRounded({ x, y, size, rotation });\n return;\n }\n\n if (neighborsCount === 1) {\n let rotation = 0;\n\n if (topNeighbor) {\n rotation = Math.PI / 2;\n } else if (rightNeighbor) {\n rotation = Math.PI;\n } else if (bottomNeighbor) {\n rotation = -Math.PI / 2;\n }\n\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n }\n\n private drawClassy({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (neighborsCount === 0) {\n this.basicCornersRounded({ x, y, size, rotation: Math.PI / 2 });\n return;\n }\n\n if (!leftNeighbor && !topNeighbor) {\n this.basicCornerRounded({ x, y, size, rotation: -Math.PI / 2 });\n return;\n }\n\n if (!rightNeighbor && !bottomNeighbor) {\n this.basicCornerRounded({ x, y, size, rotation: Math.PI / 2 });\n return;\n }\n\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n\n private drawClassyRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (neighborsCount === 0) {\n this.basicCornersRounded({ x, y, size, rotation: Math.PI / 2 });\n return;\n }\n\n if (!leftNeighbor && !topNeighbor) {\n this.basicCornerExtraRounded({ x, y, size, rotation: -Math.PI / 2 });\n return;\n }\n\n if (!rightNeighbor && !bottomNeighbor) {\n this.basicCornerExtraRounded({ x, y, size, rotation: Math.PI / 2 });\n return;\n }\n\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n}\n","export const browserImageTools = {\n toDataURL(url: string | Buffer | Blob): Promise<string> {\n if (typeof url == \"string\" && url.startsWith(\"data:\")) return Promise.resolve(url);\n return new Promise((resolve, reject) => {\n if (typeof url == \"string\") {\n const xhr = new XMLHttpRequest();\n xhr.onload = function () {\n const reader = new FileReader();\n reader.onloadend = function () {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(xhr.response);\n };\n xhr.onerror = xhr.onabort = xhr.ontimeout = reject;\n xhr.open(\"GET\", url, true);\n xhr.responseType = \"blob\";\n xhr.send();\n } else {\n const reader = new FileReader();\n reader.onloadend = function () {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(url as Blob);\n }\n });\n },\n getSize(src: string | Blob | Buffer, crossOrigin?: string): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n if (crossOrigin === \"string\") {\n image.crossOrigin = crossOrigin;\n }\n\n image.onload = (): void => {\n resolve({ width: image.width, height: image.height });\n };\n image.onerror = image.onabort = reject;\n\n if (typeof src == \"string\") image.src = src;\n else\n browserImageTools\n .toDataURL(src)\n .then((url) => (image.src = url))\n .catch(reject);\n });\n }\n};\n","export function parseColor(cstr: string) {\n let m: RegExpExecArray | null,\n parts: string[] | number[] = [],\n alpha = 1;\n\n cstr = cstr.toLowerCase();\n\n if (cstr[0] === \"#\") {\n const base = cstr.slice(1);\n const size = base.length;\n const isShort = size <= 4;\n\n if (isShort) {\n parts = [parseInt(base[0] + base[0], 16), parseInt(base[1] + base[1], 16), parseInt(base[2] + base[2], 16)];\n if (size === 4) {\n alpha = parseInt(base[3] + base[3], 16) / 255;\n }\n } else {\n parts = [parseInt(base[0] + base[1], 16), parseInt(base[2] + base[3], 16), parseInt(base[4] + base[5], 16)];\n if (size === 8) {\n alpha = parseInt(base[6] + base[7], 16) / 255;\n }\n }\n\n if (!parts[0]) parts[0] = 0;\n if (!parts[1]) parts[1] = 0;\n if (!parts[2]) parts[2] = 0;\n } else if ((m = /^((?:rgba?))\\s*\\(([^)]*)\\)/.exec(cstr))) {\n const dims = 3;\n parts = m[2].trim().split(/\\s*[,/]\\s*|\\s+/);\n\n parts = parts.map((x, i) => {\n if (x[x.length - 1] === \"%\") {\n const v = parseFloat(x) / 100;\n if (i === 3) return v;\n return v * 255;\n }\n\n if (x === \"none\") return 0;\n return parseFloat(x);\n });\n\n alpha = parts.length > dims ? parts.pop()! : 1;\n } else {\n return {\n value: cstr,\n alpha\n };\n }\n\n const value = \"#\" + parts.map((v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, \"0\")).join(\"\");\n return {\n value,\n alpha: Math.max(0, Math.min(1, alpha))\n };\n}\n","import { QRCodeMinimal } from \"@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js\";\nimport { QRUtil } from \"@liquid-js/qrcode-generator/lib/qrcode/QRUtil.js\";\nimport { QRCornerDot } from \"../figures/corner-dot.js\";\nimport { QRCornerSquare } from \"../figures/corner-square.js\";\nimport { QRDot } from \"../figures/dot.js\";\nimport { browserImageTools } from \"../tools/browser-image-tools.js\";\nimport { parseColor } from \"../utils/color.js\";\nimport { Gradient, GradientType } from \"../utils/gradient.js\";\nimport { calculateImageSize } from \"../utils/image.js\";\nimport { DotType, ImageMode, Options, ShapeType } from \"../utils/options.js\";\nimport { numToAttr } from \"../utils/svg.js\";\n\nconst squareMask = [\n [1, 1, 1, 1, 1, 1, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 1, 1, 1, 1, 1, 1]\n];\n\nconst dotMask = [\n [0, 0, 0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0, 0, 0],\n [0, 0, 1, 1, 1, 0, 0],\n [0, 0, 1, 1, 1, 0, 0],\n [0, 0, 1, 1, 1, 0, 0],\n [0, 0, 0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0, 0, 0]\n];\n\nexport class QRSVG {\n private _element: SVGElement;\n\n get element() {\n return this._element;\n }\n\n private defs: SVGElement;\n\n private backgroundMask?: SVGElement;\n private backgroundMaskGroup?: SVGElement;\n\n private dotsMask?: SVGElement;\n private dotsMaskGroup?: SVGElement;\n\n private lightDotsMask?: SVGElement;\n private lightDotsMaskGroup?: SVGElement;\n\n private qr?: QRCodeMinimal;\n private document: Document;\n private imageTools: typeof browserImageTools;\n\n constructor(\n private options: Pick<\n Options,\n | \"width\"\n | \"height\"\n | \"document\"\n | \"imageTools\"\n | \"image\"\n | \"imageOptions\"\n | \"dotsOptions\"\n | \"cornersDotOptions\"\n | \"cornersSquareOptions\"\n | \"backgroundOptions\"\n | \"shape\"\n > & { errorCorrectionPercent: number }\n ) {\n this.document = options.document;\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n const width = numToAttr(options.width);\n const height = numToAttr(options.height);\n this._element.setAttribute(\"width\", width);\n this._element.setAttribute(\"height\", height);\n this._element.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n this.defs = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n this._element.appendChild(this.defs);\n this.imageTools = options.imageTools || browserImageTools;\n }\n\n get width(): number {\n return this.options.width;\n }\n\n get height(): number {\n return this.options.height;\n }\n\n async drawQR(qr: QRCodeMinimal): Promise<void> {\n const count = qr.getModuleCount();\n const typeNumber = parseInt(((count - 17) / 4).toFixed(0), 10);\n const dotSize = this.options.dotsOptions.size;\n let drawImageSize = {\n hideXDots: 0,\n hideYDots: 0,\n width: 0,\n height: 0\n };\n\n this.qr = qr;\n\n if (this.options.image) {\n //We need it to get image size\n const size = await this.imageTools.getSize(this.options.image, this.options.imageOptions.crossOrigin);\n const { imageOptions, errorCorrectionPercent } = this.options;\n\n if (imageOptions.mode == ImageMode.background) {\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0;\n const maxWidth = (this.options.width - 2 * margin * dotSize) * imageOptions.imageSize;\n const maxHeight = (this.options.height - 2 * margin * dotSize) * imageOptions.imageSize;\n let { width, height } = size;\n\n height = (height / width) * maxWidth;\n width = maxWidth;\n\n if (height > maxHeight) {\n width = (width / height) * maxHeight;\n height = maxHeight;\n }\n\n drawImageSize = {\n hideXDots: 0,\n hideYDots: 0,\n width,\n height\n };\n } else {\n const coverLevel = imageOptions.imageSize * errorCorrectionPercent;\n const alignment = QRUtil.getPatternPosition(typeNumber);\n const maxHiddenDots = Math.floor(\n coverLevel * (count * count - 3 * 8 * 8 - 2 * (count - 16) - alignment.length ** 2 * 25)\n );\n\n drawImageSize = calculateImageSize({\n originalWidth: size.width,\n originalHeight: size.height,\n maxHiddenDots,\n maxHiddenAxisDots: count - 14,\n dotSize,\n margin: imageOptions.margin\n });\n }\n }\n\n this.drawBackground();\n\n if (\n this.options.imageOptions.mode != ImageMode.overlay &&\n this.options.image &&\n drawImageSize.width > 0 &&\n drawImageSize.height > 0\n ) {\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize });\n }\n\n this.drawDots((i: number, j: number): boolean => {\n if (this.options.imageOptions.mode == ImageMode.center) {\n if (\n i >= (count - drawImageSize.hideXDots) / 2 &&\n i < (count + drawImageSize.hideXDots) / 2 &&\n j >= (count - drawImageSize.hideYDots) / 2 &&\n j < (count + drawImageSize.hideYDots) / 2\n ) {\n return false;\n }\n }\n\n if ((i < 8 && j < 8) || (i >= count - 8 && j < 8) || (j >= count - 8 && i < 8)) return false;\n\n return true;\n });\n\n if (\n this.options.imageOptions.mode == ImageMode.overlay &&\n this.options.image &&\n drawImageSize.width > 0 &&\n drawImageSize.height > 0\n ) {\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize });\n }\n\n this.drawCorners();\n }\n\n drawBackground(): void {\n const element = this._element;\n const options = this.options;\n\n if (element && options.backgroundOptions) {\n const gradientOptions = options.backgroundOptions.gradient;\n const color = options.backgroundOptions.color;\n\n this.createColor({\n options: gradientOptions,\n color: color,\n additionalRotation: 0,\n x: 0,\n y: 0,\n height: options.height,\n width: options.width,\n name: \"background-color\"\n });\n\n const size = Math.min(options.width, options.height);\n const element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n [this.backgroundMask, this.backgroundMaskGroup] = this.createMask(\"mask-background-color\");\n this.defs.appendChild(this.backgroundMask);\n\n element.setAttribute(\"x\", numToAttr((options.width - size) / 2));\n element.setAttribute(\"y\", numToAttr((options.height - size) / 2));\n element.setAttribute(\"width\", numToAttr(size));\n element.setAttribute(\"height\", numToAttr(size));\n element.setAttribute(\"rx\", numToAttr((size / 2) * (options.backgroundOptions.round || 0)));\n\n this.backgroundMaskGroup.appendChild(element);\n }\n }\n\n drawDots(filter?: (i: number, j: number) => boolean): void {\n if (!this.qr) {\n throw \"QR code is not defined\";\n }\n\n const options = this.options;\n const count = this.qr.getModuleCount();\n\n if (count > options.width || count > options.height) {\n throw \"The canvas is too small.\";\n }\n\n const dotSize = this.options.dotsOptions.size;\n let minSize = Math.min(options.width, options.height);\n if (options.imageOptions.mode == ImageMode.background) minSize -= 2 * dotSize * (options.imageOptions.margin || 0);\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\n let dot = new QRDot(options.dotsOptions.type, this.document);\n const overlayDot = new QRDot(DotType.tinySquare, this.document);\n const markerDot = new QRDot(DotType.square, this.document);\n\n [this.dotsMask, this.dotsMaskGroup] = this.createMask(\"mask-dot-color\");\n this.defs.appendChild(this.dotsMask);\n\n if (options.imageOptions.mode == ImageMode.background) {\n [this.lightDotsMask, this.lightDotsMaskGroup] = this.createMask(\"mask-light-dot-color\");\n this.defs.appendChild(this.lightDotsMask);\n }\n\n let margin = 0;\n let additionalDots = 0;\n let fakeCount = count;\n\n if (options.shape === ShapeType.circle) {\n margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0;\n additionalDots = Math.floor((minSize / dotSize - count - 2 * margin) / 2);\n fakeCount = count + additionalDots * 2;\n } else if (options.imageOptions.mode == ImageMode.background) {\n additionalDots = 1;\n fakeCount = count + additionalDots * 2;\n }\n\n const xFakeBeginning = xBeginning - additionalDots * dotSize;\n const yFakeBeginning = yBeginning - additionalDots * dotSize;\n const colorX = xFakeBeginning;\n const colorY = yFakeBeginning;\n const colorCount = count + additionalDots * 2;\n const fakeMatrix: (boolean | undefined)[][] = new Array(fakeCount);\n const center = Math.floor(fakeCount / 2);\n\n for (let i = 0; i < fakeCount; i++) {\n fakeMatrix[i] = new Array(fakeCount);\n for (let j = 0; j < fakeCount; j++) {\n if (\n i > additionalDots - 1 &&\n i < fakeCount - additionalDots &&\n j > additionalDots - 1 &&\n j < fakeCount - additionalDots\n ) {\n const ii = i - additionalDots;\n const jj = j - additionalDots;\n if (filter && !filter(ii, jj)) fakeMatrix[i][j] = undefined;\n else fakeMatrix[i][j] = !!this.qr.isDark(jj, ii);\n continue;\n }\n\n if (\n options.shape === ShapeType.circle &&\n Math.sqrt((i - center) * (i - center) + (j - center) * (j - center)) > center\n ) {\n fakeMatrix[i][j] = undefined;\n continue;\n }\n\n if (\n i == additionalDots - 1 ||\n i == fakeCount - additionalDots ||\n j == additionalDots - 1 ||\n j == fakeCount - additionalDots\n ) {\n if (\n (j == additionalDots - 1 && (i < additionalDots + 8 || i > fakeCount - additionalDots - 9)) ||\n (j == fakeCount - additionalDots && i < additionalDots + 8) ||\n (i == additionalDots - 1 && (j < additionalDots + 8 || j > fakeCount - additionalDots - 9)) ||\n (i == fakeCount - additionalDots && j < additionalDots + 8)\n )\n fakeMatrix[i][j] = undefined;\n else fakeMatrix[i][j] = false;\n continue;\n }\n\n // Get random dots from QR code to show it outside of QR code\n fakeMatrix[i][j] = this.qr.isDark(\n j - 2 * additionalDots < 0 ? j : j >= count ? j - 2 * additionalDots : j - additionalDots,\n i - 2 * additionalDots < 0 ? i : i >= count ? i - 2 * additionalDots : i - additionalDots\n );\n }\n }\n\n const typeNr = (count - 17) / 4;\n const alignment = QRUtil.getPatternPosition(typeNr);\n\n for (let i = 0; i < fakeCount; i++) {\n const iAlign = alignment.find((v) => i - additionalDots > v - 3 && i - additionalDots < v + 3);\n for (let j = 0; j < fakeCount; j++) {\n const jAlign = alignment.find((v) => j - additionalDots > v - 3 && j - additionalDots < v + 3);\n if (fakeMatrix[i][j] == undefined) continue;\n\n if (this.lightDotsMask) {\n dot =\n iAlign &&\n jAlign &&\n ((iAlign != alignment[0] && jAlign != alignment[0]) ||\n (jAlign != alignment[0] && jAlign != alignment[alignment.length - 1]) ||\n (iAlign != alignment[0] && iAlign != alignment[alignment.length - 1]))\n ? markerDot\n : overlayDot;\n }\n\n if (!fakeMatrix[i][j]) {\n if (this.lightDotsMask) {\n dot.draw({\n x: xFakeBeginning + i * dotSize,\n y: yFakeBeginning + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\n return fakeMatrix[i + xOffset]?.[j + yOffset] === false;\n }\n });\n\n if (dot.element && this.lightDotsMaskGroup) {\n this.lightDotsMaskGroup.appendChild(dot.element);\n }\n }\n continue;\n }\n\n dot.draw({\n x: xFakeBeginning + i * dotSize,\n y: yFakeBeginning + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\n return fakeMatrix[i + xOffset]?.[j + yOffset] === true;\n }\n });\n if (dot.element && this.dotsMaskGroup) {\n this.dotsMaskGroup.appendChild(dot.element);\n }\n }\n }\n\n if (this.lightDotsMask) {\n this.createColor({\n options: options.imageOptions.fill.gradient,\n color: options.imageOptions.fill.color,\n additionalRotation: 0,\n x: colorX,\n y: colorY,\n height: colorCount * dotSize,\n width: colorCount * dotSize,\n name: \"light-dot-color\"\n });\n }\n\n this.createColor({\n options: options.dotsOptions?.gradient,\n color: options.dotsOptions.color,\n additionalRotation: 0,\n x: colorX,\n y: colorY,\n height: colorCount * dotSize,\n width: colorCount * dotSize,\n name: \"dot-color\"\n });\n }\n\n drawCorners(): void {\n if (!this.qr) {\n throw \"QR code is not defined\";\n }\n\n const element = this._element;\n const options = this.options;\n\n if (!element) {\n throw \"Element code is not defined\";\n }\n\n const count = this.qr.getModuleCount();\n const dotSize = this.options.dotsOptions.size;\n const cornersSquareSize = dotSize * 7;\n const cornersDotSize = dotSize * 3;\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\n\n [\n [0, 0, 0],\n [1, 0, Math.PI / 2],\n [0, 1, -Math.PI / 2]\n ].forEach(([column, row, rotation]) => {\n const x = xBeginning + column * dotSize * (count - 7);\n const y = yBeginning + row * dotSize * (count - 7);\n let cornersSquareMask = this.dotsMask;\n let cornersSquareMaskGroup = this.dotsMaskGroup;\n let cornersDotMask = this.dotsMask;\n let cornersDotMaskGroup = this.dotsMaskGroup;\n\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\n [cornersSquareMask, cornersSquareMaskGroup] = this.createMask(`mask-corners-square-color-${column}-${row}`);\n this.defs.appendChild(cornersSquareMask);\n cornersDotMask = cornersSquareMask;\n cornersDotMaskGroup = cornersSquareMaskGroup;\n\n this.createColor({\n options: options.cornersSquareOptions?.gradient,\n color: options.cornersSquareOptions?.color,\n additionalRotation: rotation,\n x,\n y,\n height: cornersSquareSize,\n width: cornersSquareSize,\n name: `corners-square-color-${column}-${row}`\n });\n }\n\n if (options.cornersSquareOptions?.type) {\n const cornersSquare = new QRCornerSquare(options.cornersSquareOptions.type, this.document);\n\n cornersSquare.draw({\n x,\n y,\n size: cornersSquareSize,\n rotation\n });\n\n if (cornersSquare.element && cornersSquareMaskGroup) {\n cornersSquareMaskGroup.appendChild(cornersSquare.element);\n }\n\n if (cornersSquare.fill && this.lightDotsMaskGroup) {\n this.lightDotsMaskGroup.appendChild(cornersSquare.fill);\n }\n } else {\n const dot = new QRDot(options.dotsOptions.type, this.document);\n\n for (let i = 0; i < squareMask.length; i++) {\n for (let j = 0; j < squareMask[i].length; j++) {\n if (!squareMask[i]?.[j]) {\n if (this.lightDotsMask && !dotMask[i]?.[j]) {\n dot.draw({\n x: x + i * dotSize,\n y: y + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean =>\n !squareMask[i + xOffset]?.[j + yOffset] && !dotMask[i + xOffset]?.[j + yOffset]\n });\n\n if (dot.element && this.lightDotsMaskGroup) {\n this.lightDotsMaskGroup.appendChild(dot.element);\n }\n }\n continue;\n }\n\n dot.draw({\n x: x + i * dotSize,\n y: y + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!squareMask[i + xOffset]?.[j + yOffset]\n });\n\n if (dot.element && cornersSquareMaskGroup) {\n cornersSquareMaskGroup.appendChild(dot.element);\n }\n }\n }\n\n if (this.lightDotsMask)\n for (let i = -1; i < 8; i++) {\n for (let j = -1; j < 8; j++) {\n if (i == -1 || i == 7 || j == -1 || j == 7) {\n dot.draw({\n x: x + i * dotSize,\n y: y + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\n const ii = i + xOffset;\n const jj = j + yOffset;\n return ii >= -1 && ii <= 7 && jj >= -1 && jj <= 7 && (ii == -1 || ii == 7 || jj == -1 || jj == 7);\n }\n });\n\n if (dot.element && this.lightDotsMaskGroup) {\n this.lightDotsMaskGroup.appendChild(dot.element);\n }\n }\n }\n }\n }\n\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\n [cornersDotMask, cornersDotMaskGroup] = this.createMask(`mask-corners-dot-color-${column}-${row}`);\n this.defs.appendChild(cornersDotMask);\n\n this.createColor({\n options: options.cornersDotOptions?.gradient,\n color: options.cornersDotOptions?.color,\n additionalRotation: rotation,\n x: x + dotSize * 2,\n y: y + dotSize * 2,\n height: cornersDotSize,\n width: cornersDotSize,\n name: `corners-dot-color-${column}-${row}`\n });\n }\n\n if (options.cornersDotOptions?.type) {\n const cornersDot = new QRCornerDot(options.cornersDotOptions.type, this.document);\n\n cornersDot.draw({\n x: x + dotSize * 2,\n y: y + dotSize * 2,\n size: cornersDotSize,\n rotation\n });\n\n if (cornersDot.element && cornersDotMaskGroup) {\n cornersDotMaskGroup.appendChild(cornersDot.element);\n }\n } else {\n const dot = new QRDot(options.dotsOptions.type, this.document);\n\n for (let i = 0; i < dotMask.length; i++) {\n for (let j = 0; j < dotMask[i].length; j++) {\n if (!dotMask[i]?.[j]) {\n continue;\n }\n\n dot.draw({\n x: x + i * dotSize,\n y: y + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!dotMask[i + xOffset]?.[j + yOffset]\n });\n\n if (dot.element && cornersDotMaskGroup) {\n cornersDotMaskGroup.appendChild(dot.element);\n }\n }\n }\n }\n });\n }\n\n async drawImage({\n width,\n height,\n count,\n dotSize\n }: {\n width: number;\n height: number;\n count: number;\n dotSize: number;\n }): Promise<void> {\n const options = this.options;\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\n let margin = options.imageOptions.margin * dotSize;\n if (options.imageOptions.mode == ImageMode.background) margin = 0;\n const dx = xBeginning + margin + (count * dotSize - width) / 2;\n const dy = yBeginning + margin + (count * dotSize - height) / 2;\n const dw = width - margin * 2;\n const dh = height - margin * 2;\n\n const imageUrl = await this.imageTools.toDataURL(options.image || \"\");\n let image: SVGElement = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\");\n image.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", imageUrl || \"\");\n\n if (imageUrl.startsWith(\"data:image/svg+xml;\")) {\n let data = imageUrl.substring(19);\n const i = data.indexOf(\",\");\n const encoding = data.substring(0, i);\n data = data.substring(i + 1);\n\n switch (encoding) {\n case \"base64\":\n data = typeof atob == \"function\" ? atob(data) : Buffer.from(data, \"base64\").toString(\"utf8\");\n break;\n default:\n data = \"\";\n break;\n }\n\n if (data) {\n const container = new DOMParser().parseFromString(data, \"text/xml\");\n const rootEl = Array.from(container.getElementsByTagName(\"svg\"));\n if (rootEl.length) {\n image = rootEl[0];\n image.setAttribute(\"overflow\", \"visible\");\n }\n }\n }\n\n image.setAttribute(\"x\", numToAttr(dx));\n image.setAttribute(\"y\", numToAttr(dy));\n image.setAttribute(\"width\", `${numToAttr(dw)}px`);\n image.setAttribute(\"height\", `${numToAttr(dh)}px`);\n\n this._element.appendChild(image);\n }\n\n private createColor({\n options,\n color,\n additionalRotation,\n x,\n y,\n height,\n width,\n name\n }: {\n options?: Gradient;\n color?: string;\n additionalRotation: number;\n x: number;\n y: number;\n height: number;\n width: number;\n name: string;\n }): void {\n const size = width > height ? width : height;\n const rect = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n rect.setAttribute(\"x\", numToAttr(x));\n rect.setAttribute(\"y\", numToAttr(y));\n rect.setAttribute(\"height\", numToAttr(height));\n rect.setAttribute(\"width\", numToAttr(width));\n rect.setAttribute(\"style\", `mask:url(#mask-${name})`);\n\n if (options) {\n let gradient: SVGElement;\n if (options.type === GradientType.radial) {\n gradient = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"radialGradient\");\n gradient.setAttribute(\"id\", name);\n gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\n gradient.setAttribute(\"fx\", numToAttr(x + width / 2));\n gradient.setAttribute(\"fy\", numToAttr(y + height / 2));\n gradient.setAttribute(\"cx\", numToAttr(x + width / 2));\n gradient.setAttribute(\"cy\", numToAttr(y + height / 2));\n gradient.setAttribute(\"r\", numToAttr(size / 2));\n } else {\n const rotation = ((options.rotation || 0) + additionalRotation) % (2 * Math.PI);\n const positiveRotation = (rotation + 2 * Math.PI) % (2 * Math.PI);\n let x0 = x + width / 2;\n let y0 = y + height / 2;\n let x1 = x + width / 2;\n let y1 = y + height / 2;\n\n if (\n (positiveRotation >= 0 && positiveRotation <= 0.25 * Math.PI) ||\n (positiveRotation > 1.75 * Math.PI && positiveRotation <= 2 * Math.PI)\n ) {\n x0 = x0 - width / 2;\n y0 = y0 - (height / 2) * Math.tan(rotation);\n x1 = x1 + width / 2;\n y1 = y1 + (height / 2) * Math.tan(rotation);\n } else if (positiveRotation > 0.25 * Math.PI && positiveRotation <= 0.75 * Math.PI) {\n y0 = y0 - height / 2;\n x0 = x0 - width / 2 / Math.tan(rotation);\n y1 = y1 + height / 2;\n x1 = x1 + width / 2 / Math.tan(rotation);\n } else if (positiveRotation > 0.75 * Math.PI && positiveRotation <= 1.25 * Math.PI) {\n x0 = x0 + width / 2;\n y0 = y0 + (height / 2) * Math.tan(rotation);\n x1 = x1 - width / 2;\n y1 = y1 - (height / 2) * Math.tan(rotation);\n } else if (positiveRotation > 1.25 * Math.PI && positiveRotation <= 1.75 * Math.PI) {\n y0 = y0 + height / 2;\n x0 = x0 + width / 2 / Math.tan(rotation);\n y1 = y1 - height / 2;\n x1 = x1 - width / 2 / Math.tan(rotation);\n }\n\n gradient = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"linearGradient\");\n gradient.setAttribute(\"id\", name);\n gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\n gradient.setAttribute(\"x1\", numToAttr(x0));\n gradient.setAttribute(\"y1\", numToAttr(y0));\n gradient.setAttribute(\"x2\", numToAttr(x1));\n gradient.setAttribute(\"y2\", numToAttr(y1));\n }\n\n options.colorStops.forEach(({ offset, color }: { offset: number; color: string }) => {\n const stop = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"stop\");\n stop.setAttribute(\"offset\", `${numToAttr(100 * offset)}%`);\n\n const parsed = parseColor(color);\n stop.setAttribute(\"stop-color\", parsed.value);\n if (parsed.alpha < 1) stop.setAttribute(\"stop-opacity\", parsed.alpha.toFixed(7));\n gradient.appendChild(stop);\n });\n\n rect.setAttribute(\"fill\", `url(#${name})`);\n this.defs.appendChild(gradient);\n } else if (color) {\n const parsed = parseColor(color);\n rect.setAttribute(\"fill\", parsed.value);\n if (parsed.alpha < 1) rect.setAttribute(\"opacity\", parsed.alpha.toFixed(7));\n }\n\n this._element.appendChild(rect);\n }\n\n private createMask(id: string) {\n const options = this.options;\n\n const mask = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"mask\");\n mask.setAttribute(\"id\", id);\n mask.setAttribute(\"maskUnits\", \"userSpaceOnUse\");\n mask.setAttribute(\"x\", \"0\");\n mask.setAttribute(\"y\", \"0\");\n mask.setAttribute(\"width\", numToAttr(options.width));\n mask.setAttribute(\"height\", numToAttr(options.height));\n\n const group = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n group.setAttribute(\"fill\", \"#fff\");\n mask.appendChild(group);\n\n return [mask, group];\n }\n}\n","interface ImageSizeOptions {\n originalHeight: number;\n originalWidth: number;\n maxHiddenDots: number;\n maxHiddenAxisDots?: number;\n dotSize: number;\n margin: number;\n}\n\ninterface ImageSizeResult {\n height: number;\n width: number;\n hideYDots: number;\n hideXDots: number;\n}\n\nexport function calculateImageSize({\n originalHeight,\n originalWidth,\n maxHiddenDots,\n maxHiddenAxisDots,\n dotSize,\n margin\n}: ImageSizeOptions): ImageSizeResult {\n const hideDots = { x: 0, y: 0 };\n const imageSize = { x: 0, y: 0 };\n\n if (\n originalHeight <= 0 ||\n originalWidth <= 0 ||\n maxHiddenDots <= 0 ||\n dotSize <= 0 ||\n 4 * margin ** 2 > maxHiddenDots\n ) {\n return {\n height: 0,\n width: 0,\n hideYDots: 0,\n hideXDots: 0\n };\n }\n\n //If set, ensure maxHiddenAxisDots is odd and at least 1\n if (maxHiddenAxisDots && maxHiddenAxisDots % 2 == 0) maxHiddenAxisDots = Math.max(1, maxHiddenAxisDots - 1);\n\n //Determine the bigger and smaller image dimension\n const dimMax = Math.max(originalWidth, originalHeight);\n const dimMin = Math.min(originalWidth, originalHeight);\n\n //Find max image size along the bigger dimension\n let lower = 0,\n upper = (maxHiddenAxisDots || maxHiddenDots) - 2 * margin;\n do {\n const size = lower + (upper - lower) / 2;\n let dotsMax = Math.max(1, Math.ceil(size + 2 * margin));\n if (dotsMax % 2 == 0) dotsMax++;\n let dotsMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin));\n if (dotsMin % 2 == 0) dotsMin++;\n\n if (dotsMax * dotsMin > maxHiddenDots) upper = size;\n else lower = size;\n } while (Math.abs(lower - upper) > 0.001);\n\n //Calculate how many dots the given size corresponds to\n const size = lower;\n let hideMax = Math.max(1, Math.ceil(size + 2 * margin));\n if (hideMax % 2 == 0) hideMax++;\n let hideMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin));\n if (hideMin % 2 == 0) hideMin++;\n\n //Set hidden dots along bigger and smaller dimension to the right axis\n if (originalWidth > originalHeight) {\n hideDots.x = hideMax;\n hideDots.y = hideMin;\n } else {\n hideDots.x = hideMin;\n hideDots.y = hideMax;\n }\n\n //Fit image to the hidden dots\n const maxW = (hideDots.x - 2 * margin) * dotSize;\n const maxH = (hideDots.y - 2 * margin) * dotSize;\n imageSize.x = maxW;\n imageSize.y = (maxW * originalHeight) / originalWidth;\n if (imageSize.y > maxH) {\n imageSize.y = maxH;\n imageSize.x = (maxH * originalWidth) / originalHeight;\n }\n\n return {\n height: Math.round(imageSize.y + 2 * margin * dotSize),\n width: Math.round(imageSize.x + 2 * margin * dotSize),\n hideYDots: hideDots.y,\n hideXDots: hideDots.x\n };\n}\n","import { QRCodeMinimal } from \"@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js\";\nimport { stringToBytes_UTF8 } from \"@liquid-js/qrcode-generator/lib/text/stringToBytes_UTF8.js\";\nimport { RecursivePartial } from \"../types/helper.js\";\nimport { mergeDeep } from \"../utils/merge.js\";\nimport { ImageMode, Options, ShapeType, defaultOptions, sanitizeOptions } from \"../utils/options.js\";\nimport { ErrorCorrectionPercents, getMode } from \"../utils/qrcode.js\";\nimport { QRSVG } from \"./qr-svg.js\";\n\nObject.assign(QRCodeMinimal.stringToBytesFuncs, stringToBytes_UTF8);\n\nexport type ExtensionFunction = (svg: SVGElement, options: RecursivePartial<Options>) => void;\n\nexport class QRCodeStyling {\n private options: Options;\n private container?: HTMLElement;\n private qr?: QRCodeMinimal;\n private extension?: ExtensionFunction;\n private svgDrawingPromise?: Promise<void>;\n private qrSVG?: QRSVG;\n\n get size() {\n if (this.qrSVG)\n return {\n width: this.qrSVG.width,\n height: this.qrSVG.height\n };\n return undefined;\n }\n\n constructor(options?: RecursivePartial<Options>) {\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions;\n this.update();\n }\n\n update(\n /** The same options as for initialization */\n options?: RecursivePartial<Options>\n ): void {\n if (this.container) this.container.innerHTML = \"\";\n\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options;\n\n if (!this.options.data) {\n return;\n }\n\n if (this.options.stringToBytesFuncs) {\n Object.assign(QRCodeMinimal.stringToBytesFuncs, this.options.stringToBytesFuncs);\n delete this.options.stringToBytesFuncs;\n }\n\n this.qr = new QRCodeMinimal(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel);\n const mode = this.options.qrOptions.mode || getMode(this.options.data);\n this.qr.addData(this.options.data, mode);\n this.qr.make();\n\n this.setupSvg();\n\n this.append(this.container);\n }\n\n append(\n /** This container will be used for appending of the QR code */\n container?: HTMLElement\n ): void {\n if (!container) {\n return;\n }\n\n if (this.qrSVG?.element) {\n container.appendChild(this.qrSVG.element);\n }\n\n this.container = container;\n }\n\n /**\n *\n * @example\n *\n * ```js\n * const extension = (svg, options) => {\n * const { width, height } = options;\n * const size = Math.min(width, height);\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n * const borderAttributes = {\n * fill: \"none\",\n * x: (width - size + 40) / 2,\n * y: (height - size + 40) / 2,\n * width: size - 40,\n * height: size - 40,\n * stroke: \"black\",\n * \"stroke-width\": 40,\n * rx: 100\n * };\n * Object.keys(borderAttributes).forEach((attribute) => {\n * border.setAttribute(attribute, borderAttributes[attribute]);\n * });\n * svg.appendChild(border);\n * };\n * ```\n */\n applyExtension(\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\n extension: ExtensionFunction\n ): void {\n if (!extension) {\n throw \"Extension function should be defined.\";\n }\n\n this.extension = extension;\n this.update();\n }\n\n deleteExtension(): void {\n this.extension = undefined;\n this.update();\n }\n\n async serialize(): Promise<string | undefined> {\n if (!this.qr) throw \"QR code is empty\";\n\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\n this.setupSvg();\n }\n await this.svgDrawingPromise;\n\n if (!this.qrSVG?.element) {\n return;\n }\n\n const serializer = new XMLSerializer();\n let source = serializer.serializeToString(this.qrSVG.element);\n\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source;\n return source;\n }\n\n private setupSvg(): void {\n if (!this.qr) {\n return;\n }\n let moduleCount = this.qr.getModuleCount();\n if (this.options.imageOptions.mode == ImageMode.background && this.options.shape != ShapeType.circle)\n moduleCount += 2;\n let count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * moduleCount);\n if (count % 2 == 0) count -= 1;\n let margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0;\n if (this.options.imageOptions.mode == ImageMode.background) margin += this.options.imageOptions.margin || 0;\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin));\n this.qrSVG = new QRSVG({\n ...this.options,\n width: size,\n height: size,\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\n });\n\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\n if (!this.qrSVG?.element) return;\n this.extension?.(this.qrSVG.element, this.options);\n });\n }\n}\n","import { QRCodeStyling } from \"../core/qr-code-styling.js\";\nimport { RecursivePartial } from \"../types/helper.js\";\nimport { CanvasOptions, defaultCanvasOptions, sanitizeCanvasOptions } from \"../utils/canvas-options.js\";\nimport { mergeDeep } from \"../utils/merge.js\";\n\nexport enum FileExtension {\n svg = \"svg\",\n png = \"png\",\n jpeg = \"jpeg\",\n webp = \"webp\"\n}\n\nexport function drawToCanvas(\n qrCode: QRCodeStyling,\n options?: RecursivePartial<CanvasOptions>\n): { canvas: HTMLCanvasElement; canvasDrawingPromise: Promise<void> | undefined } | undefined {\n const { width, height, margin } = options\n ? sanitizeCanvasOptions(mergeDeep(defaultCanvasOptions, options) as CanvasOptions)\n : defaultCanvasOptions;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const size = Math.min(width, height) - 2 * margin;\n\n const canvasDrawingPromise = qrCode.serialize().then((xml) => {\n if (!xml) return;\n const svg64 = btoa(xml);\n const image64 = \"data:image/svg+xml;base64,\" + svg64;\n const image = new Image();\n\n return new Promise<void>((resolve, reject) => {\n image.onload = (): void => {\n // Ensure pixel-perfect rendering of SVG to avoid artefact, then downscale to requested size\n const aaFactor = Math.ceil((2 * size) / Math.min(image.width, image.height));\n let aaCanvas: HTMLCanvasElement | OffscreenCanvas;\n try {\n aaCanvas = new OffscreenCanvas(image.width * aaFactor, image.height * aaFactor);\n } catch (_) {\n // Fallback to regular canvas element\n aaCanvas = document.createElement(\"canvas\");\n aaCanvas.width = image.width * aaFactor;\n aaCanvas.height = image.height * aaFactor;\n }\n aaCanvas.getContext(\"2d\")?.drawImage(image, 0, 0, aaCanvas.width, aaCanvas.height);\n\n canvas?.getContext(\"2d\")?.drawImage(aaCanvas, (width - size) / 2, (height - size) / 2, size, size);\n resolve();\n };\n image.onerror = image.onabort = reject;\n\n image.src = image64;\n });\n });\n\n return { canvas, canvasDrawingPromise };\n}\n\nexport async function download(\n qrCode: QRCodeStyling,\n downloadOptions?: { name?: string; extension: `${FileExtension}` },\n options?: RecursivePartial<CanvasOptions>\n): Promise<void> {\n let extension: `${FileExtension}` = FileExtension.png;\n let name = \"qr\";\n\n if (downloadOptions) {\n if (downloadOptions.name) {\n name = downloadOptions.name;\n }\n if (downloadOptions.extension) {\n extension = downloadOptions.extension;\n }\n }\n\n if (extension.toLowerCase() === \"svg\") {\n const source = await qrCode.serialize();\n if (!source) return;\n const url = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(source);\n downloadURI(url, `${name}.svg`);\n } else {\n const res = drawToCanvas(qrCode, options);\n if (!res) return;\n const { canvas, canvasDrawingPromise } = res;\n await canvasDrawingPromise;\n const url = canvas.toDataURL(`image/${extension}`);\n downloadURI(url, `${name}.${extension}`);\n }\n}\n\nexport function downloadURI(uri: string, name: string): void {\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = uri;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n","import { DOMImplementation, DOMParser, XMLSerializer } from \"@xmldom/xmldom\";\nimport { fileTypeFromBuffer } from \"file-type\";\nimport sharp from \"sharp\";\nimport { QRCodeStyling as _QRCodeStyling } from \"./core/qr-code-styling.js\";\nimport type * as _browserUtils from \"./tools/browser-utils.js\";\nimport { RecursivePartial } from \"./types/helper.js\";\nimport { Options } from \"./utils/options.js\";\nexport { ErrorCorrectionLevel, Mode, TypeNumber } from \"@liquid-js/qrcode-generator/lib/qrcode/QRCodeMinimal.js\";\nexport { type ExtensionFunction } from \"./core/qr-code-styling.js\";\nexport { FileExtension } from \"./tools/browser-utils.js\";\nexport { type RecursivePartial } from \"./types/helper.js\";\nexport { type CanvasOptions } from \"./utils/canvas-options.js\";\nexport { GradientType, type Gradient } from \"./utils/gradient.js\";\nexport { CornerDotType, CornerSquareType, DotType, ImageMode, ShapeType, type Options } from \"./utils/options.js\";\nexport { ErrorCorrectionPercents } from \"./utils/qrcode.js\";\n\nexport const browserUtils: typeof _browserUtils | undefined = undefined;\n\nexport class QRCodeStyling extends _QRCodeStyling {\n constructor(options: RecursivePartial<Options>) {\n const dom = new DOMImplementation().createDocument(null, \"\");\n const imageCache = new Map<string, Promise<{ contentType?: string | null; data: Buffer }>>();\n\n const loadImage = async function (url: string | Buffer | Blob) {\n if (typeof url == \"string\") {\n let pr = imageCache.get(url);\n if (pr) return pr;\n pr = fetch(url).then((res) =>\n res\n .arrayBuffer()\n .then((buff) => Buffer.from(buff))\n .then(async (data) => ({\n contentType: res.headers.get(\"Content-Type\") || (await fileTypeFromBuffer(data).then((r) => r?.mime)),\n data\n }))\n );\n imageCache.set(url, pr);\n return pr;\n } else {\n const buff = Buffer.from(url as Buffer);\n const mime = await fileTypeFromBuffer(buff).then((r) => r?.mime);\n return {\n contentType: mime,\n data: buff\n };\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n global.XMLSerializer = XMLSerializer as any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n global.DOMParser = DOMParser as any;\n\n super({\n ...options,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n document: options.document || (dom as any),\n imageTools: options.imageTools || {\n toDataURL: (url: string | Buffer | Blob): Promise<string> => {\n if (typeof url == \"string\" && url.startsWith(\"data:\")) return Promise.resolve(url);\n return loadImage(url).then(\n ({ contentType, data }) =>\n `data:${contentType?.replace(\"application/xml\", \"image/svg+xml\")};base64,${data.toString(\"base64\")}`\n );\n },\n getSize: async (src: string | Blob | Buffer): Promise<{ width: number; height: number }> => {\n const { data } = Buffer.isBuffer(options.image) ? { data: options.image } : await loadImage(src);\n const meta = await sharp(data).metadata();\n return {\n width: meta.width!,\n\n height: meta.height!\n };\n }\n }\n });\n }\n}\n"],"names":["obj","TypeNumber","ErrorCorrectionLevel","Mode","QRCodeMinimal","sharp","fileTypeFromBuffer","DOMImplementation","XMLSerializer$1","DOMParser$1","isObject","Array","isArray","target","sources","length","shift","undefined","source","keys","forEach","key","targetValue","sourceValue","mergeDeep","Object","assign","GradientType","DotType","CornerDotType","CornerSquareType","ShapeType","ImageMode","sanitizeGradient","gradient","colorStops","newGradient","rotation","Number","map","colorStop","offset","radial","linear","dot","randomDot","rounded","extraRounded","verticalLine","horizontalLine","classy","classyRounded","square","smallSquare","tinySquare","diamond","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","element","this","_element","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","_fill","drawExtraRounded","basicExtraRounded","drawRandomDot","drawClassyRounded","drawVerticalLine","drawHorizontalLine","drawDiamond","drawSmallSquare","drawTinySquare","basicSideRounded","basicCornerRounded","basicCornerExtraRounded","basicCornersRounded","random","originalSize","getNeighbor","leftNeighbor","rightNeighbor","topNeighbor","neighborsCount","bottomNeighbor","leftNeighbor_rotation","browserImageTools","toDataURL","url","startsWith","Promise","resolve","reject","xhr","XMLHttpRequest","onload","xhr.onload","reader","FileReader","onloadend","reader.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_parts","m","exec","dims","split","parseFloat","pop","toString","padStart","squareMask","dotMask","defs","appendChild","imageTools","drawQR","qr","getModuleCount","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","maxWidth","maxHeight","coverLevel_margin","alignment","QRUtil","getPatternPosition","calculateImageSize","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dimMax","dimMin","lower","upper","dotsMax","ceil","dotsMin","abs","hideMax","hideMin","maxW","maxH","floor","coverLevel","drawBackground","drawImage","drawDots","j","drawCorners","createColor","additionalRotation","name","backgroundMask","backgroundMaskGroup","createMask","filter","minSize","QRDot","overlayDot","markerDot","dotsMask","dotsMaskGroup","lightDotsMask","lightDotsMaskGroup","additionalDots","fakeCount","xBeginning","fakeMatrix","ii","jj","isDark","sqrt","iAlign","find","jAlign","center_jAlign","xFakeBeginning","yFakeBeginning","xOffset","yOffset","colorCount","cornersSquareSize","cornersDotSize","column","row","yBeginning","cornersSquareMask","cornersSquareMaskGroup","cornersDotMask","cornersDotMaskGroup","cornersDotMask_cornersSquare_dot","QRCornerSquare","cornersSquare","column_cornersDot","QRCornerDot","cornersDot","dx","dy","imageUrl","setAttributeNS","substring","indexOf","encoding","container_data","atob","Buffer","from","container","parseFromString","DOMParser","rootEl","getElementsByTagName","dw","dh","rect","x0","y0","x1","y1","positiveRotation","tan","stop","parsed","id","mask","group","stringToBytesFuncs","stringToBytes_UTF8","qrSVG","update","innerHTML","getMode","test","numeric","alphanumeric","unicode","byte","addData","make","setupSvg","append","applyExtension","extension","deleteExtension","serialize","svgDrawingPromise","serializeToString","XMLSerializer","moduleCount","QRSVG","FileExtension","svg","png","jpeg","webp","QRCodeStyling","QRCodeStyling$1","async","loadImage","pr","imageCache","get","fetch","res","arrayBuffer","buff","contentType","headers","r","mime","set","dom","createDocument","Map","super","isBuffer","meta","metadata"],"mappings":"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CA,UACA,UACA,UACA,QACA,UACA,KACA,UACA,UACA,UACA,UACA,UACA,UAjDWA,KAmDX,UACA,UACA,UACA,UACA,KACA,GACA,UACA,GACA,UACA,KACA,IACC,UACD,WACC,UACD,SACC,UACD,KACA,WACC,QACD,WACC,QACD,KACA,UACA,GACA,UACA,UACA,QACA,UACA,KACA,UACA,UACA,IACA,UACA,KACA,WACC,UACD,WACC,UACD,WACC,OACD,KACA,WACC,UACD,WACC,UACD,SACC,UACD,KACA,UACA,GACA,UACA,UACA,UACA,QACA,KACA,GACA,UACA,GACA,UACA,MAOGlG,KAAKmE,KACY,mBAAhBA,KACEC,IAAI;QACJ6B,OAAO9B,EAAEgC,iBAAiBhC,GACnBA,MAETC,KACID,KAAIxB,MACRsD,SACE9B,KAAc,KAATC,IAAI,IAASmB,IAAIC;QAEjB7B,UAAUQ,MAElBiC,KAAK;AAtIgC;IA0IxB,YAAAC,CAACzB;QACnB,KAAMjC,MAAM4C,GAAGC,KAAKZ;QAEfU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK/C,SAASqE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASgB,aAAa,KAAK9B,UAAU4B,KACrCd,KAAAA,SAASgB,aAAa,KAAK9B,UAAU6B;gBACrCf,KAAAA,SAASgB,aAAa,SAAS9B,UAAUhB,QACzC8B,KAAAA,SAASgB,aAAa,UAAU9B,UAAUhB;gBAC/C6B,KAAKC,SAASgB,aAAa,MAAM9B,UAAUhB,OAAO,KAClD6B,KAAKC,SAASgB,aAAa,MAAM9B,UAAUhB,OAAO;AAAlD;;AAZwC;IAiB3B,WAAA2D,CAAC1B;QAClB,KAAMjC,MAAM4C,GAAGC,KAAKZ,MACd2B,UAAU5D;QACX2C,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK/C,SAASqE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASgB,aAAa,aAAa,YACxCjB,KAAKC,SAASgB,aACZ,KACAe,OAAA,KAAYjB,KAAKC,IAAI,MAAMe,aACvB,IAAIA,aACJ,MAAMA,W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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/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 | {\r\n\r\n [key: string]: any\r\n }\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}\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}`\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}`\r\n }\r\n /** QR background styling options, false to disable background */\r\n backgroundOptions?:\r\n | {\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 }\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.square:\r\n default:\r\n drawFunction = this.drawSquare\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 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","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 { 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 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\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 (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.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 (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.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","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","basicSideRounded","basicCornerRounded","basicCornerExtraRounded","basicCornersRounded","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","dotMask","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","cornersDotMask","cornersDotMaskGroup","cornersSquare","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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"}
|