scanic 1.0.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -95,6 +95,34 @@ if (extracted.success) {
95
95
  }
96
96
  ```
97
97
 
98
+ ### Manual Corner Adjustment UI (New)
99
+
100
+ Use the built-in corner editor to let users drag corners on mobile and desktop,
101
+ then pass the confirmed corners into extraction.
102
+
103
+ ```js
104
+ import { createCornerEditor, extractDocument } from 'scanic';
105
+
106
+ const editor = createCornerEditor({
107
+ container: document.getElementById('editorHost'),
108
+ image: imageElement,
109
+ corners: detectedCorners, // optional: defaults to an inset quad
110
+ magnifier: {
111
+ zoom: 2,
112
+ size: 110
113
+ },
114
+ nudges: {
115
+ enabled: true,
116
+ steps: [1, 5]
117
+ },
118
+ onConfirm: async (corners) => {
119
+ const extracted = await extractDocument(imageElement, corners, { output: 'canvas' });
120
+ document.getElementById('output').appendChild(extracted.output);
121
+ editor.destroy();
122
+ }
123
+ });
124
+ ```
125
+
98
126
  ### Optimized Usage (Recommended for Batch/Real-time)
99
127
  The `Scanner` class maintains a persistent WebAssembly instance, avoiding the overhead of re-initializing WASM for every scan.
100
128
 
package/dist/scanic.js CHANGED
@@ -677,8 +677,16 @@ function isNodeRuntime() {
677
677
  async function initializeWasmInternal() {
678
678
  if (isNodeRuntime()) {
679
679
  try {
680
- const { readFile } = await Promise.resolve().then(() => __viteBrowserExternal);
681
- const { fileURLToPath } = await Promise.resolve().then(() => __viteBrowserExternal);
680
+ const fsModule = "node:fs/promises";
681
+ const urlModule = "node:url";
682
+ const { readFile } = await import(
683
+ /* @vite-ignore */
684
+ fsModule
685
+ );
686
+ const { fileURLToPath } = await import(
687
+ /* @vite-ignore */
688
+ urlModule
689
+ );
682
690
  const moduleUrl = new URL(import.meta.url);
683
691
  moduleUrl.search = "";
684
692
  moduleUrl.hash = "";
@@ -1112,6 +1120,688 @@ async function cannyEdgeDetector(input, options = {}) {
1112
1120
  timings.unshift({ step: "Edge Detection Total", ms: (tEnd - tStart).toFixed(2) });
1113
1121
  return finalEdges;
1114
1122
  }
1123
+ function cloneCorners(corners) {
1124
+ return {
1125
+ topLeft: { x: corners.topLeft.x, y: corners.topLeft.y },
1126
+ topRight: { x: corners.topRight.x, y: corners.topRight.y },
1127
+ bottomRight: { x: corners.bottomRight.x, y: corners.bottomRight.y },
1128
+ bottomLeft: { x: corners.bottomLeft.x, y: corners.bottomLeft.y }
1129
+ };
1130
+ }
1131
+ function pointDistance$1(a, b) {
1132
+ return Math.hypot(a.x - b.x, a.y - b.y);
1133
+ }
1134
+ function cornersAreFiniteAndDistinct$1(corners, minDistance = 4) {
1135
+ const points = [corners == null ? void 0 : corners.topLeft, corners == null ? void 0 : corners.topRight, corners == null ? void 0 : corners.bottomRight, corners == null ? void 0 : corners.bottomLeft];
1136
+ if (points.some((p) => !p || !Number.isFinite(p.x) || !Number.isFinite(p.y))) {
1137
+ return false;
1138
+ }
1139
+ for (let i = 0; i < points.length; i++) {
1140
+ for (let j = i + 1; j < points.length; j++) {
1141
+ if (pointDistance$1(points[i], points[j]) < minDistance) {
1142
+ return false;
1143
+ }
1144
+ }
1145
+ }
1146
+ return true;
1147
+ }
1148
+ function isConvexQuadrilateral$1(corners) {
1149
+ const points = [corners.topLeft, corners.topRight, corners.bottomRight, corners.bottomLeft];
1150
+ const crossSigns = [];
1151
+ for (let i = 0; i < points.length; i++) {
1152
+ const p0 = points[i];
1153
+ const p1 = points[(i + 1) % points.length];
1154
+ const p2 = points[(i + 2) % points.length];
1155
+ const cross = (p1.x - p0.x) * (p2.y - p1.y) - (p1.y - p0.y) * (p2.x - p1.x);
1156
+ if (Math.abs(cross) < 1e-6) continue;
1157
+ crossSigns.push(Math.sign(cross));
1158
+ }
1159
+ if (crossSigns.length < 3) {
1160
+ return false;
1161
+ }
1162
+ const firstSign = crossSigns[0];
1163
+ return crossSigns.every((s) => s === firstSign);
1164
+ }
1165
+ function createDefaultCorners(imageWidth, imageHeight, insetRatio = 0.08) {
1166
+ const inset = Math.max(8, Math.min(imageWidth, imageHeight) * insetRatio);
1167
+ return {
1168
+ topLeft: { x: inset, y: inset },
1169
+ topRight: { x: imageWidth - inset, y: inset },
1170
+ bottomRight: { x: imageWidth - inset, y: imageHeight - inset },
1171
+ bottomLeft: { x: inset, y: imageHeight - inset }
1172
+ };
1173
+ }
1174
+ function drawHandle(ctx, point, radius, color, stroke, lineWidth) {
1175
+ ctx.beginPath();
1176
+ ctx.arc(point.x, point.y, radius, 0, Math.PI * 2);
1177
+ ctx.fillStyle = color;
1178
+ ctx.fill();
1179
+ ctx.lineWidth = lineWidth;
1180
+ ctx.strokeStyle = stroke;
1181
+ ctx.stroke();
1182
+ }
1183
+ function normalizeImageToCanvas(image) {
1184
+ if (!image) {
1185
+ throw new Error("No image provided");
1186
+ }
1187
+ const isImageData = image && typeof image.width === "number" && typeof image.height === "number" && image.data;
1188
+ let width = 0;
1189
+ let height = 0;
1190
+ if (isImageData) {
1191
+ width = image.width;
1192
+ height = image.height;
1193
+ } else {
1194
+ width = image.width || image.naturalWidth;
1195
+ height = image.height || image.naturalHeight;
1196
+ }
1197
+ if (!width || !height) {
1198
+ throw new Error("Image must be loaded before creating the corner editor");
1199
+ }
1200
+ const canvas = document.createElement("canvas");
1201
+ canvas.width = width;
1202
+ canvas.height = height;
1203
+ const ctx = canvas.getContext("2d", { willReadFrequently: true });
1204
+ if (!ctx) {
1205
+ throw new Error("Failed to create 2D canvas context for source image");
1206
+ }
1207
+ if (isImageData) {
1208
+ ctx.putImageData(image, 0, 0);
1209
+ } else {
1210
+ ctx.drawImage(image, 0, 0, width, height);
1211
+ }
1212
+ return { canvas, width, height };
1213
+ }
1214
+ function createCornerEditor(options = {}) {
1215
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
1216
+ const container = options.container;
1217
+ if (!container || typeof container.appendChild !== "function") {
1218
+ throw new Error("createCornerEditor requires a valid container element");
1219
+ }
1220
+ const { canvas: sourceCanvas, width: imageWidth, height: imageHeight } = normalizeImageToCanvas(options.image);
1221
+ const editorCanvas = document.createElement("canvas");
1222
+ editorCanvas.style.position = "absolute";
1223
+ editorCanvas.style.top = "0";
1224
+ editorCanvas.style.left = "0";
1225
+ editorCanvas.style.display = "block";
1226
+ editorCanvas.style.boxSizing = "border-box";
1227
+ editorCanvas.style.touchAction = "none";
1228
+ editorCanvas.style.userSelect = "none";
1229
+ editorCanvas.style.webkitUserSelect = "none";
1230
+ editorCanvas.style.cursor = "crosshair";
1231
+ editorCanvas.style.outline = "none";
1232
+ const keyboardEnabled = options.keyboard !== false;
1233
+ if (keyboardEnabled) {
1234
+ editorCanvas.tabIndex = 0;
1235
+ editorCanvas.setAttribute("role", "application");
1236
+ editorCanvas.setAttribute("aria-label", "Document corner editor. Use arrow keys to adjust the selected corner.");
1237
+ }
1238
+ const restoreContainerStyle = {
1239
+ position: container.style.position,
1240
+ minHeight: container.style.minHeight
1241
+ };
1242
+ let changedContainerPosition = false;
1243
+ let changedContainerMinHeight = false;
1244
+ if (getComputedStyle(container).position === "static") {
1245
+ container.style.position = "relative";
1246
+ changedContainerPosition = true;
1247
+ }
1248
+ container.appendChild(editorCanvas);
1249
+ const ctx = editorCanvas.getContext("2d");
1250
+ if (!ctx) {
1251
+ throw new Error("Failed to create 2D canvas context for corner editor");
1252
+ }
1253
+ const magnifier = {
1254
+ enabled: ((_a = options.magnifier) == null ? void 0 : _a.enabled) !== false,
1255
+ size: ((_b = options.magnifier) == null ? void 0 : _b.size) || 110,
1256
+ zoom: ((_c = options.magnifier) == null ? void 0 : _c.zoom) || 2,
1257
+ margin: ((_d = options.magnifier) == null ? void 0 : _d.margin) || 16,
1258
+ borderColor: ((_e = options.magnifier) == null ? void 0 : _e.borderColor) || "#ffffff",
1259
+ borderWidth: ((_f = options.magnifier) == null ? void 0 : _f.borderWidth) || 2,
1260
+ crosshairColor: ((_g = options.magnifier) == null ? void 0 : _g.crosshairColor) || "#ffffff",
1261
+ crosshairSize: ((_h = options.magnifier) == null ? void 0 : _h.crosshairSize) || 18
1262
+ };
1263
+ const nudges = {
1264
+ enabled: !!((_i = options.nudges) == null ? void 0 : _i.enabled),
1265
+ steps: (((_j = options.nudges) == null ? void 0 : _j.steps) && options.nudges.steps.length ? options.nudges.steps : [1, 5]).map((v) => Math.max(1, Math.round(v)))
1266
+ };
1267
+ const defaultCorners = createDefaultCorners(imageWidth, imageHeight);
1268
+ const requestedCorners = options.corners ? cloneCorners(options.corners) : defaultCorners;
1269
+ let corners = cornersAreFiniteAndDistinct$1(requestedCorners) && isConvexQuadrilateral$1(requestedCorners) ? requestedCorners : defaultCorners;
1270
+ const initialCorners = cloneCorners(corners);
1271
+ let isDestroyed = false;
1272
+ let activeCornerKey = null;
1273
+ let dragPointerId = null;
1274
+ let lastPointerPosition = null;
1275
+ const handleHitArea = Math.max(24, options.handleHitArea || 48);
1276
+ const handleRadius = Math.max(8, Math.min(16, handleHitArea * 0.3));
1277
+ const cornerOrder = ["topLeft", "topRight", "bottomRight", "bottomLeft"];
1278
+ let view = { scale: 1, offsetX: 0, offsetY: 0, width: 1, height: 1 };
1279
+ let nudgeControls = null;
1280
+ let activeNudgeCorner = "topLeft";
1281
+ const runtimeGlobal = typeof window !== "undefined" ? window : globalThis;
1282
+ function emitChange() {
1283
+ if (typeof options.onChange === "function") {
1284
+ options.onChange(cloneCorners(corners));
1285
+ }
1286
+ }
1287
+ let lastDisplayWidth = 0;
1288
+ let lastDisplayHeight = 0;
1289
+ function computeDisplaySize() {
1290
+ const width = Math.max(1, Math.round(container.clientWidth));
1291
+ let height = Math.round(container.clientHeight);
1292
+ if (height < 80) {
1293
+ const aspect = imageHeight / Math.max(1, imageWidth);
1294
+ const viewportCap = (runtimeGlobal.innerHeight || 800) * 0.7;
1295
+ height = Math.max(240, Math.round(Math.min(width * aspect, viewportCap)));
1296
+ container.style.minHeight = height + "px";
1297
+ changedContainerMinHeight = true;
1298
+ }
1299
+ return { width, height: Math.max(1, height) };
1300
+ }
1301
+ function updateCanvasSize() {
1302
+ const { width, height } = computeDisplaySize();
1303
+ const dpr = runtimeGlobal.devicePixelRatio || 1;
1304
+ lastDisplayWidth = width;
1305
+ lastDisplayHeight = height;
1306
+ editorCanvas.style.width = width + "px";
1307
+ editorCanvas.style.height = height + "px";
1308
+ const bufferWidth = Math.round(width * dpr);
1309
+ const bufferHeight = Math.round(height * dpr);
1310
+ if (editorCanvas.width !== bufferWidth) editorCanvas.width = bufferWidth;
1311
+ if (editorCanvas.height !== bufferHeight) editorCanvas.height = bufferHeight;
1312
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
1313
+ const padding = 12;
1314
+ const availableWidth = Math.max(1, width - padding * 2);
1315
+ const availableHeight = Math.max(1, height - padding * 2);
1316
+ const scale = Math.min(availableWidth / imageWidth, availableHeight / imageHeight);
1317
+ const drawWidth = imageWidth * scale;
1318
+ const drawHeight = imageHeight * scale;
1319
+ view = {
1320
+ scale,
1321
+ offsetX: Math.round((width - drawWidth) / 2),
1322
+ offsetY: Math.round((height - drawHeight) / 2),
1323
+ width,
1324
+ height
1325
+ };
1326
+ }
1327
+ function imageToView(point) {
1328
+ return {
1329
+ x: view.offsetX + point.x * view.scale,
1330
+ y: view.offsetY + point.y * view.scale
1331
+ };
1332
+ }
1333
+ function viewToImage(x, y) {
1334
+ const px = (x - view.offsetX) / view.scale;
1335
+ const py = (y - view.offsetY) / view.scale;
1336
+ return {
1337
+ x: Math.max(0, Math.min(imageWidth, px)),
1338
+ y: Math.max(0, Math.min(imageHeight, py))
1339
+ };
1340
+ }
1341
+ function cornersValid(nextCorners) {
1342
+ return cornersAreFiniteAndDistinct$1(nextCorners) && isConvexQuadrilateral$1(nextCorners);
1343
+ }
1344
+ function getEventCanvasPoint(event) {
1345
+ const rect = editorCanvas.getBoundingClientRect();
1346
+ return {
1347
+ x: event.clientX - rect.left,
1348
+ y: event.clientY - rect.top
1349
+ };
1350
+ }
1351
+ function hitTestCorner(canvasX, canvasY) {
1352
+ let hit = null;
1353
+ let bestDistance = Infinity;
1354
+ for (const key of cornerOrder) {
1355
+ const p = imageToView(corners[key]);
1356
+ const d = Math.hypot(canvasX - p.x, canvasY - p.y);
1357
+ if (d <= handleHitArea && d < bestDistance) {
1358
+ bestDistance = d;
1359
+ hit = key;
1360
+ }
1361
+ }
1362
+ return hit;
1363
+ }
1364
+ function drawPolygonOverlay() {
1365
+ const points = cornerOrder.map((key) => imageToView(corners[key]));
1366
+ ctx.save();
1367
+ ctx.fillStyle = "rgba(15, 23, 42, 0.40)";
1368
+ ctx.beginPath();
1369
+ ctx.rect(0, 0, view.width, view.height);
1370
+ ctx.moveTo(points[0].x, points[0].y);
1371
+ for (let i = 1; i < points.length; i++) {
1372
+ ctx.lineTo(points[i].x, points[i].y);
1373
+ }
1374
+ ctx.closePath();
1375
+ ctx.fill("evenodd");
1376
+ ctx.restore();
1377
+ ctx.save();
1378
+ ctx.strokeStyle = "#22c55e";
1379
+ ctx.lineWidth = 3;
1380
+ ctx.beginPath();
1381
+ ctx.moveTo(points[0].x, points[0].y);
1382
+ for (let i = 1; i < points.length; i++) {
1383
+ ctx.lineTo(points[i].x, points[i].y);
1384
+ }
1385
+ ctx.closePath();
1386
+ ctx.stroke();
1387
+ ctx.restore();
1388
+ for (const key of cornerOrder) {
1389
+ const p = imageToView(corners[key]);
1390
+ const isActive = key === activeCornerKey;
1391
+ drawHandle(
1392
+ ctx,
1393
+ p,
1394
+ isActive ? handleRadius + 1 : handleRadius,
1395
+ isActive ? "#f59e0b" : "#ffffff",
1396
+ isActive ? "#7c2d12" : "#0f172a",
1397
+ 2
1398
+ );
1399
+ }
1400
+ }
1401
+ function drawMagnifier() {
1402
+ if (!magnifier.enabled || !activeCornerKey || !lastPointerPosition) {
1403
+ return;
1404
+ }
1405
+ const active = corners[activeCornerKey];
1406
+ const size = magnifier.size;
1407
+ const radius = size / 2;
1408
+ const zoom = Math.max(1.1, magnifier.zoom);
1409
+ let lensX = lastPointerPosition.x + radius + magnifier.margin;
1410
+ let lensY = lastPointerPosition.y - radius - magnifier.margin;
1411
+ if (lensX + radius > view.width) {
1412
+ lensX = lastPointerPosition.x - radius - magnifier.margin;
1413
+ }
1414
+ if (lensY - radius < 0) {
1415
+ lensY = lastPointerPosition.y + radius + magnifier.margin;
1416
+ }
1417
+ lensX = Math.max(radius + 2, Math.min(view.width - radius - 2, lensX));
1418
+ lensY = Math.max(radius + 2, Math.min(view.height - radius - 2, lensY));
1419
+ const sampleSize = size / zoom;
1420
+ const sx = Math.max(0, Math.min(imageWidth - sampleSize, active.x - sampleSize / 2));
1421
+ const sy = Math.max(0, Math.min(imageHeight - sampleSize, active.y - sampleSize / 2));
1422
+ ctx.save();
1423
+ ctx.beginPath();
1424
+ ctx.arc(lensX, lensY, radius, 0, Math.PI * 2);
1425
+ ctx.clip();
1426
+ ctx.drawImage(sourceCanvas, sx, sy, sampleSize, sampleSize, lensX - radius, lensY - radius, size, size);
1427
+ ctx.restore();
1428
+ ctx.save();
1429
+ ctx.beginPath();
1430
+ ctx.arc(lensX, lensY, radius, 0, Math.PI * 2);
1431
+ ctx.lineWidth = magnifier.borderWidth;
1432
+ ctx.strokeStyle = magnifier.borderColor;
1433
+ ctx.stroke();
1434
+ const ch = magnifier.crosshairSize / 2;
1435
+ ctx.strokeStyle = magnifier.crosshairColor;
1436
+ ctx.lineWidth = 1.5;
1437
+ ctx.beginPath();
1438
+ ctx.moveTo(lensX - ch, lensY);
1439
+ ctx.lineTo(lensX + ch, lensY);
1440
+ ctx.moveTo(lensX, lensY - ch);
1441
+ ctx.lineTo(lensX, lensY + ch);
1442
+ ctx.stroke();
1443
+ ctx.restore();
1444
+ }
1445
+ function render() {
1446
+ if (isDestroyed) return;
1447
+ ctx.clearRect(0, 0, view.width, view.height);
1448
+ ctx.drawImage(
1449
+ sourceCanvas,
1450
+ 0,
1451
+ 0,
1452
+ imageWidth,
1453
+ imageHeight,
1454
+ view.offsetX,
1455
+ view.offsetY,
1456
+ imageWidth * view.scale,
1457
+ imageHeight * view.scale
1458
+ );
1459
+ drawPolygonOverlay();
1460
+ drawMagnifier();
1461
+ }
1462
+ const raf = typeof runtimeGlobal.requestAnimationFrame === "function" ? runtimeGlobal.requestAnimationFrame.bind(runtimeGlobal) : null;
1463
+ const caf = typeof runtimeGlobal.cancelAnimationFrame === "function" ? runtimeGlobal.cancelAnimationFrame.bind(runtimeGlobal) : null;
1464
+ let rafId = null;
1465
+ function scheduleRender() {
1466
+ if (isDestroyed) return;
1467
+ if (!raf) {
1468
+ render();
1469
+ return;
1470
+ }
1471
+ if (rafId !== null) return;
1472
+ rafId = raf(() => {
1473
+ rafId = null;
1474
+ render();
1475
+ });
1476
+ }
1477
+ function setCorner(nextCornerKey, nextPoint) {
1478
+ const candidate = cloneCorners(corners);
1479
+ candidate[nextCornerKey] = {
1480
+ x: Math.max(0, Math.min(imageWidth, nextPoint.x)),
1481
+ y: Math.max(0, Math.min(imageHeight, nextPoint.y))
1482
+ };
1483
+ if (!cornersValid(candidate)) {
1484
+ return false;
1485
+ }
1486
+ corners = candidate;
1487
+ activeNudgeCorner = nextCornerKey;
1488
+ emitChange();
1489
+ scheduleRender();
1490
+ return true;
1491
+ }
1492
+ function buildNudgeControls() {
1493
+ if (!nudges.enabled) {
1494
+ return;
1495
+ }
1496
+ nudgeControls = document.createElement("div");
1497
+ nudgeControls.style.position = "absolute";
1498
+ nudgeControls.style.right = "8px";
1499
+ nudgeControls.style.bottom = "8px";
1500
+ nudgeControls.style.background = "rgba(15, 23, 42, 0.9)";
1501
+ nudgeControls.style.border = "1px solid rgba(148, 163, 184, 0.5)";
1502
+ nudgeControls.style.borderRadius = "10px";
1503
+ nudgeControls.style.padding = "8px";
1504
+ nudgeControls.style.display = "grid";
1505
+ nudgeControls.style.gridTemplateColumns = "repeat(4, auto)";
1506
+ nudgeControls.style.gap = "6px";
1507
+ nudgeControls.style.zIndex = "2";
1508
+ const makeButton = (glyph, ariaLabel, dx, dy, step) => {
1509
+ const btn = document.createElement("button");
1510
+ btn.type = "button";
1511
+ btn.textContent = glyph + (step > 1 ? " " + step : "");
1512
+ btn.setAttribute("aria-label", ariaLabel);
1513
+ btn.style.border = "1px solid #475569";
1514
+ btn.style.background = "#0f172a";
1515
+ btn.style.color = "#e2e8f0";
1516
+ btn.style.borderRadius = "6px";
1517
+ btn.style.padding = "4px 8px";
1518
+ btn.style.fontSize = "13px";
1519
+ btn.style.lineHeight = "1";
1520
+ btn.style.cursor = "pointer";
1521
+ btn.addEventListener("click", () => {
1522
+ const current = corners[activeNudgeCorner];
1523
+ setCorner(activeNudgeCorner, {
1524
+ x: current.x + dx * step,
1525
+ y: current.y + dy * step
1526
+ });
1527
+ });
1528
+ return btn;
1529
+ };
1530
+ for (const step of nudges.steps) {
1531
+ nudgeControls.appendChild(makeButton("←", `Move left ${step}px`, -1, 0, step));
1532
+ nudgeControls.appendChild(makeButton("→", `Move right ${step}px`, 1, 0, step));
1533
+ nudgeControls.appendChild(makeButton("↑", `Move up ${step}px`, 0, -1, step));
1534
+ nudgeControls.appendChild(makeButton("↓", `Move down ${step}px`, 0, 1, step));
1535
+ }
1536
+ container.appendChild(nudgeControls);
1537
+ }
1538
+ function handlePointerDown(event) {
1539
+ if (isDestroyed) return;
1540
+ const point = getEventCanvasPoint(event);
1541
+ const hitCorner = hitTestCorner(point.x, point.y);
1542
+ if (!hitCorner) return;
1543
+ if (typeof event.preventDefault === "function") {
1544
+ event.preventDefault();
1545
+ }
1546
+ activeCornerKey = hitCorner;
1547
+ activeNudgeCorner = hitCorner;
1548
+ dragPointerId = event.pointerId;
1549
+ lastPointerPosition = point;
1550
+ editorCanvas.style.cursor = "grabbing";
1551
+ if (keyboardEnabled && typeof editorCanvas.focus === "function") {
1552
+ try {
1553
+ editorCanvas.focus({ preventScroll: true });
1554
+ } catch (_) {
1555
+ editorCanvas.focus();
1556
+ }
1557
+ }
1558
+ if (editorCanvas.setPointerCapture && dragPointerId !== void 0) {
1559
+ editorCanvas.setPointerCapture(dragPointerId);
1560
+ }
1561
+ scheduleRender();
1562
+ }
1563
+ function handlePointerMove(event) {
1564
+ if (isDestroyed) return;
1565
+ const point = getEventCanvasPoint(event);
1566
+ if (!activeCornerKey) {
1567
+ editorCanvas.style.cursor = hitTestCorner(point.x, point.y) ? "grab" : "crosshair";
1568
+ return;
1569
+ }
1570
+ if (dragPointerId !== null && event.pointerId !== dragPointerId) return;
1571
+ lastPointerPosition = point;
1572
+ const imagePoint = viewToImage(point.x, point.y);
1573
+ setCorner(activeCornerKey, imagePoint);
1574
+ }
1575
+ function handlePointerUp(event) {
1576
+ if (!activeCornerKey) return;
1577
+ if (dragPointerId !== null && event.pointerId !== dragPointerId) return;
1578
+ if (editorCanvas.releasePointerCapture && dragPointerId !== null && dragPointerId !== void 0) {
1579
+ try {
1580
+ editorCanvas.releasePointerCapture(dragPointerId);
1581
+ } catch (_) {
1582
+ }
1583
+ }
1584
+ activeCornerKey = null;
1585
+ dragPointerId = null;
1586
+ lastPointerPosition = null;
1587
+ editorCanvas.style.cursor = "crosshair";
1588
+ scheduleRender();
1589
+ }
1590
+ function handleKeyDown(event) {
1591
+ if (isDestroyed || !keyboardEnabled) return;
1592
+ if (event.key === "Enter") {
1593
+ event.preventDefault();
1594
+ confirmEditor();
1595
+ return;
1596
+ }
1597
+ if (event.key === "Escape") {
1598
+ event.preventDefault();
1599
+ cancelEditor();
1600
+ return;
1601
+ }
1602
+ let dx = 0;
1603
+ let dy = 0;
1604
+ if (event.key === "ArrowLeft") dx = -1;
1605
+ else if (event.key === "ArrowRight") dx = 1;
1606
+ else if (event.key === "ArrowUp") dy = -1;
1607
+ else if (event.key === "ArrowDown") dy = 1;
1608
+ else return;
1609
+ event.preventDefault();
1610
+ const step = event.shiftKey ? nudges.steps[nudges.steps.length - 1] || 10 : 1;
1611
+ const current = corners[activeNudgeCorner];
1612
+ setCorner(activeNudgeCorner, {
1613
+ x: current.x + dx * step,
1614
+ y: current.y + dy * step
1615
+ });
1616
+ }
1617
+ function handleMouseDown(event) {
1618
+ handlePointerDown({
1619
+ clientX: event.clientX,
1620
+ clientY: event.clientY,
1621
+ pointerId: 1
1622
+ });
1623
+ }
1624
+ function handleMouseMove(event) {
1625
+ handlePointerMove({
1626
+ clientX: event.clientX,
1627
+ clientY: event.clientY,
1628
+ pointerId: 1
1629
+ });
1630
+ }
1631
+ function handleTouchStart(event) {
1632
+ const touch = event.touches[0];
1633
+ if (!touch) return;
1634
+ const point = getEventCanvasPoint(touch);
1635
+ if (hitTestCorner(point.x, point.y)) {
1636
+ event.preventDefault();
1637
+ }
1638
+ handlePointerDown({
1639
+ clientX: touch.clientX,
1640
+ clientY: touch.clientY,
1641
+ pointerId: 2
1642
+ });
1643
+ }
1644
+ function handleTouchMove(event) {
1645
+ const touch = event.touches[0];
1646
+ if (!touch) return;
1647
+ event.preventDefault();
1648
+ handlePointerMove({
1649
+ clientX: touch.clientX,
1650
+ clientY: touch.clientY,
1651
+ pointerId: 2
1652
+ });
1653
+ }
1654
+ function attachEvents() {
1655
+ if (typeof runtimeGlobal.PointerEvent !== "undefined") {
1656
+ editorCanvas.addEventListener("pointerdown", handlePointerDown);
1657
+ editorCanvas.addEventListener("pointermove", handlePointerMove);
1658
+ editorCanvas.addEventListener("pointerup", handlePointerUp);
1659
+ editorCanvas.addEventListener("pointercancel", handlePointerUp);
1660
+ } else {
1661
+ editorCanvas.addEventListener("mousedown", handleMouseDown);
1662
+ if (typeof runtimeGlobal.addEventListener === "function") {
1663
+ runtimeGlobal.addEventListener("mousemove", handleMouseMove);
1664
+ runtimeGlobal.addEventListener("mouseup", handlePointerUp);
1665
+ }
1666
+ editorCanvas.addEventListener("touchstart", handleTouchStart, { passive: false });
1667
+ editorCanvas.addEventListener("touchmove", handleTouchMove, { passive: false });
1668
+ editorCanvas.addEventListener("touchend", handlePointerUp);
1669
+ editorCanvas.addEventListener("touchcancel", handlePointerUp);
1670
+ }
1671
+ if (keyboardEnabled) {
1672
+ editorCanvas.addEventListener("keydown", handleKeyDown);
1673
+ }
1674
+ }
1675
+ function detachEvents() {
1676
+ editorCanvas.removeEventListener("pointerdown", handlePointerDown);
1677
+ editorCanvas.removeEventListener("pointermove", handlePointerMove);
1678
+ editorCanvas.removeEventListener("pointerup", handlePointerUp);
1679
+ editorCanvas.removeEventListener("pointercancel", handlePointerUp);
1680
+ editorCanvas.removeEventListener("mousedown", handleMouseDown);
1681
+ if (typeof runtimeGlobal.removeEventListener === "function") {
1682
+ runtimeGlobal.removeEventListener("mousemove", handleMouseMove);
1683
+ runtimeGlobal.removeEventListener("mouseup", handlePointerUp);
1684
+ }
1685
+ editorCanvas.removeEventListener("touchstart", handleTouchStart);
1686
+ editorCanvas.removeEventListener("touchmove", handleTouchMove);
1687
+ editorCanvas.removeEventListener("touchend", handlePointerUp);
1688
+ editorCanvas.removeEventListener("touchcancel", handlePointerUp);
1689
+ editorCanvas.removeEventListener("keydown", handleKeyDown);
1690
+ }
1691
+ let dprCleanup = null;
1692
+ function watchDevicePixelRatio() {
1693
+ if (typeof runtimeGlobal.matchMedia !== "function") return;
1694
+ if (dprCleanup) dprCleanup();
1695
+ const dpr = runtimeGlobal.devicePixelRatio || 1;
1696
+ const mq = runtimeGlobal.matchMedia(`(resolution: ${dpr}dppx)`);
1697
+ const onChange = () => {
1698
+ if (isDestroyed) return;
1699
+ updateCanvasSize();
1700
+ scheduleRender();
1701
+ watchDevicePixelRatio();
1702
+ };
1703
+ if (typeof mq.addEventListener === "function") {
1704
+ mq.addEventListener("change", onChange);
1705
+ dprCleanup = () => mq.removeEventListener("change", onChange);
1706
+ } else if (typeof mq.addListener === "function") {
1707
+ mq.addListener(onChange);
1708
+ dprCleanup = () => mq.removeListener(onChange);
1709
+ } else {
1710
+ dprCleanup = null;
1711
+ }
1712
+ }
1713
+ function confirmEditor() {
1714
+ const output = cloneCorners(corners);
1715
+ if (typeof options.onConfirm === "function") {
1716
+ options.onConfirm(output);
1717
+ }
1718
+ return output;
1719
+ }
1720
+ function cancelEditor() {
1721
+ if (typeof options.onCancel === "function") {
1722
+ options.onCancel();
1723
+ }
1724
+ }
1725
+ const resizeObserver = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => {
1726
+ if (isDestroyed) return;
1727
+ const next = computeDisplaySize();
1728
+ if (next.width === lastDisplayWidth && next.height === lastDisplayHeight) {
1729
+ return;
1730
+ }
1731
+ updateCanvasSize();
1732
+ scheduleRender();
1733
+ }) : null;
1734
+ updateCanvasSize();
1735
+ buildNudgeControls();
1736
+ attachEvents();
1737
+ watchDevicePixelRatio();
1738
+ if (resizeObserver) {
1739
+ resizeObserver.observe(container);
1740
+ }
1741
+ render();
1742
+ return {
1743
+ getCorners() {
1744
+ return cloneCorners(corners);
1745
+ },
1746
+ setCorners(nextCorners) {
1747
+ if (!nextCorners || !cornersValid(nextCorners)) {
1748
+ return false;
1749
+ }
1750
+ corners = cloneCorners(nextCorners);
1751
+ emitChange();
1752
+ scheduleRender();
1753
+ return true;
1754
+ },
1755
+ reset() {
1756
+ corners = cloneCorners(initialCorners);
1757
+ emitChange();
1758
+ scheduleRender();
1759
+ },
1760
+ nudge(cornerKey, dx, dy, step = 1) {
1761
+ if (!cornerOrder.includes(cornerKey)) {
1762
+ return false;
1763
+ }
1764
+ return setCorner(cornerKey, {
1765
+ x: corners[cornerKey].x + dx * step,
1766
+ y: corners[cornerKey].y + dy * step
1767
+ });
1768
+ },
1769
+ confirm() {
1770
+ return confirmEditor();
1771
+ },
1772
+ cancel() {
1773
+ cancelEditor();
1774
+ },
1775
+ destroy() {
1776
+ if (isDestroyed) return;
1777
+ isDestroyed = true;
1778
+ if (rafId !== null && caf) {
1779
+ caf(rafId);
1780
+ rafId = null;
1781
+ }
1782
+ if (dprCleanup) {
1783
+ dprCleanup();
1784
+ dprCleanup = null;
1785
+ }
1786
+ if (resizeObserver) {
1787
+ resizeObserver.disconnect();
1788
+ }
1789
+ detachEvents();
1790
+ if (nudgeControls && nudgeControls.parentNode) {
1791
+ nudgeControls.parentNode.removeChild(nudgeControls);
1792
+ }
1793
+ if (editorCanvas.parentNode) {
1794
+ editorCanvas.parentNode.removeChild(editorCanvas);
1795
+ }
1796
+ if (changedContainerPosition) {
1797
+ container.style.position = restoreContainerStyle.position;
1798
+ }
1799
+ if (changedContainerMinHeight) {
1800
+ container.style.minHeight = restoreContainerStyle.minHeight;
1801
+ }
1802
+ }
1803
+ };
1804
+ }
1115
1805
  async function initialize() {
1116
1806
  return await initializeWasm();
1117
1807
  }
@@ -1961,11 +2651,9 @@ async function scanDocument(image, options = {}) {
1961
2651
  timings
1962
2652
  };
1963
2653
  }
1964
- const __viteBrowserExternal = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1965
- __proto__: null
1966
- }, Symbol.toStringTag, { value: "Module" }));
1967
2654
  export {
1968
2655
  Scanner,
2656
+ createCornerEditor,
1969
2657
  extractDocument,
1970
2658
  initialize,
1971
2659
  scanDocument
@@ -1 +1 @@
1
- !function(A,I){"object"==typeof exports&&"undefined"!=typeof module?I(exports):"function"==typeof define&&define.amd?define(["exports"],I):I((A="undefined"!=typeof globalThis?globalThis:A||self).scanic={})}(this,function(A){"use strict";var I="undefined"!=typeof document?document.currentScript:null;const g=1e3,B=10;function Q(A,I={}){const Q=I.width||Math.sqrt(A.length),i=I.height||A.length/Q,o=void 0!==I.mode?I.mode:1,t=void 0!==I.method?I.method:2,e=I.minArea||g,a=Q+2,n=i+2,s=new Int32Array(a*n);for(let g=0;g<i;g++)for(let I=0;I<Q;I++)A[g*Q+I]>0&&(s[(g+1)*a+(I+1)]=1);const c=[];let h=2;for(let g=1;g<=i;g++)for(let A=1;A<=Q;A++){const I=s[g*a+A],Q=s[g*a+(A-1)];let i=null,e=!1,D=-1;if(1===I&&0===Q?(e=!0,i={x:A,y:g},D=2):0===I&&Q>=1&&-1!==Q&&1===Q&&(e=!1,i={x:A-1,y:g},D=6),i){if(0===o&&!e){s[i.y*a+i.x]=-1;continue}const A=h++,I=C(s,a,n,i,D,A);if(I&&I.length>0){let g=I;2===t&&(g=E(I));const Q=g.map(A=>({x:A.x-1,y:A.y-1}));if(Q.length>=(2===t?4:B)){const I={id:A,points:Q,isOuter:e};c.push(I)}}else 1===s[i.y*a+i.x]&&(s[i.y*a+i.x]=A)}}c.forEach(A=>{A.area=function(A){let I=0;const g=A.length;if(g<3)return 0;for(let B=0;B<g;B++){const Q=(B+1)%g;I+=A[B].x*A[Q].y,I-=A[Q].x*A[B].y}return Math.abs(I)/2}(A.points),A.boundingBox=function(A){if(0===A.length)return{minX:0,minY:0,maxX:0,maxY:0};let I=A[0].x,g=A[0].y,B=A[0].x,Q=A[0].y;for(let C=1;C<A.length;C++){const E=A[C];I=Math.min(I,E.x),g=Math.min(g,E.y),B=Math.max(B,E.x),Q=Math.max(Q,E.y)}return{minX:I,minY:g,maxX:B,maxY:Q}}(A.points)});const D=c.filter(A=>A.area>=e);return D.sort((A,I)=>I.area-A.area),I.debug&&(I.debug.labels=s,I.debug.rawContours=c,I.debug.finalContours=D),D}function C(A,I,g,B,Q,C){const E=[],i=new Set;let o=B.x,t=B.y;const e=o,a=t;let n=-1;A[a*I+e]=C;let s=0;const c=I*g,h=[0,1,1,1,0,-1,-1,-1],D=[-1,-1,0,1,1,1,0,-1];for(;s++<c;){let B;if(-1===n){let C=!1;for(let E=0;E<8;E++){B=Q+E&7;const i=o+h[B],e=t+D[B];if(i>=0&&i<I&&e>=0&&e<g&&A[e*I+i]>0){C=!0;break}}if(!C)return null}else B=n+2&7;let s=-1,c=-1;for(let Q=0;Q<8;Q++){const C=B+Q&7,E=o+h[C],i=t+D[C];if(E>=0&&E<I&&i>=0&&i<g&&A[i*I+E]>0){s=E,c=i,n=C+4&7;break}}if(-1===s){0===E.length&&E.push({x:o,y:t});break}const r=t*I+o;if(i.has(r))return E;E.push({x:o,y:t}),i.add(r);const y=c*I+s;if(1===A[y]&&(A[y]=C),o=s,t=c,o===e&&t===a)break}return s>=c?null:E}function E(A){const I=A.length;if(I<=2)return A;const g=[],B=A[I-1],Q=A[0];let C=B,E=Q,i=A[1],o=E.x-C.x,t=E.y-C.y,e=i.x-E.x,a=i.y-E.y;o*a!==t*e&&g.push(E);for(let n=1;n<I-1;n++)C=A[n-1],E=A[n],i=A[n+1],o=E.x-C.x,t=E.y-C.y,e=i.x-E.x,a=i.y-E.y,o*a!==t*e&&g.push(E);if(C=A[I-2],E=B,i=Q,o=E.x-C.x,t=E.y-C.y,e=i.x-E.x,a=i.y-E.y,o*a!==t*e&&g.push(E),0===g.length){if(1===I)return[A[0]];if(2===I)return A;let g=0,B=1;const C=Q.x,E=Q.y;for(let Q=1;Q<I;Q++){const I=A[Q],i=I.x-C,o=I.y-E,t=i*i+o*o;t>g&&(g=t,B=Q)}return[Q,A[B]]}return g}function i(A,I=1){if(A.length<=2)return A;let g=0,B=0;const Q=A[0],C=A[A.length-1];for(let E=1;E<A.length-1;E++){const I=o(A[E],Q,C);I>g&&(g=I,B=E)}if(g>I){const g=i(A.slice(0,B+1),I),Q=i(A.slice(B),I);return g.slice(0,-1).concat(Q)}return[Q,C]}function o(A,I,g){const B=g.x-I.x,Q=g.y-I.y,C=B*B+Q*Q;if(0===C)return Math.sqrt(Math.pow(A.x-I.x,2)+Math.pow(A.y-I.y,2));const E=((A.x-I.x)*B+(A.y-I.y)*Q)/C;let i,o;E<0?(i=I.x,o=I.y):E>1?(i=g.x,o=g.y):(i=I.x+E*B,o=I.y+E*Q);const t=A.x-i,e=A.y-o;return Math.sqrt(t*t+e*e)}function t(A,I=.02){return i(A,I*function(A){let I=0;const g=A.length;if(g<2)return 0;for(let B=0;B<g;B++){const Q=(B+1)%g,C=A[B].x-A[Q].x,E=A[B].y-A[Q].y;I+=Math.sqrt(C*C+E*E)}return I}(A))}function e(A,I){return Math.hypot(I.x-A.x,I.y-A.y)}function a(A){let I=0,g=0;for(const B of A)I+=B.x,g+=B.y;return{x:I/A.length,y:g/A.length}}function n(A,I={}){if(!A||!A.points||A.points.length<4)return null;const g=I.epsilon||.02,B=function(A,I){if(!A||A.length<4)return null;const g=[I,1.3*I,1.6*I,2*I],B=new Set;for(const Q of g){const I=Math.min(.12,Q),g=I.toFixed(4);if(B.has(g))continue;B.add(g);const C=s(t(A,I));if(C&&4===C.length)return C}return null}(A.points,g);let Q;return B&&4===B.length?Q=function(A){if(4!==A.length)return null;const I=a(A),g=[...A].sort((A,g)=>Math.atan2(A.y-I.y,A.x-I.x)-Math.atan2(g.y-I.y,g.x-I.x));let B=1/0,Q=0;for(let E=0;E<4;E++){const A=g[E].x+g[E].y;A<B&&(B=A,Q=E)}const C=[g[Q],g[(Q+1)%4],g[(Q+2)%4],g[(Q+3)%4]];return{topLeft:C[0],topRight:C[1],bottomRight:C[2],bottomLeft:C[3]}}(B):(Q=function(A){if(!A||A.length<4)return null;const I=a(A);let g=null,B=null,Q=null,C=null,E=0,i=0,o=0,t=0;for(const a of A){const A=e(a,I);a.x<I.x&&a.y<I.y?A>E&&(g=a,E=A):a.x>I.x&&a.y<I.y?A>i&&(B=a,i=A):a.x>I.x&&a.y>I.y?A>o&&(Q=a,o=A):a.x<I.x&&a.y>I.y&&A>t&&(C=a,t=A)}if(!(g&&B&&Q&&C))return null;return{topLeft:g,topRight:B,bottomRight:Q,bottomLeft:C}}(A.points),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft||(Q=function(A){if(!A||0===A.length)return null;let I=A[0],g=A[0],B=A[0],Q=A[0],C=I.x+I.y,E=g.x-g.y,i=B.x+B.y,o=Q.x-Q.y;for(let t=1;t<A.length;t++){const e=A[t],a=e.x+e.y,n=e.x-e.y;a<C&&(C=a,I=e),a>i&&(i=a,B=e),n>E&&(E=n,g=e),n<o&&(o=n,Q=e)}return{topLeft:I,topRight:g,bottomRight:B,bottomLeft:Q}}(A.points))),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft?Q:null}function s(A){if(!A||A.length<4)return null;if(4===A.length)return A;if(A.length>8)return null;let I=function(A,I){if(!A||0===A.length)return[];const g=[];for(const B of A)(0===g.length||e(B,g[g.length-1])>I)&&g.push(B);g.length>2&&e(g[0],g[g.length-1])<=I&&g.pop();return g}(A,6);return 4===I.length?I:(I.length,null)}let c,h=null;function D(){return null!==h&&0!==h.byteLength||(h=new Uint8Array(c.memory.buffer)),h}let r=0;function y(A,I){const g=I(1*A.length,1)>>>0;return D().set(A,g/1),r=A.length,g}function w(A,I){return A>>>=0,D().subarray(A/1,A/1+I)}let l=null;function N(){return null!==l&&0!==l.byteLength||(l=new Float32Array(c.memory.buffer)),l}function R(A,I,g,B,Q){const C=function(A,I){const g=I(4*A.length,4)>>>0;return N().set(A,g/4),r=A.length,g}(A,c.__wbindgen_malloc),E=r,i=c.hysteresis_thresholding(C,E,I,g,B,Q);var o=w(i[0],i[1]).slice();return c.__wbindgen_free(i[0],1*i[1],1),o}let F=null;function G(A,I){const g=I(2*A.length,2)>>>0;return(null!==F&&0!==F.byteLength||(F=new Uint16Array(c.memory.buffer)),F).set(A,g/2),r=A.length,g}function J(A,I,g,B,Q){const C=G(A,c.__wbindgen_malloc),E=r,i=G(I,c.__wbindgen_malloc),o=r,t=c.non_maximum_suppression(C,E,i,o,g,B,Q);var e,a,n=(e=t[0],a=t[1],e>>>=0,N().subarray(e/4,e/4+a)).slice();return c.__wbindgen_free(t[0],4*t[1],4),n}async function f(A){if(void 0!==c)return c;void 0!==A&&Object.getPrototypeOf(A)===Object.prototype&&({module_or_path:A}=A),void 0===A&&(A=new URL("data:application/wasm;base64,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JAAgAiABIAJqIgFLBEBBAEEAEC0ACyADQQRqIAAoAgAiAiAAKAIEQQggASACQQF0IgIgASACSxsiASABQQhNGyIBQQFBARARIAMoAgRBAUYEQCADKAIIIAMoAgwQLQALIAMoAgghAiAAIAE2AgAgACACNgIEIANBEGokAAt5AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBAwDAELIAJBEGogACgCDCgCACIAQQhqKQIANwMAIAJBGGogAEEQaikCADcDACACIAApAgA3AwggASgCACABKAIEIAJBCGoQBwsgAkEgaiQAC2kBA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBEEEIAJBAXQiAiACQQRNGyICQQRBBBARIAEoAgRBAUYEQCABKAIIIAEoAgwQLQALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtpAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgRBBCACQQF0IgIgAkEETRsiAkEEQQgQESABKAIEQQFGBEAgASgCCCABKAIMEC0ACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALaQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEQQQgAkEBdCICIAJBBE0bIgJBAkECEBEgASgCBEEBRgRAIAEoAgggASgCDBAtAAsgASgCCCEDIAAgAjYCACAAIAM2AgQgAUEQaiQACxIAIwBBMGsiACQAIABBMGokAAtoAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Hkl8AANgIIIANCAjcCFCADQoCAgIAwIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhAmAAtHAQF/IAAoAgAgACgCCCIDayACSQRAIAAgAyACEBIgACgCCCEDCyACBEAgACgCBCADaiABIAL8CgAACyAAIAIgA2o2AghBAAtEAQJ/IAEoAgQhAiABKAIAIQNBCEEEEDUiAUUEQEEEQQgQOQALIAEgAjYCBCABIAM2AgAgAEHcksAANgIEIAAgATYCAAvGAgACQCAAIAJNBEAgACABTSABIAJLcg0BIwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkECNgIMIAJB2JbAADYCCCACQgI3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IAAAABwAEAAMAAAAEgAAABcAAAAcABAADAAAABcAAAAZAAAAHAAQAAwAAAAUAAAAGQAAABwAEAAMAAAAUQAAAB4AAAAcABAADAAAAFIAAAAeAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAA8CBAAKgAAAEgBEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAgAgQAA4AAABIARAAWgAAAHoCAAANAAAAfP2LMlfmV/kC30S/40jnr21dy9YsUOtjeEGmV3Ebi7ltZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAADICBAAFQAAAN0IEAANAAAALwEQABgAAABkAQAACQAAAAQAAAAMAAAABAAAAAUAAAAGAAAABwAAAAAAAAAIAAAABAAAAAgAAAAJAAAACgAAAAsAAAAMAAAAEAAAAAQAAAANAAAADgAAAA8AAAAQAAAAAAAAAAgAAAAEAAAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAAAQBEAAqAAAAsQQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAAEARAAKgAAALcEAAANAAAABAAAAAwAAAAEAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/AkQABEAAADjABAAIAAAABwAAAAFAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlyYW5nZSBlbmQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIAAA8AoQABAAAAAACxAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgADQLEAAWAAAASgsQAA0AAAByYW5nZSBzdGFydCBpbmRleCAAAGgLEAASAAAAAAsQACIAAABhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvAAAAjAsQABkAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAsAsQACAAAADQCxAAEgAAAAAAAD8AAAC/AEGUmMAACwEBAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkyLjAgKGRlZDVjMDZjZiAyMDI1LTEyLTA4KQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAHQPdGFyZ2V0X2ZlYXR1cmVzBysPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwdzaW1kMTI4KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:I&&"SCRIPT"===I.tagName.toUpperCase()&&I.src||new URL("scanic.umd.cjs",document.baseURI).href));const g=function(){const A={wbg:{}};return A.wbg.__wbindgen_init_externref_table=function(){const A=c.__wbindgen_export_0,I=A.grow(4);A.set(0,void 0),A.set(I+0,void 0),A.set(I+1,null),A.set(I+2,!0),A.set(I+3,!1)},A}();("string"==typeof A||"function"==typeof Request&&A instanceof Request||"function"==typeof URL&&A instanceof URL)&&(A=fetch(A));const{instance:B,module:Q}=await async function(A,I){if("function"==typeof Response&&A instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(A,I)}catch(g){if("application/wasm"==A.headers.get("Content-Type"))throw g}const B=await A.arrayBuffer();return await WebAssembly.instantiate(B,I)}{const g=await WebAssembly.instantiate(A,I);return g instanceof WebAssembly.Instance?{instance:g,module:A}:g}}(await A,g);return function(A,I){return c=A.exports,f.__wbindgen_wasm_module=I,l=null,F=null,h=null,c.__wbindgen_start(),c}(B,Q)}let d=null,S=!1;async function m(){if("undefined"!=typeof process&&(null==(A=process.versions)?void 0:A.node))try{const{readFile:A}=await Promise.resolve().then(()=>v),{fileURLToPath:g}=await Promise.resolve().then(()=>v),B=new URL("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:I&&"SCRIPT"===I.tagName.toUpperCase()&&I.src||new URL("scanic.umd.cjs",document.baseURI).href);B.search="",B.hash="";const Q=new URL("../wasm_blur/pkg/wasm_blur_bg.wasm",B),C=await A(g(Q));return await f({module_or_path:C})}catch{return await f()}var A;return await f()}function k(){return d||(d=m().catch(A=>{throw d=null,A})),d}function u(A,I,g,B=5,Q=0){0===Q&&(Q=.3*(.5*(B-1)-1)+.8);const C=Math.floor(B/2),E=function(A,I){const g=new Float32Array(A),B=Math.floor(A/2);let Q=0;for(let C=0;C<A;C++){const A=C-B;g[C]=Math.exp(-A*A/(2*I*I)),Q+=g[C]}for(let C=0;C<A;C++)g[C]/=Q;return g}(B,Q),i=new Uint8ClampedArray(I*g),o=new Uint8ClampedArray(I*g);for(let t=0;t<g;t++){const g=t*I;for(let B=0;B<I;B++){let Q=0;for(let i=-C;i<=C;i++){Q+=A[g+Math.min(I-1,Math.max(0,B+i))]*E[C+i]}i[g+B]=Q}}for(let t=0;t<I;t++)for(let A=0;A<g;A++){let B=0;for(let Q=-C;Q<=C;Q++){B+=i[Math.min(g-1,Math.max(0,A+Q))*I+t]*E[C+Q]}o[A*I+t]=Math.round(B)}return o}function M(A,I,g,B,Q){const C=new Uint8Array(I*g),E=[];for(let t=1;t<g-1;t++)for(let g=1;g<I-1;g++){const i=t*I+g,o=A[i];o>=Q?(C[i]=2,E.push({x:g,y:t})):C[i]=o>=B?0:1}for(let t=0;t<I;t++)C[t]=1,C[(g-1)*I+t]=1;for(let t=1;t<g-1;t++)C[t*I]=1,C[t*I+I-1]=1;const i=[-1,0,1,-1,1,-1,0,1],o=[-1,-1,-1,0,0,1,1,1];for(;E.length>0;){const{x:A,y:g}=E.pop();for(let B=0;B<8;B++){const Q=A+i[B],t=g+o[B],e=t*I+Q;0===C[e]&&(C[e]=2,E.push({x:Q,y:t}))}}return C}async function L(A,I={}){const g=!(!I.debug||I.debug._timingsOnly),B=[],Q=performance.now();let C,E,i;if(I.skipGrayscale||!1)C=I.width,E=I.height,i=A,g&&(I.debug.grayscale=i);else{C=A.width,E=A.height;let Q=performance.now();i=function(A){const{width:I,height:g,data:B}=A,Q=new Uint8ClampedArray(I*g);for(let C=0,E=0;C<B.length;C+=4,E++)Q[E]=54*B[C]+183*B[C+1]+19*B[C+2]>>8;return Q}(A);let o=performance.now();B.push({step:"Grayscale",ms:(o-Q).toFixed(2)}),g&&(I.debug.grayscale=i)}let o=void 0!==I.lowThreshold?I.lowThreshold:null,t=void 0!==I.highThreshold?I.highThreshold:null;if(null===o||null===t){const A=1024,I=new Uint32Array(A);let g=0;for(let o=1;o<E-1;o++)for(let B=1;B<C-1;B++){const Q=o*C+B,E=-i[Q-C-1]+i[Q-C+1]-2*i[Q-1]+2*i[Q+1]-i[Q+C-1]+i[Q+C+1],t=-i[Q-C-1]-2*i[Q-C]-i[Q-C+1]+i[Q+C-1]+2*i[Q+C]+i[Q+C+1];let e=Math.abs(E)+Math.abs(t);e>=A&&(e=A-1),e>0&&(I[e]++,g++)}const B=Math.round(.7*g);let Q=0,e=75;for(let C=1;C<A;C++)if(Q+=I[C],Q>=B){e=C;break}null===o&&(o=Math.max(5,Math.round(.5*e))),null===t&&(t=Math.min(500,Math.round(1.5*e)))}const e=I.kernelSize||5,a=I.sigma||0,n=void 0!==I.L2gradient&&I.L2gradient,s=void 0===I.applyDilation||I.applyDilation,h=I.dilationKernelSize||5,D=void 0!==I.useWasmHysteresis&&I.useWasmHysteresis,l=void 0!==I.useWasmFullCanny&&I.useWasmFullCanny;if(o>=t&&([o,t]=[t,o]),l)try{await k();const A=performance.now(),D=new Uint8ClampedArray(function(A,I,g,B,Q,C,E,i,o,t){const e=y(A,c.__wbindgen_malloc),a=r,n=c.canny_edge_detector_full(e,a,I,g,B,Q,C,E,i,o,t);var s=w(n[0],n[1]).slice();return c.__wbindgen_free(n[0],1*n[1],1),s}(i,C,E,o,t,e,a,n,s,h)),l=(performance.now()-A).toFixed(2);B.push({step:"Edge Processing (WASM)",ms:l}),g&&(I.debug.finalEdges=D),I.debug?I.debug.timings=B:I.debug={timings:B};const N=performance.now();return B.unshift({step:"Edge Detection Total",ms:(N-Q).toFixed(2)}),D}catch(q){if(!S){S=!0;q instanceof Error?q.message:String(q)}}let N,F,G,f,d,m;N=performance.now();try{await k(),G=function(A,I,g,B,Q){const C=y(A,c.__wbindgen_malloc),E=r,i=c.blur(C,E,I,g,B,Q);var o=w(i[0],i[1]).slice();return c.__wbindgen_free(i[0],1*i[1],1),o}(i,C,E,e,a)}catch(x){G=u(i,C,E,e,a)}F=performance.now(),B.push({step:"Gaussian Blur",ms:(F-N).toFixed(2)}),g&&(I.debug.blurred=G),N=performance.now();{const A=function(A,I,g){const B=new Int16Array(I*g),Q=new Int16Array(I*g);for(let C=1;C<g-1;C++){const g=C*I,E=(C-1)*I,i=(C+1)*I;for(let C=1;C<I-1;C++){const I=g+C,o=A[E+C-1],t=A[E+C],e=A[E+C+1],a=A[g+C-1],n=A[g+C+1],s=A[i+C-1],c=A[i+C],h=A[i+C+1],D=e-o+2*(n-a)+(h-s),r=s+2*c+h-(o+2*t+e);B[I]=D,Q[I]=r}}return{dx:B,dy:Q}}(G,C,E);f=A.dx,d=A.dy}F=performance.now(),B.push({step:"Gradients",ms:(F-N).toFixed(2)}),N=performance.now();try{await k(),m=await J(f,d,C,E,n)}catch(x){m=function(A,I,g,B,Q){const C=new Float32Array(g*B),E=new Float32Array(g*B);for(let i=0;i<A.length;i++){const g=A[i],B=I[i];C[i]=Q?Math.sqrt(g*g+B*B):Math.abs(g)+Math.abs(B)}for(let i=1;i<B-1;i++)for(let B=1;B<g-1;B++){const Q=i*g+B,o=C[Q];if(0===o){E[Q]=0;continue}const t=A[Q],e=I[Q];let a=0,n=0;const s=Math.abs(t),c=Math.abs(e);if(c>2.4142*s)a=C[Q-g],n=C[Q+g];else if(s>2.4142*c)a=C[Q-1],n=C[Q+1];else{const A=(t^e)<0?-1:1;e>0?(a=C[(i-1)*g+(B-A)],n=C[(i+1)*g+(B+A)]):(a=C[(i+1)*g+(B-A)],n=C[(i-1)*g+(B+A)]),t>0&&e>0||t<0&&e<0?(a=C[(i-1)*g+(B+1)],n=C[(i+1)*g+(B-1)]):(a=C[(i-1)*g+(B-1)],n=C[(i+1)*g+(B+1)])}E[Q]=o>=a&&o>=n?o:0}return E}(f,d,C,E,n)}F=performance.now(),B.push({step:"Non-Max Suppression",ms:(F-N).toFixed(2)}),N=performance.now();const L=n?o*o:o,U=n?t*t:t;let H;if(D)try{await k(),H=R(m,C,E,L,U)}catch(x){H=M(m,C,E,L,U)}else H=M(m,C,E,L,U);F=performance.now(),B.push({step:"Hysteresis",ms:(F-N).toFixed(2)}),N=performance.now();const p=new Uint8ClampedArray(C*E);for(let c=0;c<H.length;c++)p[c]=2===H[c]?255:0;F=performance.now(),B.push({step:"Binary Image",ms:(F-N).toFixed(2)}),N=performance.now();let Y=p;if(s)try{await k(),Y=function(A,I,g,B){const Q=y(A,c.__wbindgen_malloc),C=r,E=c.dilate(Q,C,I,g,B);var i=w(E[0],E[1]).slice();return c.__wbindgen_free(E[0],1*E[1],1),i}(p,C,E,h)}catch(x){Y=function(A,I,g,B=5){const Q=Math.floor(B/2),C=new Uint8ClampedArray(I*g),E=new Uint8ClampedArray(I*g);for(let i=0;i<g;i++){const g=i*I;for(let B=0;B<I;B++){let E=0;for(let C=-Q;C<=Q;C++){const Q=B+C;if(Q>=0&&Q<I){const I=A[g+Q];I>E&&(E=I)}}C[g+B]=E}}for(let i=0;i<I;i++)for(let A=0;A<g;A++){let B=0;for(let E=-Q;E<=Q;E++){const Q=A+E;if(Q>=0&&Q<g){const A=C[Q*I+i];A>B&&(B=A)}}E[A*I+i]=B}return E}(p,C,E,h)}if(F=performance.now(),B.push({step:"Dilation",ms:(F-N).toFixed(2)}),g){I.debug.dx=f,I.debug.dy=d;const A=new Float32Array(C*E);for(let I=0;I<f.length;I++){const g=f[I],B=d[I];A[I]=n?Math.sqrt(g*g+B*B):Math.abs(g)+Math.abs(B)}I.debug.magnitude=A,I.debug.suppressed=m,I.debug.edgeMap=H,I.debug.cannyEdges=p,I.debug.finalEdges=Y}I.debug?I.debug.timings=B:I.debug||(I.debug={timings:B});const b=performance.now();return B.unshift({step:"Edge Detection Total",ms:(b-Q).toFixed(2)}),Y}function U(A){return A<=0?0:A>=1?1:A}function H(A,I){return Math.hypot(A.x-I.x,A.y-I.y)}function p(A){return[H(A.topLeft,A.topRight),H(A.topRight,A.bottomRight),H(A.bottomRight,A.bottomLeft),H(A.bottomLeft,A.topLeft)]}function Y(A){const I=function(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let B=0;B<I.length;B++){const A=I[(B+I.length-1)%I.length],Q=I[B],C=I[(B+1)%I.length],E=A.x-Q.x,i=A.y-Q.y,o=C.x-Q.x,t=C.y-Q.y,e=E*o+i*t,a=Math.hypot(E,i),n=Math.hypot(o,t),s=Math.max(1e-6,a*n),c=Math.max(-1,Math.min(1,e/s));g.push(180*Math.acos(c)/Math.PI)}return g}(A);let g=0;for(const B of I){g+=U(1-Math.abs(B-90)/55)}return g/Math.max(1,I.length)}function b(A,I){const g=Number(I.isValid)-Number(A.isValid);if(0!==g)return g;const B=I.confidence-A.confidence;if(!(Math.abs(B)<.015)&&0!==B)return B;const Q=Math.abs((A.approxCount??99)-4)-Math.abs((I.approxCount??99)-4);if(0!==Q)return Q;const C=(I.rightAngleScore??0)-(A.rightAngleScore??0);if(Math.abs(C)>1e-6)return C;const E=Math.abs(1-(A.contourFitRatio??1))-Math.abs(1-(I.contourFitRatio??1));return Math.abs(E)>1e-6?E:B||I.score-A.score||I.coverageRatio-A.coverageRatio||I.area-A.area}function q(A,I,g,B,Q={}){const C=Q.epsilon||.02,E=t(A.points,C).length,i=n(A,{epsilon:C});if(!i)return{contour:A,corners:null,score:0,confidence:0,isValid:!1,area:A.area||0,fillRatio:0,coverageRatio:0,cornersArea:0,approxCount:E,convex:!1,edgeSupport:0,aspectRatio:1/0,minSide:0,rightAngleScore:0,oppositeSideConsistency:0,contourFitRatio:0,contourFitScore:0};const o=g*B,e=A.area||0,a=A.boundingBox||{minX:0,minY:0,maxX:0,maxY:0},s=e/Math.max(1,(a.maxX-a.minX+1)*(a.maxY-a.minY+1)),c=function(A){if(!A)return 0;const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft];let g=0;for(let B=0;B<I.length;B++){const A=(B+1)%I.length;g+=I[B].x*I[A].y-I[A].x*I[B].y}return Math.abs(g)/2}(i),h=c/Math.max(1,o),D=p(i),r=Math.min(...D),y=(D[0]+D[2])/2,w=(D[1]+D[3])/2,l=y>w?y/Math.max(1e-6,w):w/Math.max(1e-6,y),N=function(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let Q=0;Q<I.length;Q++){const A=I[Q],B=I[(Q+1)%I.length],C=I[(Q+2)%I.length],E=(B.x-A.x)*(C.y-B.y)-(B.y-A.y)*(C.x-B.x);Math.abs(E)<1e-6||g.push(Math.sign(E))}if(g.length<3)return!1;const B=g[0];return g.every(A=>A===B)}(i),R=function(A,I,g,B){if(!(null==A?void 0:A.points)||0===A.points.length)return 0;const Q=Math.max(1,Math.floor(A.points.length/240));let C=0,E=0;for(let i=0;i<A.points.length;i+=Q){const Q=A.points[i],o=Math.max(0,Math.min(g-1,0|Q.x)),t=Math.max(0,Math.min(B-1,0|Q.y));C++;let e=!1;for(let A=-1;A<=1&&!e;A++){const Q=t+A;if(!(Q<0||Q>=B))for(let A=-1;A<=1;A++){const B=o+A;if(!(B<0||B>=g)&&I[Q*g+B]>0){e=!0;break}}}e&&E++}return 0===C?0:E/C}(A,I,g,B),F=Y(i),G=function(A){const I=p(A);return(Math.min(I[0],I[2])/Math.max(1e-6,Math.max(I[0],I[2]))+Math.min(I[1],I[3])/Math.max(1e-6,Math.max(I[1],I[3])))/2}(i),J=e/Math.max(1,c),f=U(1-Math.abs(J-1)/.55),d=4===E?1:5===E?.9:6===E?.7:E<=8?.5:.28,S=U(e/Math.max(1,.4*o)),m=U((s-.08)/.72),k=U((h-.03)/.82),u=void 0!==Q.minDocumentSideRatio?Q.minDocumentSideRatio:.06,M=void 0!==Q.minDocumentCoverageRatio?Q.minDocumentCoverageRatio:.04,L=void 0!==Q.maxDocumentAspectRatio?Q.maxDocumentAspectRatio:8,b=void 0!==Q.minDocumentFillRatio?Q.minDocumentFillRatio:.07,q=void 0!==Q.minContourFitRatio?Q.minContourFitRatio:.11,x=void 0!==Q.maxContourFitRatio?Q.maxContourFitRatio:1.2,K=void 0!==Q.minRightAngleScore?Q.minRightAngleScore:.42,T=void 0!==Q.minOppositeSideConsistency?Q.minOppositeSideConsistency:.3,W=Math.min(g,B)*u,v=function(A,I=6){const g=[null==A?void 0:A.topLeft,null==A?void 0:A.topRight,null==A?void 0:A.bottomRight,null==A?void 0:A.bottomLeft];if(g.some(A=>!A||!Number.isFinite(A.x)||!Number.isFinite(A.y)))return!1;for(let B=0;B<g.length;B++)for(let A=B+1;A<g.length;A++)if(H(g[B],g[A])<I)return!1;return!0}(i)&&N&&r>=W&&h>=M&&l<=L&&s>=b&&J>=q&&J<=x&&F>=K&&G>=T,Z=.22*S+.14*m+.15*d+.08*(N?1:0)+.08*R+.13*k+.1*F+.05*G+.05*f;return{contour:A,corners:i,score:Z,confidence:v?Z:.33*Z,isValid:v,area:e,fillRatio:s,coverageRatio:h,cornersArea:c,approxCount:E,convex:N,edgeSupport:R,aspectRatio:l,minSide:r,rightAngleScore:F,oppositeSideConsistency:G,contourFitRatio:J,contourFitScore:f}}async function x(A,I,g,B,C={}){const E=C.debug?{}:{_timingsOnly:!0},i=[];E&&!E._timingsOnly&&(E.preprocessing={scaledDimensions:{width:I,height:g},scaleFactor:B,maxProcessingDimension:C.maxProcessingDimension||800});const o=function(A={}){const I=A.dilationKernelSize||3,g=A.dilationIterations||1,B=void 0===A.applyDilation||A.applyDilation,Q=[{name:"default",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:I,dilationIterations:g,applyDilation:B}];if(!1===A.enableDetectionCascade)return Q;Q.push({name:"connect-edges",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:Math.max(I,5),dilationIterations:Math.max(g,2),applyDilation:!0}),Q.push({name:"no-dilation",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:I,dilationIterations:g,applyDilation:!1}),void 0===A.lowThreshold&&void 0===A.highThreshold&&Q.push({name:"fixed-mid-thresholds",lowThreshold:60,highThreshold:180,dilationKernelSize:I,dilationIterations:g,applyDilation:B});const C=[],E=new Set;for(const i of Q){const A=[i.lowThreshold,i.highThreshold,i.dilationKernelSize,i.dilationIterations,i.applyDilation].join(":");E.has(A)||(E.add(A),C.push(i))}return C}(C),t=[],e=async(E,o)=>{const t=E.name||`pass-${o+1}`,e=0===o?"":` (${t})`,a=C.debug?{}:{_timingsOnly:!0},n=await L(A,{width:I,height:g,lowThreshold:E.lowThreshold,highThreshold:E.highThreshold,dilationKernelSize:E.dilationKernelSize,dilationIterations:E.dilationIterations,applyDilation:E.applyDilation,debug:a,skipGrayscale:!0,useWasmBlur:!0,useWasmHysteresis:C.useWasmHysteresis,useWasmFullCanny:C.useWasmFullCanny});a.timings&&a.timings.forEach(A=>{"Edge Detection Total"!==A.step&&i.push({step:`${A.step}${e}`,ms:A.ms})});let s=performance.now();const c=Q(n,{minArea:(C.minArea||1e3)/(B*B),width:I,height:g});i.push({step:`Find Contours${e}`,ms:(performance.now()-s).toFixed(2)}),s=performance.now();const{best:h,candidates:D}=function(A,I,g,B,Q={}){const C=Q.maxCandidateContours||12,E=A.slice(0,C).map((A,C)=>({rankByArea:C,...q(A,I,g,B,Q)})).sort(b);return{best:E[0]||null,candidates:E}}(c,n,I,g,C);return i.push({step:`Corner Detection${e}`,ms:(performance.now()-s).toFixed(2)}),{name:t,params:{lowThreshold:E.lowThreshold,highThreshold:E.highThreshold,dilationKernelSize:E.dilationKernelSize,dilationIterations:E.dilationIterations,applyDilation:E.applyDilation},contours:c,best:h,candidates:D}},a=await e(o[0],0);if(t.push(a),function(A,I={}){if(!1===I.enableDetectionCascade)return!1;if(!A||!A.corners)return!0;const g=void 0!==I.minCascadeTriggerConfidence?I.minCascadeTriggerConfidence:.68;return!A.isValid||A.confidence<g||A.approxCount>5||A.rightAngleScore<.55||A.contourFitRatio<.14}(a.best,C))for(let Q=1;Q<o.length;Q++)t.push(await e(o[Q],Q));const n=[];for(const Q of t)for(const A of Q.candidates)n.push({...A,passName:Q.name,passParams:Q.params});n.sort(b);const s=n[0]||null,c=n;if(!s||!s.corners)return{success:!1,message:"No document detected",debug:E._timingsOnly?null:E,timings:i};E&&!E._timingsOnly&&(E.passes=t.map(A=>({name:A.name,params:A.params,contourCount:A.contours.length,bestCandidate:A.best?{score:A.best.score,confidence:A.best.confidence,isValid:A.best.isValid,approxCount:A.best.approxCount,coverageRatio:A.best.coverageRatio,fillRatio:A.best.fillRatio,rightAngleScore:A.best.rightAngleScore,contourFitRatio:A.best.contourFitRatio}:null})),E.candidates=c.map(A=>({passName:A.passName,rankByArea:A.rankByArea,area:A.area,fillRatio:A.fillRatio,coverageRatio:A.coverageRatio,cornersArea:A.cornersArea,approxCount:A.approxCount,convex:A.convex,edgeSupport:A.edgeSupport,aspectRatio:A.aspectRatio,minSide:A.minSide,rightAngleScore:A.rightAngleScore,oppositeSideConsistency:A.oppositeSideConsistency,contourFitRatio:A.contourFitRatio,contourFitScore:A.contourFitScore,score:A.score,confidence:A.confidence,isValid:A.isValid})),E.selectedCandidate=c[0]?{passName:c[0].passName,rankByArea:c[0].rankByArea,area:c[0].area,fillRatio:c[0].fillRatio,coverageRatio:c[0].coverageRatio,approxCount:c[0].approxCount,edgeSupport:c[0].edgeSupport,aspectRatio:c[0].aspectRatio,minSide:c[0].minSide,rightAngleScore:c[0].rightAngleScore,oppositeSideConsistency:c[0].oppositeSideConsistency,contourFitRatio:c[0].contourFitRatio,score:c[0].score,confidence:c[0].confidence,isValid:c[0].isValid}:null);const h=s.corners,D=s.contour;let r=h;return 1!==B&&(r={topLeft:{x:h.topLeft.x*B,y:h.topLeft.y*B},topRight:{x:h.topRight.x*B,y:h.topRight.y*B},bottomRight:{x:h.bottomRight.x*B,y:h.bottomRight.y*B},bottomLeft:{x:h.bottomLeft.x*B,y:h.bottomLeft.y*B}}),{success:!0,contour:D,corners:r,confidence:s.confidence,debug:E._timingsOnly?null:E,timings:i}}function K(A,I,g){const{topLeft:B,topRight:Q,bottomRight:C,bottomLeft:E}=g,i=Math.hypot(C.x-E.x,C.y-E.y),o=Math.hypot(Q.x-B.x,Q.y-B.y),t=Math.round(Math.max(i,o)),e=Math.hypot(Q.x-C.x,Q.y-C.y),a=Math.hypot(B.x-E.x,B.y-E.y),n=Math.round(Math.max(e,a));A.canvas.width=t,A.canvas.height=n;const s=function(A,I){const g=function(A,I){const g=A.length,B=A[0].length,Q=A.map(A=>A.slice()),C=I.slice();for(let i=0;i<B;i++){let A=i;for(let I=i+1;I<g;I++)Math.abs(Q[I][i])>Math.abs(Q[A][i])&&(A=I);[Q[i],Q[A]]=[Q[A],Q[i]],[C[i],C[A]]=[C[A],C[i]];for(let I=i+1;I<g;I++){const A=Q[I][i]/Q[i][i];for(let g=i;g<B;g++)Q[I][g]-=A*Q[i][g];C[I]-=A*C[i]}}const E=new Array(B);for(let i=B-1;i>=0;i--){let A=C[i];for(let I=i+1;I<B;I++)A-=Q[i][I]*E[I];E[i]=A/Q[i][i]}return E}(function(A){const g=[];for(let B=0;B<4;B++){const[Q,C]=A[B];g.push([Q,C,1,0,0,0,-Q*I[B][0],-C*I[B][0]]),g.push([0,0,0,Q,C,1,-Q*I[B][1],-C*I[B][1]])}return g}(A),[I[0][0],I[0][1],I[1][0],I[1][1],I[2][0],I[2][1],I[3][0],I[3][1]]);return[[g[0],g[1],g[2]],[g[3],g[4],g[5]],[g[6],g[7],1]]}([[B.x,B.y],[Q.x,Q.y],[C.x,C.y],[E.x,E.y]],[[0,0],[t-1,0],[t-1,n-1],[0,n-1]]);!function(A,I,g,B,Q){const C=I&&"number"==typeof I.width&&"number"==typeof I.height&&I.data,E=I.width||I.naturalWidth,i=I.height||I.naturalHeight,o=document.createElement("canvas");o.width=E,o.height=i;const t=o.getContext("2d",{willReadFrequently:!0});C?t.putImageData(I,0,0):t.drawImage(I,0,0,E,i);const e=t.getImageData(0,0,E,i).data,a=function(A){const I=A[0][0],g=A[0][1],B=A[0][2],Q=A[1][0],C=A[1][1],E=A[1][2],i=A[2][0],o=A[2][1],t=A[2][2],e=C*t-E*o,a=-(Q*t-E*i),n=Q*o-C*i,s=-(g*t-B*o),c=I*t-B*i,h=-(I*o-g*i),D=g*E-B*C,r=-(I*E-B*Q),y=I*C-g*Q,w=I*e+g*a+B*n;if(0===w)throw new Error("Singular matrix");return[[e/w,s/w,D/w],[a/w,c/w,r/w],[n/w,h/w,y/w]]}(g),n=a[0][0],s=a[0][1],c=a[0][2],h=a[1][0],D=a[1][1],r=a[1][2],y=a[2][0],w=a[2][1],l=a[2][2],N=A.createImageData(B,Q),R=N.data,F=E-1,G=i-1;for(let J=0;J<Q;J++){const A=s*J+c,I=D*J+r,g=w*J+l;for(let Q=0;Q<B;Q++){const C=1/(y*Q+g),i=(n*Q+A)*C,o=(h*Q+I)*C,t=i<0?0:i>F?F:i,a=o<0?0:o>G?G:o,s=0|t,c=0|a,D=s<F?s+1:s,r=c<G?c+1:c,w=t-s,l=a-c,N=1-w,f=1-l,d=N*f,S=w*f,m=N*l,k=w*l,u=c*E+s<<2,M=c*E+D<<2,L=r*E+s<<2,U=r*E+D<<2,H=J*B+Q<<2;R[H]=e[u]*d+e[M]*S+e[L]*m+e[U]*k+.5|0,R[H+1]=e[u+1]*d+e[M+1]*S+e[L+1]*m+e[U+1]*k+.5|0,R[H+2]=e[u+2]*d+e[M+2]*S+e[L+2]*m+e[U+2]*k+.5|0,R[H+3]=255}}A.putImageData(N,0,0)}(A,I,s,t,n)}async function T(A,I,g={}){const B=g.output||"canvas";if(!(I&&I.topLeft&&I.topRight&&I.bottomRight&&I.bottomLeft))return{output:null,corners:null,success:!1,message:"Invalid corner points provided"};try{const g=document.createElement("canvas");let Q;return K(g.getContext("2d"),A,I),Q="canvas"===B?g:"imagedata"===B?g.getContext("2d").getImageData(0,0,g.width,g.height):"dataurl"===B?g.toDataURL():g,{output:Q,corners:I,success:!0,message:"Document extracted successfully"}}catch(Q){return{output:null,corners:I,success:!1,message:`Extraction failed: ${Q.message}`}}}async function W(A,I={}){const g=[],B=performance.now(),Q=I.mode||"detect",C=I.output||"canvas";I.debug;const E=I.maxProcessingDimension||800;let i=performance.now();const{grayscaleData:o,imageData:t,scaleFactor:e,originalDimensions:a,scaledDimensions:n}=await async function(A,I=800){let g,B;const Q=A&&"number"==typeof A.width&&"number"==typeof A.height&&A.data;if(Q)g=A.width,B=A.height;else{if(!A)throw new Error("No image provided");g=A.width||A.naturalWidth,B=A.height||A.naturalHeight}const C=Math.max(g,B);let E,i,o;if(C<=I)E=g,i=B,o=1;else{const A=I/C;E=Math.round(g*A),i=Math.round(B*A),o=1/A}const t="undefined"!=typeof OffscreenCanvas,e=t?new OffscreenCanvas(E,i):document.createElement("canvas");t||(e.width=E,e.height=i);const a=e.getContext("2d",{willReadFrequently:!0});if(a.imageSmoothingEnabled=!0,a.imageSmoothingQuality="medium",Q){const I=t?new OffscreenCanvas(g,B):document.createElement("canvas");t||(I.width=g,I.height=B),I.getContext("2d").putImageData(A,0,0),a.drawImage(I,0,0,g,B,0,0,E,i)}else a.drawImage(A,0,0,g,B,0,0,E,i);const n=a.getImageData(0,0,E,i),s=n.data,c=new Uint8ClampedArray(E*i);for(let h=0,D=0;h<s.length;h+=4,D++){const A=54*s[h]+183*s[h+1]+19*s[h+2]>>8;c[D]=A,s[h]=s[h+1]=s[h+2]=A}return{grayscaleData:c,imageData:n,scaleFactor:o,originalDimensions:{width:g,height:B},scaledDimensions:{width:E,height:i}}}(A,E);g.push({step:"Image Prep + Scale + Gray",ms:(performance.now()-i).toFixed(2)});const s=await x(o,n.width,n.height,e,I);if(s.timings&&s.timings.forEach(A=>g.push(A)),!s.success){const A=performance.now();return g.unshift({step:"Total",ms:(A-B).toFixed(2)}),{output:null,corners:null,contour:null,confidence:s.confidence||null,debug:s.debug,success:!1,message:s.message||"No document detected",timings:g}}let c,h;if("detect"===Q)h=null;else if("extract"===Q){i=performance.now(),c=document.createElement("canvas");K(c.getContext("2d"),A,s.corners),g.push({step:"Perspective Transform",ms:(performance.now()-i).toFixed(2)})}"detect"!==Q&&c&&(i=performance.now(),h="canvas"===C?c:"imagedata"===C?c.getContext("2d").getImageData(0,0,c.width,c.height):"dataurl"===C?c.toDataURL():c,g.push({step:"Output Conversion",ms:(performance.now()-i).toFixed(2)}));const D=performance.now();return g.unshift({step:"Total",ms:(D-B).toFixed(2)}),{output:h,corners:s.corners,contour:s.contour,confidence:s.confidence||null,debug:s.debug,success:!0,message:"Document detected",timings:g}}const v=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));A.Scanner=class{constructor(A={}){this.defaultOptions={maxProcessingDimension:800,mode:"detect",output:"canvas",...A},this.initialized=!1}async initialize(){this.initialized||(await k(),this.initialized=!0)}async scan(A,I={}){this.initialized||await this.initialize();const g={...this.defaultOptions,...I};return await W(A,g)}async extract(A,I,g={}){this.initialized||await this.initialize();const B={...this.defaultOptions,...g};return await T(A,I,B)}},A.extractDocument=T,A.initialize=async function(){return await k()},A.scanDocument=W,Object.defineProperty(A,Symbol.toStringTag,{value:"Module"})});
1
+ !function(A,I){"object"==typeof exports&&"undefined"!=typeof module?I(exports):"function"==typeof define&&define.amd?define(["exports"],I):I((A="undefined"!=typeof globalThis?globalThis:A||self).scanic={})}(this,function(A){"use strict";var I="undefined"!=typeof document?document.currentScript:null;const g=1e3,B=10;function Q(A,I={}){const Q=I.width||Math.sqrt(A.length),i=I.height||A.length/Q,t=void 0!==I.mode?I.mode:1,o=void 0!==I.method?I.method:2,e=I.minArea||g,n=Q+2,a=i+2,s=new Int32Array(n*a);for(let g=0;g<i;g++)for(let I=0;I<Q;I++)A[g*Q+I]>0&&(s[(g+1)*n+(I+1)]=1);const r=[];let c=2;for(let g=1;g<=i;g++)for(let A=1;A<=Q;A++){const I=s[g*n+A],Q=s[g*n+(A-1)];let i=null,e=!1,h=-1;if(1===I&&0===Q?(e=!0,i={x:A,y:g},h=2):0===I&&Q>=1&&-1!==Q&&1===Q&&(e=!1,i={x:A-1,y:g},h=6),i){if(0===t&&!e){s[i.y*n+i.x]=-1;continue}const A=c++,I=C(s,n,a,i,h,A);if(I&&I.length>0){let g=I;2===o&&(g=E(I));const Q=g.map(A=>({x:A.x-1,y:A.y-1}));if(Q.length>=(2===o?4:B)){const I={id:A,points:Q,isOuter:e};r.push(I)}}else 1===s[i.y*n+i.x]&&(s[i.y*n+i.x]=A)}}r.forEach(A=>{A.area=function(A){let I=0;const g=A.length;if(g<3)return 0;for(let B=0;B<g;B++){const Q=(B+1)%g;I+=A[B].x*A[Q].y,I-=A[Q].x*A[B].y}return Math.abs(I)/2}(A.points),A.boundingBox=function(A){if(0===A.length)return{minX:0,minY:0,maxX:0,maxY:0};let I=A[0].x,g=A[0].y,B=A[0].x,Q=A[0].y;for(let C=1;C<A.length;C++){const E=A[C];I=Math.min(I,E.x),g=Math.min(g,E.y),B=Math.max(B,E.x),Q=Math.max(Q,E.y)}return{minX:I,minY:g,maxX:B,maxY:Q}}(A.points)});const h=r.filter(A=>A.area>=e);return h.sort((A,I)=>I.area-A.area),I.debug&&(I.debug.labels=s,I.debug.rawContours=r,I.debug.finalContours=h),h}function C(A,I,g,B,Q,C){const E=[],i=new Set;let t=B.x,o=B.y;const e=t,n=o;let a=-1;A[n*I+e]=C;let s=0;const r=I*g,c=[0,1,1,1,0,-1,-1,-1],h=[-1,-1,0,1,1,1,0,-1];for(;s++<r;){let B;if(-1===a){let C=!1;for(let E=0;E<8;E++){B=Q+E&7;const i=t+c[B],e=o+h[B];if(i>=0&&i<I&&e>=0&&e<g&&A[e*I+i]>0){C=!0;break}}if(!C)return null}else B=a+2&7;let s=-1,r=-1;for(let Q=0;Q<8;Q++){const C=B+Q&7,E=t+c[C],i=o+h[C];if(E>=0&&E<I&&i>=0&&i<g&&A[i*I+E]>0){s=E,r=i,a=C+4&7;break}}if(-1===s){0===E.length&&E.push({x:t,y:o});break}const y=o*I+t;if(i.has(y))return E;E.push({x:t,y:o}),i.add(y);const l=r*I+s;if(1===A[l]&&(A[l]=C),t=s,o=r,t===e&&o===n)break}return s>=r?null:E}function E(A){const I=A.length;if(I<=2)return A;const g=[],B=A[I-1],Q=A[0];let C=B,E=Q,i=A[1],t=E.x-C.x,o=E.y-C.y,e=i.x-E.x,n=i.y-E.y;t*n!==o*e&&g.push(E);for(let a=1;a<I-1;a++)C=A[a-1],E=A[a],i=A[a+1],t=E.x-C.x,o=E.y-C.y,e=i.x-E.x,n=i.y-E.y,t*n!==o*e&&g.push(E);if(C=A[I-2],E=B,i=Q,t=E.x-C.x,o=E.y-C.y,e=i.x-E.x,n=i.y-E.y,t*n!==o*e&&g.push(E),0===g.length){if(1===I)return[A[0]];if(2===I)return A;let g=0,B=1;const C=Q.x,E=Q.y;for(let Q=1;Q<I;Q++){const I=A[Q],i=I.x-C,t=I.y-E,o=i*i+t*t;o>g&&(g=o,B=Q)}return[Q,A[B]]}return g}function i(A,I=1){if(A.length<=2)return A;let g=0,B=0;const Q=A[0],C=A[A.length-1];for(let E=1;E<A.length-1;E++){const I=t(A[E],Q,C);I>g&&(g=I,B=E)}if(g>I){const g=i(A.slice(0,B+1),I),Q=i(A.slice(B),I);return g.slice(0,-1).concat(Q)}return[Q,C]}function t(A,I,g){const B=g.x-I.x,Q=g.y-I.y,C=B*B+Q*Q;if(0===C)return Math.sqrt(Math.pow(A.x-I.x,2)+Math.pow(A.y-I.y,2));const E=((A.x-I.x)*B+(A.y-I.y)*Q)/C;let i,t;E<0?(i=I.x,t=I.y):E>1?(i=g.x,t=g.y):(i=I.x+E*B,t=I.y+E*Q);const o=A.x-i,e=A.y-t;return Math.sqrt(o*o+e*e)}function o(A,I=.02){return i(A,I*function(A){let I=0;const g=A.length;if(g<2)return 0;for(let B=0;B<g;B++){const Q=(B+1)%g,C=A[B].x-A[Q].x,E=A[B].y-A[Q].y;I+=Math.sqrt(C*C+E*E)}return I}(A))}function e(A,I){return Math.hypot(I.x-A.x,I.y-A.y)}function n(A){let I=0,g=0;for(const B of A)I+=B.x,g+=B.y;return{x:I/A.length,y:g/A.length}}function a(A,I={}){if(!A||!A.points||A.points.length<4)return null;const g=I.epsilon||.02,B=function(A,I){if(!A||A.length<4)return null;const g=[I,1.3*I,1.6*I,2*I],B=new Set;for(const Q of g){const I=Math.min(.12,Q),g=I.toFixed(4);if(B.has(g))continue;B.add(g);const C=s(o(A,I));if(C&&4===C.length)return C}return null}(A.points,g);let Q;return B&&4===B.length?Q=function(A){if(4!==A.length)return null;const I=n(A),g=[...A].sort((A,g)=>Math.atan2(A.y-I.y,A.x-I.x)-Math.atan2(g.y-I.y,g.x-I.x));let B=1/0,Q=0;for(let E=0;E<4;E++){const A=g[E].x+g[E].y;A<B&&(B=A,Q=E)}const C=[g[Q],g[(Q+1)%4],g[(Q+2)%4],g[(Q+3)%4]];return{topLeft:C[0],topRight:C[1],bottomRight:C[2],bottomLeft:C[3]}}(B):(Q=function(A){if(!A||A.length<4)return null;const I=n(A);let g=null,B=null,Q=null,C=null,E=0,i=0,t=0,o=0;for(const n of A){const A=e(n,I);n.x<I.x&&n.y<I.y?A>E&&(g=n,E=A):n.x>I.x&&n.y<I.y?A>i&&(B=n,i=A):n.x>I.x&&n.y>I.y?A>t&&(Q=n,t=A):n.x<I.x&&n.y>I.y&&A>o&&(C=n,o=A)}if(!(g&&B&&Q&&C))return null;return{topLeft:g,topRight:B,bottomRight:Q,bottomLeft:C}}(A.points),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft||(Q=function(A){if(!A||0===A.length)return null;let I=A[0],g=A[0],B=A[0],Q=A[0],C=I.x+I.y,E=g.x-g.y,i=B.x+B.y,t=Q.x-Q.y;for(let o=1;o<A.length;o++){const e=A[o],n=e.x+e.y,a=e.x-e.y;n<C&&(C=n,I=e),n>i&&(i=n,B=e),a>E&&(E=a,g=e),a<t&&(t=a,Q=e)}return{topLeft:I,topRight:g,bottomRight:B,bottomLeft:Q}}(A.points))),Q&&Q.topLeft&&Q.topRight&&Q.bottomRight&&Q.bottomLeft?Q:null}function s(A){if(!A||A.length<4)return null;if(4===A.length)return A;if(A.length>8)return null;let I=function(A,I){if(!A||0===A.length)return[];const g=[];for(const B of A)(0===g.length||e(B,g[g.length-1])>I)&&g.push(B);g.length>2&&e(g[0],g[g.length-1])<=I&&g.pop();return g}(A,6);return 4===I.length?I:(I.length,null)}let r,c=null;function h(){return null!==c&&0!==c.byteLength||(c=new Uint8Array(r.memory.buffer)),c}let y=0;function l(A,I){const g=I(1*A.length,1)>>>0;return h().set(A,g/1),y=A.length,g}function D(A,I){return A>>>=0,h().subarray(A/1,A/1+I)}let w=null;function f(){return null!==w&&0!==w.byteLength||(w=new Float32Array(r.memory.buffer)),w}function d(A,I,g,B,Q){const C=function(A,I){const g=I(4*A.length,4)>>>0;return f().set(A,g/4),y=A.length,g}(A,r.__wbindgen_malloc),E=y,i=r.hysteresis_thresholding(C,E,I,g,B,Q);var t=D(i[0],i[1]).slice();return r.__wbindgen_free(i[0],1*i[1],1),t}let u=null;function R(A,I){const g=I(2*A.length,2)>>>0;return(null!==u&&0!==u.byteLength||(u=new Uint16Array(r.memory.buffer)),u).set(A,g/2),y=A.length,g}function m(A,I,g,B,Q){const C=R(A,r.__wbindgen_malloc),E=y,i=R(I,r.__wbindgen_malloc),t=y,o=r.non_maximum_suppression(C,E,i,t,g,B,Q);var e,n,a=(e=o[0],n=o[1],e>>>=0,f().subarray(e/4,e/4+n)).slice();return r.__wbindgen_free(o[0],4*o[1],4),a}async function N(A){if(void 0!==r)return r;void 0!==A&&Object.getPrototypeOf(A)===Object.prototype&&({module_or_path:A}=A),void 0===A&&(A=new URL("data:application/wasm;base64,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JAAgAiABIAJqIgFLBEBBAEEAEC0ACyADQQRqIAAoAgAiAiAAKAIEQQggASACQQF0IgIgASACSxsiASABQQhNGyIBQQFBARARIAMoAgRBAUYEQCADKAIIIAMoAgwQLQALIAMoAgghAiAAIAE2AgAgACACNgIEIANBEGokAAt5AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBAwDAELIAJBEGogACgCDCgCACIAQQhqKQIANwMAIAJBGGogAEEQaikCADcDACACIAApAgA3AwggASgCACABKAIEIAJBCGoQBwsgAkEgaiQAC2kBA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBEEEIAJBAXQiAiACQQRNGyICQQRBBBARIAEoAgRBAUYEQCABKAIIIAEoAgwQLQALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtpAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgRBBCACQQF0IgIgAkEETRsiAkEEQQgQESABKAIEQQFGBEAgASgCCCABKAIMEC0ACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALaQEDfyMAQRBrIgEkACABQQRqIAAoAgAiAiAAKAIEQQQgAkEBdCICIAJBBE0bIgJBAkECEBEgASgCBEEBRgRAIAEoAgggASgCDBAtAAsgASgCCCEDIAAgAjYCACAAIAM2AgQgAUEQaiQACxIAIwBBMGsiACQAIABBMGokAAtoAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Hkl8AANgIIIANCAjcCFCADQoCAgIAwIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhAmAAtHAQF/IAAoAgAgACgCCCIDayACSQRAIAAgAyACEBIgACgCCCEDCyACBEAgACgCBCADaiABIAL8CgAACyAAIAIgA2o2AghBAAtEAQJ/IAEoAgQhAiABKAIAIQNBCEEEEDUiAUUEQEEEQQgQOQALIAEgAjYCBCABIAM2AgAgAEHcksAANgIEIAAgATYCAAvGAgACQCAAIAJNBEAgACABTSABIAJLcg0BIwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkECNgIMIAJB2JbAADYCCCACQgI3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IAAAABwAEAAMAAAAEgAAABcAAAAcABAADAAAABcAAAAZAAAAHAAQAAwAAAAUAAAAGQAAABwAEAAMAAAAUQAAAB4AAAAcABAADAAAAFIAAAAeAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAA8CBAAKgAAAEgBEABaAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAgAgQAA4AAABIARAAWgAAAHoCAAANAAAAfP2LMlfmV/kC30S/40jnr21dy9YsUOtjeEGmV3Ebi7ltZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAADICBAAFQAAAN0IEAANAAAALwEQABgAAABkAQAACQAAAAQAAAAMAAAABAAAAAUAAAAGAAAABwAAAAAAAAAIAAAABAAAAAgAAAAJAAAACgAAAAsAAAAMAAAAEAAAAAQAAAANAAAADgAAAA8AAAAQAAAAAAAAAAgAAAAEAAAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAAAQBEAAqAAAAsQQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAAEARAAKgAAALcEAAANAAAABAAAAAwAAAAEAAAAEgAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/AkQABEAAADjABAAIAAAABwAAAAFAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlyYW5nZSBlbmQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIAAA8AoQABAAAAAACxAAIgAAAHNsaWNlIGluZGV4IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgADQLEAAWAAAASgsQAA0AAAByYW5nZSBzdGFydCBpbmRleCAAAGgLEAASAAAAAAsQACIAAABhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvAAAAjAsQABkAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAsAsQACAAAADQCxAAEgAAAAAAAD8AAAC/AEGUmMAACwEBAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkyLjAgKGRlZDVjMDZjZiAyMDI1LTEyLTA4KQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAHQPdGFyZ2V0X2ZlYXR1cmVzBysPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwdzaW1kMTI4KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:I&&"SCRIPT"===I.tagName.toUpperCase()&&I.src||new URL("scanic.umd.cjs",document.baseURI).href));const g=function(){const A={wbg:{}};return A.wbg.__wbindgen_init_externref_table=function(){const A=r.__wbindgen_export_0,I=A.grow(4);A.set(0,void 0),A.set(I+0,void 0),A.set(I+1,null),A.set(I+2,!0),A.set(I+3,!1)},A}();("string"==typeof A||"function"==typeof Request&&A instanceof Request||"function"==typeof URL&&A instanceof URL)&&(A=fetch(A));const{instance:B,module:Q}=await async function(A,I){if("function"==typeof Response&&A instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(A,I)}catch(g){if("application/wasm"==A.headers.get("Content-Type"))throw g}const B=await A.arrayBuffer();return await WebAssembly.instantiate(B,I)}{const g=await WebAssembly.instantiate(A,I);return g instanceof WebAssembly.Instance?{instance:g,module:A}:g}}(await A,g);return function(A,I){return r=A.exports,N.__wbindgen_wasm_module=I,w=null,u=null,c=null,r.__wbindgen_start(),r}(B,Q)}let F=null,G=!1;async function J(){if("undefined"!=typeof process&&(null==(A=process.versions)?void 0:A.node))try{const A="node:fs/promises",g="node:url",{readFile:B}=await import(A),{fileURLToPath:Q}=await import(g),C=new URL("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:I&&"SCRIPT"===I.tagName.toUpperCase()&&I.src||new URL("scanic.umd.cjs",document.baseURI).href);C.search="",C.hash="";const E=new URL("../wasm_blur/pkg/wasm_blur_bg.wasm",C),i=await B(Q(E));return await N({module_or_path:i})}catch{return await N()}var A;return await N()}function S(){return F||(F=J().catch(A=>{throw F=null,A})),F}function k(A,I,g,B=5,Q=0){0===Q&&(Q=.3*(.5*(B-1)-1)+.8);const C=Math.floor(B/2),E=function(A,I){const g=new Float32Array(A),B=Math.floor(A/2);let Q=0;for(let C=0;C<A;C++){const A=C-B;g[C]=Math.exp(-A*A/(2*I*I)),Q+=g[C]}for(let C=0;C<A;C++)g[C]/=Q;return g}(B,Q),i=new Uint8ClampedArray(I*g),t=new Uint8ClampedArray(I*g);for(let o=0;o<g;o++){const g=o*I;for(let B=0;B<I;B++){let Q=0;for(let i=-C;i<=C;i++){Q+=A[g+Math.min(I-1,Math.max(0,B+i))]*E[C+i]}i[g+B]=Q}}for(let o=0;o<I;o++)for(let A=0;A<g;A++){let B=0;for(let Q=-C;Q<=C;Q++){B+=i[Math.min(g-1,Math.max(0,A+Q))*I+o]*E[C+Q]}t[A*I+o]=Math.round(B)}return t}function M(A,I,g,B,Q){const C=new Uint8Array(I*g),E=[];for(let o=1;o<g-1;o++)for(let g=1;g<I-1;g++){const i=o*I+g,t=A[i];t>=Q?(C[i]=2,E.push({x:g,y:o})):C[i]=t>=B?0:1}for(let o=0;o<I;o++)C[o]=1,C[(g-1)*I+o]=1;for(let o=1;o<g-1;o++)C[o*I]=1,C[o*I+I-1]=1;const i=[-1,0,1,-1,1,-1,0,1],t=[-1,-1,-1,0,0,1,1,1];for(;E.length>0;){const{x:A,y:g}=E.pop();for(let B=0;B<8;B++){const Q=A+i[B],o=g+t[B],e=o*I+Q;0===C[e]&&(C[e]=2,E.push({x:Q,y:o}))}}return C}async function p(A,I={}){const g=!(!I.debug||I.debug._timingsOnly),B=[],Q=performance.now();let C,E,i;if(I.skipGrayscale||!1)C=I.width,E=I.height,i=A,g&&(I.debug.grayscale=i);else{C=A.width,E=A.height;let Q=performance.now();i=function(A){const{width:I,height:g,data:B}=A,Q=new Uint8ClampedArray(I*g);for(let C=0,E=0;C<B.length;C+=4,E++)Q[E]=54*B[C]+183*B[C+1]+19*B[C+2]>>8;return Q}(A);let t=performance.now();B.push({step:"Grayscale",ms:(t-Q).toFixed(2)}),g&&(I.debug.grayscale=i)}let t=void 0!==I.lowThreshold?I.lowThreshold:null,o=void 0!==I.highThreshold?I.highThreshold:null;if(null===t||null===o){const A=1024,I=new Uint32Array(A);let g=0;for(let t=1;t<E-1;t++)for(let B=1;B<C-1;B++){const Q=t*C+B,E=-i[Q-C-1]+i[Q-C+1]-2*i[Q-1]+2*i[Q+1]-i[Q+C-1]+i[Q+C+1],o=-i[Q-C-1]-2*i[Q-C]-i[Q-C+1]+i[Q+C-1]+2*i[Q+C]+i[Q+C+1];let e=Math.abs(E)+Math.abs(o);e>=A&&(e=A-1),e>0&&(I[e]++,g++)}const B=Math.round(.7*g);let Q=0,e=75;for(let C=1;C<A;C++)if(Q+=I[C],Q>=B){e=C;break}null===t&&(t=Math.max(5,Math.round(.5*e))),null===o&&(o=Math.min(500,Math.round(1.5*e)))}const e=I.kernelSize||5,n=I.sigma||0,a=void 0!==I.L2gradient&&I.L2gradient,s=void 0===I.applyDilation||I.applyDilation,c=I.dilationKernelSize||5,h=void 0!==I.useWasmHysteresis&&I.useWasmHysteresis,w=void 0!==I.useWasmFullCanny&&I.useWasmFullCanny;if(t>=o&&([t,o]=[o,t]),w)try{await S();const A=performance.now(),h=new Uint8ClampedArray(function(A,I,g,B,Q,C,E,i,t,o){const e=l(A,r.__wbindgen_malloc),n=y,a=r.canny_edge_detector_full(e,n,I,g,B,Q,C,E,i,t,o);var s=D(a[0],a[1]).slice();return r.__wbindgen_free(a[0],1*a[1],1),s}(i,C,E,t,o,e,n,a,s,c)),w=(performance.now()-A).toFixed(2);B.push({step:"Edge Processing (WASM)",ms:w}),g&&(I.debug.finalEdges=h),I.debug?I.debug.timings=B:I.debug={timings:B};const f=performance.now();return B.unshift({step:"Edge Detection Total",ms:(f-Q).toFixed(2)}),h}catch(Y){if(!G){G=!0;Y instanceof Error?Y.message:String(Y)}}let f,u,R,N,F,J;f=performance.now();try{await S(),R=function(A,I,g,B,Q){const C=l(A,r.__wbindgen_malloc),E=y,i=r.blur(C,E,I,g,B,Q);var t=D(i[0],i[1]).slice();return r.__wbindgen_free(i[0],1*i[1],1),t}(i,C,E,e,n)}catch(q){R=k(i,C,E,e,n)}u=performance.now(),B.push({step:"Gaussian Blur",ms:(u-f).toFixed(2)}),g&&(I.debug.blurred=R),f=performance.now();{const A=function(A,I,g){const B=new Int16Array(I*g),Q=new Int16Array(I*g);for(let C=1;C<g-1;C++){const g=C*I,E=(C-1)*I,i=(C+1)*I;for(let C=1;C<I-1;C++){const I=g+C,t=A[E+C-1],o=A[E+C],e=A[E+C+1],n=A[g+C-1],a=A[g+C+1],s=A[i+C-1],r=A[i+C],c=A[i+C+1],h=e-t+2*(a-n)+(c-s),y=s+2*r+c-(t+2*o+e);B[I]=h,Q[I]=y}}return{dx:B,dy:Q}}(R,C,E);N=A.dx,F=A.dy}u=performance.now(),B.push({step:"Gradients",ms:(u-f).toFixed(2)}),f=performance.now();try{await S(),J=await m(N,F,C,E,a)}catch(q){J=function(A,I,g,B,Q){const C=new Float32Array(g*B),E=new Float32Array(g*B);for(let i=0;i<A.length;i++){const g=A[i],B=I[i];C[i]=Q?Math.sqrt(g*g+B*B):Math.abs(g)+Math.abs(B)}for(let i=1;i<B-1;i++)for(let B=1;B<g-1;B++){const Q=i*g+B,t=C[Q];if(0===t){E[Q]=0;continue}const o=A[Q],e=I[Q];let n=0,a=0;const s=Math.abs(o),r=Math.abs(e);if(r>2.4142*s)n=C[Q-g],a=C[Q+g];else if(s>2.4142*r)n=C[Q-1],a=C[Q+1];else{const A=(o^e)<0?-1:1;e>0?(n=C[(i-1)*g+(B-A)],a=C[(i+1)*g+(B+A)]):(n=C[(i+1)*g+(B-A)],a=C[(i-1)*g+(B+A)]),o>0&&e>0||o<0&&e<0?(n=C[(i-1)*g+(B+1)],a=C[(i+1)*g+(B-1)]):(n=C[(i-1)*g+(B-1)],a=C[(i+1)*g+(B+1)])}E[Q]=t>=n&&t>=a?t:0}return E}(N,F,C,E,a)}u=performance.now(),B.push({step:"Non-Max Suppression",ms:(u-f).toFixed(2)}),f=performance.now();const p=a?t*t:t,L=a?o*o:o;let U;if(h)try{await S(),U=d(J,C,E,p,L)}catch(q){U=M(J,C,E,p,L)}else U=M(J,C,E,p,L);u=performance.now(),B.push({step:"Hysteresis",ms:(u-f).toFixed(2)}),f=performance.now();const b=new Uint8ClampedArray(C*E);for(let r=0;r<U.length;r++)b[r]=2===U[r]?255:0;u=performance.now(),B.push({step:"Binary Image",ms:(u-f).toFixed(2)}),f=performance.now();let H=b;if(s)try{await S(),H=function(A,I,g,B){const Q=l(A,r.__wbindgen_malloc),C=y,E=r.dilate(Q,C,I,g,B);var i=D(E[0],E[1]).slice();return r.__wbindgen_free(E[0],1*E[1],1),i}(b,C,E,c)}catch(q){H=function(A,I,g,B=5){const Q=Math.floor(B/2),C=new Uint8ClampedArray(I*g),E=new Uint8ClampedArray(I*g);for(let i=0;i<g;i++){const g=i*I;for(let B=0;B<I;B++){let E=0;for(let C=-Q;C<=Q;C++){const Q=B+C;if(Q>=0&&Q<I){const I=A[g+Q];I>E&&(E=I)}}C[g+B]=E}}for(let i=0;i<I;i++)for(let A=0;A<g;A++){let B=0;for(let E=-Q;E<=Q;E++){const Q=A+E;if(Q>=0&&Q<g){const A=C[Q*I+i];A>B&&(B=A)}}E[A*I+i]=B}return E}(b,C,E,c)}if(u=performance.now(),B.push({step:"Dilation",ms:(u-f).toFixed(2)}),g){I.debug.dx=N,I.debug.dy=F;const A=new Float32Array(C*E);for(let I=0;I<N.length;I++){const g=N[I],B=F[I];A[I]=a?Math.sqrt(g*g+B*B):Math.abs(g)+Math.abs(B)}I.debug.magnitude=A,I.debug.suppressed=J,I.debug.edgeMap=U,I.debug.cannyEdges=b,I.debug.finalEdges=H}I.debug?I.debug.timings=B:I.debug||(I.debug={timings:B});const x=performance.now();return B.unshift({step:"Edge Detection Total",ms:(x-Q).toFixed(2)}),H}function L(A){return{topLeft:{x:A.topLeft.x,y:A.topLeft.y},topRight:{x:A.topRight.x,y:A.topRight.y},bottomRight:{x:A.bottomRight.x,y:A.bottomRight.y},bottomLeft:{x:A.bottomLeft.x,y:A.bottomLeft.y}}}function U(A,I){return Math.hypot(A.x-I.x,A.y-I.y)}function b(A,I=4){const g=[null==A?void 0:A.topLeft,null==A?void 0:A.topRight,null==A?void 0:A.bottomRight,null==A?void 0:A.bottomLeft];if(g.some(A=>!A||!Number.isFinite(A.x)||!Number.isFinite(A.y)))return!1;for(let B=0;B<g.length;B++)for(let A=B+1;A<g.length;A++)if(U(g[B],g[A])<I)return!1;return!0}function H(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let Q=0;Q<I.length;Q++){const A=I[Q],B=I[(Q+1)%I.length],C=I[(Q+2)%I.length],E=(B.x-A.x)*(C.y-B.y)-(B.y-A.y)*(C.x-B.x);Math.abs(E)<1e-6||g.push(Math.sign(E))}if(g.length<3)return!1;const B=g[0];return g.every(A=>A===B)}function x(A,I,g,B,Q,C){A.beginPath(),A.arc(I.x,I.y,g,0,2*Math.PI),A.fillStyle=B,A.fill(),A.lineWidth=C,A.strokeStyle=Q,A.stroke()}function Y(A){return A<=0?0:A>=1?1:A}function q(A,I){return Math.hypot(A.x-I.x,A.y-I.y)}function v(A){return[q(A.topLeft,A.topRight),q(A.topRight,A.bottomRight),q(A.bottomRight,A.bottomLeft),q(A.bottomLeft,A.topLeft)]}function K(A){const I=function(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let B=0;B<I.length;B++){const A=I[(B+I.length-1)%I.length],Q=I[B],C=I[(B+1)%I.length],E=A.x-Q.x,i=A.y-Q.y,t=C.x-Q.x,o=C.y-Q.y,e=E*t+i*o,n=Math.hypot(E,i),a=Math.hypot(t,o),s=Math.max(1e-6,n*a),r=Math.max(-1,Math.min(1,e/s));g.push(180*Math.acos(r)/Math.PI)}return g}(A);let g=0;for(const B of I){g+=Y(1-Math.abs(B-90)/55)}return g/Math.max(1,I.length)}function T(A,I){const g=Number(I.isValid)-Number(A.isValid);if(0!==g)return g;const B=I.confidence-A.confidence;if(!(Math.abs(B)<.015)&&0!==B)return B;const Q=Math.abs((A.approxCount??99)-4)-Math.abs((I.approxCount??99)-4);if(0!==Q)return Q;const C=(I.rightAngleScore??0)-(A.rightAngleScore??0);if(Math.abs(C)>1e-6)return C;const E=Math.abs(1-(A.contourFitRatio??1))-Math.abs(1-(I.contourFitRatio??1));return Math.abs(E)>1e-6?E:B||I.score-A.score||I.coverageRatio-A.coverageRatio||I.area-A.area}function W(A,I,g,B,Q={}){const C=Q.epsilon||.02,E=o(A.points,C).length,i=a(A,{epsilon:C});if(!i)return{contour:A,corners:null,score:0,confidence:0,isValid:!1,area:A.area||0,fillRatio:0,coverageRatio:0,cornersArea:0,approxCount:E,convex:!1,edgeSupport:0,aspectRatio:1/0,minSide:0,rightAngleScore:0,oppositeSideConsistency:0,contourFitRatio:0,contourFitScore:0};const t=g*B,e=A.area||0,n=A.boundingBox||{minX:0,minY:0,maxX:0,maxY:0},s=e/Math.max(1,(n.maxX-n.minX+1)*(n.maxY-n.minY+1)),r=function(A){if(!A)return 0;const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft];let g=0;for(let B=0;B<I.length;B++){const A=(B+1)%I.length;g+=I[B].x*I[A].y-I[A].x*I[B].y}return Math.abs(g)/2}(i),c=r/Math.max(1,t),h=v(i),y=Math.min(...h),l=(h[0]+h[2])/2,D=(h[1]+h[3])/2,w=l>D?l/Math.max(1e-6,D):D/Math.max(1e-6,l),f=function(A){const I=[A.topLeft,A.topRight,A.bottomRight,A.bottomLeft],g=[];for(let Q=0;Q<I.length;Q++){const A=I[Q],B=I[(Q+1)%I.length],C=I[(Q+2)%I.length],E=(B.x-A.x)*(C.y-B.y)-(B.y-A.y)*(C.x-B.x);Math.abs(E)<1e-6||g.push(Math.sign(E))}if(g.length<3)return!1;const B=g[0];return g.every(A=>A===B)}(i),d=function(A,I,g,B){if(!(null==A?void 0:A.points)||0===A.points.length)return 0;const Q=Math.max(1,Math.floor(A.points.length/240));let C=0,E=0;for(let i=0;i<A.points.length;i+=Q){const Q=A.points[i],t=Math.max(0,Math.min(g-1,0|Q.x)),o=Math.max(0,Math.min(B-1,0|Q.y));C++;let e=!1;for(let A=-1;A<=1&&!e;A++){const Q=o+A;if(!(Q<0||Q>=B))for(let A=-1;A<=1;A++){const B=t+A;if(!(B<0||B>=g)&&I[Q*g+B]>0){e=!0;break}}}e&&E++}return 0===C?0:E/C}(A,I,g,B),u=K(i),R=function(A){const I=v(A);return(Math.min(I[0],I[2])/Math.max(1e-6,Math.max(I[0],I[2]))+Math.min(I[1],I[3])/Math.max(1e-6,Math.max(I[1],I[3])))/2}(i),m=e/Math.max(1,r),N=Y(1-Math.abs(m-1)/.55),F=4===E?1:5===E?.9:6===E?.7:E<=8?.5:.28,G=Y(e/Math.max(1,.4*t)),J=Y((s-.08)/.72),S=Y((c-.03)/.82),k=void 0!==Q.minDocumentSideRatio?Q.minDocumentSideRatio:.06,M=void 0!==Q.minDocumentCoverageRatio?Q.minDocumentCoverageRatio:.04,p=void 0!==Q.maxDocumentAspectRatio?Q.maxDocumentAspectRatio:8,L=void 0!==Q.minDocumentFillRatio?Q.minDocumentFillRatio:.07,U=void 0!==Q.minContourFitRatio?Q.minContourFitRatio:.11,b=void 0!==Q.maxContourFitRatio?Q.maxContourFitRatio:1.2,H=void 0!==Q.minRightAngleScore?Q.minRightAngleScore:.42,x=void 0!==Q.minOppositeSideConsistency?Q.minOppositeSideConsistency:.3,T=Math.min(g,B)*k,W=function(A,I=6){const g=[null==A?void 0:A.topLeft,null==A?void 0:A.topRight,null==A?void 0:A.bottomRight,null==A?void 0:A.bottomLeft];if(g.some(A=>!A||!Number.isFinite(A.x)||!Number.isFinite(A.y)))return!1;for(let B=0;B<g.length;B++)for(let A=B+1;A<g.length;A++)if(q(g[B],g[A])<I)return!1;return!0}(i)&&f&&y>=T&&c>=M&&w<=p&&s>=L&&m>=U&&m<=b&&u>=H&&R>=x,P=.22*G+.14*J+.15*F+.08*(f?1:0)+.08*d+.13*S+.1*u+.05*R+.05*N;return{contour:A,corners:i,score:P,confidence:W?P:.33*P,isValid:W,area:e,fillRatio:s,coverageRatio:c,cornersArea:r,approxCount:E,convex:f,edgeSupport:d,aspectRatio:w,minSide:y,rightAngleScore:u,oppositeSideConsistency:R,contourFitRatio:m,contourFitScore:N}}async function P(A,I,g,B,C={}){const E=C.debug?{}:{_timingsOnly:!0},i=[];E&&!E._timingsOnly&&(E.preprocessing={scaledDimensions:{width:I,height:g},scaleFactor:B,maxProcessingDimension:C.maxProcessingDimension||800});const t=function(A={}){const I=A.dilationKernelSize||3,g=A.dilationIterations||1,B=void 0===A.applyDilation||A.applyDilation,Q=[{name:"default",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:I,dilationIterations:g,applyDilation:B}];if(!1===A.enableDetectionCascade)return Q;Q.push({name:"connect-edges",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:Math.max(I,5),dilationIterations:Math.max(g,2),applyDilation:!0}),Q.push({name:"no-dilation",lowThreshold:A.lowThreshold,highThreshold:A.highThreshold,dilationKernelSize:I,dilationIterations:g,applyDilation:!1}),void 0===A.lowThreshold&&void 0===A.highThreshold&&Q.push({name:"fixed-mid-thresholds",lowThreshold:60,highThreshold:180,dilationKernelSize:I,dilationIterations:g,applyDilation:B});const C=[],E=new Set;for(const i of Q){const A=[i.lowThreshold,i.highThreshold,i.dilationKernelSize,i.dilationIterations,i.applyDilation].join(":");E.has(A)||(E.add(A),C.push(i))}return C}(C),o=[],e=async(E,t)=>{const o=E.name||`pass-${t+1}`,e=0===t?"":` (${o})`,n=C.debug?{}:{_timingsOnly:!0},a=await p(A,{width:I,height:g,lowThreshold:E.lowThreshold,highThreshold:E.highThreshold,dilationKernelSize:E.dilationKernelSize,dilationIterations:E.dilationIterations,applyDilation:E.applyDilation,debug:n,skipGrayscale:!0,useWasmBlur:!0,useWasmHysteresis:C.useWasmHysteresis,useWasmFullCanny:C.useWasmFullCanny});n.timings&&n.timings.forEach(A=>{"Edge Detection Total"!==A.step&&i.push({step:`${A.step}${e}`,ms:A.ms})});let s=performance.now();const r=Q(a,{minArea:(C.minArea||1e3)/(B*B),width:I,height:g});i.push({step:`Find Contours${e}`,ms:(performance.now()-s).toFixed(2)}),s=performance.now();const{best:c,candidates:h}=function(A,I,g,B,Q={}){const C=Q.maxCandidateContours||12,E=A.slice(0,C).map((A,C)=>({rankByArea:C,...W(A,I,g,B,Q)})).sort(T);return{best:E[0]||null,candidates:E}}(r,a,I,g,C);return i.push({step:`Corner Detection${e}`,ms:(performance.now()-s).toFixed(2)}),{name:o,params:{lowThreshold:E.lowThreshold,highThreshold:E.highThreshold,dilationKernelSize:E.dilationKernelSize,dilationIterations:E.dilationIterations,applyDilation:E.applyDilation},contours:r,best:c,candidates:h}},n=await e(t[0],0);if(o.push(n),function(A,I={}){if(!1===I.enableDetectionCascade)return!1;if(!A||!A.corners)return!0;const g=void 0!==I.minCascadeTriggerConfidence?I.minCascadeTriggerConfidence:.68;return!A.isValid||A.confidence<g||A.approxCount>5||A.rightAngleScore<.55||A.contourFitRatio<.14}(n.best,C))for(let Q=1;Q<t.length;Q++)o.push(await e(t[Q],Q));const a=[];for(const Q of o)for(const A of Q.candidates)a.push({...A,passName:Q.name,passParams:Q.params});a.sort(T);const s=a[0]||null,r=a;if(!s||!s.corners)return{success:!1,message:"No document detected",debug:E._timingsOnly?null:E,timings:i};E&&!E._timingsOnly&&(E.passes=o.map(A=>({name:A.name,params:A.params,contourCount:A.contours.length,bestCandidate:A.best?{score:A.best.score,confidence:A.best.confidence,isValid:A.best.isValid,approxCount:A.best.approxCount,coverageRatio:A.best.coverageRatio,fillRatio:A.best.fillRatio,rightAngleScore:A.best.rightAngleScore,contourFitRatio:A.best.contourFitRatio}:null})),E.candidates=r.map(A=>({passName:A.passName,rankByArea:A.rankByArea,area:A.area,fillRatio:A.fillRatio,coverageRatio:A.coverageRatio,cornersArea:A.cornersArea,approxCount:A.approxCount,convex:A.convex,edgeSupport:A.edgeSupport,aspectRatio:A.aspectRatio,minSide:A.minSide,rightAngleScore:A.rightAngleScore,oppositeSideConsistency:A.oppositeSideConsistency,contourFitRatio:A.contourFitRatio,contourFitScore:A.contourFitScore,score:A.score,confidence:A.confidence,isValid:A.isValid})),E.selectedCandidate=r[0]?{passName:r[0].passName,rankByArea:r[0].rankByArea,area:r[0].area,fillRatio:r[0].fillRatio,coverageRatio:r[0].coverageRatio,approxCount:r[0].approxCount,edgeSupport:r[0].edgeSupport,aspectRatio:r[0].aspectRatio,minSide:r[0].minSide,rightAngleScore:r[0].rightAngleScore,oppositeSideConsistency:r[0].oppositeSideConsistency,contourFitRatio:r[0].contourFitRatio,score:r[0].score,confidence:r[0].confidence,isValid:r[0].isValid}:null);const c=s.corners,h=s.contour;let y=c;return 1!==B&&(y={topLeft:{x:c.topLeft.x*B,y:c.topLeft.y*B},topRight:{x:c.topRight.x*B,y:c.topRight.y*B},bottomRight:{x:c.bottomRight.x*B,y:c.bottomRight.y*B},bottomLeft:{x:c.bottomLeft.x*B,y:c.bottomLeft.y*B}}),{success:!0,contour:h,corners:y,confidence:s.confidence,debug:E._timingsOnly?null:E,timings:i}}function X(A,I,g){const{topLeft:B,topRight:Q,bottomRight:C,bottomLeft:E}=g,i=Math.hypot(C.x-E.x,C.y-E.y),t=Math.hypot(Q.x-B.x,Q.y-B.y),o=Math.round(Math.max(i,t)),e=Math.hypot(Q.x-C.x,Q.y-C.y),n=Math.hypot(B.x-E.x,B.y-E.y),a=Math.round(Math.max(e,n));A.canvas.width=o,A.canvas.height=a;const s=function(A,I){const g=function(A,I){const g=A.length,B=A[0].length,Q=A.map(A=>A.slice()),C=I.slice();for(let i=0;i<B;i++){let A=i;for(let I=i+1;I<g;I++)Math.abs(Q[I][i])>Math.abs(Q[A][i])&&(A=I);[Q[i],Q[A]]=[Q[A],Q[i]],[C[i],C[A]]=[C[A],C[i]];for(let I=i+1;I<g;I++){const A=Q[I][i]/Q[i][i];for(let g=i;g<B;g++)Q[I][g]-=A*Q[i][g];C[I]-=A*C[i]}}const E=new Array(B);for(let i=B-1;i>=0;i--){let A=C[i];for(let I=i+1;I<B;I++)A-=Q[i][I]*E[I];E[i]=A/Q[i][i]}return E}(function(A){const g=[];for(let B=0;B<4;B++){const[Q,C]=A[B];g.push([Q,C,1,0,0,0,-Q*I[B][0],-C*I[B][0]]),g.push([0,0,0,Q,C,1,-Q*I[B][1],-C*I[B][1]])}return g}(A),[I[0][0],I[0][1],I[1][0],I[1][1],I[2][0],I[2][1],I[3][0],I[3][1]]);return[[g[0],g[1],g[2]],[g[3],g[4],g[5]],[g[6],g[7],1]]}([[B.x,B.y],[Q.x,Q.y],[C.x,C.y],[E.x,E.y]],[[0,0],[o-1,0],[o-1,a-1],[0,a-1]]);!function(A,I,g,B,Q){const C=I&&"number"==typeof I.width&&"number"==typeof I.height&&I.data,E=I.width||I.naturalWidth,i=I.height||I.naturalHeight,t=document.createElement("canvas");t.width=E,t.height=i;const o=t.getContext("2d",{willReadFrequently:!0});C?o.putImageData(I,0,0):o.drawImage(I,0,0,E,i);const e=o.getImageData(0,0,E,i).data,n=function(A){const I=A[0][0],g=A[0][1],B=A[0][2],Q=A[1][0],C=A[1][1],E=A[1][2],i=A[2][0],t=A[2][1],o=A[2][2],e=C*o-E*t,n=-(Q*o-E*i),a=Q*t-C*i,s=-(g*o-B*t),r=I*o-B*i,c=-(I*t-g*i),h=g*E-B*C,y=-(I*E-B*Q),l=I*C-g*Q,D=I*e+g*n+B*a;if(0===D)throw new Error("Singular matrix");return[[e/D,s/D,h/D],[n/D,r/D,y/D],[a/D,c/D,l/D]]}(g),a=n[0][0],s=n[0][1],r=n[0][2],c=n[1][0],h=n[1][1],y=n[1][2],l=n[2][0],D=n[2][1],w=n[2][2],f=A.createImageData(B,Q),d=f.data,u=E-1,R=i-1;for(let m=0;m<Q;m++){const A=s*m+r,I=h*m+y,g=D*m+w;for(let Q=0;Q<B;Q++){const C=1/(l*Q+g),i=(a*Q+A)*C,t=(c*Q+I)*C,o=i<0?0:i>u?u:i,n=t<0?0:t>R?R:t,s=0|o,r=0|n,h=s<u?s+1:s,y=r<R?r+1:r,D=o-s,w=n-r,f=1-D,N=1-w,F=f*N,G=D*N,J=f*w,S=D*w,k=r*E+s<<2,M=r*E+h<<2,p=y*E+s<<2,L=y*E+h<<2,U=m*B+Q<<2;d[U]=e[k]*F+e[M]*G+e[p]*J+e[L]*S+.5|0,d[U+1]=e[k+1]*F+e[M+1]*G+e[p+1]*J+e[L+1]*S+.5|0,d[U+2]=e[k+2]*F+e[M+2]*G+e[p+2]*J+e[L+2]*S+.5|0,d[U+3]=255}}A.putImageData(f,0,0)}(A,I,s,o,a)}async function Z(A,I,g={}){const B=g.output||"canvas";if(!(I&&I.topLeft&&I.topRight&&I.bottomRight&&I.bottomLeft))return{output:null,corners:null,success:!1,message:"Invalid corner points provided"};try{const g=document.createElement("canvas");let Q;return X(g.getContext("2d"),A,I),Q="canvas"===B?g:"imagedata"===B?g.getContext("2d").getImageData(0,0,g.width,g.height):"dataurl"===B?g.toDataURL():g,{output:Q,corners:I,success:!0,message:"Document extracted successfully"}}catch(Q){return{output:null,corners:I,success:!1,message:`Extraction failed: ${Q.message}`}}}async function V(A,I={}){const g=[],B=performance.now(),Q=I.mode||"detect",C=I.output||"canvas";I.debug;const E=I.maxProcessingDimension||800;let i=performance.now();const{grayscaleData:t,imageData:o,scaleFactor:e,originalDimensions:n,scaledDimensions:a}=await async function(A,I=800){let g,B;const Q=A&&"number"==typeof A.width&&"number"==typeof A.height&&A.data;if(Q)g=A.width,B=A.height;else{if(!A)throw new Error("No image provided");g=A.width||A.naturalWidth,B=A.height||A.naturalHeight}const C=Math.max(g,B);let E,i,t;if(C<=I)E=g,i=B,t=1;else{const A=I/C;E=Math.round(g*A),i=Math.round(B*A),t=1/A}const o="undefined"!=typeof OffscreenCanvas,e=o?new OffscreenCanvas(E,i):document.createElement("canvas");o||(e.width=E,e.height=i);const n=e.getContext("2d",{willReadFrequently:!0});if(n.imageSmoothingEnabled=!0,n.imageSmoothingQuality="medium",Q){const I=o?new OffscreenCanvas(g,B):document.createElement("canvas");o||(I.width=g,I.height=B),I.getContext("2d").putImageData(A,0,0),n.drawImage(I,0,0,g,B,0,0,E,i)}else n.drawImage(A,0,0,g,B,0,0,E,i);const a=n.getImageData(0,0,E,i),s=a.data,r=new Uint8ClampedArray(E*i);for(let c=0,h=0;c<s.length;c+=4,h++){const A=54*s[c]+183*s[c+1]+19*s[c+2]>>8;r[h]=A,s[c]=s[c+1]=s[c+2]=A}return{grayscaleData:r,imageData:a,scaleFactor:t,originalDimensions:{width:g,height:B},scaledDimensions:{width:E,height:i}}}(A,E);g.push({step:"Image Prep + Scale + Gray",ms:(performance.now()-i).toFixed(2)});const s=await P(t,a.width,a.height,e,I);if(s.timings&&s.timings.forEach(A=>g.push(A)),!s.success){const A=performance.now();return g.unshift({step:"Total",ms:(A-B).toFixed(2)}),{output:null,corners:null,contour:null,confidence:s.confidence||null,debug:s.debug,success:!1,message:s.message||"No document detected",timings:g}}let r,c;if("detect"===Q)c=null;else if("extract"===Q){i=performance.now(),r=document.createElement("canvas");X(r.getContext("2d"),A,s.corners),g.push({step:"Perspective Transform",ms:(performance.now()-i).toFixed(2)})}"detect"!==Q&&r&&(i=performance.now(),c="canvas"===C?r:"imagedata"===C?r.getContext("2d").getImageData(0,0,r.width,r.height):"dataurl"===C?r.toDataURL():r,g.push({step:"Output Conversion",ms:(performance.now()-i).toFixed(2)}));const h=performance.now();return g.unshift({step:"Total",ms:(h-B).toFixed(2)}),{output:c,corners:s.corners,contour:s.contour,confidence:s.confidence||null,debug:s.debug,success:!0,message:"Document detected",timings:g}}A.Scanner=class{constructor(A={}){this.defaultOptions={maxProcessingDimension:800,mode:"detect",output:"canvas",...A},this.initialized=!1}async initialize(){this.initialized||(await S(),this.initialized=!0)}async scan(A,I={}){this.initialized||await this.initialize();const g={...this.defaultOptions,...I};return await V(A,g)}async extract(A,I,g={}){this.initialized||await this.initialize();const B={...this.defaultOptions,...g};return await Z(A,I,B)}},A.createCornerEditor=function(A={}){var I,g,B,Q,C,E,i,t,o,e;const n=A.container;if(!n||"function"!=typeof n.appendChild)throw new Error("createCornerEditor requires a valid container element");const{canvas:a,width:s,height:r}=function(A){if(!A)throw new Error("No image provided");const I=A&&"number"==typeof A.width&&"number"==typeof A.height&&A.data;let g=0,B=0;if(I?(g=A.width,B=A.height):(g=A.width||A.naturalWidth,B=A.height||A.naturalHeight),!g||!B)throw new Error("Image must be loaded before creating the corner editor");const Q=document.createElement("canvas");Q.width=g,Q.height=B;const C=Q.getContext("2d",{willReadFrequently:!0});if(!C)throw new Error("Failed to create 2D canvas context for source image");return I?C.putImageData(A,0,0):C.drawImage(A,0,0,g,B),{canvas:Q,width:g,height:B}}(A.image),c=document.createElement("canvas");c.style.position="absolute",c.style.top="0",c.style.left="0",c.style.display="block",c.style.boxSizing="border-box",c.style.touchAction="none",c.style.userSelect="none",c.style.webkitUserSelect="none",c.style.cursor="crosshair",c.style.outline="none";const h=!1!==A.keyboard;h&&(c.tabIndex=0,c.setAttribute("role","application"),c.setAttribute("aria-label","Document corner editor. Use arrow keys to adjust the selected corner."));const y={position:n.style.position,minHeight:n.style.minHeight};let l=!1,D=!1;"static"===getComputedStyle(n).position&&(n.style.position="relative",l=!0),n.appendChild(c);const w=c.getContext("2d");if(!w)throw new Error("Failed to create 2D canvas context for corner editor");const f={enabled:!1!==(null==(I=A.magnifier)?void 0:I.enabled),size:(null==(g=A.magnifier)?void 0:g.size)||110,zoom:(null==(B=A.magnifier)?void 0:B.zoom)||2,margin:(null==(Q=A.magnifier)?void 0:Q.margin)||16,borderColor:(null==(C=A.magnifier)?void 0:C.borderColor)||"#ffffff",borderWidth:(null==(E=A.magnifier)?void 0:E.borderWidth)||2,crosshairColor:(null==(i=A.magnifier)?void 0:i.crosshairColor)||"#ffffff",crosshairSize:(null==(t=A.magnifier)?void 0:t.crosshairSize)||18},d={enabled:!!(null==(o=A.nudges)?void 0:o.enabled),steps:((null==(e=A.nudges)?void 0:e.steps)&&A.nudges.steps.length?A.nudges.steps:[1,5]).map(A=>Math.max(1,Math.round(A)))},u=function(A,I,g=.08){const B=Math.max(8,Math.min(A,I)*g);return{topLeft:{x:B,y:B},topRight:{x:A-B,y:B},bottomRight:{x:A-B,y:I-B},bottomLeft:{x:B,y:I-B}}}(s,r),R=A.corners?L(A.corners):u;let m=b(R)&&H(R)?R:u;const N=L(m);let F=!1,G=null,J=null,S=null;const k=Math.max(24,A.handleHitArea||48),M=Math.max(8,Math.min(16,.3*k)),p=["topLeft","topRight","bottomRight","bottomLeft"];let U={scale:1,offsetX:0,offsetY:0,width:1,height:1},Y=null,q="topLeft";const v="undefined"!=typeof window?window:globalThis;function K(){"function"==typeof A.onChange&&A.onChange(L(m))}let T=0,W=0;function P(){const A=Math.max(1,Math.round(n.clientWidth));let I=Math.round(n.clientHeight);if(I<80){const g=r/Math.max(1,s),B=.7*(v.innerHeight||800);I=Math.max(240,Math.round(Math.min(A*g,B))),n.style.minHeight=I+"px",D=!0}return{width:A,height:Math.max(1,I)}}function X(){const{width:A,height:I}=P(),g=v.devicePixelRatio||1;T=A,W=I,c.style.width=A+"px",c.style.height=I+"px";const B=Math.round(A*g),Q=Math.round(I*g);c.width!==B&&(c.width=B),c.height!==Q&&(c.height=Q),w.setTransform(g,0,0,g,0,0);const C=Math.max(1,A-24),E=Math.max(1,I-24),i=Math.min(C/s,E/r),t=s*i,o=r*i;U={scale:i,offsetX:Math.round((A-t)/2),offsetY:Math.round((I-o)/2),width:A,height:I}}function Z(A){return{x:U.offsetX+A.x*U.scale,y:U.offsetY+A.y*U.scale}}function V(A){return b(A)&&H(A)}function j(A){const I=c.getBoundingClientRect();return{x:A.clientX-I.left,y:A.clientY-I.top}}function O(A,I){let g=null,B=1/0;for(const Q of p){const C=Z(m[Q]),E=Math.hypot(A-C.x,I-C.y);E<=k&&E<B&&(B=E,g=Q)}return g}function z(){F||(w.clearRect(0,0,U.width,U.height),w.drawImage(a,0,0,s,r,U.offsetX,U.offsetY,s*U.scale,r*U.scale),function(){const A=p.map(A=>Z(m[A]));w.save(),w.fillStyle="rgba(15, 23, 42, 0.40)",w.beginPath(),w.rect(0,0,U.width,U.height),w.moveTo(A[0].x,A[0].y);for(let I=1;I<A.length;I++)w.lineTo(A[I].x,A[I].y);w.closePath(),w.fill("evenodd"),w.restore(),w.save(),w.strokeStyle="#22c55e",w.lineWidth=3,w.beginPath(),w.moveTo(A[0].x,A[0].y);for(let I=1;I<A.length;I++)w.lineTo(A[I].x,A[I].y);w.closePath(),w.stroke(),w.restore();for(const I of p){const A=Z(m[I]),g=I===G;x(w,A,g?M+1:M,g?"#f59e0b":"#ffffff",g?"#7c2d12":"#0f172a",2)}}(),function(){if(!f.enabled||!G||!S)return;const A=m[G],I=f.size,g=I/2,B=Math.max(1.1,f.zoom);let Q=S.x+g+f.margin,C=S.y-g-f.margin;Q+g>U.width&&(Q=S.x-g-f.margin),C-g<0&&(C=S.y+g+f.margin),Q=Math.max(g+2,Math.min(U.width-g-2,Q)),C=Math.max(g+2,Math.min(U.height-g-2,C));const E=I/B,i=Math.max(0,Math.min(s-E,A.x-E/2)),t=Math.max(0,Math.min(r-E,A.y-E/2));w.save(),w.beginPath(),w.arc(Q,C,g,0,2*Math.PI),w.clip(),w.drawImage(a,i,t,E,E,Q-g,C-g,I,I),w.restore(),w.save(),w.beginPath(),w.arc(Q,C,g,0,2*Math.PI),w.lineWidth=f.borderWidth,w.strokeStyle=f.borderColor,w.stroke();const o=f.crosshairSize/2;w.strokeStyle=f.crosshairColor,w.lineWidth=1.5,w.beginPath(),w.moveTo(Q-o,C),w.lineTo(Q+o,C),w.moveTo(Q,C-o),w.lineTo(Q,C+o),w.stroke(),w.restore()}())}const _="function"==typeof v.requestAnimationFrame?v.requestAnimationFrame.bind(v):null,$="function"==typeof v.cancelAnimationFrame?v.cancelAnimationFrame.bind(v):null;let AA=null;function IA(){F||(_?null===AA&&(AA=_(()=>{AA=null,z()})):z())}function gA(A,I){const g=L(m);return g[A]={x:Math.max(0,Math.min(s,I.x)),y:Math.max(0,Math.min(r,I.y))},!!V(g)&&(m=g,q=A,K(),IA(),!0)}function BA(A){if(F)return;const I=j(A),g=O(I.x,I.y);if(g){if("function"==typeof A.preventDefault&&A.preventDefault(),G=g,q=g,J=A.pointerId,S=I,c.style.cursor="grabbing",h&&"function"==typeof c.focus)try{c.focus({preventScroll:!0})}catch(B){c.focus()}c.setPointerCapture&&void 0!==J&&c.setPointerCapture(J),IA()}}function QA(A){if(F)return;const I=j(A);if(!G)return void(c.style.cursor=O(I.x,I.y)?"grab":"crosshair");if(null!==J&&A.pointerId!==J)return;S=I;const g=function(A,I){const g=(A-U.offsetX)/U.scale,B=(I-U.offsetY)/U.scale;return{x:Math.max(0,Math.min(s,g)),y:Math.max(0,Math.min(r,B))}}(I.x,I.y);gA(G,g)}function CA(A){if(G&&(null===J||A.pointerId===J)){if(c.releasePointerCapture&&null!=J)try{c.releasePointerCapture(J)}catch(I){}G=null,J=null,S=null,c.style.cursor="crosshair",IA()}}function EA(A){if(F||!h)return;if("Enter"===A.key)return A.preventDefault(),void aA();if("Escape"===A.key)return A.preventDefault(),void sA();let I=0,g=0;if("ArrowLeft"===A.key)I=-1;else if("ArrowRight"===A.key)I=1;else if("ArrowUp"===A.key)g=-1;else{if("ArrowDown"!==A.key)return;g=1}A.preventDefault();const B=A.shiftKey?d.steps[d.steps.length-1]||10:1,Q=m[q];gA(q,{x:Q.x+I*B,y:Q.y+g*B})}function iA(A){BA({clientX:A.clientX,clientY:A.clientY,pointerId:1})}function tA(A){QA({clientX:A.clientX,clientY:A.clientY,pointerId:1})}function oA(A){const I=A.touches[0];if(!I)return;const g=j(I);O(g.x,g.y)&&A.preventDefault(),BA({clientX:I.clientX,clientY:I.clientY,pointerId:2})}function eA(A){const I=A.touches[0];I&&(A.preventDefault(),QA({clientX:I.clientX,clientY:I.clientY,pointerId:2}))}let nA=null;function aA(){const I=L(m);return"function"==typeof A.onConfirm&&A.onConfirm(I),I}function sA(){"function"==typeof A.onCancel&&A.onCancel()}const rA="undefined"!=typeof ResizeObserver?new ResizeObserver(()=>{if(F)return;const A=P();A.width===T&&A.height===W||(X(),IA())}):null;return X(),function(){if(!d.enabled)return;Y=document.createElement("div"),Y.style.position="absolute",Y.style.right="8px",Y.style.bottom="8px",Y.style.background="rgba(15, 23, 42, 0.9)",Y.style.border="1px solid rgba(148, 163, 184, 0.5)",Y.style.borderRadius="10px",Y.style.padding="8px",Y.style.display="grid",Y.style.gridTemplateColumns="repeat(4, auto)",Y.style.gap="6px",Y.style.zIndex="2";const A=(A,I,g,B,Q)=>{const C=document.createElement("button");return C.type="button",C.textContent=A+(Q>1?" "+Q:""),C.setAttribute("aria-label",I),C.style.border="1px solid #475569",C.style.background="#0f172a",C.style.color="#e2e8f0",C.style.borderRadius="6px",C.style.padding="4px 8px",C.style.fontSize="13px",C.style.lineHeight="1",C.style.cursor="pointer",C.addEventListener("click",()=>{const A=m[q];gA(q,{x:A.x+g*Q,y:A.y+B*Q})}),C};for(const I of d.steps)Y.appendChild(A("←",`Move left ${I}px`,-1,0,I)),Y.appendChild(A("→",`Move right ${I}px`,1,0,I)),Y.appendChild(A("↑",`Move up ${I}px`,0,-1,I)),Y.appendChild(A("↓",`Move down ${I}px`,0,1,I));n.appendChild(Y)}(),void 0!==v.PointerEvent?(c.addEventListener("pointerdown",BA),c.addEventListener("pointermove",QA),c.addEventListener("pointerup",CA),c.addEventListener("pointercancel",CA)):(c.addEventListener("mousedown",iA),"function"==typeof v.addEventListener&&(v.addEventListener("mousemove",tA),v.addEventListener("mouseup",CA)),c.addEventListener("touchstart",oA,{passive:!1}),c.addEventListener("touchmove",eA,{passive:!1}),c.addEventListener("touchend",CA),c.addEventListener("touchcancel",CA)),h&&c.addEventListener("keydown",EA),function A(){if("function"!=typeof v.matchMedia)return;nA&&nA();const I=v.devicePixelRatio||1,g=v.matchMedia(`(resolution: ${I}dppx)`),B=()=>{F||(X(),IA(),A())};"function"==typeof g.addEventListener?(g.addEventListener("change",B),nA=()=>g.removeEventListener("change",B)):"function"==typeof g.addListener?(g.addListener(B),nA=()=>g.removeListener(B)):nA=null}(),rA&&rA.observe(n),z(),{getCorners:()=>L(m),setCorners:A=>!(!A||!V(A))&&(m=L(A),K(),IA(),!0),reset(){m=L(N),K(),IA()},nudge:(A,I,g,B=1)=>!!p.includes(A)&&gA(A,{x:m[A].x+I*B,y:m[A].y+g*B}),confirm:()=>aA(),cancel(){sA()},destroy(){F||(F=!0,null!==AA&&$&&($(AA),AA=null),nA&&(nA(),nA=null),rA&&rA.disconnect(),c.removeEventListener("pointerdown",BA),c.removeEventListener("pointermove",QA),c.removeEventListener("pointerup",CA),c.removeEventListener("pointercancel",CA),c.removeEventListener("mousedown",iA),"function"==typeof v.removeEventListener&&(v.removeEventListener("mousemove",tA),v.removeEventListener("mouseup",CA)),c.removeEventListener("touchstart",oA),c.removeEventListener("touchmove",eA),c.removeEventListener("touchend",CA),c.removeEventListener("touchcancel",CA),c.removeEventListener("keydown",EA),Y&&Y.parentNode&&Y.parentNode.removeChild(Y),c.parentNode&&c.parentNode.removeChild(c),l&&(n.style.position=y.position),D&&(n.style.minHeight=y.minHeight))}}},A.extractDocument=Z,A.initialize=async function(){return await S()},A.scanDocument=V,Object.defineProperty(A,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "scanic",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "Modern document scanner in pure JavaScript and Wasm",
5
5
  "type": "module",
6
+ "sideEffects": false,
7
+ "engines": {
8
+ "node": ">=20"
9
+ },
6
10
  "main": "dist/scanic.umd.cjs",
7
11
  "module": "dist/scanic.js",
8
12
  "types": "src/scanic.d.ts",
package/src/scanic.d.ts CHANGED
@@ -10,6 +10,57 @@ export interface CornerPoints {
10
10
  bottomLeft: Point;
11
11
  }
12
12
 
13
+ export interface CornerEditorMagnifierOptions {
14
+ enabled?: boolean;
15
+ size?: number;
16
+ zoom?: number;
17
+ margin?: number;
18
+ borderColor?: string;
19
+ borderWidth?: number;
20
+ crosshairColor?: string;
21
+ crosshairSize?: number;
22
+ }
23
+
24
+ export interface CornerEditorNudgesOptions {
25
+ enabled?: boolean;
26
+ steps?: number[];
27
+ }
28
+
29
+ export interface CornerEditorOptions {
30
+ /** Host element the editor canvas is mounted into. */
31
+ container: HTMLElement;
32
+ /** Source image to adjust corners against. */
33
+ image: HTMLImageElement | HTMLCanvasElement | ImageData;
34
+ /** Initial corner positions (image-space pixels). Defaults to an inset quad. */
35
+ corners?: CornerPoints;
36
+ magnifier?: CornerEditorMagnifierOptions;
37
+ nudges?: CornerEditorNudgesOptions;
38
+ /** Touch/click target radius (px) around each handle. Default 48. */
39
+ handleHitArea?: number;
40
+ /**
41
+ * Enable keyboard control of the focused canvas (default true):
42
+ * arrow keys nudge the active corner (Shift = coarse step),
43
+ * Enter confirms, Escape cancels.
44
+ */
45
+ keyboard?: boolean;
46
+ /** Fired on every corner change (drag, nudge, keyboard). */
47
+ onChange?: (corners: CornerPoints) => void;
48
+ /** Fired by confirm()/Enter with the final corners. */
49
+ onConfirm?: (corners: CornerPoints) => void;
50
+ /** Fired by cancel()/Escape. */
51
+ onCancel?: () => void;
52
+ }
53
+
54
+ export interface CornerEditor {
55
+ getCorners(): CornerPoints;
56
+ setCorners(corners: CornerPoints): boolean;
57
+ reset(): void;
58
+ nudge(cornerKey: keyof CornerPoints, dx: number, dy: number, step?: number): boolean;
59
+ confirm(): CornerPoints;
60
+ cancel(): void;
61
+ destroy(): void;
62
+ }
63
+
13
64
  export interface DetectionOptions {
14
65
  mode?: 'detect' | 'extract';
15
66
  output?: 'canvas' | 'imagedata' | 'dataurl';
@@ -82,3 +133,8 @@ export class Scanner {
82
133
  options?: DetectionOptions
83
134
  ): Promise<ScannerResult>;
84
135
  }
136
+
137
+ /**
138
+ * Create a manual corner adjustment editor.
139
+ */
140
+ export function createCornerEditor(options: CornerEditorOptions): CornerEditor;