@particle-academy/react-fancy 5.35.1 → 5.36.1

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.
@@ -0,0 +1,660 @@
1
+ import { cn } from './chunk-MMW2JGKZ.js';
2
+ import { forwardRef, useMemo } from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ // src/components/QrCode/qr-tables.ts
6
+ var EC_LEVELS = ["L", "M", "Q", "H"];
7
+ var BLOCK_TABLE = [
8
+ // v1
9
+ [[19, 7, 1, 19, 0, 0], [16, 10, 1, 16, 0, 0], [13, 13, 1, 13, 0, 0], [9, 17, 1, 9, 0, 0]],
10
+ [[34, 10, 1, 34, 0, 0], [28, 16, 1, 28, 0, 0], [22, 22, 1, 22, 0, 0], [16, 28, 1, 16, 0, 0]],
11
+ [[55, 15, 1, 55, 0, 0], [44, 26, 1, 44, 0, 0], [34, 18, 2, 17, 0, 0], [26, 22, 2, 13, 0, 0]],
12
+ [[80, 20, 1, 80, 0, 0], [64, 18, 2, 32, 0, 0], [48, 26, 2, 24, 0, 0], [36, 16, 4, 9, 0, 0]],
13
+ [[108, 26, 1, 108, 0, 0], [86, 24, 2, 43, 0, 0], [62, 18, 2, 15, 2, 16], [46, 22, 2, 11, 2, 12]],
14
+ [[136, 18, 2, 68, 0, 0], [108, 16, 4, 27, 0, 0], [76, 24, 4, 19, 0, 0], [60, 28, 4, 15, 0, 0]],
15
+ [[156, 20, 2, 78, 0, 0], [124, 18, 4, 31, 0, 0], [88, 18, 2, 14, 4, 15], [66, 26, 4, 13, 1, 14]],
16
+ [[194, 24, 2, 97, 0, 0], [154, 22, 2, 38, 2, 39], [110, 22, 4, 18, 2, 19], [86, 26, 4, 14, 2, 15]],
17
+ [[232, 30, 2, 116, 0, 0], [182, 22, 3, 36, 2, 37], [132, 20, 4, 16, 4, 17], [100, 24, 4, 12, 4, 13]],
18
+ // v10
19
+ [[274, 18, 2, 68, 2, 69], [216, 26, 4, 43, 1, 44], [154, 24, 6, 19, 2, 20], [122, 28, 6, 15, 2, 16]],
20
+ [[324, 20, 4, 81, 0, 0], [254, 30, 1, 50, 4, 51], [180, 28, 4, 22, 4, 23], [140, 24, 3, 12, 8, 13]],
21
+ [[370, 24, 2, 92, 2, 93], [290, 22, 6, 36, 2, 37], [206, 26, 4, 20, 6, 21], [158, 28, 7, 14, 4, 15]],
22
+ [[428, 26, 4, 107, 0, 0], [334, 22, 8, 37, 1, 38], [244, 24, 8, 20, 4, 21], [180, 22, 12, 11, 4, 12]],
23
+ [[461, 30, 3, 115, 1, 116], [365, 24, 4, 40, 5, 41], [261, 20, 11, 16, 5, 17], [197, 24, 11, 12, 5, 13]],
24
+ [[523, 22, 5, 87, 1, 88], [415, 24, 5, 41, 5, 42], [295, 30, 5, 24, 7, 25], [223, 24, 11, 12, 7, 13]],
25
+ [[589, 24, 5, 98, 1, 99], [453, 28, 7, 45, 3, 46], [325, 24, 15, 19, 2, 20], [253, 30, 3, 15, 13, 16]],
26
+ [[647, 28, 1, 107, 5, 108], [507, 28, 10, 46, 1, 47], [367, 28, 1, 22, 15, 23], [283, 28, 2, 14, 17, 15]],
27
+ [[721, 30, 5, 120, 1, 121], [563, 26, 9, 43, 4, 44], [397, 28, 17, 22, 1, 23], [313, 28, 2, 14, 19, 15]],
28
+ [[795, 28, 3, 113, 4, 114], [627, 26, 3, 44, 11, 45], [445, 26, 17, 21, 4, 22], [341, 26, 9, 13, 16, 14]],
29
+ // v20
30
+ [[861, 28, 3, 107, 5, 108], [669, 26, 3, 41, 13, 42], [485, 30, 15, 24, 5, 25], [385, 28, 15, 15, 10, 16]],
31
+ [[932, 28, 4, 116, 4, 117], [714, 26, 17, 42, 0, 0], [512, 28, 17, 22, 6, 23], [406, 30, 19, 16, 6, 17]],
32
+ [[1006, 28, 2, 111, 7, 112], [782, 28, 17, 46, 0, 0], [568, 30, 7, 24, 16, 25], [442, 24, 34, 13, 0, 0]],
33
+ [[1094, 30, 4, 121, 5, 122], [860, 28, 4, 47, 14, 48], [614, 30, 11, 24, 14, 25], [464, 30, 16, 15, 14, 16]],
34
+ [[1174, 30, 6, 117, 4, 118], [914, 28, 6, 45, 14, 46], [664, 30, 11, 24, 16, 25], [514, 30, 30, 16, 2, 17]],
35
+ [[1276, 26, 8, 106, 4, 107], [1e3, 28, 8, 47, 13, 48], [718, 30, 7, 24, 22, 25], [538, 30, 22, 15, 13, 16]],
36
+ [[1370, 28, 10, 114, 2, 115], [1062, 28, 19, 46, 4, 47], [754, 28, 28, 22, 6, 23], [596, 30, 33, 16, 4, 17]],
37
+ [[1468, 30, 8, 122, 4, 123], [1128, 28, 22, 45, 3, 46], [808, 30, 8, 23, 26, 24], [628, 30, 12, 15, 28, 16]],
38
+ [[1531, 30, 3, 117, 10, 118], [1193, 28, 3, 45, 23, 46], [871, 30, 4, 24, 31, 25], [661, 30, 11, 15, 31, 16]],
39
+ [[1631, 30, 7, 116, 7, 117], [1267, 28, 21, 45, 7, 46], [911, 30, 1, 23, 37, 24], [701, 30, 19, 15, 26, 16]],
40
+ // v30
41
+ [[1735, 30, 5, 115, 10, 116], [1373, 28, 19, 47, 10, 48], [985, 30, 15, 24, 25, 25], [745, 30, 23, 15, 25, 16]],
42
+ [[1843, 30, 13, 115, 3, 116], [1455, 28, 2, 46, 29, 47], [1033, 30, 42, 24, 1, 25], [793, 30, 23, 15, 28, 16]],
43
+ [[1955, 30, 17, 115, 0, 0], [1541, 28, 10, 46, 23, 47], [1115, 30, 10, 24, 35, 25], [845, 30, 19, 15, 35, 16]],
44
+ [[2071, 30, 17, 115, 1, 116], [1631, 28, 14, 46, 21, 47], [1171, 30, 29, 24, 19, 25], [901, 30, 11, 15, 46, 16]],
45
+ [[2191, 30, 13, 115, 6, 116], [1725, 28, 14, 46, 23, 47], [1231, 30, 44, 24, 7, 25], [961, 30, 59, 16, 1, 17]],
46
+ [[2306, 30, 12, 121, 7, 122], [1812, 28, 12, 47, 26, 48], [1286, 30, 39, 24, 14, 25], [986, 30, 22, 15, 41, 16]],
47
+ [[2434, 30, 6, 121, 14, 122], [1914, 28, 6, 47, 34, 48], [1354, 30, 46, 24, 10, 25], [1054, 30, 2, 15, 64, 16]],
48
+ [[2566, 30, 17, 122, 4, 123], [1992, 28, 29, 46, 14, 47], [1426, 30, 49, 24, 10, 25], [1096, 30, 24, 15, 46, 16]],
49
+ [[2702, 30, 4, 122, 18, 123], [2102, 28, 13, 46, 32, 47], [1502, 30, 48, 24, 14, 25], [1142, 30, 42, 15, 32, 16]],
50
+ [[2812, 30, 20, 117, 4, 118], [2216, 28, 40, 47, 7, 48], [1582, 30, 43, 24, 22, 25], [1222, 30, 10, 15, 67, 16]],
51
+ // v40
52
+ [[2956, 30, 19, 118, 6, 119], [2334, 28, 18, 47, 31, 48], [1666, 30, 34, 24, 34, 25], [1276, 30, 20, 15, 61, 16]]
53
+ ];
54
+ var MIN_VERSION = 1;
55
+ var MAX_VERSION = 40;
56
+ function blockLayout(version, ec) {
57
+ const row = BLOCK_TABLE[version - 1]?.[EC_LEVELS.indexOf(ec)];
58
+ if (!row) {
59
+ throw new RangeError(`No block layout for version ${version} level ${ec}`);
60
+ }
61
+ const [dataCodewords2, ecPerBlock, g1Blocks, g1Size, g2Blocks, g2Size] = row;
62
+ return { dataCodewords: dataCodewords2, ecPerBlock, g1Blocks, g1Size, g2Blocks, g2Size };
63
+ }
64
+ var FORMAT_BITS = {
65
+ L: [
66
+ 30660,
67
+ 29427,
68
+ 32170,
69
+ 30877,
70
+ 26159,
71
+ 25368,
72
+ 27713,
73
+ 26998
74
+ ],
75
+ M: [
76
+ 21522,
77
+ 20773,
78
+ 24188,
79
+ 23371,
80
+ 17913,
81
+ 16590,
82
+ 20375,
83
+ 19104
84
+ ],
85
+ Q: [
86
+ 13663,
87
+ 12392,
88
+ 16177,
89
+ 14854,
90
+ 9396,
91
+ 8579,
92
+ 11994,
93
+ 11245
94
+ ],
95
+ H: [
96
+ 5769,
97
+ 5054,
98
+ 7399,
99
+ 6608,
100
+ 1890,
101
+ 597,
102
+ 3340,
103
+ 2107
104
+ ]
105
+ };
106
+ function versionBits(version) {
107
+ let remainder = version;
108
+ for (let i = 0; i < 12; i += 1) {
109
+ remainder = remainder << 1 ^ (remainder >>> 11) * 7973;
110
+ }
111
+ return (version << 12 | remainder) >>> 0;
112
+ }
113
+ function alignmentPositions(version) {
114
+ if (version === 1) {
115
+ return [];
116
+ }
117
+ const count = Math.floor(version / 7) + 2;
118
+ const size = version * 4 + 17;
119
+ const step = version === 32 ? 26 : Math.ceil((size - 13) / (count * 2 - 2)) * 2;
120
+ const positions = [6];
121
+ for (let pos = size - 7; positions.length < count; pos -= step) {
122
+ positions.unshift(pos);
123
+ }
124
+ return positions.sort((a, b) => a - b);
125
+ }
126
+
127
+ // src/components/QrCode/qr-encode.ts
128
+ var MODE_INDICATOR = { numeric: 1, alphanumeric: 2, byte: 4 };
129
+ var ALPHANUMERIC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
130
+ var EXP = new Uint8Array(256);
131
+ var LOG = new Uint8Array(256);
132
+ {
133
+ let x = 1;
134
+ for (let i = 0; i < 255; i += 1) {
135
+ EXP[i] = x;
136
+ LOG[x] = i;
137
+ x <<= 1;
138
+ if (x & 256) {
139
+ x ^= 285;
140
+ }
141
+ }
142
+ EXP[255] = EXP[0];
143
+ }
144
+ function gfMul(a, b) {
145
+ if (a === 0 || b === 0) {
146
+ return 0;
147
+ }
148
+ return EXP[(LOG[a] + LOG[b]) % 255];
149
+ }
150
+ function generatorPoly(degree) {
151
+ let poly = [1];
152
+ for (let i = 0; i < degree; i += 1) {
153
+ const next = new Array(poly.length + 1).fill(0);
154
+ for (let j = 0; j < poly.length; j += 1) {
155
+ next[j] = next[j] ^ poly[j];
156
+ next[j + 1] = next[j + 1] ^ gfMul(poly[j], EXP[i]);
157
+ }
158
+ poly = next;
159
+ }
160
+ return poly;
161
+ }
162
+ function reedSolomon(data, degree) {
163
+ const generator = generatorPoly(degree);
164
+ const remainder = new Array(degree).fill(0);
165
+ for (const byte of data) {
166
+ const factor = byte ^ remainder.shift();
167
+ remainder.push(0);
168
+ for (let i = 0; i < degree; i += 1) {
169
+ remainder[i] = remainder[i] ^ gfMul(generator[i + 1], factor);
170
+ }
171
+ }
172
+ return remainder;
173
+ }
174
+ function selectMode(value) {
175
+ if (/^[0-9]*$/.test(value)) {
176
+ return "numeric";
177
+ }
178
+ if ([...value].every((char) => ALPHANUMERIC.includes(char))) {
179
+ return "alphanumeric";
180
+ }
181
+ return "byte";
182
+ }
183
+ function countBits(mode, version) {
184
+ const tier = version <= 9 ? 0 : version <= 26 ? 1 : 2;
185
+ if (mode === "numeric") {
186
+ return [10, 12, 14][tier];
187
+ }
188
+ if (mode === "alphanumeric") {
189
+ return [9, 11, 13][tier];
190
+ }
191
+ return [8, 16, 16][tier];
192
+ }
193
+ var BitBuffer = class {
194
+ constructor() {
195
+ this.bits = [];
196
+ }
197
+ push(value, length) {
198
+ for (let i = length - 1; i >= 0; i -= 1) {
199
+ this.bits.push(value >>> i & 1);
200
+ }
201
+ }
202
+ };
203
+ function utf8Bytes(value) {
204
+ const out = [];
205
+ for (const char of value) {
206
+ const code = char.codePointAt(0);
207
+ if (code < 128) {
208
+ out.push(code);
209
+ } else if (code < 2048) {
210
+ out.push(192 | code >> 6, 128 | code & 63);
211
+ } else if (code < 65536) {
212
+ out.push(224 | code >> 12, 128 | code >> 6 & 63, 128 | code & 63);
213
+ } else {
214
+ out.push(
215
+ 240 | code >> 18,
216
+ 128 | code >> 12 & 63,
217
+ 128 | code >> 6 & 63,
218
+ 128 | code & 63
219
+ );
220
+ }
221
+ }
222
+ return out;
223
+ }
224
+ function encodePayload(value, mode, version) {
225
+ const buffer = new BitBuffer();
226
+ buffer.push(MODE_INDICATOR[mode], 4);
227
+ if (mode === "numeric") {
228
+ buffer.push(value.length, countBits(mode, version));
229
+ for (let i = 0; i < value.length; i += 3) {
230
+ const group = value.slice(i, i + 3);
231
+ buffer.push(Number.parseInt(group, 10), group.length * 3 + 1);
232
+ }
233
+ return buffer;
234
+ }
235
+ if (mode === "alphanumeric") {
236
+ buffer.push(value.length, countBits(mode, version));
237
+ for (let i = 0; i < value.length; i += 2) {
238
+ const first = ALPHANUMERIC.indexOf(value[i]);
239
+ if (i + 1 < value.length) {
240
+ buffer.push(first * 45 + ALPHANUMERIC.indexOf(value[i + 1]), 11);
241
+ } else {
242
+ buffer.push(first, 6);
243
+ }
244
+ }
245
+ return buffer;
246
+ }
247
+ const bytes = utf8Bytes(value);
248
+ buffer.push(bytes.length, countBits(mode, version));
249
+ for (const byte of bytes) {
250
+ buffer.push(byte, 8);
251
+ }
252
+ return buffer;
253
+ }
254
+ function payloadBits(value, mode, version) {
255
+ return encodePayload(value, mode, version).bits.length;
256
+ }
257
+ function maxCharacters(mode) {
258
+ const bits = blockLayout(MAX_VERSION, "L").dataCodewords * 8 - 4 - countBits(mode, MAX_VERSION);
259
+ if (mode === "numeric") {
260
+ return Math.floor(bits * 3 / 10);
261
+ }
262
+ if (mode === "alphanumeric") {
263
+ return Math.floor(bits * 2 / 11);
264
+ }
265
+ return Math.floor(bits / 8);
266
+ }
267
+ var ABSOLUTE_MAX_CHARACTERS = maxCharacters("numeric");
268
+ function tooLongToFit(value, mode) {
269
+ if (value.length > ABSOLUTE_MAX_CHARACTERS) {
270
+ return true;
271
+ }
272
+ return mode !== null && value.length > maxCharacters(mode);
273
+ }
274
+ function selectVersion(value, mode, ec, minVersion) {
275
+ const bitsForTier = /* @__PURE__ */ new Map();
276
+ for (let version = Math.max(minVersion, MIN_VERSION); version <= MAX_VERSION; version += 1) {
277
+ const width = countBits(mode, version);
278
+ let bits = bitsForTier.get(width);
279
+ if (bits === void 0) {
280
+ bits = payloadBits(value, mode, version);
281
+ bitsForTier.set(width, bits);
282
+ }
283
+ if (bits <= blockLayout(version, ec).dataCodewords * 8) {
284
+ return version;
285
+ }
286
+ }
287
+ return null;
288
+ }
289
+ function dataCodewords(value, mode, version, ec) {
290
+ const capacity = blockLayout(version, ec).dataCodewords * 8;
291
+ const buffer = encodePayload(value, mode, version);
292
+ buffer.push(0, Math.min(4, capacity - buffer.bits.length));
293
+ buffer.push(0, (8 - buffer.bits.length % 8) % 8);
294
+ const codewords = [];
295
+ for (let i = 0; i < buffer.bits.length; i += 8) {
296
+ let byte = 0;
297
+ for (let bit = 0; bit < 8; bit += 1) {
298
+ byte = byte << 1 | buffer.bits[i + bit];
299
+ }
300
+ codewords.push(byte);
301
+ }
302
+ const target = capacity / 8;
303
+ for (let i = 0; codewords.length < target; i += 1) {
304
+ codewords.push(i % 2 === 0 ? 236 : 17);
305
+ }
306
+ return codewords;
307
+ }
308
+ function interleave(codewords, version, ec) {
309
+ const { ecPerBlock, g1Blocks, g1Size, g2Blocks, g2Size } = blockLayout(version, ec);
310
+ const dataBlocks = [];
311
+ let offset = 0;
312
+ for (let i = 0; i < g1Blocks; i += 1) {
313
+ dataBlocks.push(codewords.slice(offset, offset + g1Size));
314
+ offset += g1Size;
315
+ }
316
+ for (let i = 0; i < g2Blocks; i += 1) {
317
+ dataBlocks.push(codewords.slice(offset, offset + g2Size));
318
+ offset += g2Size;
319
+ }
320
+ const ecBlocks = dataBlocks.map((block) => reedSolomon(block, ecPerBlock));
321
+ const result = [];
322
+ const widest = Math.max(g1Size, g2Blocks > 0 ? g2Size : 0);
323
+ for (let i = 0; i < widest; i += 1) {
324
+ for (const block of dataBlocks) {
325
+ if (i < block.length) {
326
+ result.push(block[i]);
327
+ }
328
+ }
329
+ }
330
+ for (let i = 0; i < ecPerBlock; i += 1) {
331
+ for (const block of ecBlocks) {
332
+ result.push(block[i]);
333
+ }
334
+ }
335
+ return result;
336
+ }
337
+ function reservedModules(version) {
338
+ const size = version * 4 + 17;
339
+ const grid = Array.from({ length: size }, () => new Array(size).fill(null));
340
+ const set = (row, col, dark) => {
341
+ grid[row][col] = dark;
342
+ };
343
+ for (const [baseRow, baseCol] of [
344
+ [0, 0],
345
+ [0, size - 7],
346
+ [size - 7, 0]
347
+ ]) {
348
+ for (let row = -1; row <= 7; row += 1) {
349
+ for (let col = -1; col <= 7; col += 1) {
350
+ const r = baseRow + row;
351
+ const c = baseCol + col;
352
+ if (r < 0 || r >= size || c < 0 || c >= size) {
353
+ continue;
354
+ }
355
+ const ring = Math.max(Math.abs(row - 3), Math.abs(col - 3));
356
+ set(r, c, ring !== 2 && ring <= 3);
357
+ }
358
+ }
359
+ }
360
+ for (let i = 0; i < size; i += 1) {
361
+ if (grid[6][i] === null) {
362
+ set(6, i, i % 2 === 0);
363
+ }
364
+ if (grid[i][6] === null) {
365
+ set(i, 6, i % 2 === 0);
366
+ }
367
+ }
368
+ const positions = alignmentPositions(version);
369
+ for (const row of positions) {
370
+ for (const col of positions) {
371
+ const nearFinder = row <= 8 && col <= 8 || row <= 8 && col >= size - 9 || row >= size - 9 && col <= 8;
372
+ if (nearFinder) {
373
+ continue;
374
+ }
375
+ for (let dr = -2; dr <= 2; dr += 1) {
376
+ for (let dc = -2; dc <= 2; dc += 1) {
377
+ const ring = Math.max(Math.abs(dr), Math.abs(dc));
378
+ set(row + dr, col + dc, ring !== 1);
379
+ }
380
+ }
381
+ }
382
+ }
383
+ for (let i = 0; i < 9; i += 1) {
384
+ if (grid[8][i] === null) {
385
+ set(8, i, false);
386
+ }
387
+ if (grid[i][8] === null) {
388
+ set(i, 8, false);
389
+ }
390
+ }
391
+ for (let i = 0; i < 8; i += 1) {
392
+ set(8, size - 1 - i, false);
393
+ set(size - 1 - i, 8, false);
394
+ }
395
+ set(size - 8, 8, true);
396
+ if (version >= 7) {
397
+ const bits = versionBits(version);
398
+ for (let i = 0; i < 18; i += 1) {
399
+ const bit = (bits >>> i & 1) === 1;
400
+ set(Math.floor(i / 3), size - 11 + i % 3, bit);
401
+ set(size - 11 + i % 3, Math.floor(i / 3), bit);
402
+ }
403
+ }
404
+ return grid;
405
+ }
406
+ function placeData(grid, codewords) {
407
+ const size = grid.length;
408
+ let bitIndex = 0;
409
+ const nextBit = () => {
410
+ const byte = codewords[bitIndex >>> 3];
411
+ const bit = byte === void 0 ? 0 : byte >>> 7 - (bitIndex & 7) & 1;
412
+ bitIndex += 1;
413
+ return bit === 1;
414
+ };
415
+ let upward = true;
416
+ for (let right = size - 1; right >= 1; right -= 2) {
417
+ const pair = right === 6 ? [5, 4] : [right, right - 1];
418
+ for (let step = 0; step < size; step += 1) {
419
+ const row = upward ? size - 1 - step : step;
420
+ for (const col of pair) {
421
+ if (grid[row][col] === null) {
422
+ grid[row][col] = nextBit();
423
+ }
424
+ }
425
+ }
426
+ if (right === 6) {
427
+ right -= 1;
428
+ }
429
+ upward = !upward;
430
+ }
431
+ }
432
+ function maskCondition(mask, row, col) {
433
+ switch (mask) {
434
+ case 0:
435
+ return (row + col) % 2 === 0;
436
+ case 1:
437
+ return row % 2 === 0;
438
+ case 2:
439
+ return col % 3 === 0;
440
+ case 3:
441
+ return (row + col) % 3 === 0;
442
+ case 4:
443
+ return (Math.floor(row / 2) + Math.floor(col / 3)) % 2 === 0;
444
+ case 5:
445
+ return row * col % 2 + row * col % 3 === 0;
446
+ case 6:
447
+ return (row * col % 2 + row * col % 3) % 2 === 0;
448
+ default:
449
+ return ((row + col) % 2 + row * col % 3) % 2 === 0;
450
+ }
451
+ }
452
+ function penalty(modules) {
453
+ const size = modules.length;
454
+ let score = 0;
455
+ const scoreLine = (run) => run >= 5 ? run - 2 : 0;
456
+ for (let i = 0; i < size; i += 1) {
457
+ for (const horizontal of [true, false]) {
458
+ let run = 1;
459
+ for (let j = 1; j < size; j += 1) {
460
+ const prev = horizontal ? modules[i][j - 1] : modules[j - 1][i];
461
+ const cur = horizontal ? modules[i][j] : modules[j][i];
462
+ if (cur === prev) {
463
+ run += 1;
464
+ } else {
465
+ score += scoreLine(run);
466
+ run = 1;
467
+ }
468
+ }
469
+ score += scoreLine(run);
470
+ }
471
+ }
472
+ for (let row = 0; row < size - 1; row += 1) {
473
+ for (let col = 0; col < size - 1; col += 1) {
474
+ const a = modules[row][col];
475
+ if (a === modules[row][col + 1] && a === modules[row + 1][col] && a === modules[row + 1][col + 1]) {
476
+ score += 3;
477
+ }
478
+ }
479
+ }
480
+ const finderish = [true, false, true, true, true, false, true];
481
+ const light4 = [false, false, false, false];
482
+ const matches = (line, at, pattern) => pattern.every((want, i) => line[at + i] === want);
483
+ for (let i = 0; i < size; i += 1) {
484
+ const row = modules[i];
485
+ const col = modules.map((r) => r[i]);
486
+ for (const line of [row, col]) {
487
+ for (let j = 0; j + 7 <= size; j += 1) {
488
+ if (!matches(line, j, finderish)) {
489
+ continue;
490
+ }
491
+ if (j >= 4 && matches(line, j - 4, light4)) {
492
+ score += 40;
493
+ }
494
+ if (j + 11 <= size && matches(line, j + 7, light4)) {
495
+ score += 40;
496
+ }
497
+ }
498
+ }
499
+ }
500
+ let dark = 0;
501
+ for (const row of modules) {
502
+ for (const cell of row) {
503
+ if (cell) {
504
+ dark += 1;
505
+ }
506
+ }
507
+ }
508
+ const percent = dark * 100 / (size * size);
509
+ score += Math.floor(Math.abs(percent - 50) / 5) * 10;
510
+ return score;
511
+ }
512
+ function applyFormat(modules, ec, mask) {
513
+ const size = modules.length;
514
+ const bits = FORMAT_BITS[ec][mask] >>> 0;
515
+ const bit = (i) => (bits >>> i & 1) === 1;
516
+ for (let i = 0; i <= 5; i += 1) {
517
+ modules[8][i] = bit(14 - i);
518
+ }
519
+ modules[8][7] = bit(8);
520
+ modules[8][8] = bit(7);
521
+ modules[7][8] = bit(6);
522
+ for (let i = 9; i <= 14; i += 1) {
523
+ modules[14 - i][8] = bit(14 - i);
524
+ }
525
+ for (let i = 0; i <= 6; i += 1) {
526
+ modules[size - 1 - i][8] = bit(i);
527
+ }
528
+ for (let i = 7; i <= 14; i += 1) {
529
+ modules[8][size - 15 + i] = bit(i);
530
+ }
531
+ modules[size - 8][8] = true;
532
+ }
533
+ function encodeQr(value, options = {}) {
534
+ const ec = options.errorCorrection ?? "M";
535
+ if (tooLongToFit(value, options.mode ?? null)) {
536
+ throw new RangeError(
537
+ `Value is too long for a QR code (${value.length} characters; the maximum any mode can carry is ${ABSOLUTE_MAX_CHARACTERS})`
538
+ );
539
+ }
540
+ const mode = options.mode ?? selectMode(value);
541
+ if (tooLongToFit(value, mode)) {
542
+ throw new RangeError(
543
+ `Value is too long for a QR code in ${mode} mode (${value.length} characters; the maximum is ${maxCharacters(mode)})`
544
+ );
545
+ }
546
+ if (mode === "numeric" && !/^[0-9]*$/.test(value)) {
547
+ throw new RangeError("Numeric mode accepts digits only");
548
+ }
549
+ if (mode === "alphanumeric" && ![...value].every((char) => ALPHANUMERIC.includes(char))) {
550
+ throw new RangeError("Alphanumeric mode accepts 0-9 A-Z space and $%*+-./: only");
551
+ }
552
+ let version;
553
+ if (options.version !== void 0) {
554
+ if (options.version < MIN_VERSION || options.version > MAX_VERSION) {
555
+ throw new RangeError(`Version must be ${MIN_VERSION}-${MAX_VERSION}`);
556
+ }
557
+ version = options.version;
558
+ if (payloadBits(value, mode, version) > blockLayout(version, ec).dataCodewords * 8) {
559
+ throw new RangeError(`Value does not fit in version ${version} at level ${ec}`);
560
+ }
561
+ } else {
562
+ const chosen = selectVersion(value, mode, ec, MIN_VERSION);
563
+ if (chosen === null) {
564
+ throw new RangeError(
565
+ `Value is too long for a QR code at level ${ec} (${value.length} characters)`
566
+ );
567
+ }
568
+ version = chosen;
569
+ }
570
+ const codewords = interleave(dataCodewords(value, mode, version, ec), version, ec);
571
+ const template = reservedModules(version);
572
+ const candidates = [];
573
+ const masksToTry = options.mask === void 0 ? [0, 1, 2, 3, 4, 5, 6, 7] : [options.mask];
574
+ for (const mask of masksToTry) {
575
+ const grid = template.map((row) => [...row]);
576
+ placeData(grid, codewords);
577
+ const modules = grid.map(
578
+ (row, rowIndex) => row.map((cell, colIndex) => {
579
+ const value_ = cell;
580
+ const isData = template[rowIndex][colIndex] === null;
581
+ return isData && maskCondition(mask, rowIndex, colIndex) ? !value_ : value_;
582
+ })
583
+ );
584
+ applyFormat(modules, ec, mask);
585
+ candidates.push({ mask, modules });
586
+ }
587
+ const best = candidates.reduce((a, b) => penalty(a.modules) <= penalty(b.modules) ? a : b);
588
+ return {
589
+ modules: best.modules,
590
+ size: version * 4 + 17,
591
+ version,
592
+ errorCorrection: ec,
593
+ mode,
594
+ mask: best.mask
595
+ };
596
+ }
597
+ var QrCode = forwardRef(
598
+ ({
599
+ value,
600
+ size = 192,
601
+ errorCorrection = "M",
602
+ label,
603
+ quietZone = 4,
604
+ foreground = "currentColor",
605
+ background = "transparent",
606
+ mode,
607
+ version,
608
+ className,
609
+ ...props
610
+ }, ref) => {
611
+ const symbol = useMemo(
612
+ () => encodeQr(value, { errorCorrection, mode, version }),
613
+ [value, errorCorrection, mode, version]
614
+ );
615
+ const extent = symbol.size + quietZone * 2;
616
+ const path = useMemo(() => {
617
+ const parts = [];
618
+ for (let row = 0; row < symbol.size; row += 1) {
619
+ const line = symbol.modules[row];
620
+ let col = 0;
621
+ while (col < symbol.size) {
622
+ if (!line[col]) {
623
+ col += 1;
624
+ continue;
625
+ }
626
+ let run = 1;
627
+ while (col + run < symbol.size && line[col + run]) {
628
+ run += 1;
629
+ }
630
+ parts.push(`M${col + quietZone} ${row + quietZone}h${run}v1h-${run}z`);
631
+ col += run;
632
+ }
633
+ }
634
+ return parts.join("");
635
+ }, [symbol, quietZone]);
636
+ return /* @__PURE__ */ jsxs(
637
+ "svg",
638
+ {
639
+ ref,
640
+ width: size,
641
+ height: size,
642
+ viewBox: `0 0 ${extent} ${extent}`,
643
+ role: "img",
644
+ "aria-label": label,
645
+ shapeRendering: "crispEdges",
646
+ className: cn("fa-qr-code", className),
647
+ ...props,
648
+ children: [
649
+ background !== "transparent" && /* @__PURE__ */ jsx("rect", { width: extent, height: extent, fill: background }),
650
+ /* @__PURE__ */ jsx("path", { d: path, fill: foreground })
651
+ ]
652
+ }
653
+ );
654
+ }
655
+ );
656
+ QrCode.displayName = "QrCode";
657
+
658
+ export { QrCode, encodeQr, selectMode };
659
+ //# sourceMappingURL=chunk-IMYJIPNK.js.map
660
+ //# sourceMappingURL=chunk-IMYJIPNK.js.map