qreator 9.0.6
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/LICENSE +20 -0
- package/README.md +92 -0
- package/lib/browser/encode.d.ts +2 -0
- package/lib/browser/errorcode.d.ts +1 -0
- package/lib/browser/matrix.d.ts +9 -0
- package/lib/browser/pdf.d.ts +2 -0
- package/lib/browser/pdf.umd.js +26816 -0
- package/lib/browser/pdf.umd.js.map +1 -0
- package/lib/browser/png.d.ts +6 -0
- package/lib/browser/png.umd.js +1540 -0
- package/lib/browser/png.umd.js.map +1 -0
- package/lib/browser/png_browser.d.ts +5 -0
- package/lib/browser/qr-base.d.ts +4 -0
- package/lib/browser/qr.d.ts +2 -0
- package/lib/browser/svg.d.ts +7 -0
- package/lib/browser/svg.umd.js +1536 -0
- package/lib/browser/svg.umd.js.map +1 -0
- package/lib/browser/tests/_common.d.ts +4 -0
- package/lib/browser/tests/browser.test.d.ts +1 -0
- package/lib/browser/tests/test.d.ts +1 -0
- package/lib/browser/typing/types.d.ts +28 -0
- package/lib/browser/utils.d.ts +17 -0
- package/lib/encode.d.ts +2 -0
- package/lib/encode.js +137 -0
- package/lib/encode.js.map +1 -0
- package/lib/errorcode.d.ts +1 -0
- package/lib/errorcode.js +62 -0
- package/lib/errorcode.js.map +1 -0
- package/lib/matrix.d.ts +9 -0
- package/lib/matrix.js +347 -0
- package/lib/matrix.js.map +1 -0
- package/lib/pdf.d.ts +2 -0
- package/lib/pdf.js +64 -0
- package/lib/pdf.js.map +1 -0
- package/lib/png.d.ts +6 -0
- package/lib/png.js +30 -0
- package/lib/png.js.map +1 -0
- package/lib/png_browser.d.ts +5 -0
- package/lib/png_browser.js +53 -0
- package/lib/png_browser.js.map +1 -0
- package/lib/qr-base.d.ts +4 -0
- package/lib/qr-base.js +151 -0
- package/lib/qr-base.js.map +1 -0
- package/lib/qr.d.ts +2 -0
- package/lib/qr.js +2 -0
- package/lib/qr.js.map +1 -0
- package/lib/svg.d.ts +7 -0
- package/lib/svg.js +49 -0
- package/lib/svg.js.map +1 -0
- package/lib/tests/_common.d.ts +4 -0
- package/lib/tests/_common.js +36 -0
- package/lib/tests/_common.js.map +1 -0
- package/lib/tests/browser.test.d.ts +1 -0
- package/lib/tests/browser.test.js +193 -0
- package/lib/tests/browser.test.js.map +1 -0
- package/lib/tests/test.d.ts +1 -0
- package/lib/tests/test.js +238 -0
- package/lib/tests/test.js.map +1 -0
- package/lib/typing/types.d.ts +28 -0
- package/lib/typing/types.js +2 -0
- package/lib/typing/types.js.map +1 -0
- package/lib/utils.d.ts +17 -0
- package/lib/utils.js +68 -0
- package/lib/utils.js.map +1 -0
- package/package.json +105 -0
- package/src/encode.ts +176 -0
- package/src/errorcode.ts +75 -0
- package/src/matrix.ts +393 -0
- package/src/pdf.ts +80 -0
- package/src/png.ts +42 -0
- package/src/png_browser.ts +73 -0
- package/src/qr-base.ts +180 -0
- package/src/qr.ts +2 -0
- package/src/svg.ts +89 -0
- package/src/tests/_common.ts +40 -0
- package/src/tests/browser.test.ts +209 -0
- package/src/tests/test.ts +250 -0
- package/src/typing/index.d.ts +5 -0
- package/src/typing/types.ts +99 -0
- package/src/utils.ts +86 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import test from "ava";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
|
|
4
|
+
import { getPNG } from "../png.js";
|
|
5
|
+
import { getSVG } from "../svg.js";
|
|
6
|
+
import { getPDF } from "../pdf.js";
|
|
7
|
+
import type { ImageOptions } from "../typing/types.js";
|
|
8
|
+
import { assertEqual, generatedImageDir, goldenDir } from "./_common.js";
|
|
9
|
+
|
|
10
|
+
const text = "I \u2764\uFE0F QR code!";
|
|
11
|
+
// const text = 'https://yadi.sk/d/FuzPeEg-QyaZN?qr';
|
|
12
|
+
|
|
13
|
+
const defaultParams = {
|
|
14
|
+
ec_level: "Q" as const,
|
|
15
|
+
margin: 1,
|
|
16
|
+
parse_url: true,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
interface TestParams {
|
|
20
|
+
name: string;
|
|
21
|
+
fn: typeof getPNG | typeof getPDF | typeof getSVG;
|
|
22
|
+
filename: string;
|
|
23
|
+
params: ImageOptions;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
([
|
|
27
|
+
{
|
|
28
|
+
name: "PNG",
|
|
29
|
+
fn: getPNG,
|
|
30
|
+
filename: "qr.png",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "PNG with empty options",
|
|
34
|
+
fn: getPNG,
|
|
35
|
+
filename: "qr_with_empty_options.png",
|
|
36
|
+
options: {},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "PNG with undefined size",
|
|
40
|
+
fn: getPNG,
|
|
41
|
+
filename: "qr_with_undefined_size.png",
|
|
42
|
+
options: {
|
|
43
|
+
size: undefined,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "PNG with size",
|
|
48
|
+
fn: getPNG,
|
|
49
|
+
filename: "qr_with_size.png",
|
|
50
|
+
params: {
|
|
51
|
+
size: 9,
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "PNG with margin",
|
|
56
|
+
fn: getPNG,
|
|
57
|
+
filename: "qr_with_margin.png",
|
|
58
|
+
params: {
|
|
59
|
+
size: 9,
|
|
60
|
+
margin: 3,
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "PNG with border radius",
|
|
65
|
+
fn: getPNG,
|
|
66
|
+
filename: "qr_with_border_radius.png",
|
|
67
|
+
params: {
|
|
68
|
+
borderRadius: 1,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: "PNG with colors",
|
|
73
|
+
fn: getPNG,
|
|
74
|
+
filename: "qr_with_colors.png",
|
|
75
|
+
params: {
|
|
76
|
+
color: 0x0000a0ff,
|
|
77
|
+
bgColor: 0xffa0ffff,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "PNG with colors (hex)",
|
|
82
|
+
fn: getPNG,
|
|
83
|
+
filename: "qr_with_colors.png",
|
|
84
|
+
params: {
|
|
85
|
+
color: '#0000a0',
|
|
86
|
+
bgColor: '#ffa0ff',
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "PNG with colors (rgba)",
|
|
91
|
+
fn: getPNG,
|
|
92
|
+
filename: "qr_with_colors_rgba.png",
|
|
93
|
+
params: {
|
|
94
|
+
color: 'rgba(255, 0, 0, 0.5)',
|
|
95
|
+
bgColor: 'rgba(255, 255, 255, 0.1)',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "PNG with logo",
|
|
100
|
+
fn: getPNG,
|
|
101
|
+
filename: "qr_with_logo.png",
|
|
102
|
+
params: { logo: await readFile(`${goldenDir}/logo.png`) },
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: "PNG with logo (JPG)",
|
|
106
|
+
fn: getPNG,
|
|
107
|
+
filename: "qr_with_logo_jpg.png",
|
|
108
|
+
params: { logo: await readFile(`${goldenDir}/logo.jpg`) },
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: "PNG with logo (arraybuffer)",
|
|
112
|
+
fn: getPNG,
|
|
113
|
+
filename: "qr_with_logo.png",
|
|
114
|
+
params: { logo: (await readFile(`${goldenDir}/logo.png`)).buffer },
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: "SVG",
|
|
118
|
+
fn: getSVG,
|
|
119
|
+
filename: "qr.svg",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: "SVG with border radius",
|
|
123
|
+
fn: getSVG,
|
|
124
|
+
filename: "qr_with_border_radius.svg",
|
|
125
|
+
params: {
|
|
126
|
+
borderRadius: 4,
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: "SVG with EC level",
|
|
131
|
+
fn: getSVG,
|
|
132
|
+
filename: "qr_with_ec_level.svg",
|
|
133
|
+
params: {
|
|
134
|
+
ec_level: "H",
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "SVG with size",
|
|
139
|
+
fn: getSVG,
|
|
140
|
+
filename: "qr_with_size.svg",
|
|
141
|
+
params: {
|
|
142
|
+
size: 6,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "SVG with colors (hex)",
|
|
147
|
+
fn: getSVG,
|
|
148
|
+
filename: "qr_with_colors_hex.svg",
|
|
149
|
+
params: {
|
|
150
|
+
color: '#ff0000',
|
|
151
|
+
bgColor: '#00ff00',
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: "SVG with colors (rgba)",
|
|
156
|
+
fn: getSVG,
|
|
157
|
+
filename: "qr_with_colors_rgba.svg",
|
|
158
|
+
params: {
|
|
159
|
+
color: 'rgba(255, 0, 0, 0.5)',
|
|
160
|
+
bgColor: 'rgba(0, 255, 0, 0.2)',
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: "SVG with colors",
|
|
165
|
+
fn: getSVG,
|
|
166
|
+
filename: "qr_with_colors.svg",
|
|
167
|
+
params: {
|
|
168
|
+
color: 0xff0000ff,
|
|
169
|
+
bgColor: 0x00ff00ff,
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "SVG with logo as buffer",
|
|
174
|
+
fn: getSVG,
|
|
175
|
+
filename: "qr_with_logo.svg",
|
|
176
|
+
params: { logo: await readFile(`${goldenDir}/logo.png`) },
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: "SVG with logo as arraybuffer (PNG)",
|
|
180
|
+
fn: getSVG,
|
|
181
|
+
filename: "qr_with_logo_as_arraybuffer.svg",
|
|
182
|
+
params: {
|
|
183
|
+
logo: (await readFile(`${goldenDir}/logo.png`)).buffer,
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: "SVG with logo as arraybuffer (JPG)",
|
|
188
|
+
fn: getSVG,
|
|
189
|
+
filename: "qr_with_logo_as_arraybuffer_jpg.svg",
|
|
190
|
+
params: {
|
|
191
|
+
logo: (await readFile(`${goldenDir}/logo.jpg`)).buffer,
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "PDF",
|
|
196
|
+
fn: getPDF,
|
|
197
|
+
filename: "qr.pdf",
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
name: "PDF with border radius",
|
|
201
|
+
fn: getPDF,
|
|
202
|
+
filename: "qr_with_border_radius.pdf",
|
|
203
|
+
params: {
|
|
204
|
+
borderRadius: 4,
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: "PDF with colors",
|
|
209
|
+
fn: getPDF,
|
|
210
|
+
filename: "qr_with_colors.pdf",
|
|
211
|
+
params: { color: 0xff0000ff, bgColor: 0x00ff00ff },
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: "PDF with colors (hex)",
|
|
215
|
+
fn: getPDF,
|
|
216
|
+
filename: "qr_with_colors.pdf",
|
|
217
|
+
params: { color: '#ff0000', bgColor: '#00ff00' },
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: "PDF with arraybuffer",
|
|
221
|
+
fn: getPDF,
|
|
222
|
+
filename: "qr_logo_arraybuffer.pdf",
|
|
223
|
+
params: {
|
|
224
|
+
logo: (await readFile(`${goldenDir}/logo.png`)).buffer,
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: "PDF with arraybuffer (JPG)",
|
|
229
|
+
fn: getPDF,
|
|
230
|
+
filename: "qr_logo_arraybuffer_jpg.pdf",
|
|
231
|
+
params: {
|
|
232
|
+
logo: (await readFile(`${goldenDir}/logo.jpg`)).buffer,
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
name: "PDF with logo",
|
|
237
|
+
fn: getPDF,
|
|
238
|
+
filename: "qr_with_logo.pdf",
|
|
239
|
+
params: { logo: await readFile(`${goldenDir}/logo.png`) },
|
|
240
|
+
},
|
|
241
|
+
] as TestParams[]).forEach((testData) => {
|
|
242
|
+
test.serial(testData.name, async (t) => {
|
|
243
|
+
const image = await testData.fn(text, {
|
|
244
|
+
...defaultParams,
|
|
245
|
+
...testData.params,
|
|
246
|
+
});
|
|
247
|
+
await writeFile(`${generatedImageDir}/${testData.filename}`, image);
|
|
248
|
+
await assertEqual(t, testData.filename);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export type Matrix = number[][];
|
|
2
|
+
|
|
3
|
+
export interface Data {
|
|
4
|
+
blocks: number[][];
|
|
5
|
+
ec: number[][];
|
|
6
|
+
ec_len: number;
|
|
7
|
+
ec_level: EcLevel;
|
|
8
|
+
version: number;
|
|
9
|
+
data_len: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface NumberData {
|
|
13
|
+
[key: string]: number[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Error correction level, one of 'L', 'M', 'Q', 'H'.
|
|
18
|
+
* @default 'M'
|
|
19
|
+
*/
|
|
20
|
+
export type EcLevel = "L" | "M" | "Q" | "H";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Output type, one of 'png', 'svg', 'pdf'.
|
|
24
|
+
* @default 'png'
|
|
25
|
+
*/
|
|
26
|
+
export type ImageType = "png" | "svg" | "pdf";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Image options.
|
|
30
|
+
*/
|
|
31
|
+
export interface ImageOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Error correction level, one of 'L', 'M', 'Q', 'H'.
|
|
34
|
+
* @default 'M'
|
|
35
|
+
*/
|
|
36
|
+
ec_level?: EcLevel;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Output type, one of 'png', 'svg', 'pdf'.
|
|
40
|
+
* Documentation is wrong though, it's `undefined`!
|
|
41
|
+
* @default 'png'
|
|
42
|
+
*/
|
|
43
|
+
type?: ImageType;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* (PNG and SVG only) Module size in pixels.
|
|
47
|
+
* @default 5 //for PNG
|
|
48
|
+
* @default 0 //for others
|
|
49
|
+
*/
|
|
50
|
+
size?: number;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Margin of the resulting image in modules.
|
|
54
|
+
* @default 4 //for PNG
|
|
55
|
+
* @default 1 //for others
|
|
56
|
+
*/
|
|
57
|
+
margin?: number;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* (EXPERIMENTAL) Try to optimize QR code for URLs.
|
|
61
|
+
* @default false
|
|
62
|
+
*/
|
|
63
|
+
parse_url?: boolean;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Buffer with PNG image to draw on top of QR code.
|
|
67
|
+
* @default undefined
|
|
68
|
+
*/
|
|
69
|
+
logo?: ArrayBufferLike | Buffer;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Width of the overlay logo in percent.
|
|
73
|
+
* @default 20
|
|
74
|
+
*/
|
|
75
|
+
logoWidth?: number;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Height of the overlay logo in percent.
|
|
79
|
+
* @default 20
|
|
80
|
+
*/
|
|
81
|
+
logoHeight?: number;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Foreground color in RGBA format.
|
|
85
|
+
* @default 0x000000FF
|
|
86
|
+
*/
|
|
87
|
+
color?: number | string;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Background color in RGBA format.
|
|
91
|
+
* @default 0xFFFFFFFF
|
|
92
|
+
*/
|
|
93
|
+
bgColor?: number | string;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* border radius of the points
|
|
97
|
+
*/
|
|
98
|
+
borderRadius?: number;
|
|
99
|
+
}
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import colorString from "color-string";
|
|
2
|
+
import { ImageOptions, ImageType, Matrix } from "./typing/types";
|
|
3
|
+
|
|
4
|
+
export function getOptions(inOptions: ImageOptions) {
|
|
5
|
+
const type: ImageType = inOptions?.type ?? "png";
|
|
6
|
+
const defaults = type === "png" ? BITMAP_OPTIONS : VECTOR_OPTIONS;
|
|
7
|
+
return { ...defaults, ...inOptions };
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function colorToHex(color: number | string): string {
|
|
11
|
+
if (typeof color === "string") {
|
|
12
|
+
return colorString.to.hex(colorString.get.rgb(color));
|
|
13
|
+
}
|
|
14
|
+
return `#${(color >>> 8).toString(16).padStart(6, "0")}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function getSVGPath(matrix: Matrix, size: number, margin: number = 0, borderRadius: number = 0) {
|
|
18
|
+
let rectangles = [];
|
|
19
|
+
for (let x = 0; x < matrix.length; x++) {
|
|
20
|
+
const column = matrix[x];
|
|
21
|
+
for (let y = 0; y < column.length; y++) {
|
|
22
|
+
if (column[y]) {
|
|
23
|
+
const leftX = x * size + margin;
|
|
24
|
+
const rightX = (x + 1) * size + margin;
|
|
25
|
+
const topY = y * size + margin;
|
|
26
|
+
const bottomY = (y + 1) * size + margin;
|
|
27
|
+
const rectangle = [];
|
|
28
|
+
rectangle.push(`M ${leftX} ${topY + borderRadius}`)
|
|
29
|
+
rectangle.push(`L ${leftX} ${bottomY - borderRadius}`)
|
|
30
|
+
if (borderRadius > 0) {
|
|
31
|
+
rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX + borderRadius} ${bottomY} `)
|
|
32
|
+
}
|
|
33
|
+
rectangle.push(`L ${rightX - borderRadius} ${bottomY}`)
|
|
34
|
+
if (borderRadius > 0) {
|
|
35
|
+
rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX} ${bottomY - borderRadius}`)
|
|
36
|
+
}
|
|
37
|
+
rectangle.push(`L ${rightX} ${topY + borderRadius}`)
|
|
38
|
+
if (borderRadius > 0) {
|
|
39
|
+
rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX - borderRadius} ${topY}`)
|
|
40
|
+
}
|
|
41
|
+
rectangle.push(`L ${leftX + borderRadius} ${topY}`)
|
|
42
|
+
if (borderRadius > 0) {
|
|
43
|
+
rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX} ${topY + borderRadius}`)
|
|
44
|
+
}
|
|
45
|
+
rectangle.push(`z`)
|
|
46
|
+
rectangles.push(rectangle.join(" "));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return rectangles.join(" ");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
const commonOptions: Pick<
|
|
56
|
+
ImageOptions,
|
|
57
|
+
| "type"
|
|
58
|
+
| "parse_url"
|
|
59
|
+
| "ec_level"
|
|
60
|
+
| "logo"
|
|
61
|
+
| "logoWidth"
|
|
62
|
+
| "logoHeight"
|
|
63
|
+
| "bgColor"
|
|
64
|
+
| "color"
|
|
65
|
+
> = {
|
|
66
|
+
type: "png",
|
|
67
|
+
parse_url: false,
|
|
68
|
+
ec_level: "M",
|
|
69
|
+
logo: undefined,
|
|
70
|
+
logoWidth: 20,
|
|
71
|
+
logoHeight: 20,
|
|
72
|
+
bgColor: 0xffffffff,
|
|
73
|
+
color: 0x000000ff,
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const BITMAP_OPTIONS: ImageOptions = {
|
|
77
|
+
...commonOptions,
|
|
78
|
+
margin: 1,
|
|
79
|
+
size: 5,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const VECTOR_OPTIONS: ImageOptions = {
|
|
83
|
+
...commonOptions,
|
|
84
|
+
margin: 1,
|
|
85
|
+
size: 0,
|
|
86
|
+
};
|