@vielzeug/sigil 3.1.0 → 26.10.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.
Files changed (78) hide show
  1. package/README.md +5 -5
  2. package/dist/_format.cjs +1 -1
  3. package/dist/_format.cjs.map +1 -1
  4. package/dist/_format.js +1 -36
  5. package/dist/_format.js.map +1 -1
  6. package/dist/_galois.cjs +1 -1
  7. package/dist/_galois.cjs.map +1 -1
  8. package/dist/_galois.d.ts +1 -1
  9. package/dist/_galois.d.ts.map +1 -1
  10. package/dist/_galois.js +1 -21
  11. package/dist/_galois.js.map +1 -1
  12. package/dist/_mask.cjs +1 -1
  13. package/dist/_mask.cjs.map +1 -1
  14. package/dist/_mask.js +1 -80
  15. package/dist/_mask.js.map +1 -1
  16. package/dist/_matrix.cjs +1 -1
  17. package/dist/_matrix.cjs.map +1 -1
  18. package/dist/_matrix.d.ts +1 -1
  19. package/dist/_matrix.d.ts.map +1 -1
  20. package/dist/_matrix.js +1 -64
  21. package/dist/_matrix.js.map +1 -1
  22. package/dist/_reed-solomon.cjs +1 -1
  23. package/dist/_reed-solomon.cjs.map +1 -1
  24. package/dist/_reed-solomon.js +1 -21
  25. package/dist/_reed-solomon.js.map +1 -1
  26. package/dist/_segments.cjs +1 -1
  27. package/dist/_segments.cjs.map +1 -1
  28. package/dist/_segments.d.ts +22 -11
  29. package/dist/_segments.d.ts.map +1 -1
  30. package/dist/_segments.js +1 -69
  31. package/dist/_segments.js.map +1 -1
  32. package/dist/_tables.cjs +1 -1
  33. package/dist/_tables.cjs.map +1 -1
  34. package/dist/_tables.d.ts +4 -4
  35. package/dist/_tables.js +1 -408
  36. package/dist/_tables.js.map +1 -1
  37. package/dist/canvas.cjs +1 -1
  38. package/dist/canvas.cjs.map +1 -1
  39. package/dist/canvas.d.ts +1 -1
  40. package/dist/canvas.d.ts.map +1 -1
  41. package/dist/canvas.js +1 -13
  42. package/dist/canvas.js.map +1 -1
  43. package/dist/encode.cjs +1 -1
  44. package/dist/encode.cjs.map +1 -1
  45. package/dist/encode.d.ts +3 -1
  46. package/dist/encode.d.ts.map +1 -1
  47. package/dist/encode.js +1 -111
  48. package/dist/encode.js.map +1 -1
  49. package/dist/errors.cjs +1 -1
  50. package/dist/errors.cjs.map +1 -1
  51. package/dist/errors.js +1 -16
  52. package/dist/errors.js.map +1 -1
  53. package/dist/index.cjs +1 -1
  54. package/dist/index.js +1 -6
  55. package/dist/scan.cjs +1 -1
  56. package/dist/scan.cjs.map +1 -1
  57. package/dist/scan.d.ts.map +1 -1
  58. package/dist/scan.js +1 -140
  59. package/dist/scan.js.map +1 -1
  60. package/dist/sigil.cjs +1 -1
  61. package/dist/sigil.cjs.map +1 -1
  62. package/dist/sigil.iife.js +1 -1
  63. package/dist/sigil.iife.js.map +1 -1
  64. package/dist/sigil.js +1 -1
  65. package/dist/sigil.js.map +1 -1
  66. package/dist/svg.cjs +1 -1
  67. package/dist/svg.cjs.map +1 -1
  68. package/dist/svg.js +1 -25
  69. package/dist/svg.js.map +1 -1
  70. package/dist/types.d.ts +5 -7
  71. package/dist/types.d.ts.map +1 -1
  72. package/package.json +5 -5
  73. package/dist/_dev.cjs +0 -2
  74. package/dist/_dev.cjs.map +0 -1
  75. package/dist/_dev.d.ts +0 -2
  76. package/dist/_dev.d.ts.map +0 -1
  77. package/dist/_dev.js +0 -6
  78. package/dist/_dev.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sigil.iife.js","names":[],"sources":["../src/canvas.ts","../src/_dev.ts","../src/_tables.ts","../src/_format.ts","../src/_mask.ts","../src/_matrix.ts","../src/_galois.ts","../src/_reed-solomon.ts","../src/_segments.ts","../src/errors.ts","../src/encode.ts","../src/scan.ts","../src/svg.ts"],"sourcesContent":["import type { QrCanvasOptions, QrMatrix } from './types';\n\n/**\n * Canvas rendering — the only DOM-touching output path.\n * Resizes the canvas to `(size + 2*margin) * scale` CSS pixels, backing-store\n * scaled by `devicePixelRatio`, and paints one `fillRect` per dark module.\n * Returns the CSS pixel size so callers can size wrappers.\n */\nexport function drawToCanvas(matrix: QrMatrix, canvas: HTMLCanvasElement, options: QrCanvasOptions = {}): number {\n const margin = options.margin ?? 4;\n const scale = options.scale ?? 1;\n const dark = options.dark ?? '#000000';\n const light = options.light ?? '#ffffff';\n const cssSize = (matrix.size + margin * 2) * scale;\n const dpr = globalThis.devicePixelRatio || 1;\n\n canvas.width = cssSize * dpr;\n canvas.height = cssSize * dpr;\n canvas.style.width = `${cssSize}px`;\n canvas.style.height = `${cssSize}px`;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Canvas 2D context unavailable');\n ctx.scale(dpr, dpr);\n ctx.fillStyle = light;\n ctx.fillRect(0, 0, cssSize, cssSize);\n ctx.fillStyle = dark;\n for (let y = 0; y < matrix.size; y++)\n for (let x = 0; x < matrix.size; x++)\n if (matrix.get(x, y)) ctx.fillRect((x + margin) * scale, (y + margin) * scale, scale, scale);\n return cssSize;\n}\n","const isDev = !(globalThis as { __SIGIL_PROD__?: boolean }).__SIGIL_PROD__;\n\n/** @internal @security Messages may include user-supplied payload sizes. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/sigil] ${msg}`);\n}\n\n/** @internal — Run fn only in dev builds. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n","import type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * QR Model 2 lookup tables, transcribed from ISO/IEC 18004:2015:\n * - `EC_CODEWORDS_PER_BLOCK` / `NUM_EC_BLOCKS` — Table 9 (error-correction\n * characteristics). Stored as per-block EC codewords and block count; the\n * group-1/group-2 split is derived, since all blocks share one EC length.\n * - `alignmentPatternPositions` — Table E.1, computed by the spec formula.\n * - `CHAR_COUNT_BITS` — Table 3 (character-count indicator bit widths).\n * - `FORMAT_EC_BITS` — Table 10 (2-bit level field inside format information).\n *\n * `tables.test.ts` cross-checks every entry against the raw-module formula, so\n * a transcription slip fails the consistency test before the decode oracle runs.\n */\n\n/** Index order used by the table rows below. */\nexport const EC_LEVELS = ['L', 'M', 'Q', 'H'] as const;\n\nexport const ALPHANUMERIC_CHARSET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:';\n\n/** Mode indicators (Table 2). */\nexport const MODE_BITS: Record<QrMode, number> = {\n alphanumeric: 0b0010,\n byte: 0b0100,\n numeric: 0b0001,\n};\n\n/** Character-count indicator widths for version groups 1–9 / 10–26 / 27–40. */\nexport const CHAR_COUNT_BITS: Record<QrMode, readonly [number, number, number]> = {\n alphanumeric: [9, 11, 13],\n byte: [8, 16, 16],\n numeric: [10, 12, 14],\n};\n\n/** EC level bits inside format information (L=01, M=00, Q=11, H=10). */\nexport const FORMAT_EC_BITS: Record<QrErrorCorrection, number> = { H: 0b10, L: 0b01, M: 0b00, Q: 0b11 };\n\n/** Row 0 = L, row 1 = M, row 2 = Q, row 3 = H; column 0 unused (versions start at 1). */\nexport const EC_CODEWORDS_PER_BLOCK: ReadonlyArray<ReadonlyArray<number>> = [\n // prettier-ignore\n [\n -1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n // prettier-ignore\n [\n -1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28,\n 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n ],\n // prettier-ignore\n [\n -1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n // prettier-ignore\n [\n -1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n];\n\nexport const NUM_EC_BLOCKS: ReadonlyArray<ReadonlyArray<number>> = [\n // prettier-ignore\n [\n -1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19,\n 19, 20, 21, 22, 24, 25,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31,\n 33, 35, 37, 38, 40, 43, 45, 47, 49,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43,\n 45, 48, 51, 53, 56, 59, 62, 65, 68,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48,\n 51, 56, 59, 62, 65, 68, 71, 74, 77, 81,\n ],\n];\n\nconst ecIndex = (level: QrErrorCorrection): number => EC_LEVELS.indexOf(level);\n\n/** Total modules per side. */\nexport const matrixSize = (version: number): number => version * 4 + 17;\n\n/** Alignment-pattern center coordinates (Table E.1 formula). */\nexport function alignmentPatternPositions(version: number): readonly number[] {\n if (version === 1) return [];\n const numAlign = Math.floor(version / 7) + 2;\n const step = version === 32 ? 26 : Math.ceil((version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n const result = [6];\n for (let pos = version * 4 + 10; result.length < numAlign; pos -= step) result.splice(1, 0, pos);\n return result;\n}\n\n/**\n * Total raw modules available for data + EC + remainder bits, derived from the\n * symbol geometry (Table 1 / Annex A): full grid minus finders, separators,\n * timing, alignment, dark module, format and version information.\n */\nexport function rawDataModules(version: number): number {\n let result = (16 * version + 128) * version + 64;\n if (version >= 2) {\n const numAlign = Math.floor(version / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (version >= 7) result -= 36;\n }\n return result;\n}\n\n/** Total codewords (data + EC) for a version. */\nexport const totalCodewords = (version: number): number => Math.floor(rawDataModules(version) / 8);\n\n/** Leftover bits after the codeword stream (0, 3, 4, or 7 by version). */\nexport const remainderBits = (version: number): number => rawDataModules(version) % 8;\n\nexport function ecCodewordsPerBlock(version: number, level: QrErrorCorrection): number {\n return EC_CODEWORDS_PER_BLOCK[ecIndex(level)][version];\n}\n\nexport function numEcBlocks(version: number, level: QrErrorCorrection): number {\n return NUM_EC_BLOCKS[ecIndex(level)][version];\n}\n\n/** Data codewords for a (version, level) pair. */\nexport function dataCodewords(version: number, level: QrErrorCorrection): number {\n return totalCodewords(version) - ecCodewordsPerBlock(version, level) * numEcBlocks(version, level);\n}\n\n/** Version group for the character-count indicator: 0 → 1–9, 1 → 10–26, 2 → 27–40. */\nexport function versionGroup(version: number): 0 | 1 | 2 {\n return version <= 9 ? 0 : version <= 26 ? 1 : 2;\n}\n","import type { QrGrid } from './_matrix';\nimport { FORMAT_EC_BITS } from './_tables';\nimport type { QrErrorCorrection } from './types';\n\n/**\n * Format and version information (§7.9, Annexes C–D):\n * - Format: 5 data bits (2 EC + 3 mask) → BCH(15,5) remainder → XOR 0x5412,\n * written twice around the finders.\n * - Version (v≥7): 6 data bits → BCH(18,6) remainder, written twice in the\n * 6×3 blocks at top-right and bottom-left.\n */\n\nconst BCH_FORMAT_POLY = 0b10100110111; // x¹⁰+x⁸+x⁵+x⁴+x²+x+1\nconst BCH_FORMAT_MASK = 0b101010000010010; // 0x5412\nconst BCH_VERSION_POLY = 0b1111100100101; // x¹²+x¹¹+x¹⁰+x⁹+x⁸+x⁵+x²+1\n\n/** 15-bit format information word for (level, mask). */\nexport function formatInfoBits(level: QrErrorCorrection, mask: number): number {\n const data = (FORMAT_EC_BITS[level] << 3) | mask;\n let rem = data;\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ (((rem >>> 9) & 1) * BCH_FORMAT_POLY);\n return ((data << 10) | (rem & 0x3ff)) ^ BCH_FORMAT_MASK;\n}\n\n/** 18-bit version information word (version ≥ 7). */\nexport function versionInfoBits(version: number): number {\n let rem = version;\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ (((rem >>> 11) & 1) * BCH_VERSION_POLY);\n return (version << 12) | (rem & 0xfff);\n}\n\nconst setFunction = (grid: QrGrid, x: number, y: number, dark: boolean): void => {\n grid.modules[y][x] = dark;\n grid.isFunction[y][x] = true;\n};\n\n/** Write both copies of the 15-bit format word plus the dark module. */\nexport function drawFormatInfo(grid: QrGrid, level: QrErrorCorrection, mask: number): void {\n const size = grid.size;\n const bits = formatInfoBits(level, mask);\n const bit = (i: number) => ((bits >>> i) & 1) === 1;\n\n // First copy around the top-left finder.\n for (let i = 0; i <= 5; i++) setFunction(grid, 8, i, bit(i));\n setFunction(grid, 8, 7, bit(6));\n setFunction(grid, 8, 8, bit(7));\n setFunction(grid, 7, 8, bit(8));\n for (let i = 9; i < 15; i++) setFunction(grid, 14 - i, 8, bit(i));\n\n // Second copy: row 8 beside the top-right finder (bits 0–7),\n // column 8 beside the bottom-left finder (bits 8–14).\n for (let i = 0; i < 8; i++) setFunction(grid, size - 1 - i, 8, bit(i));\n for (let i = 8; i < 15; i++) setFunction(grid, 8, size - 15 + i, bit(i));\n\n // Always-dark module below the bottom-left strip.\n setFunction(grid, 8, size - 8, true);\n}\n\n/** Write both 6×3 version-information blocks (v≥7). */\nexport function drawVersionInfo(grid: QrGrid, version: number): void {\n if (version < 7) return;\n const size = grid.size;\n const bits = versionInfoBits(version);\n for (let i = 0; i < 18; i++) {\n const dark = ((bits >>> i) & 1) === 1;\n const a = size - 11 + (i % 3);\n const b = Math.floor(i / 3);\n setFunction(grid, a, b, dark); // top-right\n setFunction(grid, b, a, dark); // bottom-left\n }\n}\n","import type { QrGrid } from './_matrix';\n\n/**\n * Data masks and penalty scoring (§7.8.2–7.8.3):\n * eight mask functions XORed onto data modules only, then four penalty rules\n * (N1=3 runs, N2=3 blocks, N3=40 finder-like patterns, N4=10 dark ratio).\n */\n\ntype MaskFn = (x: number, y: number) => boolean;\n\nexport const MASK_FNS: readonly MaskFn[] = [\n (x, y) => (x + y) % 2 === 0,\n (_x, y) => y % 2 === 0,\n (x) => x % 3 === 0,\n (x, y) => (x + y) % 3 === 0,\n (x, y) => (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0,\n (x, y) => ((x * y) % 2) + ((x * y) % 3) === 0,\n (x, y) => (((x * y) % 2) + ((x * y) % 3)) % 2 === 0,\n (x, y) => (((x + y) % 2) + ((x * y) % 3)) % 2 === 0,\n];\n\n/** XOR mask `m` onto every non-function module. Idempotent per mask. */\nexport function applyMask(grid: QrGrid, mask: number): void {\n const fn = MASK_FNS[mask];\n for (let y = 0; y < grid.size; y++)\n for (let x = 0; x < grid.size; x++)\n if (!grid.isFunction[y][x] && fn(x, y)) grid.modules[y][x] = !grid.modules[y][x];\n}\n\nconst PENALTY_N1 = 3;\nconst PENALTY_N2 = 3;\nconst PENALTY_N3 = 40;\nconst PENALTY_N4 = 10;\n\n// Runs of ≥5 same-color modules in a row or column: N1 + (run − 5).\nfunction penaltyRuns(grid: QrGrid): number {\n let penalty = 0;\n const line = (same: boolean, run: number): number => {\n if (!same && run >= 5) penalty += PENALTY_N1 + run - 5;\n return same ? run + 1 : 1;\n };\n for (let i = 0; i < grid.size; i++) {\n let runRow = 1;\n let runCol = 1;\n for (let j = 1; j < grid.size; j++) {\n runRow = line(grid.modules[i][j] === grid.modules[i][j - 1], runRow);\n runCol = line(grid.modules[j][i] === grid.modules[j - 1][i], runCol);\n }\n if (runRow >= 5) penalty += PENALTY_N1 + runRow - 5;\n if (runCol >= 5) penalty += PENALTY_N1 + runCol - 5;\n }\n return penalty;\n}\n\n// 2×2 blocks of a single color.\nfunction penaltyBlocks(grid: QrGrid): number {\n let penalty = 0;\n for (let y = 0; y < grid.size - 1; y++)\n for (let x = 0; x < grid.size - 1; x++) {\n const c = grid.modules[y][x];\n if (c === grid.modules[y][x + 1] && c === grid.modules[y + 1][x] && c === grid.modules[y + 1][x + 1])\n penalty += PENALTY_N2;\n }\n return penalty;\n}\n\n// 1:1:3:1:1 finder-like patterns with a 4-module light border on either side.\nfunction penaltyFinderLike(grid: QrGrid): number {\n const size = grid.size;\n let penalty = 0;\n const checkLine = (get: (i: number) => boolean): void => {\n for (let i = 0; i + 11 <= size; i++) {\n const window = Array.from({ length: 11 }, (_, k) => get(i + k));\n const coreA = [false, false, false, false, true, false, true, true, true, false, true];\n const coreB = [true, false, true, true, true, false, true, false, false, false, false];\n if (window.every((v, k) => v === coreA[k]) || window.every((v, k) => v === coreB[k])) penalty += PENALTY_N3;\n }\n };\n for (let y = 0; y < size; y++) checkLine((i) => grid.modules[y][i]);\n for (let x = 0; x < size; x++) checkLine((i) => grid.modules[i][x]);\n return penalty;\n}\n\n// Ratio of dark modules: each 5% step away from 50% costs N4.\nfunction penaltyRatio(grid: QrGrid): number {\n let dark = 0;\n for (const row of grid.modules) for (const m of row) if (m) dark++;\n const total = grid.size * grid.size;\n const k = Math.floor(Math.abs(dark * 20 - total * 10) / total);\n return k * PENALTY_N4;\n}\n\n/** Total penalty score for a fully masked matrix. */\nexport function penaltyScore(grid: QrGrid): number {\n return penaltyRuns(grid) + penaltyBlocks(grid) + penaltyFinderLike(grid) + penaltyRatio(grid);\n}\n","import { alignmentPatternPositions } from './_tables';\n\n/**\n * Module placement (§7.7–7.9, Annex E): function patterns are drawn first and\n * recorded in `isFunction`, then the codeword bit stream fills the remaining\n * modules in a two-column zigzag starting bottom-right, skipping column 6.\n */\n\nexport interface QrGrid {\n /** Modules owned by function patterns — skipped by data placement and masks. */\n readonly isFunction: boolean[][];\n /** Final module colors; `true` = dark. Mutable during construction. */\n modules: boolean[][];\n readonly size: number;\n}\n\nexport function createGrid(size: number): QrGrid {\n return {\n isFunction: Array.from({ length: size }, () => new Array<boolean>(size).fill(false)),\n modules: Array.from({ length: size }, () => new Array<boolean>(size).fill(false)),\n size,\n };\n}\n\nconst setFunction = (grid: QrGrid, x: number, y: number, dark: boolean): void => {\n grid.modules[y][x] = dark;\n grid.isFunction[y][x] = true;\n};\n\n/** 7×7 finder pattern plus the one-module separator ring, centered at (x+3, y+3). */\nfunction drawFinder(grid: QrGrid, x: number, y: number): void {\n for (let dy = -4; dy <= 4; dy++)\n for (let dx = -4; dx <= 4; dx++) {\n const xx = x + 3 + dx;\n const yy = y + 3 + dy;\n if (xx < 0 || yy < 0 || xx >= grid.size || yy >= grid.size) continue;\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n setFunction(grid, xx, yy, dist !== 2 && dist !== 4);\n }\n}\n\n/** Alternating timing pattern along row/col 6, between the finders. */\nfunction drawTiming(grid: QrGrid): void {\n for (let i = 8; i < grid.size - 8; i++) {\n const dark = i % 2 === 0;\n if (!grid.isFunction[6][i]) setFunction(grid, i, 6, dark);\n if (!grid.isFunction[i][6]) setFunction(grid, 6, i, dark);\n }\n}\n\n/** 5×5 alignment pattern centered at (cx, cy). */\nfunction drawAlignment(grid: QrGrid, cx: number, cy: number): void {\n for (let dy = -2; dy <= 2; dy++)\n for (let dx = -2; dx <= 2; dx++) setFunction(grid, cx + dx, cy + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);\n}\n\n/**\n * Reserve the 15 format-info modules around each finder (both copies) and the\n * 6×3 version-info blocks for v≥7 — drawn later by `_format.ts`, but data\n * placement must skip them now.\n */\nfunction reserveFormatAreas(grid: QrGrid): void {\n const size = grid.size;\n // Around the top-left finder.\n for (let i = 0; i <= 8; i++) {\n if (i !== 6) {\n grid.isFunction[8][i] = true;\n grid.isFunction[i][8] = true;\n }\n }\n // Second copy: column 8 rows size-1..size-7 beside the bottom-left finder,\n // row 8 columns size-1..size-8 beside the top-right finder.\n for (let i = 0; i < 7; i++) grid.isFunction[size - 1 - i][8] = true;\n for (let i = 0; i < 8; i++) grid.isFunction[8][size - 1 - i] = true;\n // Always-dark module below the bottom-left format strip.\n grid.isFunction[size - 8][8] = true;\n}\n\nfunction reserveVersionAreas(grid: QrGrid, version: number): void {\n if (version < 7) return;\n const size = grid.size;\n for (let i = 0; i < 18; i++) {\n const a = size - 11 + (i % 3);\n const b = Math.floor(i / 3);\n grid.isFunction[b][a] = true; // top-right block\n grid.isFunction[a][b] = true; // bottom-left block\n }\n}\n\n/** Draw every function pattern and mark reserved areas. */\nexport function drawFunctionPatterns(grid: QrGrid, version: number): void {\n drawFinder(grid, 0, 0);\n drawFinder(grid, grid.size - 7, 0);\n drawFinder(grid, 0, grid.size - 7);\n drawTiming(grid);\n const positions = alignmentPatternPositions(version);\n for (const cy of positions)\n for (const cx of positions) {\n // Skip the three corners covered by finder patterns.\n const isCorner =\n (cx === 6 && cy === 6) || (cx === 6 && cy === grid.size - 7) || (cx === grid.size - 7 && cy === 6);\n if (!isCorner) drawAlignment(grid, cx, cy);\n }\n reserveFormatAreas(grid);\n reserveVersionAreas(grid, version);\n}\n\n/** Place codeword bits into non-function modules via the zigzag scan. */\nexport function placeData(grid: QrGrid, codewords: readonly number[]): void {\n const size = grid.size;\n const totalBits = codewords.length * 8;\n let bitIndex = 0;\n let upward = true;\n for (let right = size - 1; right >= 1; right -= 2) {\n if (right === 6) right = 5; // skip the vertical timing column\n for (let vert = 0; vert < size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const y = upward ? size - 1 - vert : vert;\n if (grid.isFunction[y][x]) continue;\n grid.modules[y][x] = bitIndex < totalBits && ((codewords[bitIndex >>> 3] >>> (7 - (bitIndex & 7))) & 1) === 1;\n bitIndex++;\n }\n }\n upward = !upward;\n }\n}\n","/**\n * GF(2⁸) arithmetic over the QR primitive polynomial x⁸+x⁴+x³+x²+1 (0x11D).\n * Tables are built once at module load: `EXP[i] = αⁱ` for generator α = 2.\n */\n\nconst PRIMITIVE = 0x11d;\n\nconst EXP = new Uint8Array(512);\nconst LOG = new Uint8Array(256);\n\n{\n let x = 1;\n for (let i = 0; i < 255; i++) {\n EXP[i] = x;\n LOG[x] = i;\n x <<= 1;\n if (x & 0x100) x ^= PRIMITIVE;\n }\n // Duplicate the cycle so `EXP[log(a) + log(b)]` never needs a mod.\n for (let i = 255; i < 512; i++) EXP[i] = EXP[i - 255];\n}\n\n/** `a * b` in GF(256); `0` when either operand is 0. */\nexport function gfMultiply(a: number, b: number): number {\n return a === 0 || b === 0 ? 0 : EXP[LOG[a] + LOG[b]];\n}\n\n/** `αⁱ` — the i-th power of the generator. `i` may exceed 254 (wraps). */\nexport function gfExp(i: number): number {\n return EXP[i % 255];\n}\n\n/** Polynomial evaluation in GF(256): Σ coeffᵢ·xⁱ with coeff[0] highest-degree. */\nexport function gfPolyEval(coeffs: readonly number[], x: number): number {\n let y = 0;\n for (const c of coeffs) y = gfMultiply(y, x) ^ c;\n return y;\n}\n\n/** Multiply two polynomials (coefficients highest-degree first). */\nexport function gfPolyMultiply(p: readonly number[], q: readonly number[]): number[] {\n const out = new Array<number>(p.length + q.length - 1).fill(0);\n for (let i = 0; i < p.length; i++) for (let j = 0; j < q.length; j++) out[i + j] ^= gfMultiply(p[i], q[j]);\n return out;\n}\n","import { gfExp, gfMultiply, gfPolyMultiply } from './_galois';\n\n/**\n * Reed–Solomon error-correction codewords over GF(256).\n * The generator polynomial for `degree` EC codewords is ∏ᵢ₌₀..degree₋₁ (x − αⁱ);\n * results are cached per degree (max 30 per ISO Table 9).\n */\n\nconst generatorCache = new Map<number, readonly number[]>();\n\n/** Generator polynomial coefficients (highest-degree first, leading 1 kept). */\nfunction generatorPoly(degree: number): readonly number[] {\n const poly = generatorCache.get(degree);\n if (poly) return poly;\n let g = [1];\n for (let i = 0; i < degree; i++) g = gfPolyMultiply(g, [1, gfExp(i)]);\n generatorCache.set(degree, g);\n return g;\n}\n\n/** EC codewords for one data block: remainder of data·x^degree ÷ generator. */\nexport function ecCodewords(data: readonly number[], degree: number): number[] {\n const gen = generatorPoly(degree); // gen[0] === 1\n const rem = new Array<number>(degree).fill(0);\n for (const b of data) {\n const factor = b ^ rem[0];\n rem.copyWithin(0, 1);\n rem[degree - 1] = 0;\n if (factor !== 0) for (let j = 0; j < degree; j++) rem[j] ^= gfMultiply(gen[j + 1], factor);\n }\n return rem;\n}\n","import { ALPHANUMERIC_CHARSET, CHAR_COUNT_BITS, dataCodewords, MODE_BITS, versionGroup } from './_tables';\nimport type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * Data-segment assembly: one segment (single mode) covering the whole input,\n * followed by terminator, byte alignment, and 0xEC/0x11 padding (§7.4–7.5).\n * Kanji and multi-segment optimization are out of scope.\n */\n\n/** Growable bit stream; `bytes` is valid only after `padToByte()`. */\nexport class BitStream {\n private bits: number[] = [];\n\n get length(): number {\n return this.bits.length;\n }\n\n append(value: number, width: number): void {\n for (let i = width - 1; i >= 0; i--) this.bits.push((value >>> i) & 1);\n }\n\n padToByte(): void {\n while (this.bits.length % 8 !== 0) this.bits.push(0);\n }\n\n toBytes(): number[] {\n const out: number[] = [];\n for (let i = 0; i < this.bits.length; i += 8) {\n let b = 0;\n for (let j = 0; j < 8; j++) b = (b << 1) | this.bits[i + j];\n out.push(b);\n }\n return out;\n }\n}\n\n/** Most compact mode able to encode the whole input. */\nexport function detectMode(data: string): QrMode {\n if (/^\\d+$/.test(data)) return 'numeric';\n for (const ch of data) if (!ALPHANUMERIC_CHARSET.includes(ch)) return 'byte';\n return 'alphanumeric';\n}\n\nconst textEncoder = new TextEncoder();\n\n/** Payload bits for the segment body (without mode/count headers). */\nexport function dataBitLength(data: string, mode: QrMode): number {\n switch (mode) {\n case 'numeric':\n return Math.floor(data.length / 3) * 10 + (data.length % 3 === 1 ? 4 : data.length % 3 === 2 ? 7 : 0);\n case 'alphanumeric':\n return Math.floor(data.length / 2) * 11 + (data.length % 2) * 6;\n case 'byte':\n return textEncoder.encode(data).length * 8;\n }\n}\n\n/** Append mode indicator, char count, and payload bits. */\nexport function appendSegment(stream: BitStream, data: string, mode: QrMode, version: number): void {\n stream.append(MODE_BITS[mode], 4);\n stream.append(charCount(data, mode), CHAR_COUNT_BITS[mode][versionGroup(version)]);\n switch (mode) {\n case 'numeric':\n for (let i = 0; i < data.length; ) {\n const n = Math.min(3, data.length - i);\n stream.append(Number.parseInt(data.slice(i, i + n), 10), n === 3 ? 10 : n === 2 ? 7 : 4);\n i += n;\n }\n break;\n case 'alphanumeric':\n for (let i = 0; i < data.length; ) {\n if (i + 1 < data.length) {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(data[i]) * 45 + ALPHANUMERIC_CHARSET.indexOf(data[i + 1]), 11);\n i += 2;\n } else {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(data[i]), 6);\n i += 1;\n }\n }\n break;\n case 'byte':\n for (const b of textEncoder.encode(data)) stream.append(b, 8);\n break;\n }\n}\n\n/** Chars/bytes reported in the count field. Byte mode counts encoded bytes. */\nexport function charCount(data: string, mode: QrMode): number {\n return mode === 'byte' ? textEncoder.encode(data).length : data.length;\n}\n\n/** Capacity in bits for the data area of (version, level). */\nexport const dataCapacityBits = (version: number, level: QrErrorCorrection): number =>\n dataCodewords(version, level) * 8;\n\n/** Bits a segment occupies at `version`: header + payload, before terminator. */\nexport function segmentBits(data: string, mode: QrMode, version: number): number {\n return 4 + CHAR_COUNT_BITS[mode][versionGroup(version)] + dataBitLength(data, mode);\n}\n\n/**\n * Full data-codeword sequence for (version, level): segment + terminator +\n * alignment + pad bytes. Caller guarantees the segment fits.\n */\nexport function buildDataCodewords(data: string, mode: QrMode, version: number, level: QrErrorCorrection): number[] {\n const stream = new BitStream();\n appendSegment(stream, data, mode, version);\n const capacity = dataCapacityBits(version, level);\n stream.append(0, Math.min(4, capacity - stream.length)); // terminator\n stream.padToByte();\n const bytes = stream.toBytes();\n const pad = [0xec, 0x11];\n for (let i = 0; bytes.length < dataCodewords(version, level); i++) bytes.push(pad[i % 2]);\n return bytes;\n}\n","/**\n * Base class for all sigil errors.\n * Use `instanceof SigilError` to catch any sigil-originated error in one branch.\n */\nexport class SigilError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when input data does not fit in the requested version/level. */\nexport class SigilCapacityError extends SigilError {\n readonly bytes: number;\n readonly maxBytes: number;\n readonly version: number;\n\n constructor(message: string, bytes: number, maxBytes: number, version: number, opts?: ErrorOptions) {\n super(message, opts);\n this.bytes = bytes;\n this.maxBytes = maxBytes;\n this.version = version;\n }\n}\n\n/** Thrown for an invalid option: version/minVersion out of range, mask outside 0–7. */\nexport class SigilOptionError extends SigilError {}\n\n/**\n * Thrown when the environment lacks `BarcodeDetector`, `getUserMedia`, or QR\n * format support. Feature-detect with `isQrScanSupported()`/`qrScanSupport()`.\n */\nexport class SigilUnsupportedError extends SigilError {}\n\n/** Thrown when camera access is denied (wraps `NotAllowedError`). */\nexport class SigilPermissionError extends SigilError {}\n\n/** Thrown when a disposed scanner is used. */\nexport class SigilDisposedError extends SigilError {}\n","import { warn } from './_dev';\nimport { drawFormatInfo, drawVersionInfo } from './_format';\nimport { applyMask, penaltyScore } from './_mask';\nimport { createGrid, drawFunctionPatterns, placeData } from './_matrix';\nimport { ecCodewords } from './_reed-solomon';\nimport { buildDataCodewords, detectMode, segmentBits } from './_segments';\nimport {\n ALPHANUMERIC_CHARSET,\n CHAR_COUNT_BITS,\n dataCodewords,\n ecCodewordsPerBlock,\n matrixSize,\n numEcBlocks,\n totalCodewords,\n versionGroup,\n} from './_tables';\nimport { SigilCapacityError, SigilOptionError } from './errors';\nimport type { QrEncodeOptions, QrErrorCorrection, QrMatrix, QrMode } from './types';\n\nconst MAX_VERSION = 40;\n\nfunction checkOptions(options: QrEncodeOptions): void {\n const { version, minVersion, mask, errorCorrection } = options;\n const inRange = (v: number) => Number.isInteger(v) && v >= 1 && v <= MAX_VERSION;\n if (version !== undefined && !inRange(version))\n throw new SigilOptionError(`version must be an integer 1–${MAX_VERSION}, got ${version}`);\n if (minVersion !== undefined && !inRange(minVersion))\n throw new SigilOptionError(`minVersion must be an integer 1–${MAX_VERSION}, got ${minVersion}`);\n if (version !== undefined && minVersion !== undefined && minVersion > version)\n throw new SigilOptionError(`minVersion (${minVersion}) exceeds version (${version})`);\n if (mask !== undefined && (!Number.isInteger(mask) || mask < 0 || mask > 7))\n throw new SigilOptionError(`mask must be an integer 0–7, got ${mask}`);\n if (errorCorrection !== undefined && !'LMQH'.includes(errorCorrection))\n throw new SigilOptionError(`errorCorrection must be 'L', 'M', 'Q', or 'H'`);\n}\n\n/** Character capacity of (version, level, mode) — the `qrCapacity` core. */\nfunction capacityFor(version: number, level: QrErrorCorrection, mode: QrMode): number {\n const countBits = CHAR_COUNT_BITS[mode][versionGroup(version)];\n const usable = dataCodewords(version, level) * 8 - 4 - countBits;\n if (usable <= 0) return 0;\n switch (mode) {\n case 'numeric':\n return Math.floor(usable / 10) * 3 + (usable % 10 >= 7 ? 2 : usable % 10 >= 4 ? 1 : 0);\n case 'alphanumeric':\n return Math.floor(usable / 11) * 2 + (usable % 11 >= 6 ? 1 : 0);\n case 'byte':\n return Math.floor(usable / 8);\n }\n}\n\n/** Smallest version ≥ minVersion whose data area fits the segment. */\nfunction pickVersion(data: string, mode: QrMode, level: QrErrorCorrection, minVersion: number): number {\n for (let v = minVersion; v <= MAX_VERSION; v++)\n if (segmentBits(data, mode, v) <= dataCodewords(v, level) * 8) return v;\n // Nothing fits — the caller reports against v40.\n return -1;\n}\n\n/** Split data codewords into EC blocks and interleave data + EC (§7.6). */\nfunction interleaveBlocks(data: readonly number[], version: number, level: QrErrorCorrection): number[] {\n const numBlocks = numEcBlocks(version, level);\n const ecLen = ecCodewordsPerBlock(version, level);\n const rawLen = totalCodewords(version);\n const shortLen = Math.floor(rawLen / numBlocks) - ecLen; // data codewords in a short block\n const numLong = rawLen % numBlocks; // long blocks carry one extra data codeword\n\n const blocks: number[][] = [];\n let offset = 0;\n for (let b = 0; b < numBlocks; b++) {\n const isLong = b >= numBlocks - numLong;\n const dat = data.slice(offset, offset + shortLen + (isLong ? 1 : 0));\n offset += dat.length;\n const ecc = ecCodewords(dat, ecLen);\n // Short blocks get a pad slot so every block array shares one length;\n // the slot is skipped during interleave below.\n blocks.push(isLong ? [...dat, ...ecc] : [...dat, 0, ...ecc]);\n }\n\n const out: number[] = [];\n for (let i = 0; i < blocks[0].length; i++)\n for (let b = 0; b < numBlocks; b++) {\n // Skip the pad slot on short blocks (index = shortLen).\n if (i !== shortLen || b >= numBlocks - numLong) out.push(blocks[b][i]);\n }\n return out;\n}\n\nfunction freezeMatrix(grid: readonly (readonly boolean[])[], meta: Omit<QrMatrix, 'modules' | 'get'>): QrMatrix {\n const modules = grid.map((row) => Object.freeze([...row]));\n Object.freeze(modules);\n return Object.freeze({\n ...meta,\n get: (x: number, y: number) => (x >= 0 && y >= 0 && x < meta.size && y < meta.size ? modules[y][x] : false),\n modules,\n });\n}\n\n/**\n * Encode `data` into a QR Model 2 symbol. Pure and synchronous.\n * Byte mode is UTF-8 without an ECI header — the industry-standard assumption.\n */\nexport function encodeQr(data: string | Uint8Array, options: QrEncodeOptions = {}): QrMatrix {\n checkOptions(options);\n const text = typeof data === 'string' ? data : new TextDecoder().decode(data);\n if (text.length === 0) throw new SigilOptionError('Cannot encode an empty input');\n\n const level = options.errorCorrection ?? 'M';\n const mode = options.mode ?? detectMode(text);\n if (mode !== 'byte' && detectMode(text) !== mode && !isModeCompatible(text, mode))\n throw new SigilOptionError(`Input cannot be encoded in ${mode} mode`);\n\n const version = options.version ?? pickVersion(text, mode, level, options.minVersion ?? 1);\n if (version === -1 || segmentBits(text, mode, version) > dataCodewords(version, level) * 8) {\n const bytes = new TextEncoder().encode(text).length;\n const max = capacityFor(options.version ?? MAX_VERSION, level, mode);\n throw new SigilCapacityError(\n `Input of ${bytes} bytes exceeds QR capacity (${max} ${mode === 'byte' ? 'bytes' : 'chars'} ` +\n `at version ${options.version ?? MAX_VERSION}-${level})`,\n bytes,\n max,\n options.version ?? MAX_VERSION,\n );\n }\n\n const used = segmentBits(text, mode, version);\n const capacity = dataCodewords(version, level) * 8;\n if (used / capacity > 0.9 && options.version === undefined)\n warn(\n `Payload uses ${Math.round((used / capacity) * 100)}% of version ${version}-${level} ` +\n `capacity; a slightly longer input will bump the QR size`,\n );\n\n const codewords = interleaveBlocks(buildDataCodewords(text, mode, version, level), version, level);\n const grid = createGrid(matrixSize(version));\n drawFunctionPatterns(grid, version);\n placeData(grid, codewords);\n\n // Try every mask (or the forced one), keep the lowest penalty.\n const candidates = options.mask !== undefined ? [options.mask] : [0, 1, 2, 3, 4, 5, 6, 7];\n let bestMask = candidates[0];\n let bestScore = Number.POSITIVE_INFINITY;\n let bestModules: boolean[][] | null = null;\n for (const m of candidates) {\n applyMask(grid, m);\n drawFormatInfo(grid, level, m);\n const score = penaltyScore(grid);\n if (score < bestScore) {\n bestScore = score;\n bestMask = m;\n bestModules = grid.modules.map((row) => [...row]);\n }\n applyMask(grid, m); // undo\n // Clear format info for the next candidate (function flags stay set).\n if (m !== candidates[candidates.length - 1]) clearFormat(grid);\n }\n\n grid.modules = bestModules as boolean[][];\n drawVersionInfo(grid, version);\n\n return freezeMatrix(grid.modules, {\n errorCorrection: level,\n mask: bestMask,\n mode,\n size: grid.size,\n version,\n });\n}\n\n/** Whether `text` is representable in `mode` (used when the mode is forced). */\nfunction isModeCompatible(text: string, mode: QrMode): boolean {\n if (mode === 'numeric') return /^\\d+$/.test(text);\n if (mode === 'alphanumeric') return [...text].every((ch) => ALPHANUMERIC_CHARSET.includes(ch));\n return true;\n}\n\n/** Un-mark and un-draw format modules so the next mask candidate starts clean. */\nfunction clearFormat(grid: ReturnType<typeof createGrid>): void {\n const size = grid.size;\n const cells: Array<readonly [number, number]> = [];\n for (let i = 0; i <= 8; i++) {\n if (i !== 6) {\n cells.push([8, i], [i, 8]);\n }\n }\n for (let i = 0; i < 8; i++) cells.push([size - 1 - i, 8]);\n for (let i = 0; i < 7; i++) cells.push([8, size - 1 - i]);\n cells.push([8, size - 8]);\n for (const [x, y] of cells) grid.modules[y][x] = false;\n}\n\n/** Max characters/bytes encodable at (version, level, mode). */\nexport function qrCapacity(version: number, errorCorrection: QrErrorCorrection, mode: QrMode): number {\n if (!Number.isInteger(version) || version < 1 || version > MAX_VERSION)\n throw new SigilOptionError(`version must be an integer 1–${MAX_VERSION}, got ${version}`);\n return capacityFor(version, errorCorrection, mode);\n}\n","import { SigilDisposedError, SigilError, SigilPermissionError, SigilUnsupportedError } from './errors';\nimport type { QrDetector, QrScanner, QrScannerOptions, QrScannerStatus, QrScanResult, SigilEvent } from './types';\n\n/**\n * Scanning via the native `BarcodeDetector` API — a thin lifecycle wrapper.\n * Feature detection is lazy so importing the package is always safe (SSR).\n * No from-scratch image decoder: unsupported environments get\n * `SigilUnsupportedError` at `start()`/`detectQr()`, never at import.\n */\n\ninterface BarcodeDetectorLike {\n detect(\n source: ImageBitmapSource,\n ): Promise<ReadonlyArray<{ rawValue: string; cornerPoints?: ReadonlyArray<{ x: number; y: number }> }>>;\n}\n\ninterface BarcodeDetectorCtor {\n getSupportedFormats?(): Promise<readonly string[]>;\n new (options?: { formats?: string[] }): BarcodeDetectorLike;\n}\n\nconst globalScope = globalThis as { BarcodeDetector?: BarcodeDetectorCtor };\n\nconst barcodeDetector = (): BarcodeDetectorCtor | undefined => globalScope.BarcodeDetector;\n\n/** Sync check: `BarcodeDetector` exists. Format support needs the async variant. */\nexport function isQrScanSupported(): boolean {\n return typeof barcodeDetector() === 'function';\n}\n\n/** Full check: `BarcodeDetector` exists and reports `qr_code` support. */\nexport async function qrScanSupport(): Promise<boolean> {\n const ctor = barcodeDetector();\n if (typeof ctor !== 'function') return false;\n if (typeof ctor.getSupportedFormats !== 'function') return true;\n try {\n return (await ctor.getSupportedFormats()).includes('qr_code');\n } catch {\n return false;\n }\n}\n\n/** One-shot detection on an image source; `null` when no code is found. */\nexport async function detectQr(\n source: ImageBitmapSource,\n options: { signal?: AbortSignal; detector?: QrDetector } = {},\n): Promise<QrScanResult | null> {\n options.signal?.throwIfAborted();\n const ctor = barcodeDetector();\n const detector = options.detector ?? (ctor ? new ctor({ formats: ['qr_code'] }) : undefined);\n if (!detector) throw new SigilUnsupportedError('BarcodeDetector is not available in this environment');\n const results = await detector.detect(source);\n options.signal?.throwIfAborted();\n const first = results[0];\n return first ? { cornerPoints: first.cornerPoints, value: first.rawValue } : null;\n}\n\nexport function createQrScanner(options: QrScannerOptions): QrScanner {\n const media = options.mediaDevices ?? globalThis.navigator?.mediaDevices;\n const once = options.once ?? true;\n const intervalMs = options.intervalMs ?? 200;\n const disposal = new AbortController();\n const tappers = new Set<(event: SigilEvent) => void>();\n const handlers = new Set<(result: QrScanResult) => void>();\n\n let status: QrScannerStatus = 'idle';\n let stream: MediaStream | null = null;\n let timer: ReturnType<typeof setInterval> | null = null;\n let busy = false;\n\n const emit = (event: SigilEvent): void => {\n if (tappers.size === 0) return;\n for (const handler of [...tappers]) {\n try {\n handler(event);\n } catch {\n // Observability must never affect behavior.\n }\n }\n };\n\n const setStatus = (next: QrScannerStatus): void => {\n if (status === next) return;\n status = next;\n emit({ status: next, type: 'status-change' });\n };\n\n const stopTracks = (): void => {\n if (timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n if (stream) {\n for (const track of stream.getTracks()) track.stop();\n stream = null;\n }\n options.video.srcObject = null;\n };\n\n const fail = (error: SigilError): void => {\n emit({ error, type: 'error' });\n stopTracks();\n setStatus('stopped');\n };\n\n const tick = async (): Promise<void> => {\n if (status !== 'scanning' || stream === null) return;\n const video = options.video;\n if (video.readyState < 2 /* HAVE_CURRENT_DATA */) {\n emit({ reason: 'not-ready', type: 'frame-skipped' });\n return;\n }\n if (busy) {\n emit({ reason: 'busy', type: 'frame-skipped' });\n return;\n }\n busy = true;\n const started = Date.now();\n try {\n const detector = await detectorPromise;\n const results = await detector.detect(video);\n const first = results[0];\n if (first) {\n const result: QrScanResult = { cornerPoints: first.cornerPoints, value: first.rawValue };\n emit({ elapsedMs: Date.now() - started, type: 'detect', value: result.value });\n for (const handler of [...handlers]) handler(result);\n if (once) {\n stopTracks();\n setStatus('stopped');\n }\n }\n } catch (error) {\n fail(error instanceof SigilError ? error : new SigilError('QR detection failed', { cause: error }));\n } finally {\n busy = false;\n }\n };\n\n const detectorPromise: Promise<QrDetector> = Promise.resolve().then(() => {\n if (options.detector) return options.detector;\n const ctor = barcodeDetector();\n if (typeof ctor !== 'function')\n throw new SigilUnsupportedError('BarcodeDetector is not available in this environment');\n return new ctor({ formats: ['qr_code'] });\n });\n\n const api: QrScanner = {\n get disposalSignal() {\n return disposal.signal;\n },\n dispose() {\n if (status === 'disposed') return;\n emit({ type: 'dispose' });\n stopTracks();\n handlers.clear();\n tappers.clear();\n setStatus('disposed');\n disposal.abort();\n },\n get disposed() {\n return status === 'disposed';\n },\n onResult(handler) {\n if (status === 'disposed') return () => {};\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n async start() {\n if (status === 'disposed') throw new SigilDisposedError('Scanner is disposed');\n if (status === 'starting' || status === 'scanning') return;\n if (!media || typeof media.getUserMedia !== 'function')\n throw new SigilUnsupportedError('getUserMedia is not available in this environment');\n // Surface a missing detector at start() (not construction) per contract.\n await detectorPromise;\n options.signal?.throwIfAborted();\n setStatus('starting');\n try {\n stream = await media.getUserMedia({ video: options.constraints ?? { facingMode: 'environment' } });\n } catch (error) {\n setStatus('idle');\n if (error instanceof DOMException && error.name === 'NotAllowedError')\n throw new SigilPermissionError('Camera permission denied', { cause: error });\n throw error instanceof Error ? error : new SigilError('Camera request failed', { cause: error });\n }\n options.signal?.throwIfAborted();\n options.video.srcObject = stream;\n await options.video.play().catch(() => {});\n setStatus('scanning');\n timer = setInterval(() => void tick(), intervalMs);\n void tick();\n },\n get status() {\n return status;\n },\n stop() {\n if (status === 'disposed') return;\n stopTracks();\n setStatus(status === 'idle' ? 'idle' : 'stopped');\n },\n tap(handler, tapOptions) {\n if (status === 'disposed') return () => {};\n tappers.add(handler);\n const off = () => tappers.delete(handler);\n tapOptions?.signal?.addEventListener('abort', off, { once: true });\n return off;\n },\n [Symbol.dispose]() {\n api.dispose();\n },\n };\n\n options.signal?.addEventListener('abort', () => api.stop(), { once: true });\n return api;\n}\n","import type { QrMatrix, QrSvgOptions } from './types';\n\n/**\n * SVG rendering — pure string output, safe in any environment.\n * The optimized path merges each row's dark-module runs into `M x y hW v1 h-W z`\n * spans; `optimizePath: false` emits one subpath per module.\n */\n\nconst esc = (s: string): string =>\n s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nexport function toSvg(matrix: QrMatrix, options: QrSvgOptions = {}): string {\n const margin = options.margin ?? 4;\n const scale = options.scale ?? 1;\n const dark = options.dark ?? 'currentColor';\n const light = options.light ?? 'transparent';\n const optimize = options.optimizePath ?? true;\n const dim = (matrix.size + margin * 2) * scale;\n\n const parts: string[] = [`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${dim} ${dim}\" role=\"img\"`];\n if (options.label !== undefined) {\n parts.push(` aria-label=\"${esc(options.label)}\"`);\n }\n parts.push(` shape-rendering=\"crispEdges\">`);\n if (options.label !== undefined) parts.push(`<title>${esc(options.label)}</title>`);\n if (light !== 'transparent') parts.push(`<rect width=\"${dim}\" height=\"${dim}\" fill=\"${light}\"/>`);\n\n const path: string[] = [];\n for (let y = 0; y < matrix.size; y++) {\n let x = 0;\n while (x < matrix.size) {\n if (!matrix.get(x, y)) {\n x++;\n continue;\n }\n if (optimize) {\n let run = 1;\n while (x + run < matrix.size && matrix.get(x + run, y)) run++;\n path.push(`M${(x + margin) * scale} ${(y + margin) * scale}h${run * scale}v${scale}h${-run * scale}z`);\n x += run;\n } else {\n path.push(`M${(x + margin) * scale} ${(y + margin) * scale}h${scale}v${scale}h${-scale}z`);\n x++;\n }\n }\n }\n parts.push(`<path d=\"${path.join('')}\" fill=\"${dark}\"/>`);\n parts.push('</svg>');\n return parts.join('');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sigil.iife.js","names":[],"sources":["../src/errors.ts","../src/canvas.ts","../src/_tables.ts","../src/_format.ts","../src/_mask.ts","../src/_matrix.ts","../src/_galois.ts","../src/_reed-solomon.ts","../src/_segments.ts","../src/encode.ts","../src/scan.ts","../src/svg.ts"],"sourcesContent":["/**\n * Base class for all sigil errors.\n * Use `instanceof SigilError` to catch any sigil-originated error in one branch.\n */\nexport class SigilError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when input data does not fit in the requested version/level. */\nexport class SigilCapacityError extends SigilError {\n readonly bytes: number;\n readonly maxBytes: number;\n readonly version: number;\n\n constructor(message: string, bytes: number, maxBytes: number, version: number, opts?: ErrorOptions) {\n super(message, opts);\n this.bytes = bytes;\n this.maxBytes = maxBytes;\n this.version = version;\n }\n}\n\n/** Thrown for an invalid option: version/minVersion out of range, mask outside 0–7. */\nexport class SigilOptionError extends SigilError {}\n\n/**\n * Thrown when the environment lacks `BarcodeDetector`, `getUserMedia`, or QR\n * format support. Feature-detect with `isQrScanSupported()`/`qrScanSupport()`.\n */\nexport class SigilUnsupportedError extends SigilError {}\n\n/** Thrown when camera access is denied (wraps `NotAllowedError`). */\nexport class SigilPermissionError extends SigilError {}\n\n/** Thrown when a disposed scanner is used. */\nexport class SigilDisposedError extends SigilError {}\n","import { SigilUnsupportedError } from './errors';\nimport type { QrCanvasOptions, QrMatrix } from './types';\n\n/**\n * Canvas rendering: the only DOM-touching output path.\n * Resizes the canvas to `(size + 2*margin) * scale` CSS pixels, backing-store\n * scaled by `devicePixelRatio`, and paints one `fillRect` per dark module.\n * Returns the CSS pixel size so callers can size wrappers.\n */\nexport function drawToCanvas(matrix: QrMatrix, canvas: HTMLCanvasElement, options: QrCanvasOptions = {}): number {\n const margin = options.margin ?? 4;\n const scale = options.scale ?? 1;\n const dark = options.dark ?? '#000000';\n const light = options.light ?? '#ffffff';\n const cssSize = (matrix.size + margin * 2) * scale;\n const dpr = globalThis.devicePixelRatio || 1;\n\n canvas.width = cssSize * dpr;\n canvas.height = cssSize * dpr;\n canvas.style.width = `${cssSize}px`;\n canvas.style.height = `${cssSize}px`;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new SigilUnsupportedError('Canvas 2D context unavailable');\n ctx.scale(dpr, dpr);\n ctx.fillStyle = light;\n ctx.fillRect(0, 0, cssSize, cssSize);\n ctx.fillStyle = dark;\n for (let y = 0; y < matrix.size; y++)\n for (let x = 0; x < matrix.size; x++)\n if (matrix.get(x, y)) ctx.fillRect((x + margin) * scale, (y + margin) * scale, scale, scale);\n return cssSize;\n}\n","import type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * QR Model 2 lookup tables, transcribed from ISO/IEC 18004:2015:\n * - `EC_CODEWORDS_PER_BLOCK` / `NUM_EC_BLOCKS`: Table 9 (error-correction\n * characteristics). Stored as per-block EC codewords and block count; the\n * group-1/group-2 split is derived, since all blocks share one EC length.\n * - `alignmentPatternPositions`: Table E.1, computed by the spec formula.\n * - `CHAR_COUNT_BITS`: Table 3 (character-count indicator bit widths).\n * - `FORMAT_EC_BITS`: Table 10 (2-bit level field inside format information).\n *\n * `tables.test.ts` cross-checks every entry against the raw-module formula, so\n * a transcription slip fails the consistency test before the decode oracle runs.\n */\n\n/** Index order used by the table rows below. */\nexport const EC_LEVELS = ['L', 'M', 'Q', 'H'] as const;\n\nexport const ALPHANUMERIC_CHARSET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:';\n\n/** Mode indicators (Table 2). */\nexport const MODE_BITS: Record<QrMode, number> = {\n alphanumeric: 0b0010,\n byte: 0b0100,\n numeric: 0b0001,\n};\n\n/** Character-count indicator widths for version groups 1–9 / 10–26 / 27–40. */\nexport const CHAR_COUNT_BITS: Record<QrMode, readonly [number, number, number]> = {\n alphanumeric: [9, 11, 13],\n byte: [8, 16, 16],\n numeric: [10, 12, 14],\n};\n\n/** EC level bits inside format information (L=01, M=00, Q=11, H=10). */\nexport const FORMAT_EC_BITS: Record<QrErrorCorrection, number> = { H: 0b10, L: 0b01, M: 0b00, Q: 0b11 };\n\n/** Row 0 = L, row 1 = M, row 2 = Q, row 3 = H; column 0 unused (versions start at 1). */\nexport const EC_CODEWORDS_PER_BLOCK: ReadonlyArray<ReadonlyArray<number>> = [\n // prettier-ignore\n [\n -1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n // prettier-ignore\n [\n -1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28,\n 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n ],\n // prettier-ignore\n [\n -1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n // prettier-ignore\n [\n -1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n];\n\nexport const NUM_EC_BLOCKS: ReadonlyArray<ReadonlyArray<number>> = [\n // prettier-ignore\n [\n -1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19,\n 19, 20, 21, 22, 24, 25,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31,\n 33, 35, 37, 38, 40, 43, 45, 47, 49,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43,\n 45, 48, 51, 53, 56, 59, 62, 65, 68,\n ],\n // prettier-ignore\n [\n -1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48,\n 51, 56, 59, 62, 65, 68, 71, 74, 77, 81,\n ],\n];\n\nconst ecIndex = (level: QrErrorCorrection): number => EC_LEVELS.indexOf(level);\n\n/** Total modules per side. */\nexport const matrixSize = (version: number): number => version * 4 + 17;\n\n/** Alignment-pattern center coordinates (Table E.1 formula). */\nexport function alignmentPatternPositions(version: number): readonly number[] {\n if (version === 1) return [];\n const numAlign = Math.floor(version / 7) + 2;\n const step = version === 32 ? 26 : Math.ceil((version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n const result = [6];\n for (let pos = version * 4 + 10; result.length < numAlign; pos -= step) result.splice(1, 0, pos);\n return result;\n}\n\n/**\n * Total raw modules available for data + EC + remainder bits, derived from the\n * symbol geometry (Table 1 / Annex A): full grid minus finders, separators,\n * timing, alignment, dark module, format and version information.\n */\nexport function rawDataModules(version: number): number {\n let result = (16 * version + 128) * version + 64;\n if (version >= 2) {\n const numAlign = Math.floor(version / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (version >= 7) result -= 36;\n }\n return result;\n}\n\n/** Total codewords (data + EC) for a version. */\nexport const totalCodewords = (version: number): number => Math.floor(rawDataModules(version) / 8);\n\n/** Leftover bits after the codeword stream (0, 3, 4, or 7 by version). */\nexport const remainderBits = (version: number): number => rawDataModules(version) % 8;\n\nexport function ecCodewordsPerBlock(version: number, level: QrErrorCorrection): number {\n return EC_CODEWORDS_PER_BLOCK[ecIndex(level)][version];\n}\n\nexport function numEcBlocks(version: number, level: QrErrorCorrection): number {\n return NUM_EC_BLOCKS[ecIndex(level)][version];\n}\n\n/** Data codewords for a (version, level) pair. */\nexport function dataCodewords(version: number, level: QrErrorCorrection): number {\n return totalCodewords(version) - ecCodewordsPerBlock(version, level) * numEcBlocks(version, level);\n}\n\n/** Version group for the character-count indicator: 0 → 1–9, 1 → 10–26, 2 → 27–40. */\nexport function versionGroup(version: number): 0 | 1 | 2 {\n return version <= 9 ? 0 : version <= 26 ? 1 : 2;\n}\n","import type { QrGrid } from './_matrix';\nimport { FORMAT_EC_BITS } from './_tables';\nimport type { QrErrorCorrection } from './types';\n\n/**\n * Format and version information (§7.9, Annexes C–D):\n * - Format: 5 data bits (2 EC + 3 mask) → BCH(15,5) remainder → XOR 0x5412,\n * written twice around the finders.\n * - Version (v≥7): 6 data bits → BCH(18,6) remainder, written twice in the\n * 6×3 blocks at top-right and bottom-left.\n */\n\nconst BCH_FORMAT_POLY = 0b10100110111; // x¹⁰+x⁸+x⁵+x⁴+x²+x+1\nconst BCH_FORMAT_MASK = 0b101010000010010; // 0x5412\nconst BCH_VERSION_POLY = 0b1111100100101; // x¹²+x¹¹+x¹⁰+x⁹+x⁸+x⁵+x²+1\n\n/** 15-bit format information word for (level, mask). */\nexport function formatInfoBits(level: QrErrorCorrection, mask: number): number {\n const data = (FORMAT_EC_BITS[level] << 3) | mask;\n let rem = data;\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ (((rem >>> 9) & 1) * BCH_FORMAT_POLY);\n return ((data << 10) | (rem & 0x3ff)) ^ BCH_FORMAT_MASK;\n}\n\n/** 18-bit version information word (version ≥ 7). */\nexport function versionInfoBits(version: number): number {\n let rem = version;\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ (((rem >>> 11) & 1) * BCH_VERSION_POLY);\n return (version << 12) | (rem & 0xfff);\n}\n\nconst setFunction = (grid: QrGrid, x: number, y: number, dark: boolean): void => {\n grid.modules[y][x] = dark;\n grid.isFunction[y][x] = true;\n};\n\n/** Write both copies of the 15-bit format word plus the dark module. */\nexport function drawFormatInfo(grid: QrGrid, level: QrErrorCorrection, mask: number): void {\n const size = grid.size;\n const bits = formatInfoBits(level, mask);\n const bit = (i: number) => ((bits >>> i) & 1) === 1;\n\n // First copy around the top-left finder.\n for (let i = 0; i <= 5; i++) setFunction(grid, 8, i, bit(i));\n setFunction(grid, 8, 7, bit(6));\n setFunction(grid, 8, 8, bit(7));\n setFunction(grid, 7, 8, bit(8));\n for (let i = 9; i < 15; i++) setFunction(grid, 14 - i, 8, bit(i));\n\n // Second copy: row 8 beside the top-right finder (bits 0–7),\n // column 8 beside the bottom-left finder (bits 8–14).\n for (let i = 0; i < 8; i++) setFunction(grid, size - 1 - i, 8, bit(i));\n for (let i = 8; i < 15; i++) setFunction(grid, 8, size - 15 + i, bit(i));\n\n // Always-dark module below the bottom-left strip.\n setFunction(grid, 8, size - 8, true);\n}\n\n/** Write both 6×3 version-information blocks (v≥7). */\nexport function drawVersionInfo(grid: QrGrid, version: number): void {\n if (version < 7) return;\n const size = grid.size;\n const bits = versionInfoBits(version);\n for (let i = 0; i < 18; i++) {\n const dark = ((bits >>> i) & 1) === 1;\n const a = size - 11 + (i % 3);\n const b = Math.floor(i / 3);\n setFunction(grid, a, b, dark); // top-right\n setFunction(grid, b, a, dark); // bottom-left\n }\n}\n","import type { QrGrid } from './_matrix';\n\n/**\n * Data masks and penalty scoring (§7.8.2–7.8.3):\n * eight mask functions XORed onto data modules only, then four penalty rules\n * (N1=3 runs, N2=3 blocks, N3=40 finder-like patterns, N4=10 dark ratio).\n */\n\ntype MaskFn = (x: number, y: number) => boolean;\n\nexport const MASK_FNS: readonly MaskFn[] = [\n (x, y) => (x + y) % 2 === 0,\n (_x, y) => y % 2 === 0,\n (x) => x % 3 === 0,\n (x, y) => (x + y) % 3 === 0,\n (x, y) => (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0,\n (x, y) => ((x * y) % 2) + ((x * y) % 3) === 0,\n (x, y) => (((x * y) % 2) + ((x * y) % 3)) % 2 === 0,\n (x, y) => (((x + y) % 2) + ((x * y) % 3)) % 2 === 0,\n];\n\n/** XOR mask `m` onto every non-function module. Idempotent per mask. */\nexport function applyMask(grid: QrGrid, mask: number): void {\n const fn = MASK_FNS[mask];\n for (let y = 0; y < grid.size; y++)\n for (let x = 0; x < grid.size; x++)\n if (!grid.isFunction[y][x] && fn(x, y)) grid.modules[y][x] = !grid.modules[y][x];\n}\n\nconst PENALTY_N1 = 3;\nconst PENALTY_N2 = 3;\nconst PENALTY_N3 = 40;\nconst PENALTY_N4 = 10;\n\n// Runs of ≥5 same-color modules in a row or column: N1 + (run − 5).\nfunction penaltyRuns(grid: QrGrid): number {\n let penalty = 0;\n const line = (same: boolean, run: number): number => {\n if (!same && run >= 5) penalty += PENALTY_N1 + run - 5;\n return same ? run + 1 : 1;\n };\n for (let i = 0; i < grid.size; i++) {\n let runRow = 1;\n let runCol = 1;\n for (let j = 1; j < grid.size; j++) {\n runRow = line(grid.modules[i][j] === grid.modules[i][j - 1], runRow);\n runCol = line(grid.modules[j][i] === grid.modules[j - 1][i], runCol);\n }\n if (runRow >= 5) penalty += PENALTY_N1 + runRow - 5;\n if (runCol >= 5) penalty += PENALTY_N1 + runCol - 5;\n }\n return penalty;\n}\n\n// 2×2 blocks of a single color.\nfunction penaltyBlocks(grid: QrGrid): number {\n let penalty = 0;\n for (let y = 0; y < grid.size - 1; y++)\n for (let x = 0; x < grid.size - 1; x++) {\n const c = grid.modules[y][x];\n if (c === grid.modules[y][x + 1] && c === grid.modules[y + 1][x] && c === grid.modules[y + 1][x + 1])\n penalty += PENALTY_N2;\n }\n return penalty;\n}\n\n// 1:1:3:1:1 finder-like patterns with a 4-module light border on either side.\nfunction penaltyFinderLike(grid: QrGrid): number {\n const size = grid.size;\n let penalty = 0;\n const checkLine = (get: (i: number) => boolean): void => {\n for (let i = 0; i + 11 <= size; i++) {\n const window = Array.from({ length: 11 }, (_, k) => get(i + k));\n const coreA = [false, false, false, false, true, false, true, true, true, false, true];\n const coreB = [true, false, true, true, true, false, true, false, false, false, false];\n if (window.every((v, k) => v === coreA[k]) || window.every((v, k) => v === coreB[k])) penalty += PENALTY_N3;\n }\n };\n for (let y = 0; y < size; y++) checkLine((i) => grid.modules[y][i]);\n for (let x = 0; x < size; x++) checkLine((i) => grid.modules[i][x]);\n return penalty;\n}\n\n// Ratio of dark modules: each 5% step away from 50% costs N4.\nfunction penaltyRatio(grid: QrGrid): number {\n let dark = 0;\n for (const row of grid.modules) for (const m of row) if (m) dark++;\n const total = grid.size * grid.size;\n const k = Math.floor(Math.abs(dark * 20 - total * 10) / total);\n return k * PENALTY_N4;\n}\n\n/** Total penalty score for a fully masked matrix. */\nexport function penaltyScore(grid: QrGrid): number {\n return penaltyRuns(grid) + penaltyBlocks(grid) + penaltyFinderLike(grid) + penaltyRatio(grid);\n}\n","import { alignmentPatternPositions } from './_tables';\n\n/**\n * Module placement (§7.7–7.9, Annex E): function patterns are drawn first and\n * recorded in `isFunction`, then the codeword bit stream fills the remaining\n * modules in a two-column zigzag starting bottom-right, skipping column 6.\n */\n\nexport interface QrGrid {\n /** Modules owned by function patterns: skipped by data placement and masks. */\n readonly isFunction: boolean[][];\n /** Final module colors; `true` = dark. Mutable during construction. */\n modules: boolean[][];\n readonly size: number;\n}\n\nexport function createGrid(size: number): QrGrid {\n return {\n isFunction: Array.from({ length: size }, () => new Array<boolean>(size).fill(false)),\n modules: Array.from({ length: size }, () => new Array<boolean>(size).fill(false)),\n size,\n };\n}\n\nconst setFunction = (grid: QrGrid, x: number, y: number, dark: boolean): void => {\n grid.modules[y][x] = dark;\n grid.isFunction[y][x] = true;\n};\n\n/** 7×7 finder pattern plus the one-module separator ring, centered at (x+3, y+3). */\nfunction drawFinder(grid: QrGrid, x: number, y: number): void {\n for (let dy = -4; dy <= 4; dy++)\n for (let dx = -4; dx <= 4; dx++) {\n const xx = x + 3 + dx;\n const yy = y + 3 + dy;\n if (xx < 0 || yy < 0 || xx >= grid.size || yy >= grid.size) continue;\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n setFunction(grid, xx, yy, dist !== 2 && dist !== 4);\n }\n}\n\n/** Alternating timing pattern along row/col 6, between the finders. */\nfunction drawTiming(grid: QrGrid): void {\n for (let i = 8; i < grid.size - 8; i++) {\n const dark = i % 2 === 0;\n if (!grid.isFunction[6][i]) setFunction(grid, i, 6, dark);\n if (!grid.isFunction[i][6]) setFunction(grid, 6, i, dark);\n }\n}\n\n/** 5×5 alignment pattern centered at (cx, cy). */\nfunction drawAlignment(grid: QrGrid, cx: number, cy: number): void {\n for (let dy = -2; dy <= 2; dy++)\n for (let dx = -2; dx <= 2; dx++) setFunction(grid, cx + dx, cy + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);\n}\n\n/**\n * Reserve the 15 format-info modules around each finder (both copies) and the\n * 6×3 version-info blocks for v≥7: drawn later by `_format.ts`, but data\n * placement must skip them now.\n */\nfunction reserveFormatAreas(grid: QrGrid): void {\n const size = grid.size;\n // Around the top-left finder.\n for (let i = 0; i <= 8; i++) {\n if (i !== 6) {\n grid.isFunction[8][i] = true;\n grid.isFunction[i][8] = true;\n }\n }\n // Second copy: column 8 rows size-1..size-7 beside the bottom-left finder,\n // row 8 columns size-1..size-8 beside the top-right finder.\n for (let i = 0; i < 7; i++) grid.isFunction[size - 1 - i][8] = true;\n for (let i = 0; i < 8; i++) grid.isFunction[8][size - 1 - i] = true;\n // Always-dark module below the bottom-left format strip.\n grid.isFunction[size - 8][8] = true;\n}\n\nfunction reserveVersionAreas(grid: QrGrid, version: number): void {\n if (version < 7) return;\n const size = grid.size;\n for (let i = 0; i < 18; i++) {\n const a = size - 11 + (i % 3);\n const b = Math.floor(i / 3);\n grid.isFunction[b][a] = true; // top-right block\n grid.isFunction[a][b] = true; // bottom-left block\n }\n}\n\n/** Draw every function pattern and mark reserved areas. */\nexport function drawFunctionPatterns(grid: QrGrid, version: number): void {\n drawFinder(grid, 0, 0);\n drawFinder(grid, grid.size - 7, 0);\n drawFinder(grid, 0, grid.size - 7);\n drawTiming(grid);\n const positions = alignmentPatternPositions(version);\n for (const cy of positions)\n for (const cx of positions) {\n // Skip the three corners covered by finder patterns.\n const isCorner =\n (cx === 6 && cy === 6) || (cx === 6 && cy === grid.size - 7) || (cx === grid.size - 7 && cy === 6);\n if (!isCorner) drawAlignment(grid, cx, cy);\n }\n reserveFormatAreas(grid);\n reserveVersionAreas(grid, version);\n}\n\n/** Place codeword bits into non-function modules via the zigzag scan. */\nexport function placeData(grid: QrGrid, codewords: readonly number[]): void {\n const size = grid.size;\n const totalBits = codewords.length * 8;\n let bitIndex = 0;\n let upward = true;\n for (let right = size - 1; right >= 1; right -= 2) {\n if (right === 6) right = 5; // skip the vertical timing column\n for (let vert = 0; vert < size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const y = upward ? size - 1 - vert : vert;\n if (grid.isFunction[y][x]) continue;\n grid.modules[y][x] = bitIndex < totalBits && ((codewords[bitIndex >>> 3] >>> (7 - (bitIndex & 7))) & 1) === 1;\n bitIndex++;\n }\n }\n upward = !upward;\n }\n}\n","/**\n * GF(2⁸) arithmetic over the QR primitive polynomial x⁸+x⁴+x³+x²+1 (0x11D).\n * Tables are built once at module load: `EXP[i] = αⁱ` for generator α = 2.\n */\n\nconst PRIMITIVE = 0x11d;\n\nconst EXP = new Uint8Array(512);\nconst LOG = new Uint8Array(256);\n\n{\n let x = 1;\n for (let i = 0; i < 255; i++) {\n EXP[i] = x;\n LOG[x] = i;\n x <<= 1;\n if (x & 0x100) x ^= PRIMITIVE;\n }\n // Duplicate the cycle so `EXP[log(a) + log(b)]` never needs a mod.\n for (let i = 255; i < 512; i++) EXP[i] = EXP[i - 255];\n}\n\n/** `a * b` in GF(256); `0` when either operand is 0. */\nexport function gfMultiply(a: number, b: number): number {\n return a === 0 || b === 0 ? 0 : EXP[LOG[a] + LOG[b]];\n}\n\n/** `αⁱ`: the i-th power of the generator. `i` may exceed 254 (wraps). */\nexport function gfExp(i: number): number {\n return EXP[i % 255];\n}\n\n/** Polynomial evaluation in GF(256): Σ coeffᵢ·xⁱ with coeff[0] highest-degree. */\nexport function gfPolyEval(coeffs: readonly number[], x: number): number {\n let y = 0;\n for (const c of coeffs) y = gfMultiply(y, x) ^ c;\n return y;\n}\n\n/** Multiply two polynomials (coefficients highest-degree first). */\nexport function gfPolyMultiply(p: readonly number[], q: readonly number[]): number[] {\n const out = new Array<number>(p.length + q.length - 1).fill(0);\n for (let i = 0; i < p.length; i++) for (let j = 0; j < q.length; j++) out[i + j] ^= gfMultiply(p[i], q[j]);\n return out;\n}\n","import { gfExp, gfMultiply, gfPolyMultiply } from './_galois';\n\n/**\n * Reed–Solomon error-correction codewords over GF(256).\n * The generator polynomial for `degree` EC codewords is ∏ᵢ₌₀..degree₋₁ (x − αⁱ);\n * results are cached per degree (max 30 per ISO Table 9).\n */\n\nconst generatorCache = new Map<number, readonly number[]>();\n\n/** Generator polynomial coefficients (highest-degree first, leading 1 kept). */\nfunction generatorPoly(degree: number): readonly number[] {\n const poly = generatorCache.get(degree);\n if (poly) return poly;\n let g = [1];\n for (let i = 0; i < degree; i++) g = gfPolyMultiply(g, [1, gfExp(i)]);\n generatorCache.set(degree, g);\n return g;\n}\n\n/** EC codewords for one data block: remainder of data·x^degree ÷ generator. */\nexport function ecCodewords(data: readonly number[], degree: number): number[] {\n const gen = generatorPoly(degree); // gen[0] === 1\n const rem = new Array<number>(degree).fill(0);\n for (const b of data) {\n const factor = b ^ rem[0];\n rem.copyWithin(0, 1);\n rem[degree - 1] = 0;\n if (factor !== 0) for (let j = 0; j < degree; j++) rem[j] ^= gfMultiply(gen[j + 1], factor);\n }\n return rem;\n}\n","import { ALPHANUMERIC_CHARSET, CHAR_COUNT_BITS, dataCodewords, MODE_BITS, versionGroup } from './_tables';\nimport type { QrErrorCorrection, QrMode } from './types';\n\n/**\n * Data-segment assembly: one segment (single mode) covering the whole input,\n * followed by terminator, byte alignment, and 0xEC/0x11 padding (§7.4–7.5).\n * Kanji and multi-segment optimization are out of scope.\n */\n\nconst textEncoder = new TextEncoder();\n\n/**\n * Payload prepared for its mode: text for numeric/alphanumeric, raw bytes for\n * byte mode. Byte mode never round-trips through a string, so invalid UTF-8\n * input survives encoding untouched.\n */\nexport type QrPayload =\n | { readonly mode: 'numeric' | 'alphanumeric'; readonly text: string }\n | { readonly mode: 'byte'; readonly bytes: Uint8Array };\n\n/** Interpret `text` as `mode`: UTF-8-encoding only for byte mode. */\nexport const payloadFromText = (text: string, mode: QrMode): QrPayload =>\n mode === 'byte' ? { bytes: textEncoder.encode(text), mode: 'byte' } : { mode, text };\n\n/** Raw binary payload; always byte mode. */\nexport const payloadFromBytes = (bytes: Uint8Array): QrPayload => ({ bytes, mode: 'byte' });\n\n/** Value carried in the character-count field. */\nexport function payloadLength(payload: QrPayload): number {\n return payload.mode === 'byte' ? payload.bytes.length : payload.text.length;\n}\n\n/** Growable bit stream; `bytes` is valid only after `padToByte()`. */\nexport class BitStream {\n private bits: number[] = [];\n\n get length(): number {\n return this.bits.length;\n }\n\n append(value: number, width: number): void {\n for (let i = width - 1; i >= 0; i--) this.bits.push((value >>> i) & 1);\n }\n\n padToByte(): void {\n while (this.bits.length % 8 !== 0) this.bits.push(0);\n }\n\n toBytes(): number[] {\n const out: number[] = [];\n for (let i = 0; i < this.bits.length; i += 8) {\n let b = 0;\n for (let j = 0; j < 8; j++) b = (b << 1) | this.bits[i + j];\n out.push(b);\n }\n return out;\n }\n}\n\n/** Most compact mode able to encode the whole text. */\nexport function detectMode(text: string): QrMode {\n if (/^\\d+$/.test(text)) return 'numeric';\n for (const ch of text) if (!ALPHANUMERIC_CHARSET.includes(ch)) return 'byte';\n return 'alphanumeric';\n}\n\n/** Payload bits for the segment body (without mode/count headers). */\nexport function dataBitLength(payload: QrPayload): number {\n switch (payload.mode) {\n case 'numeric':\n return (\n Math.floor(payload.text.length / 3) * 10 +\n (payload.text.length % 3 === 1 ? 4 : payload.text.length % 3 === 2 ? 7 : 0)\n );\n case 'alphanumeric':\n return Math.floor(payload.text.length / 2) * 11 + (payload.text.length % 2) * 6;\n case 'byte':\n return payload.bytes.length * 8;\n }\n}\n\n/** Append mode indicator, char count, and payload bits. */\nexport function appendSegment(stream: BitStream, payload: QrPayload, version: number): void {\n stream.append(MODE_BITS[payload.mode], 4);\n stream.append(payloadLength(payload), CHAR_COUNT_BITS[payload.mode][versionGroup(version)]);\n switch (payload.mode) {\n case 'numeric':\n for (let i = 0; i < payload.text.length; ) {\n const n = Math.min(3, payload.text.length - i);\n stream.append(Number.parseInt(payload.text.slice(i, i + n), 10), n === 3 ? 10 : n === 2 ? 7 : 4);\n i += n;\n }\n break;\n case 'alphanumeric':\n for (let i = 0; i < payload.text.length; ) {\n if (i + 1 < payload.text.length) {\n stream.append(\n ALPHANUMERIC_CHARSET.indexOf(payload.text[i]) * 45 + ALPHANUMERIC_CHARSET.indexOf(payload.text[i + 1]),\n 11,\n );\n i += 2;\n } else {\n stream.append(ALPHANUMERIC_CHARSET.indexOf(payload.text[i]), 6);\n i += 1;\n }\n }\n break;\n case 'byte':\n for (const b of payload.bytes) stream.append(b, 8);\n break;\n }\n}\n\n/** Capacity in bits for the data area of (version, level). */\nexport const dataCapacityBits = (version: number, level: QrErrorCorrection): number =>\n dataCodewords(version, level) * 8;\n\n/** Bits a segment occupies at `version`: header + payload, before terminator. */\nexport function segmentBits(payload: QrPayload, version: number): number {\n return 4 + CHAR_COUNT_BITS[payload.mode][versionGroup(version)] + dataBitLength(payload);\n}\n\n/**\n * Full data-codeword sequence for (version, level): segment + terminator +\n * alignment + pad bytes. Caller guarantees the segment fits.\n */\nexport function buildDataCodewords(payload: QrPayload, version: number, level: QrErrorCorrection): number[] {\n const stream = new BitStream();\n appendSegment(stream, payload, version);\n const capacity = dataCapacityBits(version, level);\n stream.append(0, Math.min(4, capacity - stream.length)); // terminator\n stream.padToByte();\n const bytes = stream.toBytes();\n const pad = [0xec, 0x11];\n for (let i = 0; bytes.length < dataCodewords(version, level); i++) bytes.push(pad[i % 2]);\n return bytes;\n}\n","import { drawFormatInfo, drawVersionInfo } from './_format';\nimport { applyMask, penaltyScore } from './_mask';\nimport { createGrid, drawFunctionPatterns, placeData } from './_matrix';\nimport { ecCodewords } from './_reed-solomon';\nimport {\n buildDataCodewords,\n detectMode,\n payloadFromBytes,\n payloadFromText,\n payloadLength,\n type QrPayload,\n segmentBits,\n} from './_segments';\nimport {\n ALPHANUMERIC_CHARSET,\n CHAR_COUNT_BITS,\n dataCodewords,\n ecCodewordsPerBlock,\n matrixSize,\n numEcBlocks,\n totalCodewords,\n versionGroup,\n} from './_tables';\nimport { SigilCapacityError, SigilOptionError } from './errors';\nimport type { QrEncodeOptions, QrErrorCorrection, QrMatrix, QrMode } from './types';\n\nconst MAX_VERSION = 40;\n\nfunction checkOptions(options: QrEncodeOptions): void {\n const { version, minVersion, mask, errorCorrection } = options;\n const inRange = (v: number) => Number.isInteger(v) && v >= 1 && v <= MAX_VERSION;\n if (version !== undefined && !inRange(version))\n throw new SigilOptionError(`version must be an integer 1–${MAX_VERSION}, got ${version}`);\n if (minVersion !== undefined && !inRange(minVersion))\n throw new SigilOptionError(`minVersion must be an integer 1–${MAX_VERSION}, got ${minVersion}`);\n if (version !== undefined && minVersion !== undefined && minVersion > version)\n throw new SigilOptionError(`minVersion (${minVersion}) exceeds version (${version})`);\n if (mask !== undefined && (!Number.isInteger(mask) || mask < 0 || mask > 7))\n throw new SigilOptionError(`mask must be an integer 0–7, got ${mask}`);\n if (errorCorrection !== undefined && !'LMQH'.includes(errorCorrection))\n throw new SigilOptionError(`errorCorrection must be 'L', 'M', 'Q', or 'H'`);\n}\n\n/** Character capacity of (version, level, mode): the `qrCapacity` core. */\nfunction capacityFor(version: number, level: QrErrorCorrection, mode: QrMode): number {\n const countBits = CHAR_COUNT_BITS[mode][versionGroup(version)];\n const usable = dataCodewords(version, level) * 8 - 4 - countBits;\n if (usable <= 0) return 0;\n switch (mode) {\n case 'numeric':\n return Math.floor(usable / 10) * 3 + (usable % 10 >= 7 ? 2 : usable % 10 >= 4 ? 1 : 0);\n case 'alphanumeric':\n return Math.floor(usable / 11) * 2 + (usable % 11 >= 6 ? 1 : 0);\n case 'byte':\n return Math.floor(usable / 8);\n }\n}\n\n/** Smallest version ≥ minVersion whose data area fits the segment, or `null`. */\nfunction pickVersion(payload: QrPayload, level: QrErrorCorrection, minVersion: number): number | null {\n for (let v = minVersion; v <= MAX_VERSION; v++) if (segmentBits(payload, v) <= dataCodewords(v, level) * 8) return v;\n return null;\n}\n\n/** The capacity error for a payload that does not fit at `version`. */\nfunction capacityError(payload: QrPayload, level: QrErrorCorrection, version: number): SigilCapacityError {\n const length = payloadLength(payload);\n const max = capacityFor(version, level, payload.mode);\n const unit = payload.mode === 'byte' ? 'bytes' : 'chars';\n return new SigilCapacityError(\n `Input of ${length} ${unit} exceeds QR capacity (${max} ${unit} at version ${version}-${level})`,\n length,\n max,\n version,\n );\n}\n\n/** Split data codewords into EC blocks and interleave data + EC (§7.6). */\nfunction interleaveBlocks(data: readonly number[], version: number, level: QrErrorCorrection): number[] {\n const numBlocks = numEcBlocks(version, level);\n const ecLen = ecCodewordsPerBlock(version, level);\n const rawLen = totalCodewords(version);\n const shortLen = Math.floor(rawLen / numBlocks) - ecLen; // data codewords in a short block\n const numLong = rawLen % numBlocks; // long blocks carry one extra data codeword\n\n const blocks: number[][] = [];\n let offset = 0;\n for (let b = 0; b < numBlocks; b++) {\n const isLong = b >= numBlocks - numLong;\n const dat = data.slice(offset, offset + shortLen + (isLong ? 1 : 0));\n offset += dat.length;\n const ecc = ecCodewords(dat, ecLen);\n // Short blocks get a pad slot so every block array shares one length;\n // the slot is skipped during interleave below.\n blocks.push(isLong ? [...dat, ...ecc] : [...dat, 0, ...ecc]);\n }\n\n const out: number[] = [];\n for (let i = 0; i < blocks[0].length; i++)\n for (let b = 0; b < numBlocks; b++) {\n // Skip the pad slot on short blocks (index = shortLen).\n if (i !== shortLen || b >= numBlocks - numLong) out.push(blocks[b][i]);\n }\n return out;\n}\n\nfunction freezeMatrix(grid: readonly (readonly boolean[])[], meta: Omit<QrMatrix, 'get'>): QrMatrix {\n const modules = grid.map((row) => Object.freeze([...row]));\n Object.freeze(modules);\n return Object.freeze({\n ...meta,\n get: (x: number, y: number) => (x >= 0 && y >= 0 && x < meta.size && y < meta.size ? modules[y][x] : false),\n });\n}\n\n/**\n * Encode `data` into a QR Model 2 symbol. Pure and synchronous.\n * Strings pick the most compact mode; `Uint8Array` is raw binary and always\n * byte mode, encoded as-is: no UTF-8 round-trip. Byte mode is UTF-8 without\n * an ECI header for string input: the industry-standard assumption.\n */\nexport function encodeQr(data: string | Uint8Array, options: QrEncodeOptions = {}): QrMatrix {\n checkOptions(options);\n if (data.length === 0) throw new SigilOptionError('Cannot encode an empty input');\n\n const level = options.errorCorrection ?? 'M';\n if (typeof data !== 'string' && options.mode !== undefined && options.mode !== 'byte')\n throw new SigilOptionError('Uint8Array input can only be encoded in byte mode');\n const mode = options.mode ?? (typeof data === 'string' ? detectMode(data) : 'byte');\n if (typeof data === 'string' && !isModeCompatible(data, mode))\n throw new SigilOptionError(`Input cannot be encoded in ${mode} mode`);\n const payload = typeof data === 'string' ? payloadFromText(data, mode) : payloadFromBytes(data);\n\n const version = options.version ?? pickVersion(payload, level, options.minVersion ?? 1);\n if (version === null || segmentBits(payload, version) > dataCodewords(version, level) * 8)\n throw capacityError(payload, level, options.version ?? MAX_VERSION);\n\n const codewords = interleaveBlocks(buildDataCodewords(payload, version, level), version, level);\n const grid = createGrid(matrixSize(version));\n drawFunctionPatterns(grid, version);\n placeData(grid, codewords);\n\n // Try every mask (or the forced one), keep the lowest penalty. Each candidate\n // is undone by the idempotent XOR, and the final drawFormatInfo below rewrites\n // every format module, so candidates never leak into each other.\n const candidates = options.mask !== undefined ? [options.mask] : [0, 1, 2, 3, 4, 5, 6, 7];\n let bestMask = candidates[0];\n let bestScore = Number.POSITIVE_INFINITY;\n for (const m of candidates) {\n applyMask(grid, m);\n drawFormatInfo(grid, level, m);\n const score = penaltyScore(grid);\n if (score < bestScore) {\n bestScore = score;\n bestMask = m;\n }\n applyMask(grid, m); // undo\n }\n\n // The grid is unmasked again: draw the winning candidate once, finally.\n applyMask(grid, bestMask);\n drawFormatInfo(grid, level, bestMask);\n drawVersionInfo(grid, version);\n\n return freezeMatrix(grid.modules, {\n errorCorrection: level,\n mask: bestMask,\n mode,\n size: grid.size,\n version,\n });\n}\n\n/** Whether `text` is representable in `mode` (used when the mode is forced). */\nfunction isModeCompatible(text: string, mode: QrMode): boolean {\n if (mode === 'numeric') return /^\\d+$/.test(text);\n if (mode === 'alphanumeric') return [...text].every((ch) => ALPHANUMERIC_CHARSET.includes(ch));\n return true;\n}\n\n/** Max characters/bytes encodable at (version, level, mode). */\nexport function qrCapacity(version: number, errorCorrection: QrErrorCorrection, mode: QrMode): number {\n if (!Number.isInteger(version) || version < 1 || version > MAX_VERSION)\n throw new SigilOptionError(`version must be an integer 1–${MAX_VERSION}, got ${version}`);\n return capacityFor(version, errorCorrection, mode);\n}\n","import { SigilDisposedError, SigilError, SigilPermissionError, SigilUnsupportedError } from './errors';\nimport type { QrDetector, QrScanner, QrScannerOptions, QrScannerStatus, QrScanResult, SigilEvent } from './types';\n\n/**\n * Scanning via the native `BarcodeDetector` API: a thin lifecycle wrapper.\n * Feature detection is lazy so importing the package is always safe (SSR).\n * No from-scratch image decoder: unsupported environments get\n * `SigilUnsupportedError` at `start()`/`detectQr()`, never at import.\n */\n\ninterface BarcodeDetectorLike {\n detect(\n source: ImageBitmapSource,\n ): Promise<ReadonlyArray<{ rawValue: string; cornerPoints?: ReadonlyArray<{ x: number; y: number }> }>>;\n}\n\ninterface BarcodeDetectorCtor {\n getSupportedFormats?(): Promise<readonly string[]>;\n new (options?: { formats?: string[] }): BarcodeDetectorLike;\n}\n\nconst globalScope = globalThis as { BarcodeDetector?: BarcodeDetectorCtor };\n\nconst barcodeDetector = (): BarcodeDetectorCtor | undefined => globalScope.BarcodeDetector;\n\n/** Sync check: `BarcodeDetector` exists. Format support needs the async variant. */\nexport function isQrScanSupported(): boolean {\n return typeof barcodeDetector() === 'function';\n}\n\n/** Full check: `BarcodeDetector` exists and reports `qr_code` support. */\nexport async function qrScanSupport(): Promise<boolean> {\n const ctor = barcodeDetector();\n if (typeof ctor !== 'function') return false;\n if (typeof ctor.getSupportedFormats !== 'function') return true;\n try {\n return (await ctor.getSupportedFormats()).includes('qr_code');\n } catch {\n return false;\n }\n}\n\n/** One-shot detection on an image source; `null` when no code is found. */\nexport async function detectQr(\n source: ImageBitmapSource,\n options: { signal?: AbortSignal; detector?: QrDetector } = {},\n): Promise<QrScanResult | null> {\n options.signal?.throwIfAborted();\n const ctor = barcodeDetector();\n const detector = options.detector ?? (ctor ? new ctor({ formats: ['qr_code'] }) : undefined);\n if (!detector) throw new SigilUnsupportedError('BarcodeDetector is not available in this environment');\n const results = await detector.detect(source);\n options.signal?.throwIfAborted();\n const first = results[0];\n return first ? { cornerPoints: first.cornerPoints, value: first.rawValue } : null;\n}\n\nexport function createQrScanner(options: QrScannerOptions): QrScanner {\n const media = options.mediaDevices ?? globalThis.navigator?.mediaDevices;\n const once = options.once ?? true;\n const intervalMs = options.intervalMs ?? 200;\n const disposal = new AbortController();\n const tappers = new Set<(event: SigilEvent) => void>();\n const handlers = new Set<(result: QrScanResult) => void>();\n\n let status: QrScannerStatus = 'idle';\n let stream: MediaStream | null = null;\n let timer: ReturnType<typeof setInterval> | null = null;\n let busy = false;\n let detector: Promise<QrDetector> | undefined;\n\n const emit = (event: SigilEvent): void => {\n if (tappers.size === 0) return;\n for (const handler of [...tappers]) {\n try {\n handler(event);\n } catch {\n // Observability must never affect behavior.\n }\n }\n };\n\n const setStatus = (next: QrScannerStatus): void => {\n if (status === next) return;\n status = next;\n emit({ status: next, type: 'status-change' });\n };\n\n // Read through a function: status changes across awaits via closures, and a\n // direct read would be narrowed to the pre-await value by the compiler.\n const isStarting = (): boolean => status === 'starting';\n\n const stopTracks = (): void => {\n if (timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n if (stream) {\n for (const track of stream.getTracks()) track.stop();\n stream = null;\n }\n options.video.srcObject = null;\n };\n\n const fail = (error: SigilError): void => {\n emit({ error, type: 'error' });\n stopTracks();\n setStatus('idle');\n };\n\n // Created on first start() so a missing BarcodeDetector never rejects a\n // promise nobody awaits (construction must stay side-effect-free).\n const getDetector = (): Promise<QrDetector> => {\n detector ??= (async () => {\n if (options.detector) return options.detector;\n const ctor = barcodeDetector();\n if (typeof ctor !== 'function')\n throw new SigilUnsupportedError('BarcodeDetector is not available in this environment');\n return new ctor({ formats: ['qr_code'] });\n })();\n return detector;\n };\n\n const tick = async (): Promise<void> => {\n if (status !== 'scanning' || stream === null) return;\n const video = options.video;\n if (video.readyState < 2 /* HAVE_CURRENT_DATA */) {\n emit({ reason: 'not-ready', type: 'frame-skipped' });\n return;\n }\n if (busy) {\n emit({ reason: 'busy', type: 'frame-skipped' });\n return;\n }\n busy = true;\n const started = Date.now();\n try {\n const qrDetector = await getDetector();\n const results = await qrDetector.detect(video);\n const first = results[0];\n if (first) {\n const result: QrScanResult = { cornerPoints: first.cornerPoints, value: first.rawValue };\n emit({ elapsedMs: Date.now() - started, type: 'detect', value: result.value });\n for (const handler of [...handlers]) handler(result);\n if (once) {\n stopTracks();\n setStatus('idle');\n }\n }\n } catch (error) {\n fail(error instanceof SigilError ? error : new SigilError('QR detection failed', { cause: error }));\n } finally {\n busy = false;\n }\n };\n\n const api: QrScanner = {\n get disposalSignal() {\n return disposal.signal;\n },\n dispose() {\n if (status === 'disposed') return;\n emit({ type: 'dispose' });\n stopTracks();\n handlers.clear();\n tappers.clear();\n setStatus('disposed');\n disposal.abort();\n },\n get disposed() {\n return status === 'disposed';\n },\n onResult(handler) {\n if (status === 'disposed') return () => {};\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n async start() {\n if (status === 'disposed') throw new SigilDisposedError('Scanner is disposed');\n if (status === 'starting' || status === 'scanning') return;\n if (!media || typeof media.getUserMedia !== 'function')\n throw new SigilUnsupportedError('getUserMedia is not available in this environment');\n // Surface a missing detector at start() (not construction) per contract.\n await getDetector();\n options.signal?.throwIfAborted();\n setStatus('starting');\n let newStream: MediaStream;\n try {\n newStream = await media.getUserMedia({ video: options.constraints ?? { facingMode: 'environment' } });\n } catch (error) {\n setStatus('idle');\n if (error instanceof DOMException && error.name === 'NotAllowedError')\n throw new SigilPermissionError('Camera permission denied', { cause: error });\n throw error instanceof Error ? error : new SigilError('Camera request failed', { cause: error });\n }\n // stop()/dispose() during the permission prompt must not resurrect the scanner.\n if (!isStarting()) {\n for (const track of newStream.getTracks()) track.stop();\n return;\n }\n stream = newStream;\n options.video.srcObject = stream;\n await options.video.play().catch(() => {});\n if (!isStarting()) {\n stopTracks();\n return;\n }\n setStatus('scanning');\n timer = setInterval(() => void tick(), intervalMs);\n void tick();\n },\n get status() {\n return status;\n },\n stop() {\n if (status === 'disposed') return;\n stopTracks();\n setStatus('idle');\n },\n tap(handler, tapOptions) {\n if (status === 'disposed') return () => {};\n tappers.add(handler);\n const off = () => tappers.delete(handler);\n tapOptions?.signal?.addEventListener('abort', off, { once: true });\n return off;\n },\n [Symbol.dispose]() {\n api.dispose();\n },\n };\n\n if (options.signal) {\n const onAbort = (): void => api.stop();\n options.signal.addEventListener('abort', onAbort, { once: true });\n // A long-lived signal must not retain the scanner past dispose().\n disposal.signal.addEventListener('abort', () => options.signal?.removeEventListener('abort', onAbort), {\n once: true,\n });\n }\n return api;\n}\n","import type { QrMatrix, QrSvgOptions } from './types';\n\n/**\n * SVG rendering: pure string output, safe in any environment.\n * The optimized path merges each row's dark-module runs into `M x y hW v1 h-W z`\n * spans; `optimizePath: false` emits one subpath per module.\n */\n\nconst esc = (s: string): string =>\n s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n\nexport function toSvg(matrix: QrMatrix, options: QrSvgOptions = {}): string {\n const margin = options.margin ?? 4;\n const scale = options.scale ?? 1;\n const dark = options.dark ?? 'currentColor';\n const light = options.light ?? 'transparent';\n const optimize = options.optimizePath ?? true;\n const dim = (matrix.size + margin * 2) * scale;\n\n const parts: string[] = [`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${dim} ${dim}\" role=\"img\"`];\n if (options.label !== undefined) {\n parts.push(` aria-label=\"${esc(options.label)}\"`);\n }\n parts.push(` shape-rendering=\"crispEdges\">`);\n if (options.label !== undefined) parts.push(`<title>${esc(options.label)}</title>`);\n if (light !== 'transparent') parts.push(`<rect width=\"${dim}\" height=\"${dim}\" fill=\"${light}\"/>`);\n\n const path: string[] = [];\n for (let y = 0; y < matrix.size; y++) {\n let x = 0;\n while (x < matrix.size) {\n if (!matrix.get(x, y)) {\n x++;\n continue;\n }\n if (optimize) {\n let run = 1;\n while (x + run < matrix.size && matrix.get(x + run, y)) run++;\n path.push(`M${(x + margin) * scale} ${(y + margin) * scale}h${run * scale}v${scale}h${-run * scale}z`);\n x += run;\n } else {\n path.push(`M${(x + margin) * scale} ${(y + margin) * scale}h${scale}v${scale}h${-scale}z`);\n x++;\n }\n }\n }\n parts.push(`<path d=\"${path.join('')}\" fill=\"${dark}\"/>`);\n parts.push('</svg>');\n return parts.join('');\n}\n"],"mappings":"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"}
package/dist/sigil.js CHANGED
@@ -1,2 +1,2 @@
1
- function e(e,t,n={}){let r=n.margin??4,i=n.scale??1,a=n.dark??`#000000`,o=n.light??`#ffffff`,s=(e.size+r*2)*i,c=globalThis.devicePixelRatio||1;t.width=s*c,t.height=s*c,t.style.width=`${s}px`,t.style.height=`${s}px`;let l=t.getContext(`2d`);if(!l)throw Error(`Canvas 2D context unavailable`);l.scale(c,c),l.fillStyle=o,l.fillRect(0,0,s,s),l.fillStyle=a;for(let t=0;t<e.size;t++)for(let n=0;n<e.size;n++)e.get(n,t)&&l.fillRect((n+r)*i,(t+r)*i,i,i);return s}var t=[`L`,`M`,`Q`,`H`],n=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`,r={alphanumeric:2,byte:4,numeric:1},i={alphanumeric:[9,11,13],byte:[8,16,16],numeric:[10,12,14]},a={H:2,L:1,M:0,Q:3},o=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],s=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,56,59,62,65,68,71,74,77,81]],c=e=>t.indexOf(e),l=e=>e*4+17;function u(e){if(e===1)return[];let t=Math.floor(e/7)+2,n=e===32?26:Math.ceil((e*4+4)/(t*2-2))*2,r=[6];for(let i=e*4+10;r.length<t;i-=n)r.splice(1,0,i);return r}function d(e){let t=(16*e+128)*e+64;if(e>=2){let n=Math.floor(e/7)+2;t-=(25*n-10)*n-55,e>=7&&(t-=36)}return t}var f=e=>Math.floor(d(e)/8);function p(e,t){return o[c(t)][e]}function m(e,t){return s[c(t)][e]}function h(e,t){return f(e)-p(e,t)*m(e,t)}function g(e){return e<=9?0:e<=26?1:2}var _=1335,ee=21522,v=7973;function te(e,t){let n=a[e]<<3|t,r=n;for(let e=0;e<10;e++)r=r<<1^(r>>>9&1)*_;return(n<<10|r&1023)^ee}function ne(e){let t=e;for(let e=0;e<12;e++)t=t<<1^(t>>>11&1)*v;return e<<12|t&4095}var y=(e,t,n,r)=>{e.modules[n][t]=r,e.isFunction[n][t]=!0};function b(e,t,n){let r=e.size,i=te(t,n),a=e=>(i>>>e&1)==1;for(let t=0;t<=5;t++)y(e,8,t,a(t));y(e,8,7,a(6)),y(e,8,8,a(7)),y(e,7,8,a(8));for(let t=9;t<15;t++)y(e,14-t,8,a(t));for(let t=0;t<8;t++)y(e,r-1-t,8,a(t));for(let t=8;t<15;t++)y(e,8,r-15+t,a(t));y(e,8,r-8,!0)}function x(e,t){if(t<7)return;let n=e.size,r=ne(t);for(let t=0;t<18;t++){let i=(r>>>t&1)==1,a=n-11+t%3,o=Math.floor(t/3);y(e,a,o,i),y(e,o,a,i)}}var S=[(e,t)=>(e+t)%2==0,(e,t)=>t%2==0,e=>e%3==0,(e,t)=>(e+t)%3==0,(e,t)=>(Math.floor(e/3)+Math.floor(t/2))%2==0,(e,t)=>e*t%2+e*t%3==0,(e,t)=>(e*t%2+e*t%3)%2==0,(e,t)=>((e+t)%2+e*t%3)%2==0];function C(e,t){let n=S[t];for(let t=0;t<e.size;t++)for(let r=0;r<e.size;r++)!e.isFunction[t][r]&&n(r,t)&&(e.modules[t][r]=!e.modules[t][r])}var w=3,re=3,ie=40,ae=10;function oe(e){let t=0,n=(e,n)=>(!e&&n>=5&&(t+=w+n-5),e?n+1:1);for(let r=0;r<e.size;r++){let i=1,a=1;for(let t=1;t<e.size;t++)i=n(e.modules[r][t]===e.modules[r][t-1],i),a=n(e.modules[t][r]===e.modules[t-1][r],a);i>=5&&(t+=w+i-5),a>=5&&(t+=w+a-5)}return t}function se(e){let t=0;for(let n=0;n<e.size-1;n++)for(let r=0;r<e.size-1;r++){let i=e.modules[n][r];i===e.modules[n][r+1]&&i===e.modules[n+1][r]&&i===e.modules[n+1][r+1]&&(t+=re)}return t}function ce(e){let t=e.size,n=0,r=e=>{for(let r=0;r+11<=t;r++){let t=Array.from({length:11},(t,n)=>e(r+n)),i=[!1,!1,!1,!1,!0,!1,!0,!0,!0,!1,!0],a=[!0,!1,!0,!0,!0,!1,!0,!1,!1,!1,!1];(t.every((e,t)=>e===i[t])||t.every((e,t)=>e===a[t]))&&(n+=ie)}};for(let n=0;n<t;n++)r(t=>e.modules[n][t]);for(let n=0;n<t;n++)r(t=>e.modules[t][n]);return n}function le(e){let t=0;for(let n of e.modules)for(let e of n)e&&t++;let n=e.size*e.size;return Math.floor(Math.abs(t*20-n*10)/n)*ae}function ue(e){return oe(e)+se(e)+ce(e)+le(e)}function de(e){return{isFunction:Array.from({length:e},()=>Array(e).fill(!1)),modules:Array.from({length:e},()=>Array(e).fill(!1)),size:e}}var T=(e,t,n,r)=>{e.modules[n][t]=r,e.isFunction[n][t]=!0};function E(e,t,n){for(let r=-4;r<=4;r++)for(let i=-4;i<=4;i++){let a=t+3+i,o=n+3+r;if(a<0||o<0||a>=e.size||o>=e.size)continue;let s=Math.max(Math.abs(i),Math.abs(r));T(e,a,o,s!==2&&s!==4)}}function fe(e){for(let t=8;t<e.size-8;t++){let n=t%2==0;e.isFunction[6][t]||T(e,t,6,n),e.isFunction[t][6]||T(e,6,t,n)}}function pe(e,t,n){for(let r=-2;r<=2;r++)for(let i=-2;i<=2;i++)T(e,t+i,n+r,Math.max(Math.abs(i),Math.abs(r))!==1)}function me(e){let t=e.size;for(let t=0;t<=8;t++)t!==6&&(e.isFunction[8][t]=!0,e.isFunction[t][8]=!0);for(let n=0;n<7;n++)e.isFunction[t-1-n][8]=!0;for(let n=0;n<8;n++)e.isFunction[8][t-1-n]=!0;e.isFunction[t-8][8]=!0}function D(e,t){if(t<7)return;let n=e.size;for(let t=0;t<18;t++){let r=n-11+t%3,i=Math.floor(t/3);e.isFunction[i][r]=!0,e.isFunction[r][i]=!0}}function O(e,t){E(e,0,0),E(e,e.size-7,0),E(e,0,e.size-7),fe(e);let n=u(t);for(let t of n)for(let r of n)r===6&&t===6||r===6&&t===e.size-7||r===e.size-7&&t===6||pe(e,r,t);me(e),D(e,t)}function k(e,t){let n=e.size,r=t.length*8,i=0,a=!0;for(let o=n-1;o>=1;o-=2){o===6&&(o=5);for(let s=0;s<n;s++)for(let c=0;c<2;c++){let l=o-c,u=a?n-1-s:s;e.isFunction[u][l]||(e.modules[u][l]=i<r&&(t[i>>>3]>>>7-(i&7)&1)==1,i++)}a=!a}}var A=285,j=new Uint8Array(512),M=new Uint8Array(256);{let e=1;for(let t=0;t<255;t++)j[t]=e,M[e]=t,e<<=1,e&256&&(e^=A);for(let e=255;e<512;e++)j[e]=j[e-255]}function N(e,t){return e===0||t===0?0:j[M[e]+M[t]]}function P(e){return j[e%255]}function F(e,t){let n=Array(e.length+t.length-1).fill(0);for(let r=0;r<e.length;r++)for(let i=0;i<t.length;i++)n[r+i]^=N(e[r],t[i]);return n}var I=new Map;function L(e){let t=I.get(e);if(t)return t;let n=[1];for(let t=0;t<e;t++)n=F(n,[1,P(t)]);return I.set(e,n),n}function R(e,t){let n=L(t),r=Array(t).fill(0);for(let i of e){let e=i^r[0];if(r.copyWithin(0,1),r[t-1]=0,e!==0)for(let i=0;i<t;i++)r[i]^=N(n[i+1],e)}return r}var z=class{bits=[];get length(){return this.bits.length}append(e,t){for(let n=t-1;n>=0;n--)this.bits.push(e>>>n&1)}padToByte(){for(;this.bits.length%8!=0;)this.bits.push(0)}toBytes(){let e=[];for(let t=0;t<this.bits.length;t+=8){let n=0;for(let e=0;e<8;e++)n=n<<1|this.bits[t+e];e.push(n)}return e}};function B(e){if(/^\d+$/.test(e))return`numeric`;for(let t of e)if(!`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.includes(t))return`byte`;return`alphanumeric`}var V=new TextEncoder;function he(e,t){switch(t){case`numeric`:return Math.floor(e.length/3)*10+(e.length%3==1?4:e.length%3==2?7:0);case`alphanumeric`:return Math.floor(e.length/2)*11+e.length%2*6;case`byte`:return V.encode(e).length*8}}function ge(e,t,a,o){switch(e.append(r[a],4),e.append(_e(t,a),i[a][g(o)]),a){case`numeric`:for(let n=0;n<t.length;){let r=Math.min(3,t.length-n);e.append(Number.parseInt(t.slice(n,n+r),10),r===3?10:r===2?7:4),n+=r}break;case`alphanumeric`:for(let r=0;r<t.length;)r+1<t.length?(e.append(n.indexOf(t[r])*45+n.indexOf(t[r+1]),11),r+=2):(e.append(n.indexOf(t[r]),6),r+=1);break;case`byte`:for(let n of V.encode(t))e.append(n,8)}}function _e(e,t){return t===`byte`?V.encode(e).length:e.length}var ve=(e,t)=>h(e,t)*8;function H(e,t,n){return 4+i[t][g(n)]+he(e,t)}function ye(e,t,n,r){let i=new z;ge(i,e,t,n);let a=ve(n,r);i.append(0,Math.min(4,a-i.length)),i.padToByte();let o=i.toBytes(),s=[236,17];for(let e=0;o.length<h(n,r);e++)o.push(s[e%2]);return o}var U=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},W=class extends U{bytes;maxBytes;version;constructor(e,t,n,r,i){super(e,i),this.bytes=t,this.maxBytes=n,this.version=r}},G=class extends U{},K=class extends U{},q=class extends U{},J=class extends U{},Y=40;function be(e){let{version:t,minVersion:n,mask:r,errorCorrection:i}=e,a=e=>Number.isInteger(e)&&e>=1&&e<=Y;if(t!==void 0&&!a(t))throw new G(`version must be an integer 1–${Y}, got ${t}`);if(n!==void 0&&!a(n))throw new G(`minVersion must be an integer 1–${Y}, got ${n}`);if(t!==void 0&&n!==void 0&&n>t)throw new G(`minVersion (${n}) exceeds version (${t})`);if(r!==void 0&&(!Number.isInteger(r)||r<0||r>7))throw new G(`mask must be an integer 0–7, got ${r}`);if(i!==void 0&&!`LMQH`.includes(i))throw new G(`errorCorrection must be 'L', 'M', 'Q', or 'H'`)}function X(e,t,n){let r=i[n][g(e)],a=h(e,t)*8-4-r;if(a<=0)return 0;switch(n){case`numeric`:return Math.floor(a/10)*3+(a%10>=7?2:+(a%10>=4));case`alphanumeric`:return Math.floor(a/11)*2+ +(a%11>=6);case`byte`:return Math.floor(a/8)}}function xe(e,t,n,r){for(let i=r;i<=Y;i++)if(H(e,t,i)<=h(i,n)*8)return i;return-1}function Se(e,t,n){let r=m(t,n),i=p(t,n),a=f(t),o=Math.floor(a/r)-i,s=a%r,c=[],l=0;for(let t=0;t<r;t++){let n=t>=r-s,a=e.slice(l,l+o+ +!!n);l+=a.length;let u=R(a,i);c.push(n?[...a,...u]:[...a,0,...u])}let u=[];for(let e=0;e<c[0].length;e++)for(let t=0;t<r;t++)(e!==o||t>=r-s)&&u.push(c[t][e]);return u}function Z(e,t){let n=e.map(e=>Object.freeze([...e]));return Object.freeze(n),Object.freeze({...t,get:(e,r)=>e>=0&&r>=0&&e<t.size&&r<t.size&&n[r][e],modules:n})}function Ce(e,t={}){be(t);let n=typeof e==`string`?e:new TextDecoder().decode(e);if(n.length===0)throw new G(`Cannot encode an empty input`);let r=t.errorCorrection??`M`,i=t.mode??B(n);if(i!==`byte`&&B(n)!==i&&!we(n,i))throw new G(`Input cannot be encoded in ${i} mode`);let a=t.version??xe(n,i,r,t.minVersion??1);if(a===-1||H(n,i,a)>h(a,r)*8){let e=new TextEncoder().encode(n).length,a=X(t.version??Y,r,i);throw new W(`Input of ${e} bytes exceeds QR capacity (${a} ${i===`byte`?`bytes`:`chars`} at version ${t.version??Y}-${r})`,e,a,t.version??Y)}let o=H(n,i,a),s=h(a,r)*8;o/s>.9&&t.version===void 0&&`${Math.round(o/s*100)}${a}${r}`;let c=Se(ye(n,i,a,r),a,r),u=de(l(a));O(u,a),k(u,c);let d=t.mask===void 0?[0,1,2,3,4,5,6,7]:[t.mask],f=d[0],p=1/0,m=null;for(let e of d){C(u,e),b(u,r,e);let t=ue(u);t<p&&(p=t,f=e,m=u.modules.map(e=>[...e])),C(u,e),e!==d[d.length-1]&&Te(u)}return u.modules=m,x(u,a),Z(u.modules,{errorCorrection:r,mask:f,mode:i,size:u.size,version:a})}function we(e,t){return t===`numeric`?/^\d+$/.test(e):t!==`alphanumeric`||[...e].every(e=>n.includes(e))}function Te(e){let t=e.size,n=[];for(let e=0;e<=8;e++)e!==6&&n.push([8,e],[e,8]);for(let e=0;e<8;e++)n.push([t-1-e,8]);for(let e=0;e<7;e++)n.push([8,t-1-e]);n.push([8,t-8]);for(let[t,r]of n)e.modules[r][t]=!1}function Ee(e,t,n){if(!Number.isInteger(e)||e<1||e>Y)throw new G(`version must be an integer 1–${Y}, got ${e}`);return X(e,t,n)}var De=globalThis,Q=()=>De.BarcodeDetector;function Oe(){return typeof Q()==`function`}async function ke(){let e=Q();if(typeof e!=`function`)return!1;if(typeof e.getSupportedFormats!=`function`)return!0;try{return(await e.getSupportedFormats()).includes(`qr_code`)}catch{return!1}}async function Ae(e,t={}){t.signal?.throwIfAborted();let n=Q(),r=t.detector??(n?new n({formats:[`qr_code`]}):void 0);if(!r)throw new K(`BarcodeDetector is not available in this environment`);let i=await r.detect(e);t.signal?.throwIfAborted();let a=i[0];return a?{cornerPoints:a.cornerPoints,value:a.rawValue}:null}function je(e){let t=e.mediaDevices??globalThis.navigator?.mediaDevices,n=e.once??!0,r=e.intervalMs??200,i=new AbortController,a=new Set,o=new Set,s=`idle`,c=null,l=null,u=!1,d=e=>{if(a.size!==0)for(let t of[...a])try{t(e)}catch{}},f=e=>{s!==e&&(s=e,d({status:e,type:`status-change`}))},p=()=>{if(l!==null&&(clearInterval(l),l=null),c){for(let e of c.getTracks())e.stop();c=null}e.video.srcObject=null},m=e=>{d({error:e,type:`error`}),p(),f(`stopped`)},h=async()=>{if(s!==`scanning`||c===null)return;let t=e.video;if(t.readyState<2){d({reason:`not-ready`,type:`frame-skipped`});return}if(u){d({reason:`busy`,type:`frame-skipped`});return}u=!0;let r=Date.now();try{let e=(await(await g).detect(t))[0];if(e){let t={cornerPoints:e.cornerPoints,value:e.rawValue};d({elapsedMs:Date.now()-r,type:`detect`,value:t.value});for(let e of[...o])e(t);n&&(p(),f(`stopped`))}}catch(e){m(e instanceof U?e:new U(`QR detection failed`,{cause:e}))}finally{u=!1}},g=Promise.resolve().then(()=>{if(e.detector)return e.detector;let t=Q();if(typeof t!=`function`)throw new K(`BarcodeDetector is not available in this environment`);return new t({formats:[`qr_code`]})}),_={get disposalSignal(){return i.signal},dispose(){s!==`disposed`&&(d({type:`dispose`}),p(),o.clear(),a.clear(),f(`disposed`),i.abort())},get disposed(){return s===`disposed`},onResult(e){return s===`disposed`?()=>{}:(o.add(e),()=>o.delete(e))},async start(){if(s===`disposed`)throw new J(`Scanner is disposed`);if(s!==`starting`&&s!==`scanning`){if(!t||typeof t.getUserMedia!=`function`)throw new K(`getUserMedia is not available in this environment`);await g,e.signal?.throwIfAborted(),f(`starting`);try{c=await t.getUserMedia({video:e.constraints??{facingMode:`environment`}})}catch(e){throw f(`idle`),e instanceof DOMException&&e.name===`NotAllowedError`?new q(`Camera permission denied`,{cause:e}):e instanceof Error?e:new U(`Camera request failed`,{cause:e})}e.signal?.throwIfAborted(),e.video.srcObject=c,await e.video.play().catch(()=>{}),f(`scanning`),l=setInterval(()=>void h(),r),h()}},get status(){return s},stop(){s!==`disposed`&&(p(),f(s===`idle`?`idle`:`stopped`))},tap(e,t){if(s===`disposed`)return()=>{};a.add(e);let n=()=>a.delete(e);return t?.signal?.addEventListener(`abort`,n,{once:!0}),n},[Symbol.dispose](){_.dispose()}};return e.signal?.addEventListener(`abort`,()=>_.stop(),{once:!0}),_}var $=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`);function Me(e,t={}){let n=t.margin??4,r=t.scale??1,i=t.dark??`currentColor`,a=t.light??`transparent`,o=t.optimizePath??!0,s=(e.size+n*2)*r,c=[`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${s} ${s}" role="img"`];t.label!==void 0&&c.push(` aria-label="${$(t.label)}"`),c.push(` shape-rendering="crispEdges">`),t.label!==void 0&&c.push(`<title>${$(t.label)}</title>`),a!==`transparent`&&c.push(`<rect width="${s}" height="${s}" fill="${a}"/>`);let l=[];for(let t=0;t<e.size;t++){let i=0;for(;i<e.size;){if(!e.get(i,t)){i++;continue}if(o){let a=1;for(;i+a<e.size&&e.get(i+a,t);)a++;l.push(`M${(i+n)*r} ${(t+n)*r}h${a*r}v${r}h${-a*r}z`),i+=a}else l.push(`M${(i+n)*r} ${(t+n)*r}h${r}v${r}h${-r}z`),i++}}return c.push(`<path d="${l.join(``)}" fill="${i}"/>`),c.push(`</svg>`),c.join(``)}export{W as SigilCapacityError,J as SigilDisposedError,U as SigilError,G as SigilOptionError,q as SigilPermissionError,K as SigilUnsupportedError,je as createQrScanner,Ae as detectQr,e as drawToCanvas,Ce as encodeQr,Oe as isQrScanSupported,Ee as qrCapacity,ke as qrScanSupport,Me as toSvg};
1
+ var SigilError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},SigilCapacityError=class extends SigilError{bytes;maxBytes;version;constructor(e,t,n,r,i){super(e,i),this.bytes=t,this.maxBytes=n,this.version=r}},SigilOptionError=class extends SigilError{},SigilUnsupportedError=class extends SigilError{},SigilPermissionError=class extends SigilError{},SigilDisposedError=class extends SigilError{};function drawToCanvas(e,t,n={}){let r=n.margin??4,i=n.scale??1,a=n.dark??`#000000`,o=n.light??`#ffffff`,s=(e.size+r*2)*i,c=globalThis.devicePixelRatio||1;t.width=s*c,t.height=s*c,t.style.width=`${s}px`,t.style.height=`${s}px`;let l=t.getContext(`2d`);if(!l)throw new SigilUnsupportedError(`Canvas 2D context unavailable`);l.scale(c,c),l.fillStyle=o,l.fillRect(0,0,s,s),l.fillStyle=a;for(let t=0;t<e.size;t++)for(let n=0;n<e.size;n++)e.get(n,t)&&l.fillRect((n+r)*i,(t+r)*i,i,i);return s}var e=[`L`,`M`,`Q`,`H`],t=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`,n={alphanumeric:2,byte:4,numeric:1},r={alphanumeric:[9,11,13],byte:[8,16,16],numeric:[10,12,14]},i={H:2,L:1,M:0,Q:3},a=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],o=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,56,59,62,65,68,71,74,77,81]],ecIndex=t=>e.indexOf(t),matrixSize=e=>e*4+17;function alignmentPatternPositions(e){if(e===1)return[];let t=Math.floor(e/7)+2,n=e===32?26:Math.ceil((e*4+4)/(t*2-2))*2,r=[6];for(let i=e*4+10;r.length<t;i-=n)r.splice(1,0,i);return r}function rawDataModules(e){let t=(16*e+128)*e+64;if(e>=2){let n=Math.floor(e/7)+2;t-=(25*n-10)*n-55,e>=7&&(t-=36)}return t}var totalCodewords=e=>Math.floor(rawDataModules(e)/8);function ecCodewordsPerBlock(e,t){return a[ecIndex(t)][e]}function numEcBlocks(e,t){return o[ecIndex(t)][e]}function dataCodewords(e,t){return totalCodewords(e)-ecCodewordsPerBlock(e,t)*numEcBlocks(e,t)}function versionGroup(e){return e<=9?0:e<=26?1:2}var s=1335,c=21522,l=7973;function formatInfoBits(e,t){let n=i[e]<<3|t,r=n;for(let e=0;e<10;e++)r=r<<1^(r>>>9&1)*s;return(n<<10|r&1023)^c}function versionInfoBits(e){let t=e;for(let e=0;e<12;e++)t=t<<1^(t>>>11&1)*l;return e<<12|t&4095}var setFunction$1=(e,t,n,r)=>{e.modules[n][t]=r,e.isFunction[n][t]=!0};function drawFormatInfo(e,t,n){let r=e.size,i=formatInfoBits(t,n),bit=e=>(i>>>e&1)==1;for(let t=0;t<=5;t++)setFunction$1(e,8,t,bit(t));setFunction$1(e,8,7,bit(6)),setFunction$1(e,8,8,bit(7)),setFunction$1(e,7,8,bit(8));for(let t=9;t<15;t++)setFunction$1(e,14-t,8,bit(t));for(let t=0;t<8;t++)setFunction$1(e,r-1-t,8,bit(t));for(let t=8;t<15;t++)setFunction$1(e,8,r-15+t,bit(t));setFunction$1(e,8,r-8,!0)}function drawVersionInfo(e,t){if(t<7)return;let n=e.size,r=versionInfoBits(t);for(let t=0;t<18;t++){let i=(r>>>t&1)==1,a=n-11+t%3,o=Math.floor(t/3);setFunction$1(e,a,o,i),setFunction$1(e,o,a,i)}}var u=[(e,t)=>(e+t)%2==0,(e,t)=>t%2==0,e=>e%3==0,(e,t)=>(e+t)%3==0,(e,t)=>(Math.floor(e/3)+Math.floor(t/2))%2==0,(e,t)=>e*t%2+e*t%3==0,(e,t)=>(e*t%2+e*t%3)%2==0,(e,t)=>((e+t)%2+e*t%3)%2==0];function applyMask(e,t){let n=u[t];for(let t=0;t<e.size;t++)for(let r=0;r<e.size;r++)!e.isFunction[t][r]&&n(r,t)&&(e.modules[t][r]=!e.modules[t][r])}var d=3,f=3,p=40,m=10;function penaltyRuns(e){let t=0,line=(e,n)=>(!e&&n>=5&&(t+=d+n-5),e?n+1:1);for(let n=0;n<e.size;n++){let r=1,i=1;for(let t=1;t<e.size;t++)r=line(e.modules[n][t]===e.modules[n][t-1],r),i=line(e.modules[t][n]===e.modules[t-1][n],i);r>=5&&(t+=d+r-5),i>=5&&(t+=d+i-5)}return t}function penaltyBlocks(e){let t=0;for(let n=0;n<e.size-1;n++)for(let r=0;r<e.size-1;r++){let i=e.modules[n][r];i===e.modules[n][r+1]&&i===e.modules[n+1][r]&&i===e.modules[n+1][r+1]&&(t+=f)}return t}function penaltyFinderLike(e){let t=e.size,n=0,checkLine=e=>{for(let r=0;r+11<=t;r++){let t=Array.from({length:11},(t,n)=>e(r+n)),i=[!1,!1,!1,!1,!0,!1,!0,!0,!0,!1,!0],a=[!0,!1,!0,!0,!0,!1,!0,!1,!1,!1,!1];(t.every((e,t)=>e===i[t])||t.every((e,t)=>e===a[t]))&&(n+=p)}};for(let n=0;n<t;n++)checkLine(t=>e.modules[n][t]);for(let n=0;n<t;n++)checkLine(t=>e.modules[t][n]);return n}function penaltyRatio(e){let t=0;for(let n of e.modules)for(let e of n)e&&t++;let n=e.size*e.size;return Math.floor(Math.abs(t*20-n*10)/n)*m}function penaltyScore(e){return penaltyRuns(e)+penaltyBlocks(e)+penaltyFinderLike(e)+penaltyRatio(e)}function createGrid(e){return{isFunction:Array.from({length:e},()=>Array(e).fill(!1)),modules:Array.from({length:e},()=>Array(e).fill(!1)),size:e}}var setFunction=(e,t,n,r)=>{e.modules[n][t]=r,e.isFunction[n][t]=!0};function drawFinder(e,t,n){for(let r=-4;r<=4;r++)for(let i=-4;i<=4;i++){let a=t+3+i,o=n+3+r;if(a<0||o<0||a>=e.size||o>=e.size)continue;let s=Math.max(Math.abs(i),Math.abs(r));setFunction(e,a,o,s!==2&&s!==4)}}function drawTiming(e){for(let t=8;t<e.size-8;t++){let n=t%2==0;e.isFunction[6][t]||setFunction(e,t,6,n),e.isFunction[t][6]||setFunction(e,6,t,n)}}function drawAlignment(e,t,n){for(let r=-2;r<=2;r++)for(let i=-2;i<=2;i++)setFunction(e,t+i,n+r,Math.max(Math.abs(i),Math.abs(r))!==1)}function reserveFormatAreas(e){let t=e.size;for(let t=0;t<=8;t++)t!==6&&(e.isFunction[8][t]=!0,e.isFunction[t][8]=!0);for(let n=0;n<7;n++)e.isFunction[t-1-n][8]=!0;for(let n=0;n<8;n++)e.isFunction[8][t-1-n]=!0;e.isFunction[t-8][8]=!0}function reserveVersionAreas(e,t){if(t<7)return;let n=e.size;for(let t=0;t<18;t++){let r=n-11+t%3,i=Math.floor(t/3);e.isFunction[i][r]=!0,e.isFunction[r][i]=!0}}function drawFunctionPatterns(e,t){drawFinder(e,0,0),drawFinder(e,e.size-7,0),drawFinder(e,0,e.size-7),drawTiming(e);let n=alignmentPatternPositions(t);for(let t of n)for(let r of n)r===6&&t===6||r===6&&t===e.size-7||r===e.size-7&&t===6||drawAlignment(e,r,t);reserveFormatAreas(e),reserveVersionAreas(e,t)}function placeData(e,t){let n=e.size,r=t.length*8,i=0,a=!0;for(let o=n-1;o>=1;o-=2){o===6&&(o=5);for(let s=0;s<n;s++)for(let c=0;c<2;c++){let l=o-c,u=a?n-1-s:s;e.isFunction[u][l]||(e.modules[u][l]=i<r&&(t[i>>>3]>>>7-(i&7)&1)==1,i++)}a=!a}}var h=285,g=new Uint8Array(512),_=new Uint8Array(256);{let e=1;for(let t=0;t<255;t++)g[t]=e,_[e]=t,e<<=1,e&256&&(e^=h);for(let e=255;e<512;e++)g[e]=g[e-255]}function gfMultiply(e,t){return e===0||t===0?0:g[_[e]+_[t]]}function gfExp(e){return g[e%255]}function gfPolyMultiply(e,t){let n=Array(e.length+t.length-1).fill(0);for(let r=0;r<e.length;r++)for(let i=0;i<t.length;i++)n[r+i]^=gfMultiply(e[r],t[i]);return n}var v=new Map;function generatorPoly(e){let t=v.get(e);if(t)return t;let n=[1];for(let t=0;t<e;t++)n=gfPolyMultiply(n,[1,gfExp(t)]);return v.set(e,n),n}function ecCodewords(e,t){let n=generatorPoly(t),r=Array(t).fill(0);for(let i of e){let e=i^r[0];if(r.copyWithin(0,1),r[t-1]=0,e!==0)for(let i=0;i<t;i++)r[i]^=gfMultiply(n[i+1],e)}return r}var y=new TextEncoder,payloadFromText=(e,t)=>t===`byte`?{bytes:y.encode(e),mode:`byte`}:{mode:t,text:e},payloadFromBytes=e=>({bytes:e,mode:`byte`});function payloadLength(e){return e.mode===`byte`?e.bytes.length:e.text.length}var BitStream=class{bits=[];get length(){return this.bits.length}append(e,t){for(let n=t-1;n>=0;n--)this.bits.push(e>>>n&1)}padToByte(){for(;this.bits.length%8!=0;)this.bits.push(0)}toBytes(){let e=[];for(let t=0;t<this.bits.length;t+=8){let n=0;for(let e=0;e<8;e++)n=n<<1|this.bits[t+e];e.push(n)}return e}};function detectMode(e){if(/^\d+$/.test(e))return`numeric`;for(let t of e)if(!`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.includes(t))return`byte`;return`alphanumeric`}function dataBitLength(e){switch(e.mode){case`numeric`:return Math.floor(e.text.length/3)*10+(e.text.length%3==1?4:e.text.length%3==2?7:0);case`alphanumeric`:return Math.floor(e.text.length/2)*11+e.text.length%2*6;case`byte`:return e.bytes.length*8}}function appendSegment(e,i,a){switch(e.append(n[i.mode],4),e.append(payloadLength(i),r[i.mode][versionGroup(a)]),i.mode){case`numeric`:for(let t=0;t<i.text.length;){let n=Math.min(3,i.text.length-t);e.append(Number.parseInt(i.text.slice(t,t+n),10),n===3?10:n===2?7:4),t+=n}break;case`alphanumeric`:for(let n=0;n<i.text.length;)n+1<i.text.length?(e.append(t.indexOf(i.text[n])*45+t.indexOf(i.text[n+1]),11),n+=2):(e.append(t.indexOf(i.text[n]),6),n+=1);break;case`byte`:for(let t of i.bytes)e.append(t,8)}}var dataCapacityBits=(e,t)=>dataCodewords(e,t)*8;function segmentBits(e,t){return 4+r[e.mode][versionGroup(t)]+dataBitLength(e)}function buildDataCodewords(e,t,n){let r=new BitStream;appendSegment(r,e,t);let i=dataCapacityBits(t,n);r.append(0,Math.min(4,i-r.length)),r.padToByte();let a=r.toBytes(),o=[236,17];for(let e=0;a.length<dataCodewords(t,n);e++)a.push(o[e%2]);return a}var b=40;function checkOptions(e){let{version:t,minVersion:n,mask:r,errorCorrection:i}=e,inRange=e=>Number.isInteger(e)&&e>=1&&e<=b;if(t!==void 0&&!inRange(t))throw new SigilOptionError(`version must be an integer 1–${b}, got ${t}`);if(n!==void 0&&!inRange(n))throw new SigilOptionError(`minVersion must be an integer 1–${b}, got ${n}`);if(t!==void 0&&n!==void 0&&n>t)throw new SigilOptionError(`minVersion (${n}) exceeds version (${t})`);if(r!==void 0&&(!Number.isInteger(r)||r<0||r>7))throw new SigilOptionError(`mask must be an integer 0–7, got ${r}`);if(i!==void 0&&!`LMQH`.includes(i))throw new SigilOptionError(`errorCorrection must be 'L', 'M', 'Q', or 'H'`)}function capacityFor(e,t,n){let i=r[n][versionGroup(e)],a=dataCodewords(e,t)*8-4-i;if(a<=0)return 0;switch(n){case`numeric`:return Math.floor(a/10)*3+(a%10>=7?2:+(a%10>=4));case`alphanumeric`:return Math.floor(a/11)*2+ +(a%11>=6);case`byte`:return Math.floor(a/8)}}function pickVersion(e,t,n){for(let r=n;r<=b;r++)if(segmentBits(e,r)<=dataCodewords(r,t)*8)return r;return null}function capacityError(e,t,n){let r=payloadLength(e),i=capacityFor(n,t,e.mode),a=e.mode===`byte`?`bytes`:`chars`;return new SigilCapacityError(`Input of ${r} ${a} exceeds QR capacity (${i} ${a} at version ${n}-${t})`,r,i,n)}function interleaveBlocks(e,t,n){let r=numEcBlocks(t,n),i=ecCodewordsPerBlock(t,n),a=totalCodewords(t),o=Math.floor(a/r)-i,s=a%r,c=[],l=0;for(let t=0;t<r;t++){let n=t>=r-s,a=e.slice(l,l+o+ +!!n);l+=a.length;let u=ecCodewords(a,i);c.push(n?[...a,...u]:[...a,0,...u])}let u=[];for(let e=0;e<c[0].length;e++)for(let t=0;t<r;t++)(e!==o||t>=r-s)&&u.push(c[t][e]);return u}function freezeMatrix(e,t){let n=e.map(e=>Object.freeze([...e]));return Object.freeze(n),Object.freeze({...t,get:(e,r)=>e>=0&&r>=0&&e<t.size&&r<t.size&&n[r][e]})}function encodeQr(e,t={}){if(checkOptions(t),e.length===0)throw new SigilOptionError(`Cannot encode an empty input`);let n=t.errorCorrection??`M`;if(typeof e!=`string`&&t.mode!==void 0&&t.mode!==`byte`)throw new SigilOptionError(`Uint8Array input can only be encoded in byte mode`);let r=t.mode??(typeof e==`string`?detectMode(e):`byte`);if(typeof e==`string`&&!isModeCompatible(e,r))throw new SigilOptionError(`Input cannot be encoded in ${r} mode`);let i=typeof e==`string`?payloadFromText(e,r):payloadFromBytes(e),a=t.version??pickVersion(i,n,t.minVersion??1);if(a===null||segmentBits(i,a)>dataCodewords(a,n)*8)throw capacityError(i,n,t.version??b);let o=interleaveBlocks(buildDataCodewords(i,a,n),a,n),s=createGrid(matrixSize(a));drawFunctionPatterns(s,a),placeData(s,o);let c=t.mask===void 0?[0,1,2,3,4,5,6,7]:[t.mask],l=c[0],u=1/0;for(let e of c){applyMask(s,e),drawFormatInfo(s,n,e);let t=penaltyScore(s);t<u&&(u=t,l=e),applyMask(s,e)}return applyMask(s,l),drawFormatInfo(s,n,l),drawVersionInfo(s,a),freezeMatrix(s.modules,{errorCorrection:n,mask:l,mode:r,size:s.size,version:a})}function isModeCompatible(e,n){return n===`numeric`?/^\d+$/.test(e):n!==`alphanumeric`||[...e].every(e=>t.includes(e))}function qrCapacity(e,t,n){if(!Number.isInteger(e)||e<1||e>b)throw new SigilOptionError(`version must be an integer 1–${b}, got ${e}`);return capacityFor(e,t,n)}var x=globalThis,barcodeDetector=()=>x.BarcodeDetector;function isQrScanSupported(){return typeof barcodeDetector()==`function`}async function qrScanSupport(){let e=barcodeDetector();if(typeof e!=`function`)return!1;if(typeof e.getSupportedFormats!=`function`)return!0;try{return(await e.getSupportedFormats()).includes(`qr_code`)}catch{return!1}}async function detectQr(e,t={}){t.signal?.throwIfAborted();let n=barcodeDetector(),r=t.detector??(n?new n({formats:[`qr_code`]}):void 0);if(!r)throw new SigilUnsupportedError(`BarcodeDetector is not available in this environment`);let i=await r.detect(e);t.signal?.throwIfAborted();let a=i[0];return a?{cornerPoints:a.cornerPoints,value:a.rawValue}:null}function createQrScanner(e){let t=e.mediaDevices??globalThis.navigator?.mediaDevices,n=e.once??!0,r=e.intervalMs??200,i=new AbortController,a=new Set,o=new Set,s=`idle`,c=null,l=null,u=!1,d,emit=e=>{if(a.size!==0)for(let t of[...a])try{t(e)}catch{}},setStatus=e=>{s!==e&&(s=e,emit({status:e,type:`status-change`}))},isStarting=()=>s===`starting`,stopTracks=()=>{if(l!==null&&(clearInterval(l),l=null),c){for(let e of c.getTracks())e.stop();c=null}e.video.srcObject=null},fail=e=>{emit({error:e,type:`error`}),stopTracks(),setStatus(`idle`)},getDetector=()=>(d??=(async()=>{if(e.detector)return e.detector;let t=barcodeDetector();if(typeof t!=`function`)throw new SigilUnsupportedError(`BarcodeDetector is not available in this environment`);return new t({formats:[`qr_code`]})})(),d),tick=async()=>{if(s!==`scanning`||c===null)return;let t=e.video;if(t.readyState<2){emit({reason:`not-ready`,type:`frame-skipped`});return}if(u){emit({reason:`busy`,type:`frame-skipped`});return}u=!0;let r=Date.now();try{let e=(await(await getDetector()).detect(t))[0];if(e){let t={cornerPoints:e.cornerPoints,value:e.rawValue};emit({elapsedMs:Date.now()-r,type:`detect`,value:t.value});for(let e of[...o])e(t);n&&(stopTracks(),setStatus(`idle`))}}catch(e){fail(e instanceof SigilError?e:new SigilError(`QR detection failed`,{cause:e}))}finally{u=!1}},f={get disposalSignal(){return i.signal},dispose(){s!==`disposed`&&(emit({type:`dispose`}),stopTracks(),o.clear(),a.clear(),setStatus(`disposed`),i.abort())},get disposed(){return s===`disposed`},onResult(e){return s===`disposed`?()=>{}:(o.add(e),()=>o.delete(e))},async start(){if(s===`disposed`)throw new SigilDisposedError(`Scanner is disposed`);if(s===`starting`||s===`scanning`)return;if(!t||typeof t.getUserMedia!=`function`)throw new SigilUnsupportedError(`getUserMedia is not available in this environment`);await getDetector(),e.signal?.throwIfAborted(),setStatus(`starting`);let n;try{n=await t.getUserMedia({video:e.constraints??{facingMode:`environment`}})}catch(e){throw setStatus(`idle`),e instanceof DOMException&&e.name===`NotAllowedError`?new SigilPermissionError(`Camera permission denied`,{cause:e}):e instanceof Error?e:new SigilError(`Camera request failed`,{cause:e})}if(!isStarting()){for(let e of n.getTracks())e.stop();return}if(c=n,e.video.srcObject=c,await e.video.play().catch(()=>{}),!isStarting()){stopTracks();return}setStatus(`scanning`),l=setInterval(()=>void tick(),r),tick()},get status(){return s},stop(){s!==`disposed`&&(stopTracks(),setStatus(`idle`))},tap(e,t){if(s===`disposed`)return()=>{};a.add(e);let off=()=>a.delete(e);return t?.signal?.addEventListener(`abort`,off,{once:!0}),off},[Symbol.dispose](){f.dispose()}};if(e.signal){let onAbort=()=>f.stop();e.signal.addEventListener(`abort`,onAbort,{once:!0}),i.signal.addEventListener(`abort`,()=>e.signal?.removeEventListener(`abort`,onAbort),{once:!0})}return f}var esc=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`);function toSvg(e,t={}){let n=t.margin??4,r=t.scale??1,i=t.dark??`currentColor`,a=t.light??`transparent`,o=t.optimizePath??!0,s=(e.size+n*2)*r,c=[`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${s} ${s}" role="img"`];t.label!==void 0&&c.push(` aria-label="${esc(t.label)}"`),c.push(` shape-rendering="crispEdges">`),t.label!==void 0&&c.push(`<title>${esc(t.label)}</title>`),a!==`transparent`&&c.push(`<rect width="${s}" height="${s}" fill="${a}"/>`);let l=[];for(let t=0;t<e.size;t++){let i=0;for(;i<e.size;){if(!e.get(i,t)){i++;continue}if(o){let a=1;for(;i+a<e.size&&e.get(i+a,t);)a++;l.push(`M${(i+n)*r} ${(t+n)*r}h${a*r}v${r}h${-a*r}z`),i+=a}else l.push(`M${(i+n)*r} ${(t+n)*r}h${r}v${r}h${-r}z`),i++}}return c.push(`<path d="${l.join(``)}" fill="${i}"/>`),c.push(`</svg>`),c.join(``)}export{SigilCapacityError,SigilDisposedError,SigilError,SigilOptionError,SigilPermissionError,SigilUnsupportedError,createQrScanner,detectQr,drawToCanvas,encodeQr,isQrScanSupported,qrCapacity,qrScanSupport,toSvg};
2
2
  //# sourceMappingURL=sigil.js.map