diff --git a/package-lock.json b/package-lock.json index 5217659..de4bc46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@mmote/niimbluelib": "0.0.1-alpha.38", "@popperjs/core": "^2.11.8", "bootstrap": "5.3.8", + "bwip-js": "4.9.0", "d3-dsv": "^3.0.1", "dayjs": "^1.11.19", "fabric": "^7.1.0", @@ -30,6 +31,7 @@ "@sveltejs/vite-plugin-svelte": "^6.2.1", "@tsconfig/svelte": "^5.0.5", "@types/bootstrap": "^5.2.10", + "@types/bwip-js": "3.2.3", "@types/d3-dsv": "^3.0.7", "@types/node": "^24.10.0", "@types/qrcode-svg": "^1.1.5", @@ -76,6 +78,7 @@ "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.4.5.tgz", "integrity": "sha512-JnUywi0WRbqm4QYoplNsMQ7KAVuyrQFha0dOH9YDVCyrVHUvPcvrnK+9j5elUMgy+pOh3ve+pk6BVoySr91c+A==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -179,45 +182,70 @@ "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "cpu": [ + "ppc64" ], + "dev": true, "license": "MIT", "optional": true, + "os": [ + "aix" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } + "node_modules/@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "cpu": [ + "x64" ], + "dev": true, "license": "MIT", "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" } @@ -237,6 +265,346 @@ "node": ">=18" } }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -285,7 +653,6 @@ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", @@ -301,7 +668,6 @@ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@eslint/core": "^0.17.0" }, @@ -315,7 +681,6 @@ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -329,7 +694,6 @@ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -354,7 +718,6 @@ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -381,7 +744,6 @@ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -392,7 +754,6 @@ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -423,7 +784,6 @@ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18.0" } @@ -434,7 +794,6 @@ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" @@ -449,7 +808,6 @@ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=12.22" }, @@ -464,7 +822,6 @@ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18" }, @@ -821,6 +1178,7 @@ "node_modules/@popperjs/core": { "version": "2.11.8", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -1192,6 +1550,7 @@ "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", @@ -1240,6 +1599,16 @@ "@popperjs/core": "^2.9.2" } }, + "node_modules/@types/bwip-js": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@types/bwip-js/-/bwip-js-3.2.3.tgz", + "integrity": "sha512-kgL1GOW7n5FhlC5aXnckaEim0rz1cFM4t9/xUwuNXCIDnWLx8ruQ4JQkG6znq4GQFovNLhQy5JdgbDwJw4D/zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/d3-dsv": { "version": "3.0.7", "dev": true, @@ -1257,8 +1626,7 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/node": { "version": "24.10.0", @@ -1339,6 +1707,7 @@ "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", @@ -1557,6 +1926,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1590,7 +1960,6 @@ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1608,7 +1977,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1638,8 +2006,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.1", @@ -1711,7 +2078,6 @@ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1730,32 +2096,31 @@ "node": ">=8" } }, + "node_modules/bwip-js": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/bwip-js/-/bwip-js-4.9.0.tgz", + "integrity": "sha512-U3aWIxR/Px4m3GPd0opQ5GQJq/G8Cj0cr5z5hrcvy/SAApPnfkLqBqjRuB3GiEAasEQup3m7k/MDM/uiS9te8Q==", + "license": "MIT", + "bin": { + "bwip-js": "bin/bwip-js.js" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } }, - "node_modules/canvas": { - "name": "uninstall", - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/uninstall/-/uninstall-0.0.0.tgz", - "integrity": "sha512-pjP/0+A4gsbDVa8XH/S2GZdT9NPJW8NFMy3GI7HnsWG+NAmFSSj3QidNosXBI9cPtxxNExEDdhKFO6sli8K3mA==", - "license": "MIT", - "optional": true - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1799,7 +2164,6 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1812,8 +2176,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/commander": { "version": "7.2.0", @@ -1827,8 +2190,7 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/crc-32": { "version": "1.2.2", @@ -1846,7 +2208,6 @@ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1956,8 +2317,7 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -2032,7 +2392,6 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -2196,7 +2555,6 @@ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -2265,8 +2623,7 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", @@ -2303,16 +2660,14 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", @@ -2330,7 +2685,6 @@ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -2357,7 +2711,6 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2375,7 +2728,6 @@ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -2389,8 +2741,7 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -2410,7 +2761,6 @@ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -2444,7 +2794,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -2506,7 +2855,6 @@ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -2524,7 +2872,6 @@ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2542,7 +2889,6 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } @@ -2615,8 +2961,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/js-yaml": { "version": "4.1.1", @@ -2624,7 +2969,6 @@ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -2677,24 +3021,21 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", @@ -2702,7 +3043,6 @@ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -2720,7 +3060,6 @@ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2750,7 +3089,6 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -2766,8 +3104,7 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lru-cache": { "version": "10.4.3", @@ -2818,7 +3155,6 @@ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2895,7 +3231,6 @@ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -2914,7 +3249,6 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -2931,7 +3265,6 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -2948,7 +3281,6 @@ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -2975,7 +3307,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -2986,7 +3317,6 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -3044,6 +3374,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -3167,7 +3498,6 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8.0" } @@ -3178,6 +3508,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -3252,7 +3583,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -3464,7 +3794,6 @@ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3478,7 +3807,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -3497,7 +3825,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -3511,7 +3838,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -3525,6 +3851,7 @@ "integrity": "sha512-uxck1KI7JWtlfP3H6HOWi/94soAl23jsGJkBzN2BAWcQng0+lTrRNhxActFqORgnO9BHVd1hKJhG+ljRuIUWfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -3589,21 +3916,6 @@ } } }, - "node_modules/svelte-check/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/svelte-eslint-parser": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.4.0.tgz", @@ -3682,6 +3994,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -3775,7 +4088,6 @@ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -3789,6 +4101,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3834,7 +4147,6 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -3852,6 +4164,7 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -3945,6 +4258,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -4039,7 +4353,6 @@ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4056,7 +4369,6 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -4100,28 +4412,12 @@ "license": "MIT", "optional": true }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 1909ee0..c929767 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@mmote/niimbluelib": "0.0.1-alpha.38", "@popperjs/core": "^2.11.8", "bootstrap": "5.3.8", + "bwip-js": "4.9.0", "d3-dsv": "^3.0.1", "dayjs": "^1.11.19", "fabric": "^7.1.0", @@ -38,6 +39,7 @@ "@sveltejs/vite-plugin-svelte": "^6.2.1", "@tsconfig/svelte": "^5.0.5", "@types/bootstrap": "^5.2.10", + "@types/bwip-js": "3.2.3", "@types/d3-dsv": "^3.0.7", "@types/node": "^24.10.0", "@types/qrcode-svg": "^1.1.5", diff --git a/src/components/LabelDesigner.svelte b/src/components/LabelDesigner.svelte index 8fc2b71..0156300 100644 --- a/src/components/LabelDesigner.svelte +++ b/src/components/LabelDesigner.svelte @@ -5,6 +5,7 @@ import { ArUcoMarker } from "$/fabric-object/aruco"; import { Barcode } from "$/fabric-object/barcode"; import { QRCode } from "$/fabric-object/qrcode"; + import { DataMatrix } from "$/fabric-object/datamatrix"; import { iconCodepoints, type MaterialIcon } from "$/styles/mdi_icons"; import { automation, connectionState, csvData, loadedFonts } from "$/stores"; import { @@ -30,6 +31,7 @@ import PrintPreview from "$/components/PrintPreview.svelte"; import ArUcoParamsPanel from "$/components/designer-controls/ArUcoParamsControls.svelte"; import QrCodeParamsPanel from "$/components/designer-controls/QRCodeParamsControls.svelte"; + import DataMatrixParamsPanel from "$/components/designer-controls/DataMatrixParamsControls.svelte"; import TextParamsControls from "$/components/designer-controls/TextParamsControls.svelte"; import VariableInsertControl from "$/components/designer-controls/VariableInsertControl.svelte"; import { DEFAULT_LABEL_PROPS, GRID_SIZE, OBJECT_DEFAULTS } from "$/defaults"; @@ -550,6 +552,10 @@ {#if selectedObject instanceof QRCode} {/if} + + {#if selectedObject instanceof DataMatrix} + + {/if} {#if selectedObject instanceof ArUcoMarker} @@ -559,7 +565,7 @@ {/if} - {#if selectedObject instanceof fabric.IText || selectedObject instanceof QRCode || (selectedObject instanceof Barcode && selectedObject.encoding === "CODE128B")} + {#if selectedObject instanceof fabric.IText || selectedObject instanceof QRCode || selectedObject instanceof DataMatrix || (selectedObject instanceof Barcode && selectedObject.encoding === "CODE128B")} {/if} diff --git a/src/components/designer-controls/DataMatrixParamsControls.svelte b/src/components/designer-controls/DataMatrixParamsControls.svelte new file mode 100644 index 0000000..ca5d7a7 --- /dev/null +++ b/src/components/designer-controls/DataMatrixParamsControls.svelte @@ -0,0 +1,31 @@ + + + + + { + selectedDataMatrix?.set("text", e.currentTarget.value); + valueUpdated(); + }}> + + diff --git a/src/components/designer-controls/ObjectPicker.svelte b/src/components/designer-controls/ObjectPicker.svelte index 9e691b8..fe073b1 100644 --- a/src/components/designer-controls/ObjectPicker.svelte +++ b/src/components/designer-controls/ObjectPicker.svelte @@ -49,6 +49,10 @@ {$tr("editor.objectpicker.qrcode")} + onSubmit("datamatrix")}> + + {$tr("editor.objectpicker.datamatrix")} + onSubmit("aruco")}> {$tr("editor.objectpicker.aruco")} diff --git a/src/components/designer-controls/ObjectPositionControls.svelte b/src/components/designer-controls/ObjectPositionControls.svelte index 9bce717..184ef71 100644 --- a/src/components/designer-controls/ObjectPositionControls.svelte +++ b/src/components/designer-controls/ObjectPositionControls.svelte @@ -6,6 +6,8 @@ import QRCode from "$/fabric-object/qrcode"; import Barcode from "$/fabric-object/barcode"; + import { DataMatrix } from "$/fabric-object/datamatrix"; + interface Props { selectedObject: fabric.FabricObject; } @@ -75,7 +77,7 @@ y - {#if !(selectedObject instanceof fabric.FabricText || selectedObject instanceof fabric.FabricImage || selectedObject instanceof QRCode || selectedObject instanceof Barcode)} + {#if !(selectedObject instanceof fabric.FabricText || selectedObject instanceof fabric.FabricImage || selectedObject instanceof QRCode || selectedObject instanceof DataMatrix || selectedObject instanceof Barcode)} x diff --git a/src/components/designer-controls/VariableInsertControl.svelte b/src/components/designer-controls/VariableInsertControl.svelte index 0a18c85..6b4e85e 100644 --- a/src/components/designer-controls/VariableInsertControl.svelte +++ b/src/components/designer-controls/VariableInsertControl.svelte @@ -2,6 +2,7 @@ import * as fabric from "fabric"; import { tr } from "$/utils/i18n"; import QRCode from "$/fabric-object/qrcode"; + import { DataMatrix } from "$/fabric-object/datamatrix"; import Barcode from "$/fabric-object/barcode"; import MdIcon from "$/components/basic/MdIcon.svelte"; @@ -21,7 +22,7 @@ if (selectedObject instanceof fabric.IText) { selectedObject.exitEditing(); selectedObject.set({ text: `${selectedObject.text}${value}` }); - } else if (selectedObject instanceof QRCode) { + } else if (selectedObject instanceof QRCode || selectedObject instanceof DataMatrix) { selectedObject.set({ text: `${selectedObject.text}${value}` }); } else if (selectedObject instanceof Barcode) { selectedObject.set({ text: `${selectedObject.text}${value}` }); diff --git a/src/fabric-object/datamatrix.ts b/src/fabric-object/datamatrix.ts new file mode 100644 index 0000000..33632dc --- /dev/null +++ b/src/fabric-object/datamatrix.ts @@ -0,0 +1,128 @@ +import bwipjs from "bwip-js"; +import * as fabric from "fabric"; +import { OBJECT_SIZE_DEFAULTS } from "$/defaults"; +import { CanvasUtils } from "$/utils/canvas_utils"; + +export const dataMatrixDefaultValues: Partial> = { + text: "Text", + stroke: "#000000", + fill: "#ffffff", + ...OBJECT_SIZE_DEFAULTS, +}; + +interface UniqueDataMatrixProps { + text: string; +} +export interface DataMatrixProps extends fabric.FabricObjectProps, UniqueDataMatrixProps {} +export interface SerializedDataMatrixProps extends fabric.SerializedObjectProps, UniqueDataMatrixProps {} +const DATAMATRIX_PROPS = ["text", "size"] as const; + +export class DataMatrix< + Props extends fabric.TOptions = Partial, + SProps extends SerializedDataMatrixProps = SerializedDataMatrixProps, + EventSpec extends fabric.ObjectEvents = fabric.ObjectEvents, + > + extends fabric.FabricObject + implements DataMatrixProps +{ + static override readonly type = "DataMatrix"; + + /** + * DataMatrix text + */ + declare text: string; + + constructor(options?: Props) { + super(); + Object.assign(this, dataMatrixDefaultValues); + this.setOptions(options); + this.lockScalingFlip = true; + this.setControlsVisibility({ + ml: false, + mt: false, + mr: false, + mb: false, + tl: false, + tr: false, + bl: false, + }); + } + + override _set(key: string, value: any): this { + super._set(key, value); + if (key === "text") { + this.dirty = true; + } + + return this; + } + + override _render(ctx: CanvasRenderingContext2D): void { + if (!this.text) { + CanvasUtils.renderError(ctx, this.width, this.height); + super._render(ctx); + return; + } + + let dmData: any; + + try { + const res = bwipjs.raw({ bcid: "datamatrix", text: this.text }); + dmData = res?.[0]; + if (!dmData || !('pixs' in dmData)) throw new Error("Invalid bwip-js output"); + } catch (e) { + console.error(e); + CanvasUtils.renderError(ctx, this.width, this.height); + super._render(ctx); + return; + } + + const { pixs, pixx, pixy } = dmData; + + // Choose scaling factor to map modules to canvas size + const dmScaleX = Math.floor(this.width / pixx); + const dmScaleY = Math.floor(this.height / pixy); + const dmScale = Math.min(dmScaleX, dmScaleY); + + let dmWidth = dmScale * pixx; + let dmHeight = dmScale * pixy; + dmWidth -= dmWidth % 2; // avoid half-pixel rendering + dmHeight -= dmHeight % 2; + + if (dmScale < 1 || dmWidth > this.width || dmHeight > this.height) { + CanvasUtils.renderError(ctx, this.width, this.height); + super._render(ctx); + return; + } + + ctx.save(); + + const offsetX = -dmWidth / 2; + const offsetY = -dmHeight / 2; + ctx.translate(offsetX, offsetY); // center + ctx.translate(-0.5, -0.5); // blurry rendering fix + + ctx.fillStyle = this.fill as string; + ctx.fillRect(0, 0, dmWidth, dmHeight); + + ctx.fillStyle = "#000000"; + + for (let y = 0; y < pixy; y++) { + for (let x = 0; x < pixx; x++) { + if (pixs[y * pixx + x]) { + ctx.fillRect(x * dmScale, y * dmScale, dmScale, dmScale); + } + } + } + + ctx.restore(); + + super._render(ctx); + } + + override toObject(propertiesToInclude: any[] = []) { + return super.toObject([...DATAMATRIX_PROPS, ...propertiesToInclude]); + } +} + +fabric.classRegistry.setClass(DataMatrix, "DataMatrix"); diff --git a/src/locale/dicts/ar.json b/src/locale/dicts/ar.json index d0c5853..414982a 100644 --- a/src/locale/dicts/ar.json +++ b/src/locale/dicts/ar.json @@ -20,6 +20,7 @@ "editor.objectpicker.image": "صورة", "editor.objectpicker.line": "خط", "editor.objectpicker.qrcode": "QR Code", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "مستطيل", "editor.objectpicker.text": "نص", "editor.objectpicker.title": "أضف عنصر", diff --git a/src/locale/dicts/bg.json b/src/locale/dicts/bg.json index d767ecd..c24a942 100644 --- a/src/locale/dicts/bg.json +++ b/src/locale/dicts/bg.json @@ -30,6 +30,7 @@ "editor.objectpicker.image": "Изображение", "editor.objectpicker.line": "Ред", "editor.objectpicker.qrcode": "Код на QR", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Правоъгълник", "editor.objectpicker.text": "Текст", "editor.objectpicker.title": "Добавяне на обект", diff --git a/src/locale/dicts/cs.json b/src/locale/dicts/cs.json index d9c8aab..9df6206 100644 --- a/src/locale/dicts/cs.json +++ b/src/locale/dicts/cs.json @@ -17,6 +17,7 @@ "editor.objectpicker.image": "Obrázek", "editor.objectpicker.line": "Čára", "editor.objectpicker.qrcode": "QR Kód", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Obdélník", "editor.objectpicker.text": "Text", "editor.objectpicker.title": "Přidat objekt", diff --git a/src/locale/dicts/de.json b/src/locale/dicts/de.json index 1c35a62..7d9337a 100644 --- a/src/locale/dicts/de.json +++ b/src/locale/dicts/de.json @@ -17,6 +17,7 @@ "editor.objectpicker.image": "Grafik", "editor.objectpicker.line": "Linie", "editor.objectpicker.qrcode": "QR-Code", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Rechteck", "editor.objectpicker.text": "Text", "editor.objectpicker.title": "Objekt hinzufügen", diff --git a/src/locale/dicts/en.json b/src/locale/dicts/en.json index 0e14104..9071bf7 100644 --- a/src/locale/dicts/en.json +++ b/src/locale/dicts/en.json @@ -32,6 +32,7 @@ "editor.objectpicker.image": "Image", "editor.objectpicker.line": "Line", "editor.objectpicker.qrcode": "QR Code", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Rectangle", "editor.objectpicker.text": "Text", "editor.objectpicker.title": "Add object", diff --git a/src/locale/dicts/es.json b/src/locale/dicts/es.json index 57ad7d9..308027d 100644 --- a/src/locale/dicts/es.json +++ b/src/locale/dicts/es.json @@ -20,6 +20,7 @@ "editor.objectpicker.image": "Imagen", "editor.objectpicker.line": "Línea", "editor.objectpicker.qrcode": "Código QR", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Rectángulo", "editor.objectpicker.text": "Texto", "editor.objectpicker.title": "Añadir objeto", diff --git a/src/locale/dicts/fr.json b/src/locale/dicts/fr.json index c5eb139..f50d583 100644 --- a/src/locale/dicts/fr.json +++ b/src/locale/dicts/fr.json @@ -19,6 +19,7 @@ "editor.objectpicker.image": "Image", "editor.objectpicker.line": "Ligne", "editor.objectpicker.qrcode": "QR Code", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Rectangle", "editor.objectpicker.text": "Texte", "editor.objectpicker.title": "Ajouter un objet", diff --git a/src/locale/dicts/hi.json b/src/locale/dicts/hi.json index d19e360..b02620b 100644 --- a/src/locale/dicts/hi.json +++ b/src/locale/dicts/hi.json @@ -27,6 +27,7 @@ "editor.objectpicker.image": "इमेज", "editor.objectpicker.line": "लाइन", "editor.objectpicker.qrcode": "क्यूआर कोड", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "आयत (Rectangle)", "editor.objectpicker.text": "टेक्स्ट", "editor.objectpicker.title": "ऑब्जेक्ट जोड़ें", diff --git a/src/locale/dicts/hr.json b/src/locale/dicts/hr.json index a590240..8bb88a3 100644 --- a/src/locale/dicts/hr.json +++ b/src/locale/dicts/hr.json @@ -18,6 +18,7 @@ "editor.objectpicker.image": "Slika", "editor.objectpicker.line": "Linija", "editor.objectpicker.qrcode": "QR kod", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Pravokutnik", "editor.objectpicker.text": "Tekst", "editor.objectpicker.title": "Dodaj objekt", diff --git a/src/locale/dicts/hu.json b/src/locale/dicts/hu.json index 0b27f49..a82970b 100644 --- a/src/locale/dicts/hu.json +++ b/src/locale/dicts/hu.json @@ -20,6 +20,7 @@ "editor.objectpicker.image": "Kép", "editor.objectpicker.line": "Vonal", "editor.objectpicker.qrcode": "QR-kód", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Négyzet", "editor.objectpicker.text": "Szöveg", "editor.objectpicker.title": "Elem beszúrása", diff --git a/src/locale/dicts/it.json b/src/locale/dicts/it.json index 7fdf6aa..2402684 100644 --- a/src/locale/dicts/it.json +++ b/src/locale/dicts/it.json @@ -17,6 +17,7 @@ "editor.objectpicker.image": "Immagine", "editor.objectpicker.line": "Linea", "editor.objectpicker.qrcode": "Codice QR", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Rettangolo", "editor.objectpicker.text": "Testo", "editor.objectpicker.title": "Aggiungi oggetto", diff --git a/src/locale/dicts/ko_KR.json b/src/locale/dicts/ko_KR.json index 0997101..e9f3b51 100644 --- a/src/locale/dicts/ko_KR.json +++ b/src/locale/dicts/ko_KR.json @@ -20,6 +20,7 @@ "editor.objectpicker.image": "이미지", "editor.objectpicker.line": "선", "editor.objectpicker.qrcode": "QR 코드", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "사각형", "editor.objectpicker.text": "텍스트", "editor.objectpicker.title": "개체 추가", diff --git a/src/locale/dicts/mr.json b/src/locale/dicts/mr.json index d3e9a64..5de2cb8 100644 --- a/src/locale/dicts/mr.json +++ b/src/locale/dicts/mr.json @@ -27,6 +27,7 @@ "editor.objectpicker.image": "प्रतिमा", "editor.objectpicker.line": "रेषा", "editor.objectpicker.qrcode": "QR कोड", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "आयत", "editor.objectpicker.text": "मजकूर", "editor.objectpicker.title": "ऑब्जेक्ट जोडा", diff --git a/src/locale/dicts/pl.json b/src/locale/dicts/pl.json index e81c62b..56e1bf6 100644 --- a/src/locale/dicts/pl.json +++ b/src/locale/dicts/pl.json @@ -17,6 +17,7 @@ "editor.objectpicker.image": "Obraz", "editor.objectpicker.line": "Linia", "editor.objectpicker.qrcode": "Kod QR", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Prostokąt", "editor.objectpicker.text": "Tekst", "editor.objectpicker.title": "Dodaj obiekt", diff --git a/src/locale/dicts/pt_BR.json b/src/locale/dicts/pt_BR.json index 47393be..5580517 100644 --- a/src/locale/dicts/pt_BR.json +++ b/src/locale/dicts/pt_BR.json @@ -19,6 +19,7 @@ "editor.objectpicker.image": "Imagem", "editor.objectpicker.line": "Linha", "editor.objectpicker.qrcode": "QR Code", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Retângulo", "editor.objectpicker.text": "Texto", "editor.objectpicker.title": "Adicionar objeto", diff --git a/src/locale/dicts/ru.json b/src/locale/dicts/ru.json index e80b943..b07338a 100644 --- a/src/locale/dicts/ru.json +++ b/src/locale/dicts/ru.json @@ -31,6 +31,7 @@ "editor.objectpicker.image": "Картинка", "editor.objectpicker.line": "Линия", "editor.objectpicker.qrcode": "QR Код", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Прямоугольник", "editor.objectpicker.text": "Текст", "editor.objectpicker.title": "Добавить объект", diff --git a/src/locale/dicts/tr.json b/src/locale/dicts/tr.json index e5cd7b6..c2fbe71 100644 --- a/src/locale/dicts/tr.json +++ b/src/locale/dicts/tr.json @@ -20,6 +20,7 @@ "editor.objectpicker.image": "Resim", "editor.objectpicker.line": "Çizgi", "editor.objectpicker.qrcode": "QR Kod", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "Dikdörtgen", "editor.objectpicker.text": "Metin", "editor.objectpicker.title": "Nesne ekle", diff --git a/src/locale/dicts/zh_cn.json b/src/locale/dicts/zh_cn.json index 3eb6a3b..16369d5 100644 --- a/src/locale/dicts/zh_cn.json +++ b/src/locale/dicts/zh_cn.json @@ -17,6 +17,7 @@ "editor.objectpicker.image": "图片", "editor.objectpicker.line": "线条", "editor.objectpicker.qrcode": "二维码", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "矩形", "editor.objectpicker.text": "文字", "editor.objectpicker.title": "添加元素", diff --git a/src/locale/dicts/zh_tw.json b/src/locale/dicts/zh_tw.json index e8a1d15..0037fc1 100644 --- a/src/locale/dicts/zh_tw.json +++ b/src/locale/dicts/zh_tw.json @@ -20,6 +20,7 @@ "editor.objectpicker.image": "圖片", "editor.objectpicker.line": "線條", "editor.objectpicker.qrcode": "QR Code", + "editor.objectpicker.datamatrix": "DataMatrix", "editor.objectpicker.rectangle": "矩形", "editor.objectpicker.text": "文字", "editor.objectpicker.title": "新增物件", diff --git a/src/types.ts b/src/types.ts index 78714b5..0359142 100644 --- a/src/types.ts +++ b/src/types.ts @@ -6,7 +6,7 @@ export type ConnectionState = "connecting" | "connected" | "disconnected"; export type ConnectionType = "bluetooth" | "serial" | "capacitor-ble"; export type LabelUnit = "mm" | "px"; -export type OjectType = "text" | "rectangle" | "line" | "circle" | "image" | "qrcode" | "barcode" | "aruco" | "pdf"; +export type OjectType = "text" | "rectangle" | "line" | "circle" | "image" | "qrcode" | "barcode" | "aruco" | "pdf" | "datamatrix"; export type PostProcessType = "threshold" | "dither" | "bayer"; export type MoveDirection = "up" | "down" | "left" | "right"; export type LabelShape = "rect" | "rounded_rect" | "circle"; diff --git a/src/utils/canvas_preprocess.ts b/src/utils/canvas_preprocess.ts index 1de9697..ad9f349 100644 --- a/src/utils/canvas_preprocess.ts +++ b/src/utils/canvas_preprocess.ts @@ -1,5 +1,6 @@ import * as fabric from "fabric"; import QRCode from "$/fabric-object/qrcode"; +import { DataMatrix } from "$/fabric-object/datamatrix"; import Barcode from "$/fabric-object/barcode"; import dayjs from "dayjs"; import { TextboxExt } from "$/fabric-object/textbox-ext"; @@ -36,7 +37,7 @@ export const canvasPreprocess = (canvas: fabric.Canvas, variables?: { [key: stri } else { obj.set({ text }); } - } else if (obj instanceof QRCode || obj instanceof Barcode) { + } else if (obj instanceof QRCode || obj instanceof Barcode || obj instanceof DataMatrix) { obj.set({ text: preprocessString(obj.text ?? "", variables) }); } }); diff --git a/src/utils/canvas_utils.ts b/src/utils/canvas_utils.ts index 3324c16..8d2d7e6 100644 --- a/src/utils/canvas_utils.ts +++ b/src/utils/canvas_utils.ts @@ -2,6 +2,7 @@ import * as fabric from "fabric"; import ArUcoMarker from "$/fabric-object/aruco"; import Barcode from "$/fabric-object/barcode"; import QRCode from "$/fabric-object/qrcode"; +import { DataMatrix } from "$/fabric-object/datamatrix"; import { OBJECT_DEFAULTS_TEXT } from "$/defaults"; export class CanvasUtils { @@ -26,7 +27,7 @@ export class CanvasUtils { } static fixFabricObjectScale(obj: fabric.FabricObject) { - const isNotScalable = obj instanceof Barcode || obj instanceof fabric.Rect || obj instanceof QRCode || obj instanceof ArUcoMarker; + const isNotScalable = obj instanceof Barcode || obj instanceof fabric.Rect || obj instanceof QRCode || obj instanceof ArUcoMarker || obj instanceof DataMatrix; if (isNotScalable) { obj.set({ @@ -38,7 +39,7 @@ export class CanvasUtils { top: Math.round(obj.top), }); - if (obj instanceof QRCode || obj instanceof ArUcoMarker) { + if (obj instanceof QRCode || obj instanceof ArUcoMarker || obj instanceof DataMatrix) { const qrMin = 42; const size = Math.max(obj.width + (obj.width % 2), qrMin); obj.set({ diff --git a/src/utils/label_designer_object_helper.ts b/src/utils/label_designer_object_helper.ts index 1ea6329..da4602e 100644 --- a/src/utils/label_designer_object_helper.ts +++ b/src/utils/label_designer_object_helper.ts @@ -3,6 +3,7 @@ import { OBJECT_DEFAULTS, OBJECT_DEFAULTS_TEXT, OBJECT_DEFAULTS_VECTOR, OBJECT_S import { ArUcoMarker } from "$/fabric-object/aruco"; import Barcode from "$/fabric-object/barcode"; import { QRCode } from "$/fabric-object/qrcode"; +import { DataMatrix } from "$/fabric-object/datamatrix"; import type { OjectType } from "$/types"; import { Toasts } from "$/utils/toasts"; import { FileUtils } from "$/utils/file_utils"; @@ -146,6 +147,16 @@ export class LabelDesignerObjectHelper { return qr; } + static addDataMatrix(canvas: fabric.Canvas): DataMatrix { + const dm = new DataMatrix({ + text: "NiimBlue", + ...OBJECT_SIZE_DEFAULTS, + ...OBJECT_DEFAULTS, + }); + canvas.add(dm); + return dm; + } + static addArUco(canvas: fabric.Canvas): ArUcoMarker { const aruco = new ArUcoMarker({ ...OBJECT_SIZE_DEFAULTS, @@ -181,6 +192,8 @@ export class LabelDesignerObjectHelper { return; case "qrcode": return this.addQrCode(canvas); + case "datamatrix": + return this.addDataMatrix(canvas); case "aruco": return this.addArUco(canvas); case "barcode":