{"_id":"@caipira/vue-reader","_rev":"15-b26407d27696cb45bc51d5f21fdf9081","name":"@caipira/vue-reader","dist-tags":{"latest":"0.0.15"},"versions":{"0.0.1":{"name":"@caipira/vue-reader","version":"0.0.1","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.1","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"afd2cc2e3e8fe47fe47d0aa24a7dc5a1a4906e7d","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.1.tgz","fileCount":64,"integrity":"sha512-K8w28VsatazMMvqrDHL/EAkRl3iwwkX8Mi9OXO+X78s3XGrZtogo/VGYIas3NzhCk5WPSrZj5lTlAnjFkVWFAQ==","signatures":[{"sig":"MEYCIQCtgcfpFfRk1Q9R4m5lfYo93hTu+4p8r7t+7I6Ba9qhhAIhAKprI3CEhhyFmjHBmYCnrgiu+TPg3VY4JeFDoDtjeIsE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5925798},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"ecc66179af6a572adc3a1ceb52c5fe197c9711bc","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"theonelucas","email":"theone@caipira.io"},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"11.6.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.11.1","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.2.0","@readium/navigator":"2.5.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.1_1779615549034_0.5507805628747806","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@caipira/vue-reader","version":"0.0.2","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.2","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"89c07a09cea0f96e1a40f0dc64d39bd4b3e552f4","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.2.tgz","fileCount":64,"integrity":"sha512-67oGTYFvjDMcwJsmVLrOBd6wtSZ8B8qp9MFK6SGXu5GMwqJgOwdyu01mfI1C4wrjYgHjSoe+K235xKby4wc8mA==","signatures":[{"sig":"MEQCIBAYh+ilJpS+zg0O0wOARmZ4MRp5dlngR0FTqd6Vof/rAiBXr0viqK6bCqvVNBOQjQNpQFMTXpa2ZliDv2dG61N6fg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5925799},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"bde3b908a1b20715db7e7f59f10c02e632c111fd","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"11.15.0","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.15.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.2.0","@readium/navigator":"2.5.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.2_1779616317365_0.3730714075476329","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@caipira/vue-reader","version":"0.0.3","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.3","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"47dbee309ea0bcd0036cd475ada2741779999f06","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.3.tgz","fileCount":54,"integrity":"sha512-9MX/lLc1M/Fn3ZFKfSDm1IYRC0wL5BuqZgwr60xifOPw8jz5lG9MlHiHyhGo375UWRb/Eguy1iHsUTsUjbimGw==","signatures":[{"sig":"MEUCIEWPkY8r4edA00XSzukyoW0AB0Ve9a4oAqzdS3lT7VbSAiEApBjVTsEmLmUslZ+qso4O4qyjszgTY4TinOhVHa0F8tM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1931675},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"7812241617ea0dda06a0ca44560a24c42d319294","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"11.15.0","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.15.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.2.0","@readium/navigator":"2.5.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.3_1779627881562_0.3160507997408071","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@caipira/vue-reader","version":"0.0.4","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.4","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"61d319e2700499631d326047ef2882fa5e73ca58","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.4.tgz","fileCount":54,"integrity":"sha512-d9ouo5enMP5uABAFhOZ30p0wPtMNxwXKMkVuVrZf5QK7yDGo6hz1G4yvXLyAg7qf0wAF67T11vsOVV+6EiTSAw==","signatures":[{"sig":"MEQCIAxcPetFTvtLUQTvGCNbK4JP70NeqN1btzOstBnBTjo+AiB758CJfC2nn1NbiIvxKfO4J6HioeDdtxTO3KTcfMxODw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1930885},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"0824c15d092b631b646eac29fce14b84b11b7642","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"11.15.0","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.15.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.2.0","@readium/navigator":"2.5.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.4_1779632726891_0.6313470124785374","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@caipira/vue-reader","version":"0.0.5","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.5","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"187f89afe0b7440c0eed18cd8c23732fa3315fa4","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.5.tgz","fileCount":54,"integrity":"sha512-ghVhIYEq7pWxDHE8riEPrQn6yMzakw0fp0kK0ziKtrm4Ijcl/LDHFqbL8HN90qj+bXJaedm0+3z/8Yah02uRkw==","signatures":[{"sig":"MEUCIQCXhRdkRe34VhpYwGoNEYp/eegMHNT/j+DVk80XG3eAuQIgHhvaU2KJFaae7qmW4xPzrHUAYVC4oKRiYryKgtTuWVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1930981},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"4263af5e8e4616b94a27f4805783055491dc24e0","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","build:wasm":"make -C ../vue-reader/wasm-streamer wasm WASM_DIR=../../ui/public/wasm","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"11.16.0","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.16.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.2.0","@readium/navigator":"2.5.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.5_1780081669639_0.9111153855123051","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@caipira/vue-reader","version":"0.0.6","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.6","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"e34032f4e243ecff1ac0332625a3432ca5508eef","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.6.tgz","fileCount":48,"integrity":"sha512-QNBwlU5GTY7Y6LHBOYWOMsh21SBYx2cRixsmlagA2UO0g/0TM5li/FsZvcZIGTiR+vos3ufa7g30LrYVM6Sb/g==","signatures":[{"sig":"MEQCIEnFu4R4n2Yhd9B3kDefYwNPZnVdVTr09F9KziZAg73iAiAcn0A10yLSdLlwZHzpsyrHjt3r/gUHQI8+LzxneJxg5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1615891},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"3216df1b6e4cb69d1b25c39c2f5976f5111839ef","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.1","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.18.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.6_1785336193297_0.7796766997914284","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@caipira/vue-reader","version":"0.0.7","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.7","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"43a6eb4a329c8468f5e1cdc29719a9e040b81456","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.7.tgz","fileCount":48,"integrity":"sha512-dUbosslUhyNgksbWE9sJHvLZCIpCjdRzvfvEejp50a/m5GlVHefOENWBsn8L76E03OyLsBoxP0wrCkOIWBHxyg==","signatures":[{"sig":"MEYCIQDvtOfJ3D1N65eN0NzJDC84dJdWBA7uD3/TSZ4XTWJQAQIhAOk17OKo+UqCr7cH36jy1L+CNxjHfd3/SxnKe5z4p74x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1613628},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"30d8092bf62afa8cba96f131ca8d3d98a362a84b","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.18.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.7_1785394549692_0.3557096865636109","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@caipira/vue-reader","version":"0.0.8","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.8","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"32e39d16b7812b7d452643ac831e64da7fd500f4","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.8.tgz","fileCount":48,"integrity":"sha512-dmmjS9sknxC7RaNMVwVIXaGSBOe8SFXVA89sUnU9XdMaT13a+q7uKVSyO0KZJ3GcUrJ+hWr8fRK7U7BGt1UjgA==","signatures":[{"sig":"MEUCIQCUILY9lPbY6J4xiBZjEMzsgnSFSc6mJM7kirSX3m9X8wIgAqVtsb7XYUrT/cZJVCETX2c5l6YNi/tVZQgZmTmAB68=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1614167},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"06286d47d599c1951cf9469510c6f472db98c64e","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.18.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.8_1785701047679_0.01169169039365281","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@caipira/vue-reader","version":"0.0.9","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.9","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"5fd1931580d4b88b4abcc874ea7ad2e9bcc52cc5","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.9.tgz","fileCount":48,"integrity":"sha512-0Tk0LDQimL7EcFPsG/Ozz7THIHefivGb7UkMGph+XUq7Qr4MZ2Ca3Jwl0zayVPC1X+6DnuJlhVvr0w346MX5kw==","signatures":[{"sig":"MEUCIB1vTnr+WYGm865ycgV+Qnp6GOqUeSZj7FQpv5k5OnT7AiEAqcHFI8V7Cg5d/qgfkwDDz4yR3ja3s/1Zpp7Hz2toxTI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1614533},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"},"./package.json":"./package.json"},"gitHead":"e03a9d3c234f7500d5a904f6452d24ede25e66da","private":false,"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.18.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.9_1786461025591_0.5195450330117999","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@caipira/vue-reader","version":"0.0.10","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.10","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"8e3ae29f615b28678065db3c8c29f42b984b41d9","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.10.tgz","fileCount":50,"integrity":"sha512-8YYFEVR2YysRF/RoJAUDTmdMdc3+Y2GKNZxmlDyP0k3NYQLT0YeoJu/sfgwIf1XrLT2ny+thsf/2Uc8zi6fupA==","signatures":[{"sig":"MEUCIQDReSNXYbomCaavjIhr46uhFom7dnlsHXw0A49M6Wc7YQIgFeZEf9ZB8D7suF0zso83/vcdLkIUnvoDqXnmo28FF0A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1624011},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"},"./package.json":"./package.json"},"gitHead":"abf9604e03949109b0b4de165a28b1f91045a4b0","private":false,"scripts":{"test":"vitest --run","build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","format":"prettier . --write","dev:test":"vitest","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.19.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^8.2.1","jsdom":"^24.1.3","vitest":"^4.1.10","prettier":"^3.9.6","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24","@vue/test-utils":"^2.4.11","@vitejs/plugin-vue":"^6.0.8"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.10_1786517339056_0.6948816863029235","host":"s3://npm-registry-packages-npm-production"}},"0.0.11":{"name":"@caipira/vue-reader","version":"0.0.11","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.11","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"3a0239bcd752c09b5c4fe2196c6ad55188f53b0f","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.11.tgz","fileCount":50,"integrity":"sha512-msRHo8Rbi890G4L17vTLB/7gDUKr+gZmcfFP2JAUV/O/RTKqGKzUgZxdgsqgBsGunndtCx6Ob1azeo9HJdT89w==","signatures":[{"sig":"MEUCIQCOIIjZMYr5HyQQvorIZfie2tyFFxsempONGahtK8VzCwIgEN7qEVSBzCRH6HaGlDP9w2RxSBTTzSoHLml06x+yuic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1631241},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"},"./package.json":"./package.json"},"gitHead":"eb66332e6b4c8968da9abd53f10ac372f2ad6f9e","private":false,"scripts":{"test":"vitest --run","build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","format":"prettier . --write","dev:test":"vitest","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.19.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^8.2.1","jsdom":"^24.1.3","vitest":"^4.1.10","prettier":"^3.9.6","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24","@vue/test-utils":"^2.4.11","@vitejs/plugin-vue":"^6.0.8"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.11_1787933802815_0.00599895524999261","host":"s3://npm-registry-packages-npm-production"}},"0.0.12":{"name":"@caipira/vue-reader","version":"0.0.12","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.12","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"621ded5846758510f9510524b52d312be6f0171e","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.12.tgz","fileCount":56,"integrity":"sha512-w1Cb/k1rePSbdvb1RSYXEgDjLl+gksIqPP8kJORCqsLLt8QRS1VBrQqvd3igHZvY3/4C01G8IEVigCGjz9J3YQ==","signatures":[{"sig":"MEQCICmJ/Ai6ujKobWBWp5hb9nPYV6a3Igms3I4XeRMc1dd0AiB2SIQWf7B+VoodSmZoDqEO2eueuf8Wt7mK6JdlQP4p2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1652766},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"},"./package.json":"./package.json"},"gitHead":"ea5be651104a8a5ecc6ad51793ab5e93249984ef","private":false,"scripts":{"test":"vitest --run","build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","format":"prettier . --write","dev:test":"vitest","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.19.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^8.2.1","jsdom":"^24.1.3","vitest":"^4.1.10","prettier":"^3.9.6","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24","@vue/test-utils":"^2.4.11","@vitejs/plugin-vue":"^6.0.8"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.12_1788115805630_0.4442031291507422","host":"s3://npm-registry-packages-npm-production"}},"0.0.13":{"name":"@caipira/vue-reader","version":"0.0.13","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.13","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"d0a46a7e3b788926638f368fe553b7b445818110","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.13.tgz","fileCount":56,"integrity":"sha512-EjKkxV5+dfrNpHkKCgp7dXOPFTVZP+KrT4aXbHD8se1NuL9TSHUIdLMG5ymZEMVG3hp8DZlabbIkZi1lkF33jw==","signatures":[{"sig":"MEUCIQC4nD2rWJzX2WLI7lKRHaL1GOtkeMplNsvo6bsttxJYUwIgPV11ZoRnyCySUMde6pg3YIH/Qm2x+I3U6gNMn96CA8Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1655239},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"},"./package.json":"./package.json"},"gitHead":"455c22c185bc55a0ad18f313b264da9ce1f4567c","private":false,"scripts":{"test":"vitest --run","build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","format":"prettier . --write","dev:test":"vitest","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.19.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^8.2.1","jsdom":"^24.1.3","vitest":"^4.1.10","prettier":"^3.9.6","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24","@vue/test-utils":"^2.4.11","@vitejs/plugin-vue":"^6.0.8"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.13_1788294922189_0.2054184019584837","host":"s3://npm-registry-packages-npm-production"}},"0.0.14":{"name":"@caipira/vue-reader","version":"0.0.14","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"_id":"@caipira/vue-reader@0.0.14","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"homepage":"https://github.com/caipira-io/vue-reader#readme","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"0073f159c9371f3a0bc29d399c530328caa33bbe","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.14.tgz","fileCount":56,"integrity":"sha512-co5vVrpCJJ9DCu21I1YeyTdqgb6QPXB+v7vC9sWTl3bU5e911IzJlk2vEJIVl0uViDtFD2BNKLQv7uuLQDNoHw==","signatures":[{"sig":"MEYCIQDgsfN6wNCNXx1poqsOBA8QD8sVpItPRcBGgvD4IQHzewIhANZjaulbVi2SgoLjzZPMuNxbB1B8TDadoI9iSMQnybT5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1655904},"main":"./dist/src/index.js","type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"},"./package.json":"./package.json"},"gitHead":"a9bccca20a7d9510469c878ab44571cffc4c5062","private":false,"scripts":{"test":"vitest --run","build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","format":"prettier . --write","dev:test":"vitest","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"_nodeVersion":"24.19.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^8.2.1","jsdom":"^24.1.3","vitest":"^4.1.10","prettier":"^3.9.6","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24","@vue/test-utils":"^2.4.11","@vitejs/plugin-vue":"^6.0.8"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-reader_0.0.14_1788366268743_0.8257475581756313","host":"s3://npm-registry-packages-npm-production"}},"0.0.15":{"_id":"@caipira/vue-reader@0.0.15","bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"dist":{"shasum":"37a9adf3d71a61a0bce5e7d6f2e571fa676588e1","tarball":"https://registry.npmjs.org/@caipira/vue-reader/-/vue-reader-0.0.15.tgz","fileCount":56,"integrity":"sha512-OUwUxl9pMgphkIZTUjvSi07M0bK1Ih9fVW/uqzwIK3wc7dcvi8S8Z+4AORrbpX/NJl++xk4IgfQrvg1bEBpNSw==","signatures":[{"sig":"MEYCIQDXogFNB0BxIpo0DWcERpGd0fEeQbPxprxiJfwqGQ+gwAIhALgYL/LqwP4Fu2bkd0Lrq1Na0fDezRK5ouziyuXukErz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCgaOn8zVvDRfu9gQ/y2NuJD8yOLIOQVmpoe77b6qYnHQIgaupgylk/lsZaKTj8MH4AKc4/KcBixJyM8VRf4QUeHQk="}],"unpackedSize":1655750},"main":"./dist/src/index.js","name":"@caipira/vue-reader","type":"module","types":"./dist/src/index.d.ts","author":{"name":"Theone Lucas","email":"theone@caipira.io"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"},"./package.json":"./package.json"},"gitHead":"0b7dec5d278f79d9fad6c042bd2fa0930d5a346f","private":false,"scripts":{"test":"vitest --run","build":"npm run clean && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","clean":"rm -rf dist","format":"prettier . --write","dev:test":"vitest","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"version":"0.0.15","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cb352d85-4264-4977-a21d-8b9fe8181ef8"}},"homepage":"https://github.com/caipira-io/vue-reader#readme","repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless e-book reader toolkit for vue","directories":{},"maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"_nodeVersion":"24.19.0","dependencies":{"jszip":"^3.10.1","lodash":"^4.18.1","@readium/shared":"2.4.0","@readium/navigator":"2.8.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.13","vite":"^8.2.1","jsdom":"^24.1.3","vitest":"^4.1.10","prettier":"^3.9.6","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^20.16.5","@types/lodash":"^4.17.24","@vue/test-utils":"^2.4.11","@vitejs/plugin-vue":"^6.0.8"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vue-reader_0.0.15_1788457409060_0.44029464298760734"}}},"time":{"created":"2026-05-24T09:39:08.901Z","modified":"2026-09-03T17:43:29.444Z","0.0.1":"2026-05-24T09:39:09.225Z","0.0.2":"2026-05-24T09:51:57.490Z","0.0.3":"2026-05-24T13:04:41.727Z","0.0.4":"2026-05-24T14:25:27.068Z","0.0.5":"2026-05-29T19:07:49.795Z","0.0.6":"2026-07-29T14:43:13.460Z","0.0.7":"2026-07-30T06:55:49.846Z","0.0.8":"2026-08-02T20:04:07.829Z","0.0.9":"2026-08-11T15:10:25.768Z","0.0.10":"2026-08-12T06:48:59.222Z","0.0.11":"2026-08-28T16:16:42.959Z","0.0.12":"2026-08-30T18:50:05.788Z","0.0.13":"2026-09-01T20:35:22.381Z","0.0.14":"2026-09-02T16:24:28.889Z","0.0.15":"2026-09-03T17:43:29.272Z"},"bugs":{"url":"https://github.com/caipira-io/vue-reader/issues"},"author":{"name":"Theone Lucas","email":"theone@caipira.io"},"homepage":"https://github.com/caipira-io/vue-reader#readme","repository":{"url":"git+https://github.com/caipira-io/vue-reader.git","type":"git"},"description":"Headless e-book reader toolkit for vue","maintainers":[{"name":"theonelucas","email":"theone@caipira.io"}],"readme":"# @caipira/vue-reader\n\nHeadless reader toolkit for Vue 3.\n\nThis package provides a set of tools for creating your own custom reader. It currently supports:\n\n- Raw text\n- EPUB\n\n## What is included\n\n- Headless epub reader via `useEpubReader`, `useEpubReaderState` and `useEpubReaderNavigation`\n- Colors hook `setReaderColors`\n- Dictionary integration hook `setReaderDictionary`\n\n## Install\n\n```bash\nnpm install @caipira/vue-reader\n```\n\n## Usage\n\n### Script:\n\n```ts\nimport { useTemplateRef } from 'vue';\nimport {\n    useEpubReader,\n    setReaderColors,\n    useEpubReaderState,\n    useEpubReaderNavigation,\n} from '@caipira/vue-reader';\n\nconst epubSrc = 'https://example.com/book.epub';\nconst containerRef = useTemplateRef<HTMLDivElement>('containerRef');\n\nsetReaderColors({\n    background: '#0f172a',\n    text: '#f8fafc',\n    highlight: '#facc15',\n});\n\nconst reader = useEpubReader(() => epubSrc, containerRef);\nconst { error, loading } = useEpubReaderState();\nconst { goForward, goBackward } = useEpubReaderNavigation();\n```\n\n### Template:\n\n```html\n<section class=\"w-full flex justify-between\">\n    <button\n        icon=\"chevron-left\"\n        @click=\"goBackward\"\n    />\n    <button\n        icon=\"chevron-right\"\n        @click=\"goForward\"\n    />\n</section>\n\n<div\n    ref=\"containerRef\"\n    class=\"h-full w-full overflow-hidden\"\n    :class=\"{ 'opacity-0': loading || error }\"\n/>\n```\n\n## Dictionary API\n\nThe reader uses your dictionary adapter to classify words as `known` or `unknown`.\nUnknown words are highlighted automatically in the viewport.\n\nImplement and register a dictionary adapter:\n\n```ts\nimport type {\n    ReaderDictionaryApi,\n    ReaderDictionaryWordStatus,\n} from '@caipira/vue-reader';\nimport { setReaderDictionary } from '@caipira/vue-reader';\n\nfunction createDictionary(): ReaderDictionaryApi {\n    const cache = new Map<string, ReaderDictionaryWordStatus>();\n\n    return {\n        async classifyWords(language, lemmas, contextKey) {\n            // Load/sync dictionary data for `language` once, then classify lemmas.\n            // `contextKey` can be used as a cache partition key.\n            const result = new Map<string, ReaderDictionaryWordStatus>();\n\n            for (const lemma of lemmas) {\n                const status = cache.get(lemma) ?? 'unknown';\n                result.set(lemma, status);\n            }\n\n            return result;\n        },\n        clear() {\n            cache.clear();\n        },\n    };\n}\n\nsetReaderDictionary(createDictionary());\n```\n\n### Contract\n\n- `classifyWords(language, lemmas, contextKey)`\n  Returns a `Map<lemma, 'known' | 'unknown'>`.\n- `clear()`\n  Clears adapter caches when reader state is torn down.\n\n## Word highlighting and lookup flow\n\nWhen a dictionary is registered with `setReaderDictionary(...)`:\n\n- Unknown words are highlighted automatically.\n- Selecting a single word triggers a lookup, whatever the device raises the selection with: a double click, a long press, a drag. A selection holding more than one word is left alone.\n\nYou can handle lookup events by extending your dictionary object with an optional `onWordLookup` callback (matching the UI integration):\n\n```ts\nimport type { ReaderDictionaryApi } from '@caipira/vue-reader';\nimport { setReaderDictionary } from '@caipira/vue-reader';\n\nconst dictionary = createDictionary() as ReaderDictionaryApi & {\n    onWordLookup?: (payload: { language: string; word: string; context: string }) => void;\n};\n\ndictionary.onWordLookup = ({ language, word, context }) => {\n    // Open your dictionary UI (drawer/modal/popover) and query definitions.\n    openDictionaryDrawer({ language, word, context });\n};\n\nsetReaderDictionary(dictionary);\n```\n\nThe `context` value contains nearby text around the clicked word, useful for disambiguation.\n\n## Public API\n\n- `useEpubReader(src, containerRef, options)`\n- `useEpubReaderState()`\n- `useEpubReaderNavigation()`\n- `setReaderColors({ background, text, highlight })`\n- `setReaderDictionary(dictionary)`\n- `useReaderDictionary()`\n\n## Adapters\n\n### Preferences adapter\n\nUse `preferences` to load and persist reader settings from your app-specific store.\n\n### Storage adapter\n\nUse `storage` to override default sessionStorage-based locator persistence.\n\n```ts\nimport type { Locator } from '@readium/shared';\nimport type { ReaderStorageAdapter } from '@caipira/vue-reader';\n\nconst saved = new Map<string, { locator?: Locator; percentage?: number }>();\n\nconst storage: ReaderStorageAdapter = {\n    savePosition(key, locator, progress) {\n        // `progress.percentage` is 0..1, not 0..100.\n        saved.set(key, { locator, percentage: progress?.percentage });\n    },\n    restorePosition(key, publication, positions) {\n        const state = saved.get(key);\n\n        if (state?.locator) {\n            return state.locator;\n        }\n\n        if (state?.percentage === undefined) {\n            return undefined;\n        }\n\n        // A percentage synced from a device: the nearest resource start is where it is.\n        let nearest: Locator | undefined;\n        let shortest = Infinity;\n\n        for (const position of positions) {\n            const at = position.locations.totalProgression;\n\n            if (at === undefined) continue;\n\n            const distance = Math.abs(at - state.percentage);\n\n            if (distance < shortest) {\n                shortest = distance;\n                nearest = position;\n            }\n        }\n\n        return nearest;\n    },\n};\n```\n\n#### Contract\n\n- `savePosition(key, locator, progress?)`\n  Called whenever the reading position changes.\n    - `progress.percentage` is how far through the whole book the reader is, on a\n      **0..1 scale** — not 0..100. This is the scale devices such as KOReader keep\n      their own progress on, so a position saved here and one synced from a device\n      are directly comparable. Store it as-is and multiply only for display.\n    - `locator.locations.totalProgression` is that same number, and\n      `locator.locations.progression` is how far through its own resource the\n      reader is.\n- `restorePosition(key, publication, positions)`\n  Called once per book opened, before the navigator is created; return the locator\n  to open at, or `undefined` to open the book at its start.\n    - `positions` is the publication's generated positions list. An adapter that\n      holds nothing but a percentage — a position that came from a device rather\n      than from this reader — uses it to map that percentage back onto a locator.\n    - The list holds one locator per resource in the reading order, each carrying\n      that resource's `position` and, in `locations.totalProgression`, where the\n      resource starts on the same weighted **0..1 scale** `savePosition` hands a\n      percentage out on. Invert a percentage by taking the locator whose\n      `totalProgression` is nearest it, as above — that places a reader in a\n      resource rather than on a page.\n    - A resource the reader cannot place carries no `totalProgression`. Skip those\n      rather than reading them as the start of the book.\n\nBoth calls are synchronous. An adapter backed by a server should load its state\nbefore the reader mounts and write behind, so nothing the reader does waits on\nthe network.\n\n## Build\n\n```bash\nnpm run typecheck\nnpm run build\n```\n","readmeFilename":"README.md"}