{"_id":"@zzalai/leafer-point-annotation","_rev":"26-807f74411b595888da21d31b6a2e46b9","name":"@zzalai/leafer-point-annotation","dist-tags":{"latest":"1.1.24"},"versions":{"1.0.0":{"name":"@zzalai/leafer-point-annotation","version":"1.0.0","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.0.0","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"e4396fdcdf473f16bbba88fe11c452a9c18abed1","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.0.0.tgz","fileCount":34,"integrity":"sha512-axGUql7/z/dJht37NxJME5JLQv1ck39ZST2Le2ysOJ5gWzLs4xmJrt1ylr34J3rQxtGfco0spCBOGP3OG0T5vA==","signatures":[{"sig":"MEUCIQDBtvGa8yRcrfgLBfW0OxQK0ClNZDujn2eDs9JvDZ1ElAIgb+S1wTtBTb4HUpGWhaGIfK7eKBodHunJ9CSfTrCejYE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":661734},"main":"./dist/leafer-point-annotation.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"}},"gitHead":"72581b1c9f001690cfc609531580f7605b545700","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^3.0.0","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.0.0_1777683194105_0.8097346484784111","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@zzalai/leafer-point-annotation","version":"1.1.0","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.0","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"bc78e359be78017850299b3afaaf2ed11af884f1","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.0.tgz","fileCount":34,"integrity":"sha512-y7wBW5JlxYyFtpA1sLLltuwcxy/WARY7Gblaw3w2PzRdH8rhQylMfdupUDYS0Ri7a5iYKATNBXzEG1SzYQYG4A==","signatures":[{"sig":"MEYCIQClDCxK8gPq3gpMOebkJPRYAAerrqTMn+JY0j8LGQZ97wIhAIJLP4K6XgCCk5rVz2uhy3woshBHb/wOK9UwaqSvy+ef","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":674206},"main":"./dist/leafer-point-annotation.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"}},"gitHead":"72581b1c9f001690cfc609531580f7605b545700","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^3.0.0","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.0_1778209829512_0.6108239662191361","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@zzalai/leafer-point-annotation","version":"1.1.1","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.1","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"36b34b206e7a4e05f0b21cc095b013fec3eeb356","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.1.tgz","fileCount":34,"integrity":"sha512-N4gIVS9/1LZQapoClOAYvsCAMR5ze9PfYubdeNab5I9QNTuN5BPhp/jLct0MjNsBSq3AxX4YtHzfdVdpKxwAlA==","signatures":[{"sig":"MEYCIQDGgslNSNoVbM7hSTcK9JQVpsBoQLgKO5ovxuOLNZMzHgIhAK4IJlqye6/TTZcSyJyx7WfiQ0i/8yBPQP+EZhadulBv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":677078},"main":"./dist/leafer-point-annotation.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"b3384f3591437bb86274d576e633e12a5cfc6d5e","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.1_1780403206888_0.738832219924555","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@zzalai/leafer-point-annotation","version":"1.1.2","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.2","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"9a6ab7d6bab1b612e9d0b288070fb45abe28dd83","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.2.tgz","fileCount":35,"integrity":"sha512-2c1/1/35QPUEEQ0Km7Z9y1Q0THAFqovTH+SM0ux2j89O4dMeszAjTn3dqNagtknJvY/FFAVqtGgmdmscqyLjdA==","signatures":[{"sig":"MEYCIQDj2QkS9Si4BZMZRVkiuo2spu7YnMxivPOczooFzNk7MwIhAK0tumFioxU016sRgYGKeSQqPdtBzZO1YOzxZK7EOXmV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":780079},"main":"./dist/leafer-point-annotation.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"a6a99ab87f5e1cd306318d5b1fcfc173d1329dfe","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.2_1781450713571_0.29327541141040836","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@zzalai/leafer-point-annotation","version":"1.1.3","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.3","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"fd9982a51f002644dd558e757e083fd6a0460b5b","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.3.tgz","fileCount":35,"integrity":"sha512-GzwfLu/Fo2adAow1wDeBxsQjW5ASBQpOO/zY5S3tUqaS6hlL4dAlfl6qKESSjlSXx89KdLuJdfblYk6b0Q5rkQ==","signatures":[{"sig":"MEYCIQCJvak1gmKl/P9PThAgzrJF45PDn+Ptb/7ei193OEYLEAIhAM72b3CocwjfP94HJluzGLT1F54lgdRIi/c5AUJEOn9x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":780081},"main":"./dist/leafer-point-annotation.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"468f96eb144900705f8e1a0655e1531bd0e42377","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.3_1781492048680_0.4584536448926815","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@zzalai/leafer-point-annotation","version":"1.1.4","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.4","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"4cf0987eb7c476771631f07e4847732246bd783b","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.4.tgz","fileCount":35,"integrity":"sha512-jNZ8+7iPHjiDbgt6KP4aGCc5/Iuw6u9JP5XDmGqJxnobnWHZMym2Td3/oBYda8FT3N91mRlb0hFKXqiVFfA6aw==","signatures":[{"sig":"MEYCIQCdYfyh1zOVGL5vFRQOcU+bMtlLi6sHhZTHPeBGjRoARwIhAO8ZoDk9O9Ua4pb8naNxCpGa4X8qOnSUzSl4W50EP5cA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":782631},"main":"./dist/leafer-point-annotation.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"6b0f70528863d77a11f8cbc76a0286042af36b1a","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.4_1781517092220_0.8860636898996284","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@zzalai/leafer-point-annotation","version":"1.1.5","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.5","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"1ed42d23283335bd141c19160cfef18aec40a6b7","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.5.tgz","fileCount":36,"integrity":"sha512-c81XIFN+p/xvg4FDe6Im8sNAiTlnJO5Ucj5fV0A0snPNpgUcprcVLC14B/356Ejd4bwgJGl1jCMSgKeZwR27Rw==","signatures":[{"sig":"MEQCIF59t4Y1ZFgS1wyb8CJvwWKfLjT3KsJ876/G32rrnM8lAiAa1+98/XjYrpGwftezrzXwoQPccd/GK78MNIWI+/m/Pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":801884},"main":"./dist/leafer-point-annotation.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"457a20d72b24c52b20cba0887555060fe9722c43","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.5_1781604150600_0.6670672015882124","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@zzalai/leafer-point-annotation","version":"1.1.6","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.6","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"131120aec1c1973648b3e70e3924279c4a85e5d9","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.6.tgz","fileCount":19,"integrity":"sha512-b/QAx0Q92Tkh2cwzIcPdsqE1RXWzx4fR3xDvMhCpIaNW9SgYU9ozolAEri/J6/6AmLxKSwhln3rCPuONx6Jnhg==","signatures":[{"sig":"MEQCIBWxylc+LNxmBv4FgbH+KAWNG5OuSnTRRtvFzUxpeDA0AiBJfJQzUk4ncfdGtNij5+m4Eah34/H14yvEVk2M4PZXPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":818923},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"b2b62e9f8036ea23c773b1de37a8404e88d66213","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.6_1781687462651_0.42293823848407563","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@zzalai/leafer-point-annotation","version":"1.1.7","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.7","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"07df018adf8c8c6227c5ede31f2f0637171b8f32","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.7.tgz","fileCount":19,"integrity":"sha512-WgymGDd9Z9zul2L7PrUFSJVbUVHn7S0+oG0ZiiiwnucsuHm8zY3TJPtMC49Rr7PvKCj0TQmg0ReEb1n8fTii2w==","signatures":[{"sig":"MEUCIDrWuDZF1EJDUZDMDgtDqTfXRvliI3C28poBKaNOlc21AiEAvMujIAiMKU+ZIPq6ika2c1Qww636jPYeRfQRtNRR+p0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":819495},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"1fc933cac4742da28b5861db49683ed27707c049","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.7_1781690517320_0.5042225552534392","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"@zzalai/leafer-point-annotation","version":"1.1.8","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.8","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"4dfafbf6b31a8ec58d68872b48a0296f9addefaa","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.8.tgz","fileCount":19,"integrity":"sha512-mtC3HmmYDzQm6uQbtt4KfHEsC8kl/ROFPE3NPaiWdUL65FUTFnRA5t01rBztgwz+3dJeRX7H4T2MG3Il9HCSNA==","signatures":[{"sig":"MEYCIQCwpkVeDigdp3rXGBC0bMLqIhoG89Cw6wGrhh6HoyICTgIhAIZUxfqU+zaoj5YY/vB5VtmHig0Bsze9zjqjtr1tCMKq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":820389},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"e1426fe12c0c9f0246e94b2bdd59f7cfee2f1c37","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.8_1781715572907_0.03806804618978288","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"@zzalai/leafer-point-annotation","version":"1.1.9","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.9","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"2507666cd1a1576ef5719cde4f17bf6a3ccca71e","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.9.tgz","fileCount":19,"integrity":"sha512-yUfqBhcf7jdvnTLtI8TgQOv0cQ9b5pEV9H/5py4iaL7jP7C1lEacKln9ja5PG3l+ZyP0g6RPe3Nm4SovDKau1g==","signatures":[{"sig":"MEQCIB6S+1lJs96C8CwpI5oLcGmrJkej4JTqyGbMCbZcsM62AiAukbk1/WGRxr4jIrBuKyrii7mBfRgeyA+39b/RFsniFA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":827324},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"3308d400e21f3b6e2f5e12cbe8c53d4cd16de9cd","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.9_1781735828793_0.40882201409895824","host":"s3://npm-registry-packages-npm-production"}},"1.1.10":{"name":"@zzalai/leafer-point-annotation","version":"1.1.10","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.10","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"3da64c5fab4f4a750685dc63447932cd0ae9ec30","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.10.tgz","fileCount":19,"integrity":"sha512-439bo1EsIYOAvwMawbBu30PwU9Vmfw/KnxFqrGRXf3IofhNDuAef92lA0bUkHehxJNW158VlxUu5r60Of3Cykg==","signatures":[{"sig":"MEQCIFfCXtpojuNGPisRJTqjyMO/+iM/HXfLJ1XNBEO+4Wf4AiB6DPo1v93itS1vJuToK4ZfkXA6LUOkMGqeqcRccrLiPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":837180},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"8e215dd556863acb68d8b6f1979cafe4b0e32907","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.10_1781957276582_0.5250108968142682","host":"s3://npm-registry-packages-npm-production"}},"1.1.11":{"name":"@zzalai/leafer-point-annotation","version":"1.1.11","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.11","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"8c6470be8d56101c402f924da9ed3ee78a0bec91","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.11.tgz","fileCount":19,"integrity":"sha512-FkjE6otGbN8oKLl1gUgzCIpmxf60qbjxx97ZirMMkv6qmJNVg3Ks2bz786xG2qbV2ZY3nk5wgUKpp91kw+tUXQ==","signatures":[{"sig":"MEQCIGrk9UpUqnlv0X2HrPsz8jNuB0ATutdHZTr5DESuxeA8AiAjMQJiWNqWwrjCft27YKvHy7c4fbfR9h8sI2a4O2QuTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":837469},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"5cdcdf53690f6778a7557822ea85e68cfe5ec777","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.11_1782060867012_0.2098145588939182","host":"s3://npm-registry-packages-npm-production"}},"1.1.12":{"name":"@zzalai/leafer-point-annotation","version":"1.1.12","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.12","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"80522c35cd98d5100693d1fb2f729198c001a3af","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.12.tgz","fileCount":19,"integrity":"sha512-nC1Oj8n4DG5LDWzGMXKbR5Pu8ATbuirmhmZTzXinRtsWBJuOYOxzamQF9M+cD1+L3Oi7dlE2CArEnfXeQSc3dg==","signatures":[{"sig":"MEUCIQCy3N5NuoCbKP9LRC6X6R+zwNd8AQN42TFUPEmdqe4JYgIgQsH/yIHZ/07jAM9BWlorQWgK3YGaqG7phRmd7dUvJ9Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":843524},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"f99c6841ffb3865b7c644a8773f57d8420f12035","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.12_1782183979743_0.7415640948792412","host":"s3://npm-registry-packages-npm-production"}},"1.1.13":{"name":"@zzalai/leafer-point-annotation","version":"1.1.13","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.13","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"a1f7bd7841a568dd2cfd2a18d446af0ca475815a","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.13.tgz","fileCount":19,"integrity":"sha512-Mc0eYY8X55ycKreo1Bk7AUQqKeYHJlj7T+O0jsNJMcI8yGkzQa8mTxdyXi8fwdRMSR2fiLFCnQaGkw12ffa1KA==","signatures":[{"sig":"MEYCIQCoz+GG3L5iTfxldyg2KJ5LtMYG/D566Sp67q7cURXWawIhAMmMt3LMgp9RHcir6lqHUPS/v5+e//GbIv3NeV3+ZWtz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":845713},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"f99c6841ffb3865b7c644a8773f57d8420f12035","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.13_1782240919833_0.9286727183845893","host":"s3://npm-registry-packages-npm-production"}},"1.1.14":{"name":"@zzalai/leafer-point-annotation","version":"1.1.14","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.14","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"0849d0403d72f84563e9bf451b8567b5b5cbc150","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.14.tgz","fileCount":19,"integrity":"sha512-FJykL90Ny9vaiE9M+fLC5mO/9HqXrS6vBYKfojrVIOG13KdyCtfsM5456zIf2AktSM1Oxm4IL9Od7xf1v+8Kkg==","signatures":[{"sig":"MEYCIQCetNTg4zlWekvFvowUFseFSAiwSr1TN8t185EluJDJjQIhAKgsaPMkOv6HBVfB4m6s8HG3A6DebswAFD3Z3TNrvlts","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":845749},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"2acef03e74390329ae3734e491f4894fcf97994b","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.14_1782245939065_0.180443562632995","host":"s3://npm-registry-packages-npm-production"}},"1.1.15":{"name":"@zzalai/leafer-point-annotation","version":"1.1.15","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.15","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"2086b2dec5c5f42c82fef4c557fd6c111c79cfac","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.15.tgz","fileCount":19,"integrity":"sha512-bIzQycg3WFmN3WJhju5NncUkG5fQyUyQzxAfEr9+b3IuCIUlnHzuiz6kv62RkMhrDChLnC2RFaJxjci8JD7GAQ==","signatures":[{"sig":"MEUCIQDVQD11MjAc2ynRoe7DKQ0KCRmgMqw29471PHi7J6wrWwIgJuVa6z3/q/Ce2mZiyyLkdbwcoOY5arfPEDfMDeg39go=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":845894},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"2acef03e74390329ae3734e491f4894fcf97994b","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.15_1782262522117_0.8988696374267984","host":"s3://npm-registry-packages-npm-production"}},"1.1.16":{"name":"@zzalai/leafer-point-annotation","version":"1.1.16","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.16","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"15af2851e38b8cb0f38de047e62103a0a985727f","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.16.tgz","fileCount":19,"integrity":"sha512-kmgzUxCCBPKYtTbR8ib5aN+WicLKpfh4Mh9DGPLlEHlAPMf2HPS2VksnHT6xWjdXJ1yLtKIpWXomEiPg6WU/+Q==","signatures":[{"sig":"MEQCIBZI0JyYsFVYcFi9ZMF9iwKUm4/1wDd46KeV6ixUFA2fAiB/F+6Q/sYjtmGNEmRBkRI2miSUOHoguu9aJzFme/nSUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":849219},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"15b81e85d6a927581f4bbec123f08ce630e7ad22","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.16_1782383947163_0.8188171807376696","host":"s3://npm-registry-packages-npm-production"}},"1.1.17":{"name":"@zzalai/leafer-point-annotation","version":"1.1.17","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.17","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"dd59fd3327954c519cd4cd1715d1c0c719e4192d","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.17.tgz","fileCount":19,"integrity":"sha512-m8CeYA/goDRQmQP7BDHTp8SI06IdJN9qUJln0wr6Yiee3NawZM3hcLN82CS67SWXaBWI8Tn3qJ1nP0oyLJX+oQ==","signatures":[{"sig":"MEUCIEFztRwT+DMxC0hRYu4P/T48ZoGAfAU4LHPoR+yW0m7oAiEA7g1y3MWDFjE0WjhJqtwjWSDXi30vvEHFshuX091g3Ak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":849310},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"15b81e85d6a927581f4bbec123f08ce630e7ad22","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.17_1782385725168_0.19111390174411702","host":"s3://npm-registry-packages-npm-production"}},"1.1.18":{"name":"@zzalai/leafer-point-annotation","version":"1.1.18","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.18","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"368615925ae2ef0c8b84d92daf9493d09c4e7f20","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.18.tgz","fileCount":19,"integrity":"sha512-FvuqAOVjSmpbvjATN+Ahk8HJ5igesWTZSL2ZRK6y7j6be4wHlFI6TdeUalyCfZtlzgTNwGKfkxfmppR8r6PYZQ==","signatures":[{"sig":"MEQCIEfWHw3Rb+gTXaEdKO/gFmVsizJU2dJD5Dwzf5I3wFNkAiBk/64aU/MUPBAfHRvCfGcyvg0C8sAd013iV/Et4bTgcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":849855},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"23a6533e87d38372608747aee7082e655e72ebda","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.18_1782465080017_0.5970847779089201","host":"s3://npm-registry-packages-npm-production"}},"1.1.19":{"name":"@zzalai/leafer-point-annotation","version":"1.1.19","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.19","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"bc88d2b1b01ec18e07ad9d5d67e93c45bcd3e566","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.19.tgz","fileCount":19,"integrity":"sha512-/NgEODCABplqmaR6SfutPB29OTKUR9RXhxDh0+FfmCESw0iL79Bx/9Gpkbk49gaNIit7RPwNAQoOM0JsulM+IQ==","signatures":[{"sig":"MEUCIQDSily7M2iPLhnbfxaGfsZ7JhdL1ZPU3wqfsnjN8j5fLwIgcLvITXFAZQ0XE1TUheRN5va+bkuzzjEiFMIEQ2aHAo8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":850168},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"bf319abac276a9d8459a3c6cb5e82a26eef146e2","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.19_1782659557537_0.24586167150461846","host":"s3://npm-registry-packages-npm-production"}},"1.1.20":{"name":"@zzalai/leafer-point-annotation","version":"1.1.20","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.20","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"a5cf7ef93f70b2dd3cf16249e4742e3abf11aca5","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.20.tgz","fileCount":19,"integrity":"sha512-z58V5iYujT1TzwxwuimUdNYR2s/+Vopv5L5TrL8Pmqq8HWJZVsJtsdHCIAFF/SkMdIuTraaZVDwynuQYS6LnLQ==","signatures":[{"sig":"MEUCIQCQUjCfetKg7RkPGmc8wtTZEVggjHpYjvwKgmfnOnw55QIgHZfmBIyln5C+wyiW4ieTftv5jO/Gs+tf3b0rBKE/O5I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":850525},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"4b839045f1abc688b5ad7d2ade0419d12051c2c0","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.20_1782784420509_0.8191048381719379","host":"s3://npm-registry-packages-npm-production"}},"1.1.21":{"name":"@zzalai/leafer-point-annotation","version":"1.1.21","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.21","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"48f60e5406d4cc59cde91416ba504d449929c75e","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.21.tgz","fileCount":19,"integrity":"sha512-C/cqgBfu0M8LST4392BWpI/lKNZ0gRvcwmzTe4BBcPOfN3JZDB6n9cXIIFH1Zv5BKWDYdoq0BN6/DeVNl2Elpg==","signatures":[{"sig":"MEUCIDxoZBmWbqjI98qQEbZKJ8vnu6cAoju4iP9WvznP8RwUAiEA98vv5GGfuvzNXfnnDFH/UzYDbgYAFuCzWhdHetqwryw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":852534},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"cbab7593c95722f72c5dada5d279d57d74581f39","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.21_1782981428670_0.8939371466224819","host":"s3://npm-registry-packages-npm-production"}},"1.1.22":{"name":"@zzalai/leafer-point-annotation","version":"1.1.22","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.22","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"95193b59d1a25beaf6f3e3d310642227e3a759ff","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.22.tgz","fileCount":20,"integrity":"sha512-LEN5DtSGV8z40qJW4QM4AHzYlG91bjleXosmuZUUEeXfGu/YHOOnWBtp7x6WngOjsDoLR+bTS2gGAYXHYJK1LA==","signatures":[{"sig":"MEQCIFlYNopmJoq0xd6mjZIs81khKjzZHzbQ9XmSe3zVXEuwAiAoMNdWeGEHQ/qSf/9AvmKvutBjVxOJm6za7RXIBxl7Uw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":864705},"main":"./dist/leafer-point-annotation.es.js","type":"module","_from":"file:zzalai-leafer-point-annotation-1.1.22.tgz","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"_resolved":"C:\\Users\\20935\\AppData\\Local\\Temp\\4b5ce8ff36cbfde1c6500b39f7102cde\\zzalai-leafer-point-annotation-1.1.22.tgz","_integrity":"sha512-LEN5DtSGV8z40qJW4QM4AHzYlG91bjleXosmuZUUEeXfGu/YHOOnWBtp7x6WngOjsDoLR+bTS2gGAYXHYJK1LA==","repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.22_1784070421904_0.9823193638085703","host":"s3://npm-registry-packages-npm-production"}},"1.1.23":{"name":"@zzalai/leafer-point-annotation","version":"1.1.23","keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","_id":"@zzalai/leafer-point-annotation@1.1.23","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"homepage":"https://otaku1951.github.io/leafer-point-annotation/","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"dist":{"shasum":"80540aed98bd5c074d3f48ac827fea2124cfdc5f","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.23.tgz","fileCount":21,"integrity":"sha512-U+blci8hQwb40WfD3VIKq738Iqss1sN1xFB78mvuMb6eJnpZ7AeQbmZY/fFLZcW9KvPWbE1GtBNCEFzH/YHUlw==","signatures":[{"sig":"MEUCIHjsF9RmWZr9RhkOZnGH06uDCetAjs0EhLZ3ThQlFcPYAiEAzmkaTvL8kNaOrsYAPJo6WPlnD+mrOJnr9FyzCLTcZYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":871025},"main":"./dist/leafer-point-annotation.es.js","type":"module","types":"./dist/index.d.ts","module":"./dist/leafer-point-annotation.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"gitHead":"8f0f4840f923cbc4e0273c8650b6f1d8ee95ae05","scripts":{"dev":"vite","build":"vite build","preview":"vite preview","build:all":"npm run build && npm run docs:build","docs:build":"vite build --config vite.docs.config.ts","type-check":"tsc --noEmit"},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"repository":{"url":"git+https://github.com/otaku1951/leafer-point-annotation.git","type":"git"},"_npmVersion":"11.11.0","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","directories":{},"_nodeVersion":"25.8.0","dependencies":{"tinykeys":"^3.0.0","leafer-ui":"^2.0.8","@leafer-in/box":"^2.1.6","@leafer-in/view":"^2.0.8","vue-pick-colors":"^1.8.0","@leafer-in/state":"^2.1.0","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/viewport":"^2.0.8","@leafer-in/text-editor":"^2.1.0","@zzalai/leafer-undo-redo":"1.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"vite":"^8.0.8","terser":"^5.46.1","typescript":"^6.0.2","@types/node":"^25.6.0","vite-plugin-dts":"^5.0.2","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3"},"peerDependencies":{"vue":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/leafer-point-annotation_1.1.23_1785401365428_0.9128795915947683","host":"s3://npm-registry-packages-npm-production"}},"1.1.24":{"name":"@zzalai/leafer-point-annotation","version":"1.1.24","description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","type":"module","publishConfig":{"access":"public"},"main":"./dist/leafer-point-annotation.es.js","module":"./dist/leafer-point-annotation.es.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/leafer-point-annotation.es.js","require":"./dist/leafer-point-annotation.umd.js","types":"./dist/index.d.ts"},"./dist/leafer-point-annotation.css":{"import":"./dist/leafer-point-annotation.css","require":"./dist/leafer-point-annotation.css"}},"scripts":{"dev":"vite","build":"vite build","preview":"vite preview","type-check":"tsc --noEmit","docs:build":"vite build --config vite.docs.config.ts","build:all":"npm run build && npm run docs:build"},"keywords":["vue3","leaferjs","point","annotation","image-processing"],"author":{"name":"zzalai"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/otaku1951/leafer-point-annotation.git"},"homepage":"https://otaku1951.github.io/leafer-point-annotation/","packageManager":"pnpm@10.33.0","peerDependencies":{"vue":"^3.3.0"},"dependencies":{"@leafer-in/box":"^2.1.6","@leafer-in/editor":"^2.0.8","@leafer-in/resize":"^2.0.8","@leafer-in/state":"^2.1.0","@leafer-in/text-editor":"^2.1.0","@leafer-in/view":"^2.0.8","@leafer-in/viewport":"^2.0.8","@zzalai/leafer-undo-redo":"1.0.3","leafer-ui":"^2.0.8","tinykeys":"^3.0.0","vue-pick-colors":"^1.8.0"},"devDependencies":{"@types/node":"^25.6.0","@vitejs/plugin-vue":"^6.0.6","@vue/language-core":"^3.3.3","terser":"^5.46.1","typescript":"^6.0.2","vite":"^8.0.8","vite-plugin-dts":"^5.0.2"},"gitHead":"0225120cfe56f7e98004874ad245c0894287612d","_id":"@zzalai/leafer-point-annotation@1.1.24","bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"_nodeVersion":"25.8.0","_npmVersion":"11.11.0","dist":{"integrity":"sha512-LNGIlKVa1ZKoUQ+qoJSPMxshdT9WE3xuk/W/AImeIq1owDCp/dQJtca385rjJPjyVveUousNHf62vNagaGnlsQ==","shasum":"217ce56b00bcd7716aac2500e51ff9bde39f1377","tarball":"https://registry.npmjs.org/@zzalai/leafer-point-annotation/-/leafer-point-annotation-1.1.24.tgz","fileCount":21,"unpackedSize":871714,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFcN+qPPYFqGOu0q7/Ae575mAqr6yrRG+7Ao166eeZZnAiEAypYHevOxILk8DkR4xNXGFdFjXx5lKnNgT1ZDu3yKZgo="}]},"_npmUser":{"name":"otaku1951","email":"otaku1951@gmail.com"},"directories":{},"maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/leafer-point-annotation_1.1.24_1785462165505_0.21140835820217663"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-02T00:53:14.006Z","modified":"2026-07-31T01:42:45.860Z","1.0.0":"2026-05-02T00:53:14.338Z","1.1.0":"2026-05-08T03:10:29.683Z","1.1.1":"2026-06-02T12:26:47.045Z","1.1.2":"2026-06-14T15:25:13.750Z","1.1.3":"2026-06-15T02:54:08.862Z","1.1.4":"2026-06-15T09:51:32.392Z","1.1.5":"2026-06-16T10:02:30.771Z","1.1.6":"2026-06-17T09:11:02.849Z","1.1.7":"2026-06-17T10:01:57.497Z","1.1.8":"2026-06-17T16:59:33.040Z","1.1.9":"2026-06-17T22:37:08.939Z","1.1.10":"2026-06-20T12:07:56.766Z","1.1.11":"2026-06-21T16:54:27.215Z","1.1.12":"2026-06-23T03:06:19.950Z","1.1.13":"2026-06-23T18:55:20.048Z","1.1.14":"2026-06-23T20:18:59.282Z","1.1.15":"2026-06-24T00:55:22.317Z","1.1.16":"2026-06-25T10:39:07.339Z","1.1.17":"2026-06-25T11:08:45.310Z","1.1.18":"2026-06-26T09:11:20.145Z","1.1.19":"2026-06-28T15:12:37.715Z","1.1.20":"2026-06-30T01:53:40.666Z","1.1.21":"2026-07-02T08:37:08.847Z","1.1.22":"2026-07-14T23:07:02.082Z","1.1.23":"2026-07-30T08:49:25.566Z","1.1.24":"2026-07-31T01:42:45.693Z"},"bugs":{"url":"https://github.com/otaku1951/leafer-point-annotation/issues"},"author":{"name":"zzalai"},"license":"MIT","homepage":"https://otaku1951.github.io/leafer-point-annotation/","keywords":["vue3","leaferjs","point","annotation","image-processing"],"repository":{"type":"git","url":"git+https://github.com/otaku1951/leafer-point-annotation.git"},"description":"A Vue3 component for point annotation and brush painting on images using LeaferJS, supporting COCO/YOLO/JSON export, designed for AI model training dataset annotation","maintainers":[{"name":"otaku1951","email":"otaku1951@gmail.com"}],"readme":"# @zzalai/leafer-point-annotation\n\n[English](README_EN.md) | 中文\n\n> 基于 **Vue 3 + LeaferJS** 的图像点标注与笔刷涂抹工具，支持导出 COCO/YOLO/JSON 格式，专为 AI 模型训练数据集标注设计。\n\n- 📍 点标注（可拖拽、可编辑、自动重排、hover/selected 状态）\n- 🖌️ 多图层笔刷涂抹与擦除（颜色、透明度、大小、连续性可调，橡皮擦独立尺寸）\n- 🪢 套索工具（自由绘制闭合区域进行填充/擦除，轨迹黑白双线高对比度）\n- 🔀 一键根据点标注的轨迹生成笔刷多边形区域\n- 🖼️ 本地图片上传（点击 + 拖拽）或远程图片\n- 🎨 完整的点/笔刷样式自定义\n- ⬅️ 撤销 / 重做（Command 模式）\n- 📤 多格式导出：JSON / COCO / YOLO / Mask (dataURL / Blob / File)\n- 📱 支持自定义工具栏（隐藏内置工具栏，调用 ref API 自行构建）\n- 🔒 `enableBrush: false` 可完全禁用笔刷，仅保留点标注\n- ⌨️ 丰富的键盘快捷键（`v` `p` `b` `e` `Ctrl+Z` `Ctrl+Y` `Delete` 等，需 `options.enableHotkeys: true`）\n- 🔍 **`beforeCreatePoint` 前置判定回调**（创建点标注前介入，支持同步/异步，适用于数量限制、区域限制、用户二次确认等场景）\n- 📦 **TypeScript 类型集中导出**（`import type { OptionsSource, PointAnnotationItem, ImageSource, PointStyle, BrushStyle, ... } from '@zzalai/leafer-point-annotation'`）\n\n---\n\n## 目录\n\n- [安装](#安装)\n- [快速开始](#快速开始)\n- [Props 配置](#props-配置)\n  - [imageSource](#imagesource)\n  - [options](#options)\n  - [beforeCreatePoint（创建点前回调）](#beforecreatepoint创建点前回调)\n  - [currentLayer（v-model:currentLayer）](#currentlayerv-modelcurrentlayer)\n- [Events 事件](#events-事件)\n- [TypeScript 类型导入](#typescript-类型导入)\n- [Ref API（父组件调用）](#ref-api父组件调用)\n  - [点标注](#点标注)\n  - [图片 & 画布](#图片-画布)\n  - [工具切换](#工具切换)\n  - [删除 & 清空](#删除-清空)\n  - [笔刷图层](#笔刷图层)\n  - [笔刷样式](#笔刷样式)\n  - [点轨迹生成笔刷区域](#点轨迹生成笔刷区域)\n  - [缩放](#缩放)\n  - [撤销 / 重做](#撤销-重做)\n  - [导入 / 导出](#导入-导出)\n- [使用示例](#使用示例)\n  - [最小示例](#最小示例)\n  - [完整自定义（隐藏内置工具栏）](#完整自定义隐藏内置工具栏)\n  - [多图层笔刷](#多图层笔刷)\n  - [后端上传 Mask（Blob/File）](#后端上传-mask-blobfile)\n  - [只启用点标注（禁用笔刷）](#只启用点标注禁用笔刷)\n  - [套索工具（自由绘制闭合区域）](#套索工具自由绘制闭合区域)\n  - [点标注前回调（beforeCreatePoint）](#点标注前回调beforecreatepoint)\n- [快捷键](#快捷键)\n- [开发与构建](#开发与构建)\n- [许可证](#许可证)\n\n---\n\n## 安装\n\n### npm\n\n```bash\nnpm install @zzalai/leafer-point-annotation\n```\n\n### yarn\n\n```bash\nyarn add @zzalai/leafer-point-annotation\n```\n\n### pnpm\n\n```bash\npnpm add @zzalai/leafer-point-annotation\n```\n\n> ⚠️ 注意：`vue@^3.3.0` 为 peer dependency（不会被自动安装，需宿主项目已存在）。\n\n---\n\n## 快速开始\n\n```vue\n<template>\n  <PointAnnotation\n    ref=\"annotationRef\"\n    v-model:image-source=\"imageSource\"\n    :options=\"options\"\n    @point-change=\"handlePointChange\"\n    @load-success=\"handleLoadSuccess\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport { PointAnnotation } from '@zzalai/leafer-point-annotation'\n\n// 👇 必须手动导入样式\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n\n// 方式一：远程图片\nconst imageSource = computed(() => ({\n  url: 'https://example.com/sample.jpg'\n}))\n\n// 方式二：不传 imageSource（初始为 null），用户本地上传后自动绑定\n// const imageSource = ref<ImageSource | null>(null)\n\nconst options = {\n  enableBrush: true,\n  pointStyle: {\n    circleFill: '#ff4d4f',\n    circleStroke: '#ffffff'\n  },\n  brushStyle: {\n    color: '#1890ff',\n    opacity: 0.55,\n    size: 100,\n    eraserSize: 150  // 橡皮擦大小（可选，未设置时与笔刷大小一致）\n  }\n}\n\nfunction handlePointChange(points: any[]) {\n  console.log('点标注变化：', points)\n}\n\nfunction handleLoadSuccess(info: any) {\n  console.log('图片加载成功：', info)\n}\n</script>\n```\n\n---\n\n## Props 配置\n\n### imageSource\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `url` | `string` | 图片地址（远程 URL、dataURL 或 blob URL） |\n| `id` | `string` | 可选，业务标识 |\n| `width` | `number` | 图片宽度（加载成功后填充） |\n| `height` | `number` | 图片高度（加载成功后填充） |\n| `isLocal` | `boolean` | 是否为本地图片（本地选择时为 true） |\n| `file` | `File` | 当前图片文件对象（经过旋转/翻转后为变换后的新文件，可直接用于后端 multipart 上传） |\n| `metaFile` | `File` | 原始未变换的图片文件（始终指向最初上传的原图，不受旋转/翻转影响） |\n\n> **单一数据源**：图片加载完全依赖 `props.imageSource`。不传 `imageSource` 时，组件显示大面积上传区域，支持**点击选择文件**和**拖拽文件**两种本地加载方式。\n> \n> **v-model 支持**：组件支持 `v-model:imageSource` 双向绑定，内部选择图片后自动更新父组件数据。\n\n### options\n\n完整的 `OptionsSource`：\n\n```ts\ninterface OptionsSource {\n  // ============ 功能开关 ============\n  enableBrush?: boolean                     // 是否启用笔刷（默认 true）；\n                                            // false 时笔刷按钮/面板不渲染，\n                                            // brushTool/eraserTool/mask 导出等方法失效\n  enableHotkeys?: boolean                   // 是否启用键盘快捷键（默认 false）；\n                                            // true 时才绑定 v/p/b/e/Ctrl+Z 等快捷键\n  brushCursorEnabled?: boolean             // 是否显示笔刷/橡皮擦的自定义跟随光标（默认 true）；\n                                            // 切换到 brush/eraser 工具时光标显示为笔刷形状（颜色、大小、透明度实时同步）\n  lassoFixedSizeOnZoom?: boolean           // 套索轨迹是否保持固定大小（不随画布缩放而变粗，默认 true）；\n                                            // 黑色主线 + 白色描边，高对比度适应各种背景\n  loadingGradientColors?: [string, string]  // 加载中渐变动画的两个颜色（默认：淡紫 '#e8e0ff' -> 淡蓝 '#d8e8ff'）\n  loadingTextColor?: string                // 加载中文字颜色（默认：'#4a5568'，蓝灰色，明显且不违和）\n\n  // ============ UI 开关 ============\n  showToolbar?: boolean                     // 是否显示内置工具栏（默认 true）\n  showZoomController?: boolean              // 是否显示内置缩放控制器（默认 true）\n  canvasBackground?: string                 // 画布背景色（默认 '#f6f6f6'）\n\n  // ============ 缩放 ============\n  zoomMin?: number                          // 最小缩放比例（默认 0.2）\n  zoomMax?: number                          // 最大缩放比例（默认 4）\n\n  // ============ 点标注 ============\n  pointStyle?: Partial<PointStyle>          // 点标注样式（覆盖默认）\n  maxPoints?: number                        // 最大点数（可选）\n\n  // ============ 笔刷 ============\n  brushStyle?: Partial<BrushStyle>          // 笔刷样式（覆盖默认）\n  brushLayers?: BrushLayerConfig[]          // 笔刷图层配置（不传则单图层 \"default\"）\n  maxBrushLayers?: number                   // 最大图层数（可选）\n\n  // ============ 历史 ============\n  maxUndoSteps?: number                     // 最大撤销步数（默认 100）\n\n  // ============ Mask 导出 ============\n  maskExportFormat?: 'png' | 'jpeg' | 'jpg' // Mask 默认导出格式（默认 png）\n  maskExportForeground?: 'black' | 'white'  // Mask 默认前景色（默认 black）\n}\n```\n\n#### PointStyle（点标注样式）\n\n```ts\ninterface PointStyle {\n  circleRadius: number\n  circleFill: string\n  circleStroke: string\n  circleStrokeWidth: number\n\n  // hover\n  hoverCircleFill: string\n  hoverCircleStroke: string\n\n  // selected\n  selectedCircleFill: string\n  selectedCircleStroke: string\n  selectedCircleScale: number\n\n  // 文字\n  circleTextFontSize: number\n  circleTextFontFamily: string\n  circleTextFill: string\n\n  // label\n  labelBackgroundColor: string\n  labelTextColor: string\n  labelFontSize: number\n  labelPadding: number | number[]\n\n  // 固定大小\n  fixedSizeOnZoom?: boolean                 // 开启则点不随画布缩放变大\n  fixedSizeScale?: number                   // 固定大小系数\n}\n```\n\n默认值参考 [`src/types/index.ts`](src/types/index.ts)。\n\n#### BrushStyle（笔刷样式）\n\n```ts\ninterface BrushStyle {\n  color: string                             // 笔刷颜色（十六进制）\n  opacity: number                           // 透明度 0~1（通过 Group.opacity 控制）\n  size: number                              // 笔刷大小（像素）\n  eraserSize?: number                       // 橡皮擦大小（像素），未设置时使用 size\n  minSize: number                           // 滑块最小\n  maxSize: number                           // 滑块最大\n  continuity: number                        // 两点间最大距离阈值（超过则断开）\n}\n```\n\n> **橡皮擦独立尺寸**：`eraserSize` 用于独立配置橡皮擦尺寸，与笔刷尺寸分离。未设置时默认与 `size` 相同。笔刷配置面板中分别提供「笔刷大小」和「橡皮擦大小」两个滑块。\n>\n> **橡皮擦光标样式**：采用白色 2px 外圈 + 黑色 1px 内圈的双环设计（类似 Photoshop），无论浅色还是深色背景都清晰可见，无需额外配置。\n\n#### BrushLayerConfig（多图层配置）\n\n```ts\ninterface BrushLayerConfig {\n  label: string                             // 图层显示名\n  value: string                             // 图层唯一标识\n  color?: string                            // 该图层默认颜色\n  opacity?: number                          // 该图层默认透明度\n  size?: number                             // 该图层默认笔刷大小\n}\n```\n\n不传 `brushLayers` 时默认为单图层 `{label:'默认图层', value:'default'}`。\n\n### beforeCreatePoint（创建点前回调）\n\n在**每次点标注被创建前**调用，父组件可通过返回值**允许/阻止**该点被创建，支持同步返回与异步返回（例如弹确认框等待用户选择）。\n\n```ts\ntype BeforeCreatePoint = (\n  x: number,                   // 点击位置的像素 x（图片坐标系）\n  y: number,                   // 点击位置的像素 y（图片坐标系）\n  normalizedX: number,         // 归一化 x（0 ~ 1）\n  normalizedY: number,         // 归一化 y（0 ~ 1）\n  existingPointCount: number   // 当前已有多少个点（即 this.pointAnnotations.length）\n) => boolean | Promise<boolean>\n```\n\n**返回值规则**：\n- `true` → 允许创建\n- `false` → 阻止创建\n- `Promise<true> / Promise<false>` → 异步等待后决定是否创建（如弹 `window.confirm`）\n\n**生效路径**：用户画布点击 / 父组件通过 ref 调用 `createPointAnnotation()` 两种路径都会经过相同的前置判定。\n\n**典型用法**：\n\n```ts\n// 1) 限制最多 20 个点\nfunction beforeCreatePoint(x: number, y: number, nx: number, ny: number, count: number) {\n  return count < 20\n}\n\n// 2) 只允许在图片右半部分（x > 宽度的 50%）\nfunction beforeCreatePoint(x: number, y: number, nx: number, ny: number) {\n  return nx > 0.5\n}\n\n// 3) 异步：弹确认框（实际业务可替换为 UI 组件的确认弹窗）\nasync function beforeCreatePoint(x: number, y: number) {\n  return window.confirm(`在坐标 (${Math.round(x)}, ${Math.round(y)}) 创建点？`)\n}\n\n// 4) 组合使用：数量限制 + 区域限制\nasync function beforeCreatePoint(x: number, y: number, nx: number, ny: number, count: number) {\n  if (count >= 5) { console.warn('最多 5 个点'); return false }\n  if (nx < 0.5) { console.warn('只允许在右半部分标注'); return false }\n  return window.confirm('确认创建？')\n}\n```\n\n```vue\n<PointAnnotation\n  :image-source=\"imageSource\"\n  :before-create-point=\"beforeCreatePoint\"\n/>\n```\n\n### currentLayer（v-model:currentLayer）\n\n受控图层切换。例如：\n\n```vue\n<PointAnnotation\n  :options=\"{ brushLayers: [\n    { label: '前景', value: 'foreground' },\n    { label: '遮挡', value: 'occlusion' }\n  ]}\"\n  v-model:current-layer=\"activeLayer\"\n/>\n```\n\n---\n\n## Events 事件\n\n| 事件 | 参数 | 触发时机 |\n|------|------|---------|\n| `point-change` | `(points: PointAnnotation[])` | 点新增 / 删除 / 修改 / 重排 |\n| `load-start` | - | 开始加载图片 |\n| `load-success` | `{ url, width, height, isLocal, file?, metaFile? }` | 图片加载成功（`file` 为当前文件，`metaFile` 为原始文件；旋转/翻转后 `file` 为变换后的新文件，`metaFile` 保持原始不变） |\n| `load-error` | `{ error }` | 图片加载失败 |\n| `undo-state-change` | `{ canUndo }` | 撤销栈状态变化 |\n| `redo-state-change` | `{ canRedo }` | 重做栈状态变化 |\n| `update:currentLayer` | `layerValue` | 当前笔刷图层变化（配合 v-model） |\n| `layer-change` | `layerValue` | 同 update:currentLayer |\n| `update:imageSource` | `ImageSource` | 组件内部选择图片后触发（配合 v-model:imageSource） |\n| `point-hover` | `(pointData, isHovering: boolean)` | 点 hover 状态变化：鼠标移入/移出某点时触发 |\n| `point-select` | `(pointData, isSelected: boolean)` | 点选中状态变化：点击选中/取消选中某点时触发 |\n\n---\n\n## TypeScript 类型导入\n\n所有对外类型与默认常量都从包根导出，可直接从 `@zzalai/leafer-point-annotation` 导入：\n\n```ts\nimport PointAnnotation from '@zzalai/leafer-point-annotation'\n\n// 👇 类型（import type，仅作类型提示用，不参与打包）\nimport type {\n  PointAnnotationItem,   // 点标注数据结构（注意：命名为 PointAnnotationItem，\n                         // 避免与 Vue 组件 PointAnnotation 命名冲突）\n  OptionsSource,         // :options 的类型\n  ImageSource,           // :image-source 的类型\n  PointStyle,            // 点标注样式配置\n  BrushStyle,            // 笔刷样式配置\n  BrushLayerConfig,      // 多图层配置项\n  BrushStrokeData,       // 笔刷笔画数据\n  ToolType,              // 'select' | 'point' | 'brush' | 'eraser' | 'lasso'\n  ExportFormat,          // 导出格式\n  ExportOptions,         // 导出选项\n  ImportOptions,         // 导入选项\n  Statistics,            // 统计信息\n  ExportData,            // 完整导出数据结构\n} from '@zzalai/leafer-point-annotation'\n\n// 👇 默认常量（value import，运行时可用）\nimport {\n  DEFAULT_POINT_STYLE,   // 默认点标注样式\n  DEFAULT_BRUSH_STYLE,   // 默认笔刷样式\n} from '@zzalai/leafer-point-annotation'\n\n// 必须手动导入样式\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n```\n\n**组件实例类型**：\n```ts\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n```\n\n**父组件 Props 类型示例**：\n```ts\nimport type { OptionsSource, ImageSource } from '@zzalai/leafer-point-annotation'\n\nconst imageSource = ref<ImageSource>({ url: 'https://example.com/image.jpg' })\n\nconst options = ref<Partial<OptionsSource>>({\n  enableBrush: true,\n  enableHotkeys: false,\n  pointStyle: { circleFill: '#ff4d4f' },\n  brushLayers: [\n    { label: '前景', value: 'foreground', color: '#1890ff', opacity: 0.55 },\n    { label: '遮挡', value: 'occlusion', color: '#faad14', opacity: 0.55 },\n  ],\n})\n```\n\n---\n\n## Ref API（父组件调用）\n\n通过 `ref` 访问组件实例后可调用以下方法。\n\n```ts\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n\n// 示例：\nannotationRef.value?.pointTool()                 // 切到点标注工具\nannotationRef.value?.createBrushFromPoints()     // 按点轨迹生成笔刷区域\nannotationRef.value?.getMaskBlob()                // 导出当前图层 Blob（上传后端）\n```\n\n### 点标注\n\n| 方法 | 说明 |\n|------|------|\n| `getPointAnnotations(): PointAnnotation[]` | 获取当前所有点 |\n| `createPointAnnotation(x: number, y: number, label?: string): Promise<string \\| null>` | 程序化新增一个点（返回新点 id 或 null；若配置了 `beforeCreatePoint` 并返回 false 则返回 null） |\n| `removePointAnnotation(id: string): boolean` | 程序化删除一个点 |\n| `updatePointAnnotationLabel(id: string, label: string): boolean` | 修改某个点的 label |\n| `setPointHoverState(pointId: string, isHover: boolean): boolean` | 编程式设置某个点的 hover 样式（仅修改视觉，不触发事件，不会形成双向循环） |\n| `setPointSelectState(pointId: string, isSelected: boolean): boolean` | 编程式设置某个点的选中状态（通过 `app.editor.select` 更新 editor 内部选中集，与点元素样式和 `previousSelectedStates` 保持一致；`isExternalSelectSync` 标志防止双向循环触发 `point-select` 事件） |\n| `findPointBySequenceNumber(seq: number): { id: string; data: any } \\| null` | 按圆圈内显示的数字序号查找点，返回该点的 id 和完整数据（父组件跨实例联动时，按视觉序号匹配更可靠） |\n\n### 图片 & 画布\n\n| 方法 | 说明 |\n|------|------|\n| `getImageInfo()` | `{ url, width, height, isLocal, file?, metaFile? }`（`file` 为当前文件，`metaFile` 为原始未变换的文件） |\n| `resetCanvas()` | 重置画布到无图片初始化状态（清除所有标注、笔刷、撤销栈） |\n| `rotateImage()` | 顺时针旋转图片 90°（会清空所有标注和笔刷数据） |\n| `rotateImageLeft()` | 逆时针旋转图片 90°（会清空所有标注和笔刷数据） |\n| `flipImage(direction?)` | 翻转图片：`'h'` 水平翻转（默认），`'v'` 垂直翻转（会清空所有标注和笔刷数据） |\n\n> **图片旋转/翻转说明**：旋转和翻转采用简化方案——执行时先清空所有已有标注和笔刷数据，再对图片像素进行 Canvas 2D 变换并重新加载。因此建议**先调整图片方向，再开始标注**。变换后 `file` 为变换后的新 `File` 对象，`metaFile` 始终指向原始文件。\n\n> **图片加载说明**：图片加载完全通过 `props.imageSource` 控制，不再对外暴露 `loadImage()` 和 `openFileDialog()` 方法。组件内部选择图片后通过 `v-model:imageSource` 自动同步到父组件。\n\n### 工具切换\n\n| 方法 | 说明 |\n|------|------|\n| `getCurrentTool(): 'select' \\| 'point' \\| 'brush' \\| 'eraser' \\| 'lasso'` | - |\n| `setTool(tool)` | 切换到指定工具（`enableBrush=false` 时 brush/eraser/lasso 被拦截） |\n| `selectTool()` | 选择工具 |\n| `pointTool()` | 点标注工具 |\n| `brushTool(openPanel?: boolean)` | 笔刷工具 |\n| `eraserTool()` | 橡皮擦工具 |\n| `lassoTool()` | 套索工具 |\n\n### 删除 & 清空\n\n| 方法 | 说明 |\n|------|------|\n| `deleteSelected()` | 删除当前选中的点（带 `confirm`） |\n| `clearAllAnnotations()` | 清除所有标注点（不动笔刷） |\n| `clearAllAnnotationsAndBrush()` | 清空所有点 + 笔刷（带 `confirm`） |\n| `clearBrush()` | 清空当前图层的笔刷 |\n| `clearAllBrushLayers()` | 清空所有图层的笔刷 |\n\n### 笔刷图层\n\n| 方法 | 说明 |\n|------|------|\n| `getCurrentLayer(): string` | 当前激活图层 value |\n| `setActiveLayer(value: string): boolean` | 切换到指定图层 |\n| `getAllLayers(): BrushLayerConfig[]` | 所有图层配置 |\n\n### 笔刷样式\n\n| 方法 | 说明 |\n|------|------|\n| `getBrushStyle(): BrushStyle` | 返回当前样式的拷贝 |\n| `updateBrushStyle(partial: Partial<BrushStyle>): void` | 动态更新（如颜色/透明度/大小） |\n\n### 点轨迹生成笔刷区域\n\n| 方法 | 说明 |\n|------|------|\n| `createBrushFromPoints(): boolean` | 按 `sequenceNumber` 顺序将点的像素坐标连成闭合多边形，使用当前笔刷样式填充；点数量 < 3 时不操作 |\n\n### 缩放\n\n| 方法 | 说明 |\n|------|------|\n| `zoomIn()` | 放大 |\n| `zoomOut()` | 缩小 |\n| `resetZoom()` | 重置到 100% |\n\n### 撤销 / 重做\n\n| 方法 | 说明 |\n|------|------|\n| `undo()` | 撤销上一步 |\n| `redo()` | 重做上一步 |\n\n### 导入 / 导出\n\n| 方法 | 说明 |\n|------|------|\n| `exportCanvasJSON(): string` | 全量导出（点 + 笔刷快照 + 图片信息） |\n| `importCanvasJSON(data: string \\| object): boolean` | 从导出的 JSON 恢复 |\n| `exportMaskImage(format?, fg?)`: `Promise<string \\| null>` | 当前图层 mask（dataURL） |\n| `exportMaskImageByLayer(layerValue, format?, fg?)`: `Promise<string \\| null>` | 指定图层 mask |\n| `exportAllMaskImages(format?, fg?)`: `Promise<Record<string, string>>` | 所有图层 mask |\n| `getMaskBlob(layerValue?, format?, fg?)`: `Promise<Blob \\| null>` | 当前/指定图层 Blob（后端上传） |\n| `getMaskFile(layerValue?, filename?, format?, fg?)`: `Promise<File \\| null>` | 当前/指定图层 File |\n| `getAllMaskBlobs(format?, fg?)`: `Promise<Record<string, Blob>>` | 所有图层 Blob 集合 |\n| `exportCOCO(): string` | 导出 COCO JSON（点标注 = keypoints） |\n| `exportYOLO(): string` | 导出 YOLO 标注 |\n\n> 参数说明：`format` = `'png' \\| 'jpeg' \\| 'jpg'`；`fg` = `'black' \\| 'white'`（mask 前景色）。\n> 注：所有 Mask/Blob/File 相关方法需在浏览器环境调用，且在 `enableBrush=false` 时返回 null/{}。\n\n---\n\n## 使用示例\n\n### 最小示例\n\n```vue\n<template>\n  <PointAnnotation\n    ref=\"annotationRef\"\n    v-model:image-source=\"imageSource\"\n    :options=\"{ enableBrush: false }\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { PointAnnotation } from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n</script>\n```\n\n### 完整自定义（隐藏内置工具栏）\n\n```vue\n<template>\n  <div class=\"my-toolbar\">\n    <button @click=\"() => annotationRef.value?.pointTool()\">点标注</button>\n    <button @click=\"() => annotationRef.value?.brushTool()\">笔刷</button>\n    <button @click=\"() => annotationRef.value?.eraserTool()\">橡皮</button>\n    <button @click=\"() => annotationRef.value?.deleteSelected()\">删除</button>\n    <button @click=\"() => annotationRef.value?.clearAllAnnotationsAndBrush()\">全部清空</button>\n    <button @click=\"() => annotationRef.value?.undo()\">撤销</button>\n    <button @click=\"() => annotationRef.value?.redo()\">重做</button>\n    <button @click=\"() => annotationRef.value?.createBrushFromPoints()\">点→多边形</button>\n    <button @click=\"uploadMask\">上传 Mask</button>\n  </div>\n\n  <PointAnnotation\n    ref=\"annotationRef\"\n    :image-source=\"{ url: 'https://example.com/image.jpg' }\"\n    :options=\"{ showToolbar: false, showZoomController: false }\"\n    @point-change=\"handlePoints\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { PointAnnotation } from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n\nfunction handlePoints(points: any[]) {\n  console.log('points:', points)\n}\n\nasync function uploadMask() {\n  const blob = await annotationRef.value?.getMaskBlob()\n  if (!blob) return\n  const fd = new FormData()\n  fd.append('file', blob, 'mask.png')\n  await fetch('/api/upload', { method: 'POST', body: fd })\n}\n</script>\n```\n\n### 多图层笔刷\n\n```vue\n<template>\n  <PointAnnotation\n    ref=\"annotationRef\"\n    :image-source=\"{ url: 'https://example.com/image.jpg' }\"\n    :options=\"{\n      brushLayers: [\n        { label: '前景', value: 'foreground', color: '#1890ff', opacity: 0.55 },\n        { label: '遮挡', value: 'occlusion',  color: '#faad14', opacity: 0.55 },\n        { label: '背景', value: 'background', color: '#52c41a', opacity: 0.55 }\n      ]\n    }\"\n    v-model:current-layer=\"activeLayer\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { PointAnnotation } from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\nconst activeLayer = ref('foreground')\n</script>\n```\n\n### 后端上传 Mask（Blob/File）\n\n```vue\n<template>\n  <PointAnnotation ref=\"annotationRef\" :image-source=\"{ url: '...' }\" />\n  <button @click=\"uploadAllMasks\">上传所有图层 Mask</button>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { PointAnnotation } from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n\nasync function uploadAllMasks() {\n  const blobs = await annotationRef.value?.getAllMaskBlobs('png', 'black')\n  if (!blobs) return\n  for (const [layerValue, blob] of Object.entries(blobs)) {\n    const fd = new FormData()\n    fd.append('file', blob, `${layerValue}.png`)\n    await fetch('/api/mask-upload', { method: 'POST', body: fd })\n  }\n}\n</script>\n```\n\n### 只启用点标注（禁用笔刷）\n\n```vue\n<template>\n  <PointAnnotation\n    ref=\"annotationRef\"\n    :image-source=\"{ url: '...' }\"\n    :options=\"{ enableBrush: false }\"\n    @point-change=\"handlePoints\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { PointAnnotation } from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\nfunction handlePoints(points: any[]) {\n  console.log('标注：', points)\n}\n</script>\n```\n\n### 套索工具（自由绘制闭合区域）\n\n套索工具用于自由绘制闭合区域并自动填充/擦除，与笔刷共享颜色、透明度和图层设置，支持撤销/重做。\n\n```vue\n<template>\n  <PointAnnotation\n    ref=\"annotationRef\"\n    :image-source=\"{ url: '...' }\"\n    :options=\"{\n      enableBrush: true,\n      lassoFixedSizeOnZoom: true,  // 套索轨迹保持固定屏幕大小（默认 true）\n      brushStyle: {\n        color: '#1890ff',\n        opacity: 0.55,\n        size: 100,\n      }\n    }\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport PointAnnotation from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n\n// 程序化切换到套索工具\nfunction useLasso() {\n  annotationRef.value?.lassoTool()\n}\n</script>\n```\n\n> **套索轨迹样式**：采用黑色 1px 主线 + 白色 3px 描边的高对比度设计，无论浅色还是深色背景都清晰可见。\n>\n> **`lassoFixedSizeOnZoom`**：控制套索轨迹是否随画布缩放而变粗。默认 `true`（固定屏幕像素大小，类似标注点的 `fixedSizeOnZoom`），设为 `false` 则线宽随画布缩放变化。\n\n### 图片旋转与翻转\n\n通过 ref API 对图片进行顺时针 90° 旋转、水平翻转或垂直翻转。变换会清空所有已有标注和笔刷数据，建议在标注前调整好图片方向。\n\n```vue\n<template>\n  <PointAnnotation\n    ref=\"annotationRef\"\n    :image-source=\"imageSource\"\n    @load-success=\"handleLoadSuccess\"\n  />\n  <div class=\"my-toolbar\">\n    <button @click=\"() => annotationRef.value?.rotateImage()\">↻ 顺时针 90°</button>\n    <button @click=\"() => annotationRef.value?.rotateImageLeft()\">↺ 逆时针 90°</button>\n    <button @click=\"() => annotationRef.value?.flipImage('h')\">⇆ 水平翻转</button>\n    <button @click=\"() => annotationRef.value?.flipImage('v')\">⇅ 垂直翻转</button>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport PointAnnotation from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n\nfunction handleLoadSuccess(info: any) {\n  console.log('当前文件：', info.file)       // 变换后的新 File\n  console.log('原始文件：', info.metaFile)   // 始终指向原始上传的文件\n}\n</script>\n```\n\n> **`file` vs `metaFile`**：\n> - `file`：当前图片文件。每次旋转/翻转后会替换为变换后的新 `File` 对象\n> - `metaFile`：原始未变换的图片文件。第一次变换时自动记录，后续变换保持不变\n> - 无需旋转/翻转时，`metaFile` 不存在，`file` 即为原始文件\n\n### 点标注前回调（beforeCreatePoint）\n\n```vue\n<template>\n  <PointAnnotation\n    ref=\"annotationRef\"\n    :image-source=\"{ url: '...' }\"\n    :before-create-point=\"beforeCreatePoint\"\n    @point-change=\"handlePoints\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport PointAnnotation from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst annotationRef = ref<InstanceType<typeof PointAnnotation> | null>(null)\n\n// 示例：限制最多 5 个点 + 只允许在图片右半部分创建 + 创建前二次确认\nasync function beforeCreatePoint(\n  x: number, y: number,\n  nx: number, ny: number,\n  count: number\n) {\n  if (count >= 5) {\n    console.warn('最多 5 个点标注')\n    return false\n  }\n  if (nx < 0.5) {\n    console.warn('只允许在右半部分标注')\n    return false\n  }\n  return window.confirm(`在 (${Math.round(x)}, ${Math.round(y)}) 创建第 ${count + 1} 个点？`)\n}\n\nfunction handlePoints(points: any[]) {\n  console.log('点列表：', points)\n}\n</script>\n```\n\n### 多实例双向联动（A ↔ B 点 hover/选中同步）\n\n当页面上有两个或多个 PointAnnotation 实例时，可通过 `point-hover` / `point-select` 事件 + `setPointHoverState` / `setPointSelectState` API 实现跨实例的点状态联动。推荐按 **sequenceNumber**（圆圈内显示的数字序号）匹配，因为它始终连续，不受删除/undo/redo 影响：\n\n```vue\n<template>\n  <div style=\"display: flex; gap: 20px\">\n    <div style=\"flex: 1\">\n      <h3>实例 A</h3>\n      <PointAnnotation\n        ref=\"refA\"\n        :image-source=\"{ url: imageUrlA }\"\n        @point-hover=\"(p, h) => onPointHover('A', p, h)\"\n        @point-select=\"(p, s) => onPointSelect('A', p, s)\"\n      />\n    </div>\n    <div style=\"flex: 1\">\n      <h3>实例 B</h3>\n      <PointAnnotation\n        ref=\"refB\"\n        :image-source=\"{ url: imageUrlB }\"\n        @point-hover=\"(p, h) => onPointHover('B', p, h)\"\n        @point-select=\"(p, s) => onPointSelect('B', p, s)\"\n      />\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport PointAnnotation from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst refA = ref<InstanceType<typeof PointAnnotation> | null>(null)\nconst refB = ref<InstanceType<typeof PointAnnotation> | null>(null)\nconst imageUrlA = '/demo-a.jpg'\nconst imageUrlB = '/demo-b.jpg'\n\n// 按 sequenceNumber（圆圈显示的数字序号）在目标实例中找到对应点\nfunction syncBySeq(targetRef: any, sourcePoint: any, apply: (pointId: string) => void) {\n  const target = targetRef.value?.findPointBySequenceNumber(sourcePoint.sequenceNumber);\n  if (target) apply(target.id);\n}\n\n// hover 双向同步\nfunction onPointHover(source: 'A' | 'B', pointData: any, isHover: boolean) {\n  const targetRef = source === 'A' ? refB : refA;\n  syncBySeq(targetRef, pointData, (targetId) => {\n    targetRef.value?.setPointHoverState(targetId, isHover);\n  });\n}\n\n// 选中状态双向同步\nfunction onPointSelect(source: 'A' | 'B', pointData: any, isSelected: boolean) {\n  const targetRef = source === 'A' ? refB : refA;\n  syncBySeq(targetRef, pointData, (targetId) => {\n    targetRef.value?.setPointSelectState(targetId, isSelected);\n  });\n}\n</script>\n```\n\n> **匹配规则说明**：\n> - 默认按 `sequenceNumber`（圆圈内显示的数字 1、2、3…）匹配，不受删除/undo/redo 影响\n> - 如需按 `id` 或其他字段匹配，只需替换 `syncBySeq` 中的查找逻辑\n> - `setPointHoverState` 是纯样式修改；`setPointSelectState` 通过 `app.editor.select` 同步 editor 内部选中集，二者均通过 `isExternalSelectSync` 标志避免双向循环\n\n### 删除联动最佳实践（推荐方案）\n\n不建议基于 `point-change` 事件做删除匹配（`sequenceNumber` 在删除后会重排，容易删错），推荐以下方案：\n\n```vue\n<template>\n  <div>\n    <!-- 双实例均隐藏工具栏 + 禁用组件内部快捷键 -->\n    <PointAnnotation\n      ref=\"refA\"\n      :image-source=\"{ url: imageUrlA }\"\n      :options=\"{ showToolbar: false, enableHotkeys: false }\"\n      @point-hover=\"(p, h) => onPointHover('A', p, h)\"\n      @point-select=\"(p, s) => onPointSelect('A', p, s)\"\n    />\n    <PointAnnotation\n      ref=\"refB\"\n      :image-source=\"{ url: imageUrlB }\"\n      :options=\"{ showToolbar: false, enableHotkeys: false }\"\n      @point-hover=\"(p, h) => onPointHover('B', p, h)\"\n      @point-select=\"(p, s) => onPointSelect('B', p, s)\"\n    />\n    <!-- 父组件统一删除按钮 -->\n    <button @click=\"deleteSelectedBoth\">🗑 删除选中</button>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted } from 'vue'\nimport PointAnnotation from '@zzalai/leafer-point-annotation'\nimport '@zzalai/leafer-point-annotation/dist/leafer-point-annotation.css'\n\nconst refA = ref<InstanceType<typeof PointAnnotation> | null>(null)\nconst refB = ref<InstanceType<typeof PointAnnotation> | null>(null)\n\n// hover 双向同步\nfunction onPointHover(source: 'A' | 'B', pointData: any, isHover: boolean) {\n  const targetRef = source === 'A' ? refB : refA\n  const target = targetRef.value?.findPointBySequenceNumber(pointData.sequenceNumber)\n  if (target) targetRef.value?.setPointHoverState(target.id, isHover)\n}\n\n// 选中状态双向同步\nfunction onPointSelect(source: 'A' | 'B', pointData: any, isSelected: boolean) {\n  const targetRef = source === 'A' ? refB : refA\n  const target = targetRef.value?.findPointBySequenceNumber(pointData.sequenceNumber)\n  if (target) targetRef.value?.setPointSelectState(target.id, isSelected)\n}\n\n// 统一删除：两端选中状态已经联动同步，分别调用 deleteSelected() 即可\nconst deleteSelectedBoth = () => {\n  refA.value?.deleteSelected()\n  refB.value?.deleteSelected()\n}\n\n// 双实例模式下：父组件监听 Delete 键，统一触发删除\nconst onAppKeyDown = (e: KeyboardEvent) => {\n  const target = e.target as HTMLElement\n  if (target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA')) return\n  if (e.code === 'Delete' || e.key === 'Delete') {\n    e.preventDefault()\n    deleteSelectedBoth()\n  }\n}\n\nonMounted(() => { window.addEventListener('keydown', onAppKeyDown) })\nonUnmounted(() => { window.removeEventListener('keydown', onAppKeyDown) })\n</script>\n```\n\n> **为什么推荐此方案**：\n> - hover/selected 状态通过 `point-hover` / `point-select` 事件双向同步，保证两端选中的点始终一致\n> - 删除操作由父组件统一执行，直接调用两个实例的 `deleteSelected()`，不依赖 `sequenceNumber` 或 `id` 匹配\n> - 不受删除后重排的影响，更可靠、更简单\n> - `showToolbar: false` 隐藏内置工具栏，`enableHotkeys: false` 禁用组件内部快捷键，避免 Delete 键触发两次删除\n\n---\n\n## 快捷键\n\n> 生效条件：**`options.enableHotkeys: true`** + (**画布获得焦点** 或 **鼠标 hover 在画布上**)\n>\n> `enableHotkeys` 默认 `false`，需显式传 `true` 才会绑定快捷键。\n\n| 按键 | 功能 | 限制 |\n|------|------|------|\n| `v` | 选择工具 | 需 `enableHotkeys=true` |\n| `p` | 点标注工具 | 需 `enableHotkeys=true` |\n| `b` | 笔刷工具 | 需 `enableHotkeys=true` + `enableBrush=true` |\n| `e` | 橡皮擦工具 | 需 `enableHotkeys=true` + `enableBrush=true` |\n| `l` | 套索工具 | 需 `enableHotkeys=true` + `enableBrush=true` |\n| `Ctrl + Z` | 撤销 | 需 `enableHotkeys=true` |\n| `Ctrl + Y` | 重做 | 需 `enableHotkeys=true` |\n| `Delete` | 删除选中的点 | 需 `enableHotkeys=true` |\n| `Ctrl + +` | 放大 | 需 `enableHotkeys=true` |\n| `Ctrl + -` | 缩小 | 需 `enableHotkeys=true` |\n| `Ctrl + 0` | 重置缩放 | 需 `enableHotkeys=true` |\n| `Alt` | 显示/隐藏快捷键提示浮层 | 需 `enableHotkeys=true` |\n\n---\n\n## 开发与构建\n\n```bash\n# 安装依赖\npnpm install\n\n# 本地开发（App.vue 为演示入口）\npnpm dev\n\n# 构建库产物（dist/）\npnpm build\n\n# 构建演示站点（docs/）\npnpm docs:build\n\n# 同时构建库 + 演示站\npnpm build:all\n\n# 类型检查\npnpm tsc --noEmit\n```\n\n### 项目结构\n\n```\nsrc/\n├── components/\n│   ├── PointAnnotation.vue        # 核心主组件（所有能力整合）\n│   ├── BrushSizeSlider.vue        # 笔刷大小滑块\n│   └── BrushStylePanel.vue        # 笔刷样式面板\n├── elements/\n│   └── PointAnnotationElement.ts  # 自定义点元素（Group + Ellipse + Text）\n├── utils/\n│   ├── CanvasBrush.ts             # 笔刷底层（canvas + 绘制快照）\n│   ├── LassoOverlay.ts            # 套索工具（自由绘制闭合区域，黑白双线高对比度）\n│   ├── ImageTransformer.ts        # 图片变换工具（旋转 90°、水平/垂直翻转，Canvas 2D 实现）\n│   ├── BrushCommands.ts           # 笔刷撤销命令\n│   ├── PointCommands.ts           # 点撤销命令\n│   ├── BrushStroke.ts             # 笔画数据\n│   ├── COCOExporter.ts            # COCO 导出\n│   └── YOLOExporter.ts            # YOLO 导出\n├── types/\n│   └── index.ts                   # 所有对外类型与默认值\n├── App.vue                        # dev 演示页\n├── index.ts                       # 对外导出\n└── main.ts                        # dev 入口\n```\n\n### 发布流程\n\n1. `pnpm install` → `pnpm build:all`\n2. 确认 `dist/` 与 `docs/` 最新\n3. 更新 `package.json` 的 `version`\n4. `npm publish`\n5. `git push` 到 GitHub（触发 Pages 重新部署）\n\n---\n\n## 许可证\n\nMIT © zzalai\n","readmeFilename":"README.md"}