{"_id":"@zakkster/lite-charts","_rev":"27-6a7f1a77b5c7f8fb4c4bd6cdf1591100","name":"@zakkster/lite-charts","dist-tags":{"latest":"1.24.0"},"versions":{"1.0.0":{"name":"@zakkster/lite-charts","version":"1.0.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.0.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"b6b17ab3e37f783f26561807b954b6b7a80bbe05","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.0.0.tgz","fileCount":6,"integrity":"sha512-Co4emCRydFlOqg2PRkAk0Um9fNIfcZXTjXfjCNsJkWM4GDQL1eq+Y3WDia/0oHjsmKUKQ0uyI5Z7Q9vH0xqV8A==","signatures":[{"sig":"MEYCIQDkiNlI8eJenuFd6/FGQIQ7JKIqTpNtoknzrafwWEvWEAIhAItCtlF5y9HoanvyKk4lWXTbNd6IC0WziEVGqiD+bK8R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":286203},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"scripts":{"test":"node --test --test-reporter=spec","bench":"node --expose-gc bench/line-100k.mjs","test:gc":"node --expose-gc --test --test-reporter=spec"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"11.15.0","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"23.5.0","_hasShrinkwrap":false,"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.5"},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.0.0_1780960885419_0.9040375607315043","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@zakkster/lite-charts","version":"1.1.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.1.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"e01feef0fa965817a32e5eb6b890a9b7b5da9190","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.1.0.tgz","fileCount":7,"integrity":"sha512-nI7rnxbbT9Z5f9YmhQH5LwhTBTvx1pbIc4CdgoNN1038QmFhkzrS3EK1o9QaTBD+PYKmcBScIFS9cg1hvuCynA==","signatures":[{"sig":"MEUCIEYMTY7cOfTEavVVD+MyqKjQ+nuB49Z67wWEgrZVUv77AiEAr1AFbobaM+hhHy3koCbV8Nr6WPoHHtbopDexE85JsiA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":363974},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"cd6e50555ace4ce6fd2a293d459e6c63a0f75f47","scripts":{"demo":"node demo/serve.js","test":"node --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","test:gc":"node --expose-gc --test --test-reporter=spec test/*.test.js"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"11.15.0","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"23.5.0","_hasShrinkwrap":false,"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.5"},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.1.0_1781327454203_0.022911852239127173","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@zakkster/lite-charts","version":"1.2.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.2.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"7f504722606d06d658d1be7b9b3d1e7a0a0c5029","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.2.0.tgz","fileCount":8,"integrity":"sha512-vHwF7VRwg6svrCeBu3giyAtaNZzXZBWL4YCdkISOdSiNPoa3ZKQg87KLu9R+hMjOmhEq/J5YiILwFzhzmygA1g==","signatures":[{"sig":"MEUCIQC2PsFxKtAPiZ4J9qfkfgWeFzTLP4GzfcSpHUWoEseZSgIgQweUVi5TyuhLDLafyWOD+bUJpGNh5kf82AcI7MZ66W4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":465865},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"952b01f15771a3427f392b38266f78f24094e0b7","scripts":{"test":"node --expose-gc --test --test-reporter=spec","bench":"node --expose-gc bench/line-100k.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"11.15.0","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"23.5.0","_hasShrinkwrap":false,"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.2.0_1782765524637_0.36416235348985637","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@zakkster/lite-charts","version":"1.4.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.4.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"6e6743159d8a062e432662b3ad90742db3c8701a","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.4.0.tgz","fileCount":8,"integrity":"sha512-AVAl9MnmMgf/u1PUU6Hlf6JbQyGibSPZmUROrAkuH/yqvm1qohSIVcQO0S5h4DJzQVwZSMH7fc8BJ2OPr8G/eQ==","signatures":[{"sig":"MEUCIGU02jMmMoUNmrp2YUQw0pTvwtWIciRoqesP3cWQDl05AiEAoW6CnEUgebFZQoQPzVPBRat0pnozWPLnsebqx8mqf7M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":575752},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"babacda983fef44e85adea6f261692f9896f088f","scripts":{"test":"node --expose-gc --test --test-reporter=spec","bench":"node --expose-gc bench/line-100k.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"11.15.0","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"23.5.0","_hasShrinkwrap":false,"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.4.0_1783226124117_0.02859679129008641","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@zakkster/lite-charts","version":"1.4.1","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.4.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"6266ac6dd1e6a95c55a8eacfe88dbcf8cf6955bb","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.4.1.tgz","fileCount":8,"integrity":"sha512-p1+KmA6JFc1+ZdJeXcMGXFC2nzbzaRb6FMvUvAM8bKuJAQ690ZJ1DT/Dq/+w+1I4Z65gV0OQswvuD5YdSMJ/7g==","signatures":[{"sig":"MEYCIQCcziRcMAjKaKlIXJPcwW+tuejs2jQBvWBmcYlO6dn7TgIhAPgjrJxzqMqKJBWBHzC9+O+MI7wFkeI9ZjqwDOXkBYAR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":594441},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"fd6eceb735dcb55a4bc1d46b522eafc308bd4f60","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"11.16.0","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.4.1_1785531209873_0.35057147065701466","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@zakkster/lite-charts","version":"1.5.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.5.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"89e72e6bc1815b6355fe403cb04200bb2dc53a13","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.5.0.tgz","fileCount":8,"integrity":"sha512-q63Mirv55CU515Lo93QvxUOeA1zQFPEO42xbcpQKyVAY0uNNKhWMIoZrvsHEjTOAuSV7FrU64qdVIfpH97mlDw==","signatures":[{"sig":"MEQCIGBOtSBO71N5YjPbO+saQCIywWTaBUOngD1+EuwRCAL4AiBQzKbAg27bR7omyNPP+mybY64fRlMaOupv0K8D4IchOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":638454},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"481066d57b331fa1ef7bb5a4b73e9c6c2e31fd85","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.5.0_1786753334738_0.8420542080297782","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@zakkster/lite-charts","version":"1.5.1","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.5.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"b442cbbf59c78eab760093008b3bde7f7a821472","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.5.1.tgz","fileCount":8,"integrity":"sha512-L4k1hdfWUTDhw1NAWHTMqOQ7alJ//zqUWbEnG5V7ssvodKusQspN/gJkgC2UDl7rz7YZUgYiBTqWLz9pw7MZfg==","signatures":[{"sig":"MEUCIE9T7X+2Ep0P+LhC4Ghw8r4xhe4BgfQTC06UjJqoAmFVAiEAuelwzBONj+oHU0GKzQsBaP+LJhLLQh7VJvVSuIeVKdU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":644178},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"40d4a489de07b27f2937448e63149d9dcabf9174","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.5.1_1786828352068_0.6399639259396146","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@zakkster/lite-charts","version":"1.6.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.6.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"dd845b403c2d11151f0c7ad60c8dc65b48988e34","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.6.0.tgz","fileCount":8,"integrity":"sha512-x8h/6LSiob5sWZFeRhQAdTwIoLvFYbZpKTRkQ4VLEMq7j47Y9JA71zNFkIhDAVPD8XGQn69HSYiRSg3FgiFtfA==","signatures":[{"sig":"MEYCIQCJzCy+PUS0tZTPdaPkPk+g3W6U+t67zrz9VsOXjvc8YQIhAMThdV79IYqdrKmE5hRGTgAoTInRotteTfepF+rqUxcd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":653295},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"5e5db37533a22711abbb164c71de47a7515d7172","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.6.0_1786924876059_0.48970420249097546","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"@zakkster/lite-charts","version":"1.6.1","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.6.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"981fda5c26f00962c2975d699ddbdc02372c985a","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.6.1.tgz","fileCount":8,"integrity":"sha512-3HZd8qPwi2yTUTVoDzQjOYUG3JeIcbsZTrxgcEBWqHWtYcn+G1IysZHgdpvZU1dIiTxLAncviqfJSl/kNjuFFQ==","signatures":[{"sig":"MEUCIQCxHWnz6s4NvI/yzreCmU6Zsag+itcE162fbvW/r+xwvQIgNIzc4qgz/2J2sx6bCWGkXONvlEbn2+6diXMIFeQpBOg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIErrKNJBTU3uiMsB1ep108EnlqlmbEO4dvOC3LCB7VDXAiALiv6+1KI3Yi16JYSIQEtPkwBZC2hqhoNZocwIrmDu/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":661602},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"35b59dc2e2dd4f150f5ca598be749569b2ea41ce","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.6.1_1787267607585_0.9675970663938274","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@zakkster/lite-charts","version":"1.7.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.7.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"06aa4f962edb706c35295db2ab1bf428ee99f65b","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.7.0.tgz","fileCount":8,"integrity":"sha512-vLc2Jgmu7GGkZv7gGFzHzMMZErbh+9SWoFUO5wWogQ8E1J+gs85pp2updX8Qz6SLt8mZXDLUL6izy3F9GKNvPQ==","signatures":[{"sig":"MEYCIQC9WWwKidh6fw4kIDvqkTorYgf66kZk6PgSioujEd4Y1AIhAL4dtTBo+suook7CL+vD8JdYP0GCijbKRyOW0Jl7pkwF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAx3i+BG71SfujTbOfZwN/yJuriBXeCQBv+y++0XR1adAiEAj+qk5jmakvx4qGNX/lSlo1IYgcMUh7nsrh1Cc0I+c+4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":691228},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"a315d155154e94e29921f75ae61dfb5e2674db7e","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.7.0_1787278342811_0.6852489568774525","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@zakkster/lite-charts","version":"1.8.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.8.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"668072e64748141d6b5af53819bb07109a7503ec","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.8.0.tgz","fileCount":8,"integrity":"sha512-1OxGTLZVkWl7OtG4YkoOWOIsVMC1tBRY2lGep2R8SIsRWpuZ+pxVtOdB9nTI/VsHsnH6M56rAPLUltpzARYTbQ==","signatures":[{"sig":"MEUCIHgpPXtDrH3N+J8ocL53oRLc5A1ws2AAHuaz6Q2XxEO1AiEA7OumLVosNJZ//EYJRWoqJiV7r3V/xC8GXNp7x9XbyWY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAknCbx2zKwM5ZuNsvponw1nH14MYgGOf2Mo1W89xF6fAiBKE+zKdCGLu9Dtd7KGYHEi2LEj47fcyb991woiNv2ryw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":703620},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"a315d155154e94e29921f75ae61dfb5e2674db7e","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.8.0_1787292995894_0.682816054586509","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@zakkster/lite-charts","version":"1.9.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.9.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"f4516df5e95aefbd65ff26d2249c31ed9c67a8ed","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.9.0.tgz","fileCount":8,"integrity":"sha512-nIo0gCBSdpx1cjS31BKzI9hfKFr47EQ0GqzD56sRjSAjy54smJdPVTELJH98gySoWXSXCsAog+aPgXMk1XggJA==","signatures":[{"sig":"MEUCIB9kytYGmC2X38gItm2dtS+qjZVOLfIqV3YQuT3qQ6VjAiEAl45u7OLPp5aZnkQIpjkiIK/YNahH5Ap0EPirpS8B62I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFeuwzonhA4yOxaWj/ze5oq+/n6PeFle/xzzmbGgR1CxAiB07SyG9uydPRM1DoXGPli66ygNN53sBCnOxtPWFJ8AKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":719265},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"948ad6f0b9931fd8dc2b2c3377451d27d1f683df","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.9.0_1788069022767_0.015622098530369666","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@zakkster/lite-charts","version":"1.10.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.10.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"475dbea1971e5abab2cb6fb5b12d12ffe05230eb","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.10.0.tgz","fileCount":8,"integrity":"sha512-vhZsE9uNTDXacSb/VZ/HHoQ9fYTxaBGMyfLm1aK5+5OvjKFROVyfN0HCWFNE6vtO3q+f12sWbbc1K4MBXL/q5A==","signatures":[{"sig":"MEYCIQD3eJeHfHcJIf3Ml6gPYzzTnqcszMY//xtT6A0NgqwGowIhAI2K2K904dZylAaQ+4GL3axkJiwqG2gi1X6ctuTelJQw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFY9To4vXl+U/8yM72Tskb/g00Jst4RyaWkegGscYnVsAiEA53aM6g6NsejbbszmDLaGXBykUiZnKbwoKUVLxuQ1OAc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":743905},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"c7ebd4e8346c68ef29474adfab95fd3a7988a8c0","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.10.0_1788332027790_0.507601317696524","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"@zakkster/lite-charts","version":"1.11.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.11.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"f4184e152e40664190bc593da07af6a601920e1d","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.11.0.tgz","fileCount":8,"integrity":"sha512-3j5htQKIeUpb5Dv8Zlz3SL7DMbPcysY/ebvH2h7QqZBnGzAbZUxkZ+Ddr834teRK4kGrmy1D3WisNQ4Fa+dSrA==","signatures":[{"sig":"MEUCIQDIvM2aTziuRcLHmr0vx0BJHe3ph1hefrWgwwZBCClrEgIgOi1SOpOWb9RGg+Z+hw3cH2GsPXM1exnLW5WphyyFYfM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDNmoqNf6j8+7k046PO+g6wapxEke/xiwigEkoxPF9HDwIge+xp7NO1CErk2UYepVeKKRhqB0S+rkNTjSCsXQy1Ogk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":765179},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"02b98cdb30a5f1c4044bfdd0bc50b936e6bc48b2","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.11.0_1788336714296_0.662347049093934","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"@zakkster/lite-charts","version":"1.12.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.12.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"a2465eefad46b397e756e135d9e11bfad32b07a4","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.12.0.tgz","fileCount":8,"integrity":"sha512-7tG8Vj9sj5A5JmMriuwKNpU7npf16ZH377Cx7dxUFv179uTuUreQIRKspmPhNXyrHxI8tkLOx6dDZVHClC+3Ow==","signatures":[{"sig":"MEYCIQC9c2Kx7FOnZ97ihkEXvXBwl/QQLiNSTqbXBm0JO0oGRAIhAPS30h2pzBkHfaO0VjDU9+Utmae1rQ7GbI/y+CORhlqi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFrxcBPIWcQrruPGtSoTrjzQahjhGSmLCBF5lUhe303QAiB0vqppUZYIEZRv2GyUQ9U1TxF2A8ObHFpEtWtHa2kDJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":789167},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"02b98cdb30a5f1c4044bfdd0bc50b936e6bc48b2","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.12.0_1788340898815_0.5810165914859569","host":"s3://npm-registry-packages-npm-production"}},"1.13.0":{"name":"@zakkster/lite-charts","version":"1.13.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.13.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"2fc558992d67789ddb9b092f533520fcbdf8fa4a","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.13.0.tgz","fileCount":8,"integrity":"sha512-X3CA4BR9Hws1QWDQwpEACKzN5peEOG8SL7Ir1pXkiV8UtDcdSsW/6lNICglLErWgjiHprcCNFFA8hRVhRFtLRw==","signatures":[{"sig":"MEUCIQDJp059mjLhvv5kDVDO01Q87DDC3BDsNDZ60fiayxTaswIgKaJOh884wdnji2Q+v8rhDGIK+rP/M3zgOrJODBasa1Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDhcQVBGp9PVf0h+uOrxVjngFqhc/ib4xV6KTyL3Of0JgIhAIv8NKFQW3HRzK6Z8Nhbv6ik9cj0TKyP8LD4Pb/BUubi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806777},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"bf63c5e3bff50b554372a33efdaedd00d5e39bb5","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.0.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.0.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.13.0_1788391505303_0.5619240315841099","host":"s3://npm-registry-packages-npm-production"}},"1.14.0":{"name":"@zakkster/lite-charts","version":"1.14.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.14.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"3cdba234d11ba92b55c14798168c4338f9cc4e36","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.14.0.tgz","fileCount":8,"integrity":"sha512-x5fjTmUPRRrJqMwPE35QMW2nDi1kYZv8Bl4aZlRekIpBAA6Bw8zO/fMRfIYieepm4OgBOPALQUfMT45TyRbVbw==","signatures":[{"sig":"MEUCIHnd4s0sKVqrMzv1xBN9gL+a4Toj/NDEpoakFQGIRIWEAiEAhgeZh28geJ0nM1696/Qg8suzeB7S5+o1fEB5llO0qk4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAUMAClsHn4loH7UehyKfqP5UWpT/OSwHMfXj/bh6+aWAiEAjswsp1PXHsGrlXrTVL+DDJjEI+kthhMeBbMyN4rb+EI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":837903},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"049f1ba28e8bf511217ac5e8c6bb4e0281070f16","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.2.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.2.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.14.0_1788397245195_0.21904151903759717","host":"s3://npm-registry-packages-npm-production"}},"1.15.0":{"name":"@zakkster/lite-charts","version":"1.15.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.15.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"31dc3b00af077d7635dc05b9fe6106806dc6e460","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.15.0.tgz","fileCount":8,"integrity":"sha512-JKT1vJUx5NyTbt3pv1TrKn704C8z/AzgOp2oUVuXwl7B3VfwK1d1nnP7VWzCMxwfDRweGrDQ8jYM+BCgSFUCpA==","signatures":[{"sig":"MEUCIGo6EqUZLWgC4Qt8/DQw/8nc7q2ecjflzPDGzi2iNx69AiEA7INgWL+RgkruYM8Wu8pgLsYwqB+2R5tpUlDSMoRPnRc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCaEOWLQCJUKUJ6xNO8xAKVJjcGdsAtEX9oPQdVRk7JBQIgYqWWZSSRn3sA3HhgF21FNQkFa9PQDKTRNvmsTVLiRFs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":859983},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"45940822edee48c376dccceb25c5b2a71a538848","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.2.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.2.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.15.0_1788411310721_0.27121240382667344","host":"s3://npm-registry-packages-npm-production"}},"1.16.0":{"name":"@zakkster/lite-charts","version":"1.16.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.16.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"e1379df02e72d75c5ee530bae136d5bd250a6051","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.16.0.tgz","fileCount":8,"integrity":"sha512-LcOUoOi4pfN4gHlwd0yrN5ZaavgfbI/FW2w2AGzF84G6bpG3kVNgdO5JbheujKsKYlF4mxITwOGFX1jf4+m3ig==","signatures":[{"sig":"MEQCIEX7gRBNiZ14Tzw6LRGel2ob+iMLJIS2zgYQJASsZPoIAiACk+zWFqha8SzscHxP5AVktMC9zjEQ9RQ/bqWSoDOxaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBTNfNEoYekZl2pJVjFlLXVX+ENBmU1H+uPajiZB9qxOAiA3LJyy8g+68tvu8vQGo0Gm2GkfQ1pcfTw1JegyGWv7lA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":894507},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"adc81e7ca622f324295e44f279c36ad15e97516d","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.3.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.16.0_1788565552169_0.14703716215370122","host":"s3://npm-registry-packages-npm-production"}},"1.17.0":{"name":"@zakkster/lite-charts","version":"1.17.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.17.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"c89ae3cba74d758fc818267a6c3ef133cefd0161","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.17.0.tgz","fileCount":8,"integrity":"sha512-f9ynGmGWGFmIRPSMkg3/TgmUTJKDyj9SK1pgtEnlzSWfltXGDqRkWo0EKL+Z0IOCMnbGM23IXyEumvlvdbjdBg==","signatures":[{"sig":"MEQCIHqYlGOhZfklaeq4yLOG+fCoXqNT9qQHVl1Dc4NHtAn0AiBdiOXmz8utOCqz/cuETfX9q4brNfwlSpfK4xkUQWZpWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC/qjsg4GdOdQYb2ZqPtt/OacUxpuj4ZOQYBtj2cqr3IQIgZqWNU8WlnIG+cIX2TOiUO0G6H6ii8SI1jh7EdXeuXy4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":921874},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"e1cdccb6e46ecd5f8791c81bd391e203ca067a58","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.3.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.17.0_1788596162772_0.05566971657046005","host":"s3://npm-registry-packages-npm-production"}},"1.18.0":{"name":"@zakkster/lite-charts","version":"1.18.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.18.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"7e9e54623f8dbbd17ab4e2a0aa685b8e1c742049","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.18.0.tgz","fileCount":8,"integrity":"sha512-ZXnHOBT4HouvM49CKfmz2GKxR0U9M2R+lo1Zu4zzZ81uLYWWR58fAKPmgHR08BErgcj789eo8nJTiQhvAPCnJw==","signatures":[{"sig":"MEUCIBPBQeSKfW+4OR4xsGIGSpZkKZoaWJKzxJk2Oig9UDRrAiEA748ZhiMoeETGwmXHZDebmDiWscJ6/wwa097AfFFOobQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBvHDtGiABzM6N7uvbvUVXYMsK1egKfCx7xyH15JdqGhAiEAnbfjyGcOx+IhW63kOTBdkvqCX+N4p9XcQJ+lzKF0tBg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":965712},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"b7537460f929d3a4820c3619ae9ce37b9dd03ad6","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.4.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.18.0_1788643925939_0.46546066741660885","host":"s3://npm-registry-packages-npm-production"}},"1.19.0":{"name":"@zakkster/lite-charts","version":"1.19.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.19.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"29b22518f780e3564952695f3b09dd819c478d7b","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.19.0.tgz","fileCount":8,"integrity":"sha512-uw9Lk5rNXbJQ0a1oKvq2s1h19UvcG6FKkMAYgsSr4kCRf8oegYdgy2zqu5QBejZIg8ySFTJWLj4d6ZUXrivWqQ==","signatures":[{"sig":"MEUCIQCmtVptMQknJbRXCHYlDH0m36iih1bS6PNAEoKlm5yeKQIgHT0adQ4KgQR8krMLqsfs/Dn0oMqDX0ZE8PQQXMkIj6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCJOeB/HzjUHNbhv5XMKTGuFmid/JaF68Y9AgGaA/KSzAIhAIHQ0cf67fc4Bmq3d7a3lyryQs4N8krXK4SdNrXrjjGS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1004404},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"603b9b3a6af1b54c77e13faeed04c71059239207","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","bench:candle":"node --expose-gc bench/candle-10k.mjs","bench:layers":"node --expose-gc bench/scatter-layers-10k.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.4.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.19.0_1788659140478_0.7737712345577887","host":"s3://npm-registry-packages-npm-production"}},"1.20.0":{"name":"@zakkster/lite-charts","version":"1.20.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.20.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"4dc049ae17fef866da20ebf2219bbc2a56556002","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.20.0.tgz","fileCount":8,"integrity":"sha512-y9hIaIy99BIKAT2AKWJgBb3h61Au4vWzTm+PItbaCq01sYoGpboHGEPnq2Qf7BWM8vQica3bg5BLUi8Su5x33Q==","signatures":[{"sig":"MEQCIH4+xo6goY6cE1k4DsOiL0KlAEaE3DAlZ0c72VVR8QF1AiBlb6D58q9EaJVxIYrGbx3UM6Ywd5ioX9w2kYFGWceMvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDB72OWmHcyiQZ3REqQzuzghh4wjpZeyGEslXGFLh29tQIgPbuwoWcJkc5p11l8D5fyzS6359WkTB2cYMTEtMsiKTA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1035043},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"050dc3d14690fa5a6d1314d793136efe482ab64b","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","bench:candle":"node --expose-gc bench/candle-10k.mjs","bench:layers":"node --expose-gc bench/scatter-layers-10k.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.4.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.20.0_1788847101877_0.7964946995359465","host":"s3://npm-registry-packages-npm-production"}},"1.21.0":{"name":"@zakkster/lite-charts","version":"1.21.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.21.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"4099b274f9f8249fc1d31dd5fcc900929bfe2a54","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.21.0.tgz","fileCount":8,"integrity":"sha512-No65/5pkRWxsti6ANB2cSJop25Oo6hfoM2t95Y2lm1UmZUo6p9a0bFYByQIvJWfH6p2S61QzebnPOFud5NEeaA==","signatures":[{"sig":"MEUCIQCF066lRiqn9gJB+lpnPhAbWP7yxt452sCA0EjaRg8e/gIgLXHLOrCwyiDEkAKZ9Bf3LDrwjx/swNHgeaTxrGzKSX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDIiMi672qOtVzZkc+uUiBHPeqjTz/EnutJpZG/5pLzYAIhAK2PQ7uNohXXAz41gihYjZ6Y3ek/ngpjPtqRFTwDQANE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1064414},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"a0c72cf1cb885a35a33a06203e910c14fd1b560d","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","bench:candle":"node --expose-gc bench/candle-10k.mjs","bench:layers":"node --expose-gc bench/scatter-layers-10k.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.4.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.21.0_1789015617464_0.49020644889041387","host":"s3://npm-registry-packages-npm-production"}},"1.22.0":{"name":"@zakkster/lite-charts","version":"1.22.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.22.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"c9e67f8976208763e7458b7daf68abaa33397f63","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.22.0.tgz","fileCount":8,"integrity":"sha512-mX5EeBP1gCxAqvuOr8Xsq809UaFW5sFPrD1aqyMJY01axD8Ewn31GL+yywVKGgauQdy5gqqgP2u0wLLeu01vwQ==","signatures":[{"sig":"MEUCIHCRvvs30dInTjcInGB75OEog9riv0bxR7zo+JF/buLtAiEA0cLrkoOxRkHdTvGd6hbR79um5oD0graWeJrhlrNzY3Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDRUhDLqJiyKIVy45n16UQDLf4tJXHJBPMqPwRiqxtxygIhANYATQ1BIN0l5522vMcXlhO6W/WWYkx+rCWvYmQYXTsm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1073998},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"ef9731787874b32a172951cffcf76e0d59cc44f2","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","bench:candle":"node --expose-gc bench/candle-10k.mjs","bench:layers":"node --expose-gc bench/scatter-layers-10k.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"12.0.2","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.8.2","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.4.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.22.0_1789610862849_0.04642363810370842","host":"s3://npm-registry-packages-npm-production"}},"1.23.0":{"name":"@zakkster/lite-charts","version":"1.23.0","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-charts@1.23.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"d213a4679e90fb88108ebbf9b86fb868d3fe205f","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.23.0.tgz","fileCount":8,"integrity":"sha512-3rkDQLyas4tIdoyvWEuZ20ffOPrqlAhXaMl8/j7AihK6hIolKxmDynMo2nG8sTB5sOYbj0XYHrybRZySkxL3TA==","signatures":[{"sig":"MEUCIF79FVTZQxIwYxk2HgD6pmU/jhVAaktn5SxQ/wG1XvciAiEA+nDTCfbDlIkBUYKx24HDCMavnJR3LEf2NTjnwvunHd4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCqYf2r+8OvoRAIKPta53fN6gI7ZAu2EgqtP5kVBwFLAwIgKkDJccov5jdT9HCvNyEqC1uqQORZF8U7X18ZLvwL+IE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1092911},"main":"./Charts.js","type":"module","types":"./Charts.d.ts","module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"04f60365d2168502d32b7646f344c5eafd22bfa9","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","bench:candle":"node --expose-gc bench/candle-10k.mjs","bench:layers":"node --expose-gc bench/scatter-layers-10k.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"11.19.1","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"sideEffects":false,"_nodeVersion":"26.8.2","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.4.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/lite-charts_1.23.0_1790023238471_0.9029143451976893","host":"s3://npm-registry-packages-npm-production"}},"1.24.0":{"_id":"@zakkster/lite-charts@1.24.0","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"7247e38220988bc0eb160c72a8f57ad7bde6d053","tarball":"https://registry.npmjs.org/@zakkster/lite-charts/-/lite-charts-1.24.0.tgz","fileCount":8,"integrity":"sha512-NAZwZY7spkP7N9OCEAZfFKBO7aelbnMIiHn/RY62iLIH57rQLBnwUHRyDQqiRLteLqtQlJ3c8Xg3z7ntMM/yXg==","signatures":[{"sig":"MEYCIQDFSrPkjtM9WQV/xFfr3sNoG26KYbAlKGeYq4QRjkNhIAIhALCruqMzDkrOPvRc2rxNi1o4ngekKJNiwvfRWFySjZZ2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDlLCIGNLbydXB/lAeOEj+AI2NV9t4Ihz146rMUGdekoAiEArTP3ax31RnenHSPCLuB2px0pXl2bfK7oxw8VVR4sU+Q="}],"unpackedSize":1105754},"main":"./Charts.js","name":"@zakkster/lite-charts","type":"module","types":"./Charts.d.ts","author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"module":"./Charts.js","engines":{"node":">=18"},"exports":{".":{"node":"./Charts.js","types":"./Charts.d.ts","import":"./Charts.js","default":"./Charts.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"9d1ed57d85e65ac45501032f68945c1fcc9044b3","license":"MIT","scripts":{"test":"node --expose-gc --test --test-reporter=spec test/*.test.js","bench":"node --expose-gc bench/line-100k.mjs","verify":"npm test && npm run torture","torture":"node --expose-gc test/torture.mjs","bench:candle":"node --expose-gc bench/candle-10k.mjs","bench:layers":"node --expose-gc bench/scatter-layers-10k.mjs","torture:logfuzz":"node --expose-gc test/torture-logfuzz.mjs"},"version":"1.24.0","_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"_npmVersion":"11.19.1","description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","directories":{},"maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"sideEffects":false,"_nodeVersion":"26.8.2","_hasShrinkwrap":false,"devDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-leak":"^1.8.0","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":">=1.5.0-rc.1 <2.0.0","@zakkster/lite-delaunay":"^1.4.0","@zakkster/lite-gc-profiler":"^1.14.0"},"peerDependencies":{"@zakkster/lite-axis":"^1.0.1","@zakkster/lite-scene":"^1.0.0","@zakkster/lite-signal":"^1.1.0","@zakkster/lite-virtual":"^1.1.0","@zakkster/lite-delaunay":"^1.3.0"},"peerDependenciesMeta":{"@zakkster/lite-virtual":{"optional":true},"@zakkster/lite-delaunay":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lite-charts_1.24.0_1790048031012_0.7685801935519081"}}},"time":{"created":"2026-06-08T23:21:25.194Z","modified":"2026-09-22T03:33:51.273Z","1.0.0":"2026-06-08T23:21:25.555Z","1.1.0":"2026-06-13T05:10:54.392Z","1.2.0":"2026-06-29T20:38:44.823Z","1.4.0":"2026-07-05T04:35:24.271Z","1.4.1":"2026-07-31T20:53:30.071Z","1.5.0":"2026-08-15T00:22:14.915Z","1.5.1":"2026-08-15T21:12:32.224Z","1.6.0":"2026-08-17T00:01:16.252Z","1.6.1":"2026-08-20T23:13:27.677Z","1.7.0":"2026-08-21T02:12:22.962Z","1.8.0":"2026-08-21T06:16:35.995Z","1.9.0":"2026-08-30T05:50:22.873Z","1.10.0":"2026-09-02T06:53:47.904Z","1.11.0":"2026-09-02T08:11:54.376Z","1.12.0":"2026-09-02T09:21:38.910Z","1.13.0":"2026-09-02T23:25:05.397Z","1.14.0":"2026-09-03T01:00:45.286Z","1.15.0":"2026-09-03T04:55:10.823Z","1.16.0":"2026-09-04T23:45:52.298Z","1.17.0":"2026-09-05T08:16:02.869Z","1.18.0":"2026-09-05T21:32:06.047Z","1.19.0":"2026-09-06T01:45:40.591Z","1.20.0":"2026-09-08T05:58:21.987Z","1.21.0":"2026-09-10T04:46:57.556Z","1.22.0":"2026-09-17T02:07:42.937Z","1.23.0":"2026-09-21T20:40:38.567Z","1.24.0":"2026-09-22T03:33:51.127Z"},"bugs":{"url":"https://github.com/PeshoVurtoleta/lite-charts/issues","email":"shinikchiev@yahoo.com"},"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","homepage":"https://github.com/PeshoVurtoleta/lite-charts#readme","keywords":["chart","charts","visualization","canvas","reactive","signal","zero-gc","performance","line-chart","telemetry","dashboard"],"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-charts.git","type":"git"},"description":"Reactive, zero-GC chart library. Signal-native data, scales, and dimensions; 60fps at 100k points; zero allocations in steady-state render. Built on @zakkster/lite-scene.","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"readme":"# @zakkster/lite-charts\n\n[![npm version](https://img.shields.io/npm/v/@zakkster/lite-charts.svg?style=for-the-badge&color=latest)](https://www.npmjs.com/package/@zakkster/lite-charts)\n![Zero-GC](https://img.shields.io/badge/Zero--GC-Hot%20path-00C853?style=for-the-badge&logo=leaf&logoColor=white)\n[![sponsor](https://img.shields.io/badge/sponsor-PeshoVurtoleta-ea4aaa.svg?logo=github)](https://github.com/sponsors/PeshoVurtoleta)\n[![npm bundle size](https://img.shields.io/bundlephobia/minzip/@zakkster/lite-charts?style=for-the-badge)](https://bundlephobia.com/result?p=@zakkster/lite-charts)\n[![npm downloads](https://img.shields.io/npm/dm/@zakkster/lite-charts?style=for-the-badge&color=blue)](https://www.npmjs.com/package/@zakkster/lite-charts)\n[![npm total downloads](https://img.shields.io/npm/dt/@zakkster/lite-charts?style=for-the-badge&color=blue)](https://www.npmjs.com/package/@zakkster/lite-charts)\n![TypeScript](https://img.shields.io/badge/TypeScript-Types-informational?style=flat-square)\n[![lite-signal peer](https://img.shields.io/npm/dependency-version/@zakkster/lite-charts/peer/@zakkster/lite-signal?style=for-the-badge&color=blue)](https://github.com/PeshoVurtoleta/lite-signal)\n![Dependencies](https://img.shields.io/badge/runtime%20deps-0-brightgreen?style=flat-square)\n[![license](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE.txt)\n\n> Reactive, zero-GC chart library. Signals for data, dimensions, theme. 100k\n> points at 60fps with sub-frame budget. Built on `@zakkster/lite-scene`\n> (Canvas2D scene graph), `@zakkster/lite-signal` (reactive core), and\n> `@zakkster/lite-axis` (tick generation). Three peer deps. ESM-only.\n> ~1100 lines single file. MIT.\n\n**Status:** v1.24.0 -- chart chrome (minor). `title` / `subtitle` stack\ncentered above the plot and `caption` takes the bottom-right attribution\nline on every axis-kernel chart, each bumping its side's DEFAULT margin\nonly when that margin side is unset. Fonts derive from the axis font\n(bold title one size class up); colors ride `labelColor` and the theme\nrefresh. Fail-closed doors before any allocation, including `subtitle`\nwithout `title`.\n**583/583 tests pass** plus a torture/stress gate (`npm run torture`).\n\n**New in v1.24.0:**\n- **Chart chrome.** `title` / `subtitle` render canvas-centered above the\n  plot (top-margin bumps 24px/16px when `margin.top` is unset); `caption`\n  right-aligns at the plot edge on the bottom-most line (14px bump),\n  pushing an `xTitle` up one line when both are present -- without a\n  caption the v1.23.0 `xTitle` position is byte-identical (test-pinned).\n  Fonts derive from `font` at construction (title bold +4px, subtitle\n  +1px, caption -1px; a px-less base font falls back unchanged). All\n  three recolor on `refreshTheme()`, export to SVG, and die with the\n  chart. `''`, non-strings, and an orphan `subtitle` throw at\n  construction with zero nodes allocated. Non-axis kernels ignore the\n  keys; per-kernel chrome, per-element style objects, and wrapping are\n  named refusals. 11 new tests (572 -> 583), 3 reversion proofs, torture\n  A29 (chrome redraw within 2 B/op of a chrome-less control).\n\n**New in v1.23.0:**\n- **Tick-format callbacks.** `xTickFormat` / `yTickFormat`\n  (`(value: number) => string`) on every axis-kernel chart, applied at the\n  cold axis rebuild. A time x-axis passes the raw epoch-ms value; band\n  (category) axes ignore the callback (the horizontal bar's bottom VALUE\n  axis honors `xTickFormat`). Non-function configs throw at construction\n  with nothing allocated; a callback that returns junk or throws surfaces\n  as a `mount()` error on the first rebuild and fail-safes (labels hide,\n  no throw mid-gesture) on later ones.\n- **Axis titles.** `xTitle` / `yTitle` non-empty strings; the y title reads\n  bottom-to-top via a rotated scene node. A title adds 18px to its side's\n  DEFAULT margin only when that side is not set explicitly. Titles track\n  resize, recolor on `refreshTheme()`, export to SVG, die with the chart.\n- **Axis theme fix.** `refreshTheme()` now re-fires the axis/grid scene-node\n  color bindings through a tracked `axisThemeVersion` signal -- previously\n  every axis-kernel chart repainted its axis chrome in the stale mount-time\n  colors after a theme switch. 14 new boundary tests (558 -> 572), three\n  measured reversion proofs, torture tier A28.\n\n**New in v1.22.0:**\n- **Heatmap `refreshTheme()`.** The grid kernel captures its theme-affected\n  color specs (`colors` ramp endpoints, `labelColor`, `highlightStroke`,\n  `rowColumnHighlightFill`, `valueLabelColor`) before mount resolves them,\n  so a theme switch re-resolves the original `--var` tokens and recomputes\n  the cell/label color arrays (`Charts.d.ts` already declared the method on\n  `Chart` -- the implementation now matches). The `valueLabelColor: 'auto'`\n  per-cell contrast path survives repeated refreshes; headless or\n  unresolvable tokens fail closed to `#888`; unmounted charts no-op. 6 new\n  boundary tests (552 -> 558), one measured reversion proof.\n\n**New in v1.21.0:**\n- **Error bars / confidence bands.** Per-series (chart-level default)\n  `errorBars: { lo, hi }` (absolute per-row accessors or SoA `los`/`his`\n  arrays) or `{ value }` (symmetric magnitude, `lo = y - v` / `hi = y + v`;\n  mutually exclusive with `lo`/`hi`). `band: false` draws whiskers (vertical\n  bar + `capWidth` caps), `true` draws a filled ribbon, `'both'` draws both;\n  a NaN/null gap splits the ribbon into runs. `color` defaults to the series\n  color, `bandFill` to that color at ~0.15 alpha. Projects through a log\n  y-axis (a non-positive bound self-skips), clips to the plot rect, and\n  emits to SVG. A per-row null/NaN `lo`/`hi`/`value` self-skips that point\n  (`+null === 0` gated -- never a 0-anchored bar); a bad config throws at\n  construction before any signal is allocated. A chart without `errorBars`\n  is byte-identical. New torture A27 (whisker + band gesture storm within\n  2 B/op of a no-errorBars control; the cold resolve fires once per\n  data/theme change, never per frame).\n\n**New in v1.20.0:**\n- **Brush v2.** `brushModifier` selects the gesture modifier (default\n  `'shift'`, resolved cold to one predicate; an unknown value throws at\n  construction). Each gesture-driven commit gains `idsBySeries` -- a\n  commit-time per-series snapshot, one slot per series, `null` for a\n  hidden or empty series (visibility read untracked, never recomputed on a\n  later toggle); the primary `ids` is unchanged. The horizontal-bar brush\n  gains a band multi-select: a modifier+click TOGGLES the clicked band\n  in/out (modifier+drag still replaces with a contiguous range), toggling\n  the last band off clears; `bands` may be NON-contiguous, `bandMin` /\n  `bandMax` are the HULL, and the overlay draws one rect per contiguous\n  run (byte-identical to the one-rect path for a single run).\n  `setBrush({ bands })` validates each key against the categories and\n  re-derives the hull. Fixed: `setBrush({ xMin: null })` on a vertical\n  brush now throws instead of coercing to bound 0.\n\n**New in v1.19.0:**\n- **Candlestick / OHLC chart.** `createCandlestickChart(config)` -- wick\n  `h..l` (1px centered), body `o..c`, up/down fills (`#16a34a`/`#dc2626`\n  defaults; `wick` defaults to the per-candle body color). Body width is\n  the MEDIAN adjacent ts delta in pixels x `bodyRatio` (default 0.7,\n  clamp `(0,1]`), recomputed cold per data/scale change -- one missing or\n  off-schedule bar never resizes the rest. Timestamps ride raw doubles\n  internally, so minute bars at 2026 epochs draw exactly. Corrupt rows\n  (null/NaN fields, `h < max(o,c)`, `l > min(o,c)`, equal or descending\n  `ts`) refuse the whole series -- `mount()` throws; a corrupt post-mount\n  swap draws nothing and a healthy re-swap recovers. `yScale:\n  { type: 'log' }` projects each of o/h/l/c independently. Doji\n  (`o === c`) paints a 1px tick. The tooltip carries four O/H/L/C rows.\n  `shading` (weekends / sessions / overnight / holidays / early close)\n  is the shipped `createTimeLineChart` engine, byte-identical. Candles\n  sit at TRUE time -- weekend gaps show as gaps (index-compact slots are\n  a named-trigger candidate, see the roadmap).\n\n**New in v1.18.0:**\n- **Cluster outlines on scatter.** `outlines: { index: createClusterIndex(N),\n  groupKey, alpha?, stroke?, strokeWidth?, fill?, fillOpacity?, dash? }`\n  partitions the primary series' rows by the raw `groupKey` value and strokes\n  one boundary per group: the convex hull when `alpha` is absent, or the\n  concave alpha shape (`alpha` = a radius in pixel units, finite `> 0`;\n  `Infinity` is refused -- omit `alpha` for the hull) when set. The fourth\n  injection rung after `spatialIndex`, `cells` and `field`: geometry comes\n  from the injected factory (lite-charts imports nothing), per-group handles\n  are rebuilt cold on every data/scale change on the `postProject` seam, and\n  the per-frame draw walks prebuilt pooled loops only. Multi-loop alpha\n  shapes (split clusters) and interior hole loops both draw; an optional\n  translucent fill runs one path per group, so hole loops carve out under the\n  nonzero fill rule. Rows whose key is missing/`null` belong to no group;\n  groups with fewer than 3 usable points (or none under the alpha) silently\n  draw markers only; more than 64 distinct groups is a fail-closed layer\n  fault. Construction throws before any owned signal on a bad `index`,\n  `groupKey`, or `alpha`; junk styles fall back. `exportSVG` emits Z-closed\n  paths per loop.\n\n**New in v1.17.0:**\n- **Contour lines over the field raster.** `field.contours: { levels, color?,\n  width?, dash? }` sweeps the injected triangulation for iso-value crossings\n  (exact for the piecewise-linear interpolant -- a planar field's contour is\n  exactly straight) and strokes them between the raster and the cells/markers,\n  inside the plot clip, at 0 B/frame. `levels` is a count (`1..32` lines spread\n  evenly strictly inside the finite sampled range -- they re-derive on every\n  pan/zoom, so a panned-out outlier never pins them) or an explicit array of\n  values (sorted, deduped; out-of-range values legally draw nothing). Segments\n  are precomputed cold into a pooled grow-only buffer on the same postProject\n  refresh as the raster; the per-frame draw walks prebuilt geometry only.\n  Styles fall back (junk `color`/`width`/`dash` never throw); bad `levels`\n  throw at construction before any owned signal. The contour pass is a third\n  independent fault domain: it reuses the field's mesh handle, skips silently\n  when the raster has nothing to show, and a fault in it never touches the\n  raster or cells. `exportSVG` emits the stroked paths between the field rects\n  and the cell polygons. `locate`/`barycentric` remain unconsumed -- no\n  delaunay-side change was needed.\n\n**New in v1.16.0:**\n- **Injected field-raster layer.** `field: { index: createFieldIndex(N), value,\n  gridW?, gridH?, colors?, colorFn?, opacity? }`: the primary series' per-point\n  scalar `value` is rasterized into a smooth interpolated background heatmap\n  (the third injection rung after `spatialIndex` and `cells`), drawn UNDER the\n  cells and markers inside the plot clip at 0 B/frame. Built over pixel-space\n  points and re-sampled cold on every data/scale change (same `postProject`\n  seam as cells), so pan/zoom never serves a stale or affine-wrong field. One\n  `sampleField` per refresh fills a pooled grid; per-cell colors are precomputed\n  cold. `gridW`/`gridH` integers in `[8, 256]` (default `64 x 48`); `colors`\n  `[low, high]` hex ramp or `colorFn(v, vMin, vMax)` (extents over FINITE cells\n  only); `opacity` default `0.5`. Independent fault domain from `cells` (each\n  has its own `try/catch`, error slot, and handle disposal). SVG export parity\n  (one `<rect>` per finite cell). Construction throws before any owned signal:\n  non-object `field`, missing/non-function `index`, missing `value`, or\n  non-integer/out-of-caps `gridW`/`gridH`. See \"Field raster\" below for wiring.\n\n**New in v1.15.0:**\n- **Horizontal legend virtualization.** A virtualized legend at\n  `position: 'top' | 'bottom'` scrolls a single non-wrapping row along X.\n  Supply `legend.width` (viewport) + `legend.itemWidth` (fixed row width, both\n  positive integers); the adapter receives `{ count, itemWidth, width, overscan,\n  renderRow, horizontal: true }`. Size keys are orientation-exclusive --\n  `height`/`itemHeight` on top/bottom, or `width`/`itemWidth` on left/right,\n  throw at construction. Left/right virtualization is unchanged and byte-identical.\n- **Early-close holidays.** `shading.holidays` entries may be\n  `{ ts, closeMinutes }`: on that UTC day every session clamps to close at\n  `closeMinutes` (1..1439) instead of its normal close, fusing forward like a\n  whole-day holiday's band. Doors that throw at construction: object without\n  `ts`; bad `ts`; `closeMinutes` null/non-integer/outside 1..1439; a duplicate\n  UTC day across all entries; an early close on a weekday with no open session;\n  and an early close on a day carrying an overnight evening session. Whole-day\n  (number) entries are byte-identical to v1.14.0.\n- **Earlier fail-closed legend validation.** Bad legend config (virtualize junk,\n  orientation-exclusive size key) now throws with zero owned signals allocated.\n  When both the chart-type options and the legend are invalid, the `initOpts`\n  error wins.\n\n**New in v1.14.0:**\n- **Fat hover.** `hitTolerance: 'nearest'` (scatter only): the whole plot\n  becomes each point's hit region -- ideal for sparse scatters. Finite\n  per-query cap (plot diagonal), identical on the linear and indexed hit\n  paths; any other string throws at construction.\n- **Voronoi cell layer.** `cells: { index: createCellIndex(N), colorKey?,\n  fillOpacity?, stroke?, strokeWidth? }`: pixel-space bbox-clipped cells,\n  rebuilt with the projection through the spatial-index lifecycle (pan/zoom\n  never serves a stale or affine-wrong cell), drawn under the markers at\n  0 B/frame, with a free hover-cell highlight off the crosshair. Degenerate\n  clouds draw markers with no cells; construction validation throws before\n  any signal allocation. SVG export parity.\n- See \"Fat hover + Voronoi cells\" below for wiring.\n\n**New in v1.13.0:**\n- **Overnight sessions.** `{ openMinutes: 1320, closeMinutes: 1260, days:\n  [0,1,2,3,4] }` (Globex-style, opens Sun-Thu 22:00 UTC) now works: the\n  session is split at the UTC midnight seam into an evening + next-day\n  morning half, so the single-cursor band sweep is structurally unchanged\n  and the seam never shades a sliver inside the open span. `days` is the\n  weekday the session OPENS. `close === open` still throws (a 24h session\n  is `{ 0, 1440 }`).\n- **`shading.holidays`.** Epoch-ms dates, each truncated to its UTC day\n  start; the whole day is closed and fuses with adjacent gap bands into one\n  range. Works with or without `sessions`. Fail-closed: `[]`, `null`\n  entries (null is not epoch 0), non-integers, strings, and `Date` objects\n  all throw -- pass `Date.UTC(...)` values.\n- See \"Overnight sessions + holidays\" under the Time-series section.\n\n**New in v1.12.0:**\n- **`legend.virtualize`.** `(host, opts) => ({ dispose })` -- the adapter owns\n  row creation/position/height; lite-charts owns row contents (`renderRow`\n  re-reads swatch colour + visibility per bind, so recycled rows never show\n  stale state), toggling, and a11y (`role`/`aria-pressed`/`tabindex`). With\n  `legend.height` (required), `legend.itemHeight` (default 28), and\n  `legend.overscan` (default 2). See \"Virtualizing a tall legend\" below.\n- **Fail-closed doors.** Non-function `virtualize`, `position: 'top'|'bottom'`,\n  a missing/`null`/non-positive-integer `height`, or a factory returning no\n  `dispose()` all throw (construction or mount) with nothing attached;\n  `virtualize: false` or absent keeps the byte-identical eager legend.\n- **`@zakkster/lite-virtual`** added as an OPTIONAL peer (mirrors\n  `lite-delaunay`); never imported.\n\n**New in v1.11.0:**\n- **Session-calendar shading.** `shading: { sessions: [{ openMinutes: 570,\n  closeMinutes: 960 }] }` (UTC minutes-from-midnight, days default Mon-Fri)\n  shades everything outside trading hours. Bands ride the annotation layer as\n  in v1.10.0 -- zero per-frame cost, exportSVG-visible, composing with user\n  `annotations`. Overnight sessions (`close < open`) throw as unsupported;\n  every malformed field throws at construction. See \"Time-series line chart\"\n  below.\n- **Fail-closed `xScale.type`.** `createTimeLineChart({ xScale: { type: 'log' } })`\n  now throws; previously the conflicting type was silently overridden.\n\n**New in v1.10.0:**\n- **`createTimeLineChart(config)`.** `createLineChart` with time-first defaults:\n  `xScale.type` forced to `'time'` (a plain numeric `x` key infers `'linear'`\n  otherwise), `panBounds` defaulting to `'data'`, and an optional `shading`\n  config. See \"Time-series line chart\" below.\n- **Weekend shading.** `shading: true | 'weekends' | { fill? }` shades every\n  Sat 00:00 -> Mon 00:00 UTC span in the data domain. Bands are plain\n  `{ type: 'range', axis: 'x' }` annotations, so they compose with any\n  `annotations` you pass and export through `exportSVG`; omit `shading` for a\n  plain time line at zero cost. Fail-closed: a `null`/non-finite extent bound\n  emits no bands (never epoch 0), and SoA `{ xs, ys }` data is shaded like AoS.\n\n**New in v1.9.0:**\n- **Horizontal bars brush.** `createBarChart({ orientation: 'horizontal',\n  brush: true })`. A shift-drag selects a value range (screen-X, the value axis\n  under the swap) crossed with a band set (screen-Y); `chart.brush()` returns\n  `{ valueMin, valueMax, bandMin, bandMax, bands, ids }` -- `bands` the selected\n  category keys, `ids` the matching primary-series rows. The vertical brush keeps\n  its `{ xMin, xMax, yMin, yMax, ids }` shape. Zero per-frame draw allocation is\n  preserved (a `swapAxes ? ...` selection at each brush call site; the pure brush\n  helpers are byte-identical). Fail-closed: an empty-category chart commits\n  `null` (never an undefined band), and a `log` value axis still throws at\n  construction. See \"Horizontal bar brush\" below.\n\n**New in v1.8.0:**\n- **Horizontal bars pan, zoom, and grid.** `createBarChart({ orientation:\n  'horizontal', pan: true, zoom: true, grid: true })`. Under the axis-role swap\n  the value axis is on screen-X, so a horizontal drag pans the value domain and\n  the wheel zooms it around the cursor value; the band (category) axis stays\n  pinned. `view.yMin` / `view.yMax` address the value axis. Zero per-frame draw\n  allocation is preserved (a new gesture-time `swapAxes ? ...` selection at each\n  call site; the linear kernels are untouched). Still fail-closed: horizontal +\n  `brush` (a value-range + band-ids payload is a separate future cut) and\n  horizontal + a `log` value axis both throw at construction. See \"Horizontal\n  bar interactions\" below.\n\n**New in v1.7.0:**\n- **`annotations` on axis-kernel charts.** An array -- or `() => Annotation[]`\n  -- of `line` (a rule at a data value on the x or y axis), `range` (a shaded\n  band between two values on one axis), `point`, and `text` marks, each pinned\n  to DATA coordinates. They re-project on every scale change, so they track\n  pan / zoom and work on log axes (a value `<= 0` on a log axis simply does not\n  draw -- fail-closed, exactly like the series). `color` / `fill` accept\n  `--css-var` tokens and re-resolve on `refreshTheme`. Rendered above the series\n  and below the crosshair; present in `exportSVG`. Zero per-frame allocation,\n  and the whole layer is absent when `annotations` is unset. See \"Annotations\"\n  below.\n\n**New in v1.6.1:**\n- **Mixed-sign log domains pan and zoom cleanly.** When `min <= 0, max > 0`\n  on a `type: 'log'` axis (x or y), the data-domain snapshot used for\n  pan/zoom bounds is floored to the same positive value the render path uses,\n  so the first gesture no longer produces a NaN (frozen) view. The\n  no-positive-extent case still throws at mount. Symmetric on both axes; draw\n  path byte-unchanged.\n\n**New in v1.6.0:**\n- **`xScale: { type: 'log' }`** -- base-10 log on the x-axis for any\n  axis-kernel chart. Ticks via `lite-axis.logTicks` (decade boundaries);\n  `map(x <= 0)` is NaN, so line / area break segments and markers skip.\n  Pan and zoom operate in log space -- the interaction plumbing was already\n  symmetric with the y-axis, so this wiring was mostly enabling what the\n  kernels already supported. Fail-closed: throws at mount on a non-positive\n  x-domain, and at construction on a bar (band) or time x-axis (a scale is\n  one type). See \"Log scale\" below.\n\n**Inherited from v1.5.0 (+ the v1.5.1 patch):**\n- **`centerLabel` on `createDonutChart`** -- a number rendered in the\n  donut hole as a `pointer-events:none` DOM overlay (not canvas text),\n  so its font resizes itself. Font size is owned by CSS `clamp()`: the\n  chart writes the hole radius and the label's digit count as custom\n  properties on data/resize only (sub-Hz), and more digits shrink the\n  number to stay inside the ring -- zero per-frame JS, no `measureText`.\n  Accepts `boolean | string | (() => string) | { text, format, subLabel,\n  color, font, minFontSize, maxFontSize }`. Fail-closed: throws on a\n  chart with no hole (a pie, or `innerRadius` 0). See \"Donut center\n  label\" below.\n- **`orientation: 'horizontal'` on `createBarChart`** -- category band\n  on the Y axis (category 0 at top), bars growing from the value\n  baseline along X. The vertical draw path is byte-identical (horizontal\n  selects a peer draw function once at setup). Fail-closed subset for\n  this cut: `horizontal` combined with `pan` / `zoom` / `brush` / a value\n  `grid` / a log value axis throws at construction. See \"Horizontal\n  orientation\" below.\n- **Log-scale point projection fix (v1.5.1 patch).** `scaleSeriesToPixels`\n  projected `yScale: { type: 'log' }` points with linear math, throwing\n  line / area / scatter / bubble points off-canvas (the axis and ticks were\n  correct; only the points were wrong). The projection loop is now log-aware\n  on both axes; the all-linear path is byte-identical. Present since y-log\n  shipped in v1.4.1. (This is what made the v1.6.0 x-log projection correct.)\n\n**Inherited from v1.4.0 (+ the v1.4.1 patch):**\n- **`yScale: { type: 'log' }`** -- log scale on the y-axis for any\n  axis-kernel chart. Base-10 log; ticks via `lite-axis.logTicks`.\n  See \"Log scale\" below.\n- **`pan: true`** + **`zoom: true`** -- pointer-drag pans\n  (cursor-anchor convention); wheel zooms around the cursor.\n  `chart.view` is a reactive `{ xMin, xMax, yMin, yMax }` accessor\n  intentionally symmetric with `lite-camera-max`'s camera signal\n  for future lite-gl drop-in. See \"Pan + zoom\" below.\n- **`brush: true`** -- shift+drag rectangle selection. `chart.brush`\n  emits `{ xMin, xMax, yMin, yMax, ids }` for cross-chart linking.\n  Coexists with pan/zoom via modifier routing. See \"Brushing\"\n  below.\n- **Four allocation traps closed** (audit): heatmap quantile\n  Float32Array pool; `_parseRGBLike` indexOf scan;\n  `charBufToString` via `apply`; SVG path chunks for 100k+ point\n  export. No public API changes; pre-existing leaks in v1.2-1.3\n  code, fixed silently.\n- **Log-aware pan/zoom (v1.4.1 patch).** `pan` / `zoom` on a\n  `yScale: { type: 'log' }` chart now run their arithmetic in log\n  space (`_applyPanLog` / `_applyZoomLog`) with a domain floor;\n  before, the first gesture drove the domain wrong or negative\n  (findings LC-01..LC-05). `updateLogScale` throws on a non-positive\n  domain. The same log-space pan/zoom now applies to `xScale: { type:\n  'log' }` as of v1.6.0 (see \"New in v1.6.0\" above).\n\n**Inherited from v1.3.0:**\n- **`chart.exportSVG()`** on every chart. Safe at 100k+ points\n  (the SVG path-chunks audit fix above protects against\n  `RangeError: Invalid string length` on big exports).\n\n**Inherited from v1.2.0:**\n- `chart.destroy()` on every kernel; terminal counterpart to\n  `unmount()`. Zero residue across 30 mount+destroy cycles.\n- Heatmap row + column highlights, quantile color binning, and\n  auto-contrast value labels.\n\n**Inherited from earlier alphas:**\n- `createHeatmap` on the fourth kernel (alpha.3); ~11 KB minified\n  on its own, the smallest of the nine bundles.\n- `createScatterChart` (alpha.1); reuses the spatial-index foundation\n  with `k = 1`.\n- Multi-series bubble + per-point color via `colorKey`, global size\n  domain across visible series (alpha.2).\n- Pluggable spatial-index (`SpatialIndex` / `SpatialIndexFactory`)\n  for O(log n) hit-test on dense point clouds (alpha.0).\n  `@zakkster/lite-delaunay` 1.1.0+ ships a conforming\n  `createSpatialIndex` -- see \"Spatial-index hit-testing\" below.\n\n**Inherited from v1.1.0:** bar layout polish -- stacked bars,\nrounded corners, per-bar hover tint. All opt-in.\n\nSee [ROADMAP.md](./ROADMAP.md) for the development history and the\nforward plan.\n\n## Install\n\n```bash\nnpm i @zakkster/lite-charts @zakkster/lite-signal @zakkster/lite-scene @zakkster/lite-axis\n```\n\n## Hello World\n\n```javascript\nimport { signal } from '@zakkster/lite-signal';\nimport { createLineChart } from '@zakkster/lite-charts';\n\nconst data = signal([\n    { t: new Date('2026-01-01'), v: 100 },\n    { t: new Date('2026-02-01'), v: 142 },\n    { t: new Date('2026-03-01'), v: 88 },\n    { t: new Date('2026-04-01'), v: 175 },\n]);\n\nconst chart = createLineChart({\n    data,\n    x: 't',\n    y: 'v',\n    width: 800,\n    height: 400,\n    color: '#3b82f6',\n});\n\nchart.mount(document.getElementById('chart-container'));\n\n// Mutate the signal anywhere -- the chart redraws automatically.\nsetTimeout(() => {\n    data.update((rows) => [...rows, { t: new Date('2026-05-01'), v: 210 }]);\n}, 1000);\n```\n\nThe chart inferred the time scale from the `Date` probe, auto-fitted the\ny-domain with 5% padding, and threaded a reactive signal end-to-end. No\nexplicit re-render needed.\n\n## Why lite-charts\n\n| Concern | lite-charts | Chart.js | uPlot | D3 |\n|---|---|---|---|---|\n| **Reactive data binding** | First-class signals | Imperative `.update()` | Imperative `.setData()` | Manual selection re-bind |\n| **100k points** | 1.4 ms / 4.7 ms p95 (CPU) | Drops frames | OK | Hand-rolled |\n| **Zero-GC steady state** | Yes (slab-based) | No | Mostly | No |\n| **Bundle (min+gz)** | ~6 KB (alpha est.) | 78 KB | 40 KB | 70+ KB |\n| **Render substrate** | Canvas2D via lite-scene | Canvas2D | Canvas2D | SVG / Canvas |\n| **API style** | Vega-Lite middle ground | Imperative config | Hand-tuned | Composable primitives |\n| **Twitch Extension fit** | Yes (1MB / 3s budget) | No | Yes | No |\n\nBuilt specifically for performance-critical environments: dashboards that\nstream telemetry, live trading interfaces, game HUDs, monitoring overlays,\nTwitch Extensions. Where Chart.js works fine until you hit 5k points and a\n~3MB transitive dep graph, lite-charts is engineered to scale to 100k points\nin a 1MB bundle without GC pauses.\n\n## Architecture\n\n```mermaid\ngraph TD\n    User[User config + data signal] --> Constructor[createLineChart]\n    Constructor --> Normalize[Normalize: data shorthand -> series[]]\n    Normalize --> Accessors[Build accessors x/y]\n    Accessors --> InferType[Infer x-scale type]\n    InferType --> StateAlloc[Allocate SeriesState slabs]\n\n    StateAlloc --> Mount[mount(container)]\n    Mount --> Scene[createScene from lite-scene]\n    Scene --> Effect1[Effect: width/height -> plotBounds]\n    Scene --> Effect2[Effect: data -> SoA extract -> scale -> pixels]\n    Scene --> Axes[buildAxis x2 / lite-axis ticks]\n    Scene --> SeriesNodes[path nodes / one per series]\n    SeriesNodes --> DrawFn[makeLineDrawFn closure]\n\n    DrawFn --> PathSelect{n > 2*cols?}\n    PathSelect -->|yes| Decimate[decimateMinMax kernel<br/>lifted from lite-canvas-graph]\n    PathSelect -->|no| Polyline[Direct polyline / NaN-aware]\n    Decimate --> Stroke[ctx.stroke]\n    Polyline --> Stroke\n\n    Signal[Any signal write] --> LiteSignal[lite-signal sync flush]\n    LiteSignal --> EffectsRun[Effects re-run]\n    EffectsRun --> DirtyBridge[scaleVersion bump -> scene.markDirty]\n    DirtyBridge --> SceneDraw[lite-scene drawAll / coalesced via _queued]\n    SceneDraw --> DrawFn\n```\n\nThe hot path (line render) is allocation-free: per-frame work is two `O(n)`\nscans (extract extents, project to pixels) plus the decimation kernel\n(`O(plotWidth)`) and a single `ctx.stroke()`. The axis update path allocates\na small amount per re-layout (label strings, ephemeral props objects), but\nthat runs only on data-domain or size changes, not every frame.\n\n## API Reference\n\n### `createLineChart(config) -> chart`\n\n| Config key | Type | Default | Notes |\n|---|---|---|---|\n| `data` | `Row[]` &#124; `Signal<Row[]>` &#124; `() => Row[]` &#124; `{xs, ys}` SoA | -- | Either `data` or `series` required. SoA fast path is zero-copy. |\n| `series` | `SeriesConfig[]` &#124; `Signal<SeriesConfig[]>` | -- | Multi-series form. `{name, data, color, lineWidth}`. |\n| `x` | `string` &#124; `number` &#124; `(row, i) => number` | `'x'` | Accessor key, array index, or function. `Date` is coerced to ms. |\n| `y` | `string` &#124; `number` &#124; `(row, i) => number` | `'y'` | Same. |\n| `width` | `number` &#124; `Signal<number>` &#124; `() => number` | `800` | Static or reactive. |\n| `height` | `number` &#124; `Signal<number>` &#124; `() => number` | `400` | Same. |\n| `margin` | `{top,right,bottom,left}` | `{16,24,32,56}` | Pixel space reserved for axes. |\n| `color` | `string` | `'#3b82f6'` | Hex, css var (`--my-token`), or any CSS color string. |\n| `lineWidth` | `number` | `1.5` | Series stroke width in CSS pixels. |\n| `background` | `string` &#124; `null` | `null` | Canvas fill before draw. |\n| `dpr` | `number` | `devicePixelRatio` | Override device pixel ratio. |\n| `xScale` | `{type?, domain?}` | inferred | `type: 'linear' \\| 'time'`; `domain: [min, max]` to lock. |\n| `yScale` | `{domain?, zero?, nice?}` | nice + pad | `zero: true` forces 0 inclusion; `nice: true` adds 5% padding. |\n| `axisColor` | `string` | `'#888888'` | Axis spine + tick color. |\n| `labelColor` | `string` | `'#444444'` | Tick label color. |\n| `font` | `string` | `'11px sans-serif'` | Tick label font. |\n| `interpolation` | `'linear'` &#124; `'step'` &#124; `'step-after'` &#124; `'step-before'` &#124; `'step-mid'` &#124; `'monotone'` &#124; `'catmull-rom'` | `'linear'` | Path interpolation mode. Per-series override via `SeriesConfig.interpolation`. |\n| `markers` | `boolean` &#124; `{shape?, size?, fill?, stroke?, strokeWidth?, everyN?}` | `false` | Marker dots at each sample. `true` = circle defaults. `{everyN: 5}` for dense data. |\n| `grid` | `boolean` &#124; `{x?, y?, color?}` | `false` | Gridlines through the plot rect at each tick. `true` = both axes. Object form for per-axis + color override. |\n| `crosshair` | `boolean` &#124; `{color?, dash?}` | `true` | Vertical line + per-series marker dots. `false` disables. |\n| `tooltip` | `boolean` &#124; `{background?, border?, format?}` | `true` | Canvas-drawn box at the snapped x. `false` disables. |\n| `legend` | `boolean` &#124; `'top'`&#124;`'bottom'`&#124;`'left'`&#124;`'right'` &#124; `{position?, container?}` | `'bottom'` | DOM-rendered legend with click-to-toggle. `false` disables. |\n| `schedule` | `(fn) => void` | `requestAnimationFrame` | Frame scheduler. Pass `(fn) => fn()` for sync (tests), `queueMicrotask` for headless batching. |\n\n#### Chart methods\n\n| Method | Returns | Notes |\n|---|---|---|\n| `chart.mount(target)` | `chart` | `target` is an `HTMLElement` (creates canvas inside) or `HTMLCanvasElement`. |\n| `chart.unmount()` | `void` | Disposes all effects, removes canvas if owned. Idempotent. |\n| `chart.exportPNG({mimeType?, quality?})` | `string` (data URL) | Calls `canvas.toDataURL`. |\n| `chart.redraw()` | `void` | Force a redraw without changing data. |\n| `chart.moveCrosshair(canvasX, canvasY)` | `void` | Programmatic crosshair move. Snaps to nearest sample on the primary series. |\n| `chart.hideCrosshair()` | `void` | Hide crosshair + tooltip. Idempotent. |\n| `chart.setSeriesVisible(idx, visible)` | `void` | Toggle a series. Out-of-range indices are safe no-ops. |\n| `chart.refreshTheme()` | `void` | Re-resolve CSS-var colors and redraw. Call after a theme switch. |\n\n#### Chart properties\n\n| Prop | Type | Notes |\n|---|---|---|\n| `chart.scene` | `Scene` &#124; `null` | The underlying `lite-scene` instance. |\n| `chart.canvas` | `HTMLCanvasElement` &#124; `null` | The canvas being drawn into. |\n| `chart.xScale` | `Scale` | `{type, dMin, dMax, rMin, rMax, map(v), invert(px)}`. |\n| `chart.yScale` | `Scale` | Same shape. |\n| `chart.xScaleType` | `'linear'` &#124; `'time'` | Resolved at construction. |\n| `chart.plotBounds` | `Signal<number>` | A version-counter signal; subscribe to react to size changes. |\n| `chart.crosshair` | `Signal<CrosshairState>` | Live `{visible, snapIdx, snapDomainX, snapPixelX, mousePixelY}`. Subscribe for synchronized small-multiples. |\n| `chart.seriesVisibility` | `Signal<boolean>[]` | One signal per series. Read in a reactive context to bind external UI; write to toggle. |\n| `chart.legend` | `HTMLElement` &#124; `null` | The legend container, or null if `legend: false` or mounted into a bare canvas. |\n\n## Reactivity\n\nEvery config value (`width`, `height`, `data`, future `color`, etc.) accepts\neither a static value or a signal accessor. A signal is just a function:\n\n```javascript\nconst w = signal(800);\nconst chart = createLineChart({ data, width: w, height: 400 });\nchart.mount(el);\n\n// Later:\nw.set(1200);  // chart resizes and rescales -- no manual redraw call\n```\n\nInternally, lite-charts wraps statics in constant accessors via a tiny\nhelper, so the engine only ever calls functions. Zero overhead for static\nconfig; full reactivity for signal config. Same pattern as `unref` in Vue,\n`toValue` in Solid, etc.\n\n### Bring-your-own scheduling\n\nThe default schedule is `requestAnimationFrame`. In Node (tests, headless\nbenches, SSR-adjacent workflows), pass an explicit schedule:\n\n```javascript\n// Synchronous -- assertions can read ctx.calls immediately. Best for tests.\nconst chart = createLineChart({ ..., schedule: (fn) => fn() });\n\n// Microtask-coalesced -- draws batch within a tick. Best for headless benches.\nconst chart = createLineChart({ ..., schedule: (fn) => queueMicrotask(fn) });\n```\n\n## Tooltip + crosshair\n\nOn by default in v1.0.0-alpha.1. The crosshair vertical line snaps to the\nnearest sample on the primary series (binary search on sorted xs); markers\non each additional series snap independently at the same domain x. The\ntooltip is canvas-drawn (no DOM overlay), so it remains headless-testable.\n\n```javascript\ncreateLineChart({\n    data,\n    crosshair: { color: '#666', dash: [3, 3] },\n    tooltip: {\n        // String form: replaces the header, suppresses rows.\n        format: (snap) => 'sample #' + snap.snapIdx,\n        // Object form: customize both -- snap.rows is pre-filled with one row per series.\n        // format: (snap) => ({ header: 'custom', rows: snap.rows }),\n    },\n});\n\n// Disable per-feature\ncreateLineChart({ data, crosshair: false });  // tooltip stays on\ncreateLineChart({ data, tooltip: false });    // crosshair stays on\ncreateLineChart({ data, crosshair: false, tooltip: false }); // no DOM listener attached\n```\n\n### Synchronized crosshairs across small multiples\n\nThe `chart.crosshair` signal exposes live state. To synchronize the\ncrosshair across multiple charts sharing an x-axis, write to one and\nforward to the others:\n\n```javascript\nconst c1 = createLineChart({ data: a, x: 't', y: 'cpu' });\nconst c2 = createLineChart({ data: b, x: 't', y: 'mem' });\nc1.mount(el1); c2.mount(el2);\n\nc1.crosshair.subscribe((state) => {\n    if (state.visible) c2.moveCrosshair(state.snapPixelX, /* y irrelevant for sync */ 0);\n    else c2.hideCrosshair();\n});\n```\n\n### Programmatic + testing API\n\n`chart.moveCrosshair(canvasX, canvasY)` and `chart.hideCrosshair()` drive\nthe same path as the DOM mousemove handler. Tests use these directly\nagainst the mock canvas (no event simulation needed). The mock canvas in\n`test/harness.js` doesn't implement `addEventListener`, so the DOM listener\nis skipped in headless contexts -- the programmatic API is the only way in.\n\n## Area chart (v1.0.0-alpha.2)\n\n`createAreaChart(config)` shares everything with `createLineChart` -- same\ndata shape, same accessors, same scales, same reactivity, same crosshair\nand tooltip -- and adds three options:\n\n| Config key | Type | Default | Notes |\n|---|---|---|---|\n| `baseline` | `number` &#124; `'bottom'` | `0` | Domain y value to close the area to. `'bottom'` pins to the bottom edge of the plot rect regardless of domain. Numeric baselines clamp to plot rect if outside. |\n| `stroke` | `boolean` | `true` | Whether to stroke the upper boundary of the fill. |\n| `fillOpacity` | `number` | `0.3` | Multiplied into `globalAlpha` before fill. The stroke draws at full alpha. |\n\n```javascript\nimport { createAreaChart } from '@zakkster/lite-charts';\n\nconst chart = createAreaChart({\n    data: timeseries,\n    x: 't', y: 'cpu',\n    color: '#3b82f6',\n    baseline: 0,        // fills from data line down to y=0\n    fillOpacity: 0.25,\n    stroke: true,       // crisp blue line on top of soft fill\n});\n```\n\nBoth render paths from line chart carry over: direct polyline-with-close\nfor sparse data, decimated per-column for dense. The decimated path fills\nto the column's upper envelope (max), matching d3-area's default behavior;\nribbon-style min-max area is a separate primitive in v1.1+.\n\n## Legend (v1.0.0-alpha.3)\n\nRendered as a DOM element (sibling of the canvas, inside an auto-created\nflex wrapper), so it's keyboard-accessible (each row is a `<button>` with\n`aria-pressed`), CSS-themable (`.lite-charts-legend` class on the\ncontainer), and -- opt-in -- windowable for hundreds of series (see\n[Virtualizing a tall legend](#virtualizing-a-tall-legend-v1120)).\nClick-to-toggle is wired by default.\n\n```javascript\ncreateLineChart({\n    series: [\n        { name: 'CPU',  data: cpuRows },\n        { name: 'Memory', data: memRows },\n        { name: 'Disk', data: diskRows },\n    ],\n    x: 't', y: 'pct',\n    legend: 'bottom',           // 'top' | 'bottom' | 'left' | 'right' | false\n});\n```\n\nPosition controls the auto-wrapper's flex direction:\n\n- `'bottom'` / `'top'` -> column wrapper (canvas above/below legend)\n- `'left'` / `'right'` -> row wrapper (canvas beside legend)\n\nFor custom DOM placement, pass an existing element via\n`legend: { container: someEl }` -- the legend appends into your element and\nthe canvas stays put.\n\n### Virtualizing a tall legend (v1.12.0)\n\nA legend with hundreds of series puts one DOM node per series into layout.\n`legend.virtualize` hands the row windowing to an external adapter so only a\nbounded set of rows is ever mounted. **lite-charts never imports a windowing\nlibrary** -- you pass the factory. Wire it to `@zakkster/lite-virtual`'s\n`mountList` (your import), or any windowing primitive with the same shape:\n\n```javascript\nimport { createLineChart } from '@zakkster/lite-charts';\nimport { effect } from '@zakkster/lite-signal';\nimport { mountList } from '@zakkster/lite-virtual'; // YOUR import, not ours\n\n// mountList wants (host, scope, opts) with a lite-element-shaped scope\n// ({ effect, on, onCleanup }) and viewport/render key names; lite-charts\n// hands the factory (host, opts) and wants { dispose } back. This bridge\n// closes the gap -- its collected teardowns become the one dispose().\nconst virtualize = (host, opts) => {\n    const cleanups = [];\n    const scope = {\n        effect: (fn) => { const stop = effect(fn); cleanups.push(stop); return stop; },\n        on: (el, ev, fn, o) => {\n            el.addEventListener(ev, fn, o);\n            cleanups.push(() => el.removeEventListener(ev, fn, o));\n        },\n        onCleanup: (fn) => cleanups.push(fn),\n    };\n    mountList(host, scope, {\n        count: opts.count,\n        itemHeight: opts.itemHeight,\n        viewport: opts.height,\n        overscan: opts.overscan,\n        render: opts.renderRow,\n    });\n    return {\n        dispose: () => {\n            for (let i = cleanups.length - 1; i >= 0; i--) cleanups[i]();\n            cleanups.length = 0;\n        },\n    };\n};\n\ncreateLineChart({\n    series: manySeries,                  // hundreds of rows\n    legend: {\n        position: 'right',               // must be 'left' or 'right'\n        height: 320,                     // required: scroll-viewport px\n        itemHeight: 28,                  // fixed row height (default 28)\n        overscan: 2,                     // off-viewport rows (default 2)\n        virtualize,                      // -> { dispose }\n    },\n});\n```\n\nOne styling note: the pooled rows are absolutely positioned, so the legend\nhost has no intrinsic width -- give `.lite-charts-legend-virtual` an explicit\nwidth (e.g. `flex: 0 0 200px`) or it collapses beside the canvas.\n\nThe factory is called once at mount with `(host, opts)`:\n\n| `opts` field | Type | Meaning |\n|---|---|---|\n| `count` | `number` | Total series count (`>= 0`). |\n| `itemHeight` | `number` | Fixed row height in px (`> 0` integer). |\n| `height` | `number` | Viewport height in px (`> 0` integer). |\n| `overscan` | `number` | Extra rows rendered per edge (`>= 0` integer). |\n| `renderRow` | `(rowEl, idx) => void` | Bind a pooled row to series `idx`. |\n\nThe adapter owns row creation, position, and height; it calls `renderRow` for\neach visible (and overscan) row. `renderRow` -- owned by lite-charts -- writes\nthe row's children, `data-lc-idx`, `role`/`aria-pressed`/`tabindex`, swatch\ncolour, opacity, and label text, re-reading colour and visibility on every call\nso a recycled row never carries stale state. A single delegated click listener\non the host toggles the series under the clicked `data-lc-idx`.\n\nThe factory **must** return `{ dispose: function }`, or mount throws with nothing\nattached (`chart.legend` stays `null`). Every invalid config -- a non-function\n`virtualize`, `position: 'top' | 'bottom'`, a missing/`null`/non-positive-integer\n`height`, or an invalid `itemHeight` / `overscan` -- throws at construction,\nbefore any signal is allocated. `virtualize: false` (or absent) uses the eager\npath unchanged.\n\n> **Focus does not survive scroll-out.** Rows are pooled and recycled, so a row\n> that scrolls out of the window is rebound to a different series -- keyboard\n> focus on it is lost. This is an inherent trade-off of virtualization.\n\n### Series visibility\n\nEach series has a `Signal<boolean>` exposed on `chart.seriesVisibility[i]`.\nToggling it has three effects:\n\n1. The series stops rendering (line/area, crosshair marker, tooltip row).\n2. The y-domain rescales to fit only the visible series (matching\n   Chart.js convention -- toggle reveals detail in the remaining data).\n   Pass an explicit `yScale: { domain: [...] }` to lock the scale.\n3. The legend swatch + label dim (`opacity: 0.4`, `aria-pressed=false`).\n\nYou can toggle programmatically via `chart.setSeriesVisible(idx, bool)` or\nwrite directly to the signal:\n\n```javascript\nchart.setSeriesVisible(0, false);\n// or\nchart.seriesVisibility[0].set(false);\n// or\nchart.seriesVisibility[0].update((v) => !v);\n```\n\nFor a \"show only this\" pattern (alt-click), iterate:\n\n```javascript\nconst showOnly = (idx) => {\n    chart.seriesVisibility.forEach((sig, i) => sig.set(i === idx));\n};\n```\n\n## Path interpolation (v1.0.0)\n\nSeven modes. Default is `'linear'` (the polyline). Three step variants for\ndiscrete data (telemetry, state machines, financial OHLC). Two smoothing\nmodes for continuous data.\n\n```javascript\ncreateLineChart({ data, interpolation: 'monotone' });\n```\n\n| Mode | Visual | When to use |\n|---|---|---|\n| `'linear'` | Straight segments between samples | Default; honest about data resolution |\n| `'step'` / `'step-after'` | Horizontal then vertical | Sample held until the next reading (sensor readouts) |\n| `'step-before'` | Vertical then horizontal | Sample took effect at the prior x (event-triggered transitions) |\n| `'step-mid'` | Step at the midpoint of each segment | Symmetric staircase; useful for histogram-like data |\n| `'monotone'` | Fritsch-Carlson cubic Hermite | Smooth without overshooting between samples. Best for noisy time-series. |\n| `'catmull-rom'` | Uniform Catmull-Rom spline | Smooth through all samples. Aesthetic; can overshoot on irregular data. |\n\nPer-series override:\n\n```javascript\ncreateLineChart({\n    series: [\n        { name: 'CPU',    data: cpu,    interpolation: 'monotone' },\n        { name: 'Events', data: events, interpolation: 'step-after' },\n    ],\n});\n```\n\n**Decimation interaction:** when `n > 2 * plotWidth` and the decimated\nrender path activates, interpolation is ignored -- smoothing the per-column\nmin/max envelope would be visually misleading. Interpolation only changes\nthe direct path.\n\n**NaN handling:** linear and step modes split on NaN (each contiguous run\nrenders independently). Smoothing modes assume contiguous data; if you need\ngaps, use linear or step.\n\n## Markers (v1.0.0)\n\nMarker dots at each sample point. Distinct from crosshair markers (those\nappear only on hover).\n\n```javascript\ncreateLineChart({ data, markers: true });   // circle defaults\n\ncreateLineChart({\n    data,\n    markers: {\n        shape: 'diamond',\n        size: 6,\n        fill: '#3b82f6',\n        stroke: '#ffffff',\n        strokeWidth: 2,\n        everyN: 1,\n    },\n});\n```\n\nUse `everyN` for dense series:\n\n```javascript\n// 500-point series with markers every 10th sample -- legible without noise.\ncreateLineChart({ data: dense, markers: { everyN: 10 } });\n```\n\n**Decimation interaction:** markers are suppressed when the decimated path\nruns (>2x plot width). They'd be unreadable.\n\n## Error bars + confidence bands (v1.21.0)\n\nOpt in per series (or chart-level as a default) on `createLineChart`,\n`createAreaChart`, `createScatterChart`. Each point gets a lower/upper\nbound, drawn as a whisker (vertical bar + caps), a filled ribbon, or both.\n\n```javascript\n// Absolute lo/hi per row.\ncreateLineChart({\n  data: [{ x: 0, y: 5, lo: 4, hi: 6.5 }, { x: 1, y: 6, lo: 5.2, hi: 6.8 }],\n  errorBars: { lo: 'lo', hi: 'hi' },        // whiskers, caps 3px\n});\n\n// Symmetric magnitude -- lo = y - e, hi = y + e.\ncreateLineChart({\n  data: rows,\n  errorBars: { value: 'stderr', band: 'both' },  // ribbon + whiskers\n});\n\n// Per series: bars on one series only.\ncreateLineChart({\n  series: [\n    { name: 'model', data: pred, errorBars: { lo: 'p05', hi: 'p95', band: true } },\n    { name: 'actual', data: obs },            // no bars\n  ],\n});\n```\n\n`errorBars` fields:\n\n| Field | Meaning |\n| --- | --- |\n| `lo`, `hi` | Absolute lower/upper accessors or keys (AoS). Mutually exclusive with `value`. |\n| `value` | Symmetric magnitude: `lo = y - v`, `hi = y + v`. |\n| `band` | `false` whiskers only (default), `true` filled ribbon, `'both'`. |\n| `color` | Whisker stroke. Default = the series color. |\n| `width` | Whisker stroke px. Default 1, clamped to `(0, 8]`. |\n| `capWidth` | Cap half-extent px. Default 3, `[0, 32]`; `0` = no caps. |\n| `bandFill` | Ribbon fill. Default = the series color at ~0.15 alpha. |\n\nSoA data supplies parallel `los` / `his` typed arrays alongside `xs` / `ys`\ninstead of accessors. Bounds project through the y-scale (log-safe -- a\nnon-positive bound self-skips) on the annotation cold-resolve/hot-project\nsplit, so a pan/zoom frame re-maps at 0 B and the raw columns re-resolve\nonly on a data or theme change. A NaN/null gap splits the ribbon into runs.\n\n**Fail-closed:** a per-row `null`/`NaN` `lo`/`hi`/`value` self-skips that\npoint -- never a bar anchored at 0 (`+null === 0` is gated). A malformed\n`errorBars` (junk shape, `value` together with `lo`/`hi`, bad\n`width`/`capWidth`/`band`/`color`) throws at construction before any signal\nis allocated.\n\n**Not for:** bar charts (the grouped/stacked offset math is a separate\ncut), decimated high-N series (bars draw per raw point -- intended for\nlow-N), and horizontal-bar layouts. Box plots and stacked area are later\nstatistical cuts.\n\n## Theme reactivity (v1.0.0)\n\nColors passed as `'--token-name'` get resolved against the container's\ncomputed style at mount. When you switch themes (dark mode, brand swap),\ncall `chart.refreshTheme()` to re-resolve every CSS-var-driven color and\ntrigger a redraw.\n\n```javascript\nconst chart = createLineChart({\n    data,\n    color: '--my-brand-primary',\n    axisColor: '--my-text-muted',\n});\nchart.mount(el);\n\n// On theme change:\ndocument.documentElement.setAttribute('data-theme', 'dark');\nchart.refreshTheme();\n```\n\nHex / oklch / named colors pass through unchanged; only CSS-var tokens\nre-resolve. Legend swatches update too. As of v1.22.0 the heatmap / grid\nkernel is covered as well -- its precomputed cell ramp is recomputed on\n`refreshTheme()`; earlier versions required a re-create. As of v1.23.0\nthe axis-kernel chrome (spine, ticks, labels, gridlines, axis titles)\ngenuinely recolors too: earlier versions repainted those scene nodes in\ntheir stale mount-time colors after a theme switch.\n\n> **MutationObserver auto-detection** is deliberately not bundled in v1.0.0.\n> Which element to observe (container? `<html>`? `<body>`?), which\n> attributes (class? data-theme? both?), and how to debounce all depend on\n> the host app's theming convention. Wire your own observer to call\n> `chart.refreshTheme()`, or pair it with whatever theme-change event your\n> framework emits.\n\n## Bar chart (v1.1.0-alpha.0)\n\n```javascript\nimport { createBarChart } from '@zakkster/lite-charts';\n\n// Single series:\nconst chart = createBarChart({\n    data: [\n        { x: 'Q1', y: 42 },\n        { x: 'Q2', y: 58 },\n        { x: 'Q3', y: 65 },\n        { x: 'Q4', y: 78 },\n    ],\n    color: '--c-primary',\n});\nchart.mount(document.getElementById('chart'));\n```\n\nMulti-series renders **grouped** side-by-side at each category. Each bar\ntakes a slice of the band centered on its series index\n(`offsetX = (i - (count - 1)/2) * groupWidth`):\n\n```javascript\ncreateBarChart({\n    series: [\n        { name: 'Revenue',  data: [{x:'Q1',y:42}, {x:'Q2',y:58}, ...], color: '--c-primary' },\n        { name: 'Expenses', data: [{x:'Q1',y:30}, {x:'Q2',y:35}, ...], color: '--c-amber' },\n        { name: 'Profit',   data: [{x:'Q1',y:12}, {x:'Q2',y:23}, ...], color: '--c-cyan' },\n    ],\n});\n```\n\n| Config | Type | Default | Notes |\n|---|---|---|---|\n| `baseline` | `number` | `0` | Y value where bars anchor. Negatives extend downward. |\n| `paddingInner` | `number` | `0.15` | Gap between bands as fraction of step. d3 convention. |\n| `paddingOuter` | `number` | `0.1` | Padding at each end of the range as fraction of step. |\n| `groupInnerPad` | `number` | `0.08` | Inner gap between bars within a grouped slot. |\n| `orientation` | `'vertical' \\| 'horizontal'` | `'vertical'` | `'horizontal'` puts the category band on Y (v1.5.0). Any other value throws. |\n\n**Hit detection is discrete.** Unlike line/area which uses `bisectNearest`\n(O(log n) over the x array), bar uses `bandScale.invert(canvasX)` which is\na single floor-division: `Math.floor((px - origin) / step)`. The user is\neither inside a band or in a gap that snaps to the nearest band. O(1)\nregardless of category count.\n\n**Y-domain includes the baseline by default** so bars don't visually float.\nOverride with `yScale: { domain: [...] }` if you need a fixed window.\n\n**Stacked layout** (v1.1.0) flips the grouped layout with `stack: true`;\neach series gets per-category `stackBottoms` / `stackTops` in data space\nfrom a `postExtract` hook, and the y-domain rolls up to the cumulative\ntotal.\n\n### Horizontal orientation (v1.5.0)\n\n```javascript\ncreateBarChart({\n    orientation: 'horizontal',\n    series: [{ name: 'Downloads', color: '--c-primary', data: [\n        { x: 'TypeScript', y: 1840 },\n        { x: 'Python',     y: 1620 },\n        { x: 'Rust',       y: 940  },\n    ]}],\n});\n```\n\n`orientation: 'horizontal'` swaps the category band onto the **Y axis**\n(category 0 at top, reusing the heatmap y-band convention) and grows each\nbar from the value baseline along **X**; the value axis moves to the\nbottom and category labels sit right-aligned on the left. Rankings and\nlong category labels read better this way than rotated under a vertical\naxis.\n\nThe **vertical draw path is byte-identical to v1.4.1** -- horizontal\nselects a peer draw function (`makeHBarDrawFn`) and a pixel-range swap\nonce at setup, so there is no per-frame branch and a vertical chart pays\nnothing. Proven by a SHA-256 hash-parity test over the five hot draw\nfunctions.\n\n**Fail-closed subset for this cut.** `orientation: 'horizontal'` combined\nwith `pan`, `zoom`, `brush`, a value-axis `grid`, or a log value axis\nthrows at construction rather than half-wiring the interaction (those\nland in a later 1.5.x). `crosshair().snapPixelX` reports the band-axis\npixel when horizontal.\n\n## Tree-shakeable architecture (v1.2.0)\n\n`lite-charts` is built on a tiny shared kernel that's parameterized by a\n**renderer object** per chart type:\n\n```javascript\nconst createBaseAxisChart = (config, renderer) => { /* shared scaffold */ };\n\nconst LINE_RENDERER = { extractData, makeDrawFn, hitTest, buildXAxis, ... };\nconst AREA_RENDERER = { ...AREA_specific };\nconst BAR_RENDERER  = { ...BAR_specific };\n\nexport const createLineChart = (config) => createBaseAxisChart(config, LINE_RENDERER);\nexport const createAreaChart = (config) => createBaseAxisChart(config, AREA_RENDERER);\nexport const createBarChart  = (config) => createBaseAxisChart(config, BAR_RENDERER);\n```\n\n`createBaseAxisChart` calls renderer methods **polymorphically** -- it\nnever references any specific renderer by name. The bundler can statically\nprove which renderers are reachable from the entry import and drop the\nrest, along with all their renderer-specific helpers.\n\n**Measured bundle sizes** (esbuild --bundle --minify, peer deps externalized):\n\n| Entry | Bundle size | What's included |\n|---|---|---|\n| `import { createLineChart }`    | **24 KB** | Line renderer + interp helpers + decimation + shared axis kernel + auto-resize |\n| `import { createAreaChart }`    | **25 KB** | Area renderer + interp helpers + decimation + shared axis kernel + auto-resize |\n| `import { createBarChart }`     | **25 KB** | Bar renderer + bandScale + bar helpers + shared axis kernel + auto-resize + **stack / rounded / hover (v1.1.0)** |\n| `import { createBubbleChart }`  | **25 KB** | Bubble renderer + sqrt size scale + distance hit-test + axis kernel + auto-resize + **spatial-index hook (v1.2.0-alpha.0)** + **multi-series + per-point color (v1.2.0-alpha.2)** |\n| `import { createScatterChart }` | **22 KB** | Scatter renderer + axis kernel + spatial-index hook (v1.2.0-alpha.1) |\n| `import { createPieChart }`     | **13 KB** | Slice renderer + polar kernel (no axes / scales / interp / decimation) + auto-resize |\n| `import { createDonutChart }`   | **13 KB** | Same as pie (shared renderer; only innerRadius default differs) |\n| `import { createRadarChart }`   | **13 KB** | Radar kernel (cos/sin tables, polygon draw, spokes, grid rings, vertex hit-test) -- zero axis/polar code |\n| `import { createHeatmap }`      | **10.5 KB** | **Grid kernel (v1.2.0-alpha.3)** -- two band scales, Float32 cells, Uint8 presentMask, precomputed cell colors. Zero axis / polar / radar code. |\n| All nine together               | **~70 KB** | Four kernels deduplicated; all renderers; shared utilities (resolveColor, ensureFloat32, mount/DPR, legend, auto-resize) shared once |\n\nThe v1.1.0 bar features (stacked layout, rounded corners, hover tint)\nadd ~1.6 KB to the bar bundle (`computeBarStacks`, `_roundRectPath`,\nthe per-bar tint overlay path). The kernel-level `postExtract` hook is\na single null-check that minifies to a few dozen bytes; line / area /\nbubble bundles each pick up ~300 bytes for it. Pie / donut / radar are\non different kernels and unaffected.\n\n**Auto-resize:** omit `width` / `height` from the config and the chart\nobserves its mount container, updating dimensions on container resize\nthrough the existing reactive graph:\n\n```js\n// Reactive to container size, no demo helpers needed\ncreateLineChart({ series: [...] }).mount(document.getElementById('chart'));\n\n// Explicit static -- bypasses auto-observation\ncreateLineChart({ series: [...], width: 800, height: 400 }).mount(canvas);\n\n// Explicit reactive -- user-provided signal\ncreateLineChart({ series: [...], width: mySignal }).mount(div);\n```\n\nFalls back gracefully (keeps default size) when `ResizeObserver` is\nunavailable. rAF-throttled so burst resize events coalesce into one\nre-extract per frame.\n\n**What gets dropped from the radar bundle:** every axis-chart helper\n(xScale, yScale, axes, grid, decimation, interp, bisect, bandScale,\nmakeLineDrawFn, makeBarDrawFn, makeBubbleDrawFn) and every polar-slice\nhelper (extractSliceData, sliceHitTest, computeSliceGeometry,\nmakeSliceDrawFn). What's *kept*: the precomputed cos/sin tables, polygon\ndraw, spoke renderer with angle-aware label alignment, and 12-px\nnearest-vertex hit-test.\n\n**Requirements for tree-shaking to work** (already in place):\n1. `\"sideEffects\": false` in package.json\n2. Every renderer is a separate top-level `const`\n3. Renderers don't reference each other (no spread inheritance -- shared\n   methods are top-level `const`s)\n4. Pure test helpers live on a separate `_testHelpers` export, not on\n   chart instance `_internal` -- production code never references it, so\n   it gets dropped along with everything it transitively references\n\nThe same architecture extends to upcoming chart families:\n\n```javascript\n// v1.3.0 -- pie family (no axes, polar coordinates)\nconst createBasePolarChart = (config, renderer) => { /* polar scaffold */ };\nexport const createPieChart   = (c) => createBasePolarChart(c, PIE_RENDERER);\nexport const createDonutChart = (c) => createBasePolarChart(c, DONUT_RENDERER);\nexport const createRadarChart = (c) => createBasePolarChart(c, RADAR_RENDERER);\n\n// v1.3.0 -- scatter family (extends axis chart with size dimension)\nexport const createBubbleChart = (c) => createBaseAxisChart(c, BUBBLE_RENDERER);\n\n// v1.4.0 -- heatmap (2D categorical grid)\nconst createBaseGridChart = (config, renderer) => { /* grid scaffold */ };\nexport const createHeatmap = (c) => createBaseGridChart(c, HEATMAP_RENDERER);\n```\n\nEach chart type added to the library costs nothing for users who don't\nimport it. A dashboard that only needs line and bar charts gets a ~30 KB\nbundle even after pie, donut, radar, bubble, and heatmap ship.\n\n## Donut center label (v1.5.0)\n\nA number in the donut hole, rendered as a `pointer-events:none` DOM\noverlay (a sibling of the canvas, **not** canvas text or a scene node) so\nit resizes itself and never touches the per-frame slice draw:\n\n```javascript\nimport { signal, createDonutChart } from '...';\n\nconst data = signal([\n    { label: 'Search', value: 4200 },\n    { label: 'Direct', value: 2800 },\n]);\n\ncreateDonutChart({\n    data,\n    innerRadius: 0.55,\n    centerLabel: {\n        text: () => data().reduce((s, d) => s + d.value, 0).toLocaleString(),\n        subLabel: 'Total',\n    },\n});\n```\n\n- **Config:** `boolean | string | (() => string) | { text, format,\n  subLabel, color, font, minFontSize, maxFontSize }`. `centerLabel: true`\n  defaults `format` to the total of visible slices; a string or accessor\n  is shorthand for `{ text }`. `text` and `subLabel` are static-or-signal\n  -- an accessor makes the label reactive.\n- **Font size is owned by CSS.** The overlay is fixed at mount to\n  `font-size: clamp(var(--cl-min), calc(var(--cl-fit) / var(--cl-digits)),\n  var(--cl-max))`. On data/resize only (sub-Hz) the chart writes\n  `--cl-fit` (hole radius), `--cl-digits` (label length), and the\n  min/max floor and cap. More digits shrink the number; it tracks the\n  donut as it resizes; there is **zero per-frame JS and no\n  `measureText`**. The overlay box is constrained to the hole's inscribed\n  square so text cannot overflow the ring.\n- **Fail-closed.** Throws at construction on a chart with no hole (a pie,\n  or a resolved `innerRadius` of 0), and if `minFontSize > maxFontSize`.\n- **SVG export parity.** `chart.exportSVG()` emits an equivalent centered\n  `<text>` from the same fit formula (plus a second `<text>` for the\n  sub-label). `exportPNG` does **not** include the overlay -- it is a\n  `toDataURL` of the canvas only, by design. `chart.centerLabel` exposes\n  the overlay element (null when not configured).\n- **Requires a mount target with a parent** (the overlay is absolutely\n  positioned against the chart container); a plain donut without\n  `centerLabel` still mounts anywhere.\n\n## Spatial-index hit-testing (v1.2.0)\n\nPast roughly a thousand points, the linear-scan hover hit-test on bubble and\nscatter charts starts to cost real time per pointer move. The `spatialIndex`\nconfig option accepts a factory matching the `SpatialIndexFactory` contract;\n**lite-charts never imports a spatial library** -- you pass the factory, same\ndependency direction as `legend.virtualize`. `@zakkster/lite-delaunay` 1.1.0+\nexports `createSpatialIndex`, which matches the contract directly -- no\nadapter needed:\n\n```javascript\nimport { createBubbleChart } from '@zakkster/lite-charts';\nimport { createSpatialIndex } from '@zakkster/lite-delaunay'; // YOUR import, not ours\n\ncreateBubbleChart({\n    data: denseRows,                          // thousands of points\n    // One factory per chart; maxPoints >= your largest series point count.\n    spatialIndex: createSpatialIndex(20_000),\n    spatialIndexThreshold: 1000,              // default; linear scan below it\n});\n```\n\nThe factory is `(pxs, pys, n) => index`, called lazily at the first hit-test\nonce a series crosses `spatialIndexThreshold` points, cached across queries,\nand disposed on every data change and on unmount. The index it returns:\n\n| Member | Contract |\n|---|---|\n| `findNearest(qx, qy, k, maxDistSq, outIndices, outDistSq)` | Write up to `k` nearest original indices (by squared pixel distance, filtered to `<= maxDistSq`) into the caller-owned buffers; return the count written (`0..k`). Zero allocation per query. |\n| `dispose()` | Free/recycle whatever the build acquired. |\n\nlite-charts queries with `k = 8` and post-filters by disc containment plus\nsmallest-radius tie-break, so overlapping bubbles resolve to the visually\ntopmost point -- identical semantics to the linear-scan path. `NaN` points\n(log-scale projections, missing data) never come back from a conforming\nindex, and a chart below the threshold, or with no factory configured, stays\non the byte-identical linear-scan path.\n\n## Fat hover + Voronoi cells (v1.14.0)\n\nTwo scatter-only features that share one idea: a point's Voronoi cell is the\nregion of the plot closer to it than to any other point.\n\n**Fat hover** turns that region into the hit target. On a sparse scatter,\npixel-perfect aim inside a small `hitTolerance` disc is fussy; `hitTolerance:\n'nearest'` instead snaps the hover to the closest point no matter how far the\ncursor is:\n\n```javascript\nimport { createScatterChart } from '@zakkster/lite-charts';\n\ncreateScatterChart({\n    data: sparseRows,\n    hitTolerance: 'nearest',   // snap to the closest point, always\n});\n```\n\nThe query is capped per-hover at the plot diagonal squared -- a finite bound\nthat is semantically \"everywhere inside the plot\" yet always terminates the\nspatial index's grid walk (an unbounded `Infinity` is an untested input to a\nthird-party grid). It works identically on the linear and indexed paths. A\nnumber keeps the classic disc behavior byte-for-byte; any other string throws\nat construction.\n\n**Cell tessellation** draws the cells themselves -- the classic\nstation-map/coverage view where every point owns a colored polygon. Like\n`spatialIndex`, the polygon geometry comes from an injected factory;\n**lite-charts imports no tessellation library**. `@zakkster/lite-delaunay`\n1.2.0+ exports `createCellIndex`, which matches the `CellIndexFactory`\ncontract directly:\n\n```javascript\nimport { createScatterChart } from '@zakkster/lite-charts';\nimport { createCellIndex } from '@zakkster/lite-delaunay'; // YOUR import, not ours\n\ncreateScatterChart({\n    data: stations,\n    hitTolerance: 'nearest',                  // fat hover pairs naturally\n    cells: {\n        index: createCellIndex(20_000),       // maxPoints >= largest series\n        colorKey: 'zone',                     // raw per-point fill (no coercion)\n        fillOpacity: 0.35,\n        stroke: '#ffffff', strokeWidth: 1,    // optional cell boundaries\n    },\n});\n```\n\nThe cell layer is one scene node drawn UNDER the markers, inside the plot\nclip, with a free hover-cell highlight (the crosshair's `snapIdx` cell is\nstroked in its own color). The factory is `(pxs, pys, n) => index`; the index\nit returns:\n\n| Member | Contract |\n|---|---|\n| `cell(i, bx0, by0, bx1, by1, outXY)` | Write cell `i`'s polygon, clipped to the axis-aligned bbox, into the caller-owned `outXY` as interleaved `[x0,y0,x1,y1,...]`; return the vertex count (`0` => absent cell: NaN site, degenerate input, or no bbox intersection). Throws (never truncates) on overflow. Zero allocation per call. |\n| `dispose()` | Free/recycle whatever the build acquired. |\n\nCells are **pixel-space** -- Voronoi is not affine-invariant under anisotropic\nx/y scaling, so data-space cells would be wrong hover regions. lite-charts\nhands the factory the same projected `pxs/pys` it hands `spatialIndex` and\nrebuilds the tessellation (cold) on every data or scale change, so pan and\nzoom can never serve a stale or distorted cell. The per-frame draw walks\nprebuilt packed arrays at **0 B/frame**. A degenerate cloud (all-collinear or\ncoincident points) draws markers with n","readmeFilename":"README.md"}