{"_id":"3d-spinner","_rev":"20-50a5cca99e4def85f64ddee90a5f24d3","name":"3d-spinner","dist-tags":{"latest":"1.1.0"},"versions":{"0.9.0":{"name":"3d-spinner","version":"0.9.0","keywords":["spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.0","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://github.com/runelaang/3d-spinner#readme","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"b27dca22085510ce67986ff981ddf53cad6803e3","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.0.tgz","fileCount":69,"integrity":"sha512-3SLzliQDp/HAaHdQxdFgrfwkO/iBiX0vUx7rbheLY/PaPv6mQZx7FXIkNJhNMXGyAgSbBqH6ybFuVDW88dgXnA==","signatures":[{"sig":"MEQCIC6khwu6Uxnm7pd0aHzwbQRE6HBnRF5DeeJbHHHxfqc6AiBMJ4lonINNnUlM2cBelvjkyhhKGJmwaIWrtx0oeQh4vA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137958},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && tsc","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.0_1782743149719_0.5620212113445266","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"3d-spinner","version":"0.9.1","keywords":["spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.1","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://github.com/runelaang/3d-spinner#readme","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"a89046fc1a9beeda91c240cb40ce24cac48670d2","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.1.tgz","fileCount":69,"integrity":"sha512-jCgwOgp1oKghCJdLzhZfdMwUXEGiGduLz8B1NXdJ8K8tgPZibafHgpNd/AgKlGhwPm4BqS03gjZHtSBEM0JZoQ==","signatures":[{"sig":"MEUCIAlOmvBYb0cQRPUq2oYzCdtR0CibIMxsL3BCLzDNvoZeAiEA/UfGqrYxWWRTp7ZAAY1y5/EdQOtiupHlKRtXppg1lQc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147486},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && tsc","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.1_1782820979793_0.11030234884105039","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"3d-spinner","version":"0.9.2","keywords":["spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.2","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://github.com/runelaang/3d-spinner#readme","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"499322a169cac87532f5e706fcc1c1f025f388b0","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.2.tgz","fileCount":79,"integrity":"sha512-FpomZtd2TREsXmlLX5o9+BcbCa3s2XAiuIYLvabkV5kU9IR467aZn6g+mh9brPomWRrd8PDZuCjYyLhRNOSKAw==","signatures":[{"sig":"MEQCIF73swkmBIcF30k0bFifrqte2TP/WftL1mJiVhoWMAfsAiAKh+rHrSQaKyiyiqW5LsXki02+qhCcLudo2XPkBIuESg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":430450},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.2_1782917881381_0.544490967167248","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"3d-spinner","version":"0.9.3","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.3","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://github.com/runelaang/3d-spinner#readme","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"8a5939b02077417423d7f0a73d65128374358982","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.3.tgz","fileCount":141,"integrity":"sha512-7JKUgIAWJK0n80R9RiLfoQAsR6j2BAADKrLEdTmS2BTd1pVIdbXSz8EzPQVoi6fMHrROXHGZCrqQG/Pe12yM7w==","signatures":[{"sig":"MEQCIA22BX375DmnAfSNcq59tXyjSkOvOqEnrFR41eINHSnlAiARUnr4R46ppueabcI2gleLJ8qFf8RyAc7sofp5vAW+yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1000109},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.3_1783281075470_0.25577245746142685","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"3d-spinner","version":"0.9.4","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.4","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"3c2ef382e31fb4c43f1c10fc7be217edab7fe956","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.4.tgz","fileCount":145,"integrity":"sha512-D+zy8E2Wie0ZfuwHznabSrSMO6yEY9d22Yz610H7cJQyQONgli6I53HbIgMK1gjTrhp57IIO/87xks0sMuuRjw==","signatures":[{"sig":"MEUCIG3gmojehRXSNMpIAAs8eBBK8aEKnu+kD+5D4M7oUcOMAiEAtZDH7b6tjpihPGwDs5G3KWediqZZ36eB+njwzc57qgI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1080299},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.4_1783303400020_0.9393569679508815","host":"s3://npm-registry-packages-npm-production"}},"0.9.5":{"name":"3d-spinner","version":"0.9.5","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.5","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"73abc255bdb3dad120fe3e7b83370fb44655179d","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.5.tgz","fileCount":145,"integrity":"sha512-a8yaVMM2bILRzxOxY2tlda8RsP5cL7umfNQ8w23rP6R33tUQ+jfe9oKs18c2IS2RXcHp1xvbLbASBrUpMemVWg==","signatures":[{"sig":"MEUCIFK4daXFCYWUMnlN/J32S2b+oRp3wD75d2+xyOrLBRymAiEA/qO2D6v58WXKHerfoL9UnYmgJVawgeb0NmVwJ1eq5T8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1148243},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.5_1783668734399_0.9787229964876418","host":"s3://npm-registry-packages-npm-production"}},"0.9.6":{"name":"3d-spinner","version":"0.9.6","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.6","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"4d2576abbea219bdd4ab4ecdabfe40f869547be2","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.6.tgz","fileCount":145,"integrity":"sha512-fV+4euwFS9hH7+yzKtv43fAI7sd6ZQ2aDVSg+UYQGqeGE/9kYGGOYNpJgGDCaYNJZUgjNDsQTpp36+PktvMLfA==","signatures":[{"sig":"MEUCIGU6bm6Lgx+wrmjWxGRejVnZrA9ytG6iRYdrXESqpmhWAiEApF6ntZqePIG1YpjSpSoO3ZHa+hMTELBhC5X8sArYiYU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1151051},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.6_1784041111373_0.7896293737544919","host":"s3://npm-registry-packages-npm-production"}},"0.9.8":{"name":"3d-spinner","version":"0.9.8","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.8","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"ad3f6434c7a7878c699cfaf75e25fb737e90bf5a","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.8.tgz","fileCount":147,"integrity":"sha512-R+lvznCeW1tdafCWLEAZ6ZEpTEGjIt0kNad/Dbn+HQuz5uZhycJoD08E5Aw6ARSglnTBTAuA3le0FzXpLUHjYQ==","signatures":[{"sig":"MEQCIFsmpqfJZ8hPS+zqSTH+m128/9UxiC2J+LiO5FDuVwwlAiBSSeGDty2p6sXa7e7QyiL85qeGhNrqalEaKsHPQeJW/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1289759},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/ghost-train":{"types":"./dist/animations/ghost-train.d.ts","import":"./dist/animations/ghost-train.js","require":"./dist/cjs/animations/ghost-train.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./animations/rocket-launch":{"types":"./dist/animations/rocket-launch.d.ts","import":"./dist/animations/rocket-launch.js","require":"./dist/cjs/animations/rocket-launch.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.8_1784873881249_0.3721961912102705","host":"s3://npm-registry-packages-npm-production"}},"0.9.9":{"name":"3d-spinner","version":"0.9.9","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.9","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"db68a5ae8fe527d029d736c96e011ecb61ed1769","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.9.tgz","fileCount":147,"integrity":"sha512-oIfKTZq/U2SOLxZPYLcScVLTmkIS7LIWJ4j6n3i7v645S7YiL3oGQ2DSb78AwKSutQRca1E8lGc65pgr3OfUMA==","signatures":[{"sig":"MEQCID5w/ymBE9uKGTs8ZBJ/xilTVui+iVKeiLYAAZ0py4r1AiAMIHC3hX0wg4T7sEF/lYXZCBUujbT/7ZBeXpgdF+VQbA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1306751},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/ghost-train":{"types":"./dist/animations/ghost-train.d.ts","import":"./dist/animations/ghost-train.js","require":"./dist/cjs/animations/ghost-train.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./animations/rocket-launch":{"types":"./dist/animations/rocket-launch.d.ts","import":"./dist/animations/rocket-launch.js","require":"./dist/cjs/animations/rocket-launch.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"A lightweight, zero-dependency 3D spinner, loader, and progress indicator for JavaScript.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.9_1784882430716_0.7709502911895227","host":"s3://npm-registry-packages-npm-production"}},"0.9.10":{"name":"3d-spinner","version":"0.9.10","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.10","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"a00f87645a68c5d858aa99dd62f26eb01356084d","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.10.tgz","fileCount":147,"integrity":"sha512-At8d5+75O+iGqB9ibO4TG24eciAtvniBm0E3bzVmatpHtcUqBE8dd0TWK9FnNVtAjmQ/YKtcyVpqRck1b8iROQ==","signatures":[{"sig":"MEUCIChI7bO9nrz6NtUfAmw0dX/yXSjBS1HzUmoKuVRjctMEAiEAo5Lx1q93Ea2z5WCCqcpUr82mPhkcRedBseO332Ru+3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1323357},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/ghost-train":{"types":"./dist/animations/ghost-train.d.ts","import":"./dist/animations/ghost-train.js","require":"./dist/cjs/animations/ghost-train.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./animations/rocket-launch":{"types":"./dist/animations/rocket-launch.d.ts","import":"./dist/animations/rocket-launch.js","require":"./dist/cjs/animations/rocket-launch.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser — ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.10_1785505172147_0.1324950408144565","host":"s3://npm-registry-packages-npm-production"}},"0.9.12":{"name":"3d-spinner","version":"0.9.12","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.12","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"ee215590225a8b0673cfcafc1af6e10cdc36f088","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.12.tgz","fileCount":147,"integrity":"sha512-H7eoYSWnmwawiuXTpSFynb5dj0wGtgnkBdASpH+N0ph4MeqvgKMc0Gswe5U08+Ciws4bgXxgVrwy8PycjKLSzA==","signatures":[{"sig":"MEUCIQCDRb3BTqzYDO5hH86Vovi1lrU7H0YmT0gwMhfX4AeYDwIgf2zj6x9vD3hOtwcdwxCC6tjlaj1b7Y9oRZJaHusMOnE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1326737},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/ghost-train":{"types":"./dist/animations/ghost-train.d.ts","import":"./dist/animations/ghost-train.js","require":"./dist/cjs/animations/ghost-train.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./animations/rocket-launch":{"types":"./dist/animations/rocket-launch.d.ts","import":"./dist/animations/rocket-launch.js","require":"./dist/cjs/animations/rocket-launch.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.12.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser — ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.12_1787076145241_0.5118106248376815","host":"s3://npm-registry-packages-npm-production"}},"0.9.13":{"name":"3d-spinner","version":"0.9.13","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.13","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"09fb7da95fbfa216ae28985718dcc6f30e33232d","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.13.tgz","fileCount":147,"integrity":"sha512-gJrZqY3PD/OLIern8ArbYWOPD2DY4oJ+qAsUzg78dPCDPWP2m8aXi1gOE9yJTf4wHB0z2TkbznM68OX/hGAKqA==","signatures":[{"sig":"MEYCIQCmu9wWTP2NXgWsnrnX0NaYf2NQ/P4bMoxG/6XPb2/quwIhAMBZRFG94cyqcf8Z1pZHsE/nyCihtomLZfX3QuDhoN3s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGqPwiqfbhprvNfEeL9/XQxabQydo80sPpQuRsCQBvT0AiEAxKxckn9yfMvd/K+z5T34HdChLf/kr96Fc3aV8Oq8VAs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1326722},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/ghost-train":{"types":"./dist/animations/ghost-train.d.ts","import":"./dist/animations/ghost-train.js","require":"./dist/cjs/animations/ghost-train.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./animations/rocket-launch":{"types":"./dist/animations/rocket-launch.d.ts","import":"./dist/animations/rocket-launch.js","require":"./dist/cjs/animations/rocket-launch.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser — ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.13_1790244402517_0.37830673896898226","host":"s3://npm-registry-packages-npm-production"}},"0.9.14":{"name":"3d-spinner","version":"0.9.14","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.14","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"7353f7a0d4091329d3d8d7980004884ee1b1c18e","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.14.tgz","fileCount":147,"integrity":"sha512-NcLJ/ZstkStrS3GYyvncszDQ3wdkDF/xDbdJWfu128BJFXK8oXD1IkjSJsY3mg1L12rTTTd+oN8xL1WBT5YhEA==","signatures":[{"sig":"MEYCIQCu/UJSfK9ZAwz6yMLoBA9KouZMROKx3di8iyg5z5f/HAIhAO26SGpZgCqngMXE60uozv5Nrn9CaXN+LSApjJsv8QQe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICOPvDQb9t1LclLRrU5gD2qWiAU9VsP3grWOC7Ih2nyIAiAR7/c8/PIi3YqUMxOyaesxqHD06yN/o/KjNBQrbqLBZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1345842},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/ghost-train":{"types":"./dist/animations/ghost-train.d.ts","import":"./dist/animations/ghost-train.js","require":"./dist/cjs/animations/ghost-train.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./animations/rocket-launch":{"types":"./dist/animations/rocket-launch.d.ts","import":"./dist/animations/rocket-launch.js","require":"./dist/cjs/animations/rocket-launch.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser — ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.14_1790247556295_0.7118169562140817","host":"s3://npm-registry-packages-npm-production"}},"0.9.15":{"name":"3d-spinner","version":"0.9.15","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.15","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"a204b0e4628476e5cfa97e90e3b6acaf4a4720e8","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.15.tgz","fileCount":149,"integrity":"sha512-F6t31P7yRlGWBPmYpaPIWVuRz3QMcDaCPk81dR7jX90O42RgFGY8y1HdVVPYqE0gK92+BIn9hmS/ofpJDU+HMQ==","signatures":[{"sig":"MEYCIQDJ25sD8dlAy7FhIik76+nJ63QWL7dqnGjeoTuspTZLeQIhAKg/5vV2ghxfCImYBVoziR3pKXe0kCfo1m/0isgoSOj2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD8p4iPj9KKerkTjPoPJAuS7oHMsyNrA1s4hvdor2a+5QIhAPdV/18YqZpjqz4+xHKIhPoYbCmy3SPWt3wO0LV7ShLZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1348651},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/ghost-train":{"types":"./dist/animations/ghost-train.d.ts","import":"./dist/animations/ghost-train.js","require":"./dist/cjs/animations/ghost-train.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./animations/rocket-launch":{"types":"./dist/animations/rocket-launch.d.ts","import":"./dist/animations/rocket-launch.js","require":"./dist/cjs/animations/rocket-launch.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser — ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.15_1790287267238_0.8002419655738979","host":"s3://npm-registry-packages-npm-production"}},"0.9.16":{"name":"3d-spinner","version":"0.9.16","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.16","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"096b1cb9b65fa2bf6cbb31e2528d4cef448dbfa2","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.16.tgz","fileCount":149,"integrity":"sha512-DuyD7Z0xCaizoUAyHClwVz4cM4NfrXbmTLk3G5i1FbvbYM/ETGNeC3SEK06b0d2Ip6maOlRO6DjuHEOpBEFAkQ==","signatures":[{"sig":"MEYCIQD1fIy61lisXQBMC7LLewRwzPiv7peSAkwpO/7oTqqgLwIhAMa5BD4eByzTLl3Ibuh0SRi851PEVzzZ212PHUMPQe7Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDDlxqQeo78JsPfgaAghJ21flEXIAiiwlxJcgUp3oeAxAiEAk8fwV5LMWcNioTJPsGGNOnqJKbFwDf5zqdXS9YCzKHE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1359833},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/cjs/index.cjs"},"./motion":{"types":"./dist/motion/motion.d.ts","import":"./dist/motion/motion.js","require":"./dist/cjs/motion/motion.cjs"},"./prefabs":{"types":"./dist/prefabs/prefabs.d.ts","import":"./dist/prefabs/prefabs.js","require":"./dist/cjs/prefabs/prefabs.cjs"},"./animations/spin":{"types":"./dist/animations/spin.d.ts","import":"./dist/animations/spin.js","require":"./dist/cjs/animations/spin.cjs"},"./motion/transitions":{"types":"./dist/motion/transitions.d.ts","import":"./dist/motion/transitions.js","require":"./dist/cjs/motion/transitions.cjs"},"./composite-animation":{"types":"./dist/composite-animation.d.ts","import":"./dist/composite-animation.js","require":"./dist/cjs/composite-animation.cjs"},"./animations/particles":{"types":"./dist/animations/particles.d.ts","import":"./dist/animations/particles.js","require":"./dist/cjs/animations/particles.cjs"},"./animations/charged-orb":{"types":"./dist/animations/charged-orb.d.ts","import":"./dist/animations/charged-orb.js","require":"./dist/cjs/animations/charged-orb.cjs"},"./animations/ghost-train":{"types":"./dist/animations/ghost-train.d.ts","import":"./dist/animations/ghost-train.js","require":"./dist/cjs/animations/ghost-train.cjs"},"./animations/grid-assembly":{"types":"./dist/animations/grid-assembly.d.ts","import":"./dist/animations/grid-assembly.js","require":"./dist/cjs/animations/grid-assembly.cjs"},"./animations/object-motion":{"types":"./dist/animations/object-motion.d.ts","import":"./dist/animations/object-motion.js","require":"./dist/cjs/animations/object-motion.cjs"},"./animations/rocket-launch":{"types":"./dist/animations/rocket-launch.d.ts","import":"./dist/animations/rocket-launch.js","require":"./dist/cjs/animations/rocket-launch.cjs"},"./engines/little-3d-engine":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","import":"./dist/engines/little-3d-engine/little-3d-engine.js","require":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"},"./engines/little-tween-engine":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","import":"./dist/engines/little-tween-engine/little-tween-engine.js","require":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"},"./engines/little-3d-engine/loaders/obj":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","import":"./dist/engines/little-3d-engine/loaders/obj.js","require":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"},"./engines/little-3d-engine/renderers/webgl-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgl-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"},"./engines/little-3d-engine/renderers/webgpu-textured":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"},"./engines/little-3d-engine/renderers/canvas2d-textured":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","import":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js","require":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}},"scripts":{"dev":"npx serve .","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:umd","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","build:umd":"node scripts/build-umd.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser — ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.28.1","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.16_1790313375649_0.9471070663007146","host":"s3://npm-registry-packages-npm-production"}},"0.9.29":{"name":"3d-spinner","version":"0.9.29","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.29","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"f7697ce98195373d4923ae49678a38b8de35777d","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.29.tgz","fileCount":221,"integrity":"sha512-rEGIHfNVyoux935B93HBMPno658XrdngKJqUlvdGrV8oOxRdkC0hUJCGpC7f/kf6Zgd64nA4A3jwQLWZlfz7Iw==","signatures":[{"sig":"MEYCIQDep67y+Wlg0S6El8kPXKxs759J9t/3IBH75uioNruZ3QIhAJsOvUu/YrxCfuXciiFOFGVJOJB0+2OTN6cb5jOI53WS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEXDgY3LRzSGkM2YpB14SGpAVhAs3LJ84zY3u/LHe95dAiEAvRzXkPM7Avn4dNJ+M+wNHmVsPVYPcWjHx+Ixr9h9Slc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1638456},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.cjs"}},"./motion":{"import":{"types":"./dist/motion/motion.d.ts","default":"./dist/motion/motion.js"},"require":{"types":"./dist/cjs/motion/motion.d.cts","default":"./dist/cjs/motion/motion.cjs"}},"./prefabs":{"import":{"types":"./dist/prefabs/prefabs.d.ts","default":"./dist/prefabs/prefabs.js"},"require":{"types":"./dist/cjs/prefabs/prefabs.d.cts","default":"./dist/cjs/prefabs/prefabs.cjs"}},"./animations/spin":{"import":{"types":"./dist/animations/spin.d.ts","default":"./dist/animations/spin.js"},"require":{"types":"./dist/cjs/animations/spin.d.cts","default":"./dist/cjs/animations/spin.cjs"}},"./motion/transitions":{"import":{"types":"./dist/motion/transitions.d.ts","default":"./dist/motion/transitions.js"},"require":{"types":"./dist/cjs/motion/transitions.d.cts","default":"./dist/cjs/motion/transitions.cjs"}},"./composite-animation":{"import":{"types":"./dist/composite-animation.d.ts","default":"./dist/composite-animation.js"},"require":{"types":"./dist/cjs/composite-animation.d.cts","default":"./dist/cjs/composite-animation.cjs"}},"./animations/particles":{"import":{"types":"./dist/animations/particles.d.ts","default":"./dist/animations/particles.js"},"require":{"types":"./dist/cjs/animations/particles.d.cts","default":"./dist/cjs/animations/particles.cjs"}},"./animations/charged-orb":{"import":{"types":"./dist/animations/charged-orb.d.ts","default":"./dist/animations/charged-orb.js"},"require":{"types":"./dist/cjs/animations/charged-orb.d.cts","default":"./dist/cjs/animations/charged-orb.cjs"}},"./animations/ghost-train":{"import":{"types":"./dist/animations/ghost-train.d.ts","default":"./dist/animations/ghost-train.js"},"require":{"types":"./dist/cjs/animations/ghost-train.d.cts","default":"./dist/cjs/animations/ghost-train.cjs"}},"./animations/grid-assembly":{"import":{"types":"./dist/animations/grid-assembly.d.ts","default":"./dist/animations/grid-assembly.js"},"require":{"types":"./dist/cjs/animations/grid-assembly.d.cts","default":"./dist/cjs/animations/grid-assembly.cjs"}},"./animations/object-motion":{"import":{"types":"./dist/animations/object-motion.d.ts","default":"./dist/animations/object-motion.js"},"require":{"types":"./dist/cjs/animations/object-motion.d.cts","default":"./dist/cjs/animations/object-motion.cjs"}},"./animations/rocket-launch":{"import":{"types":"./dist/animations/rocket-launch.d.ts","default":"./dist/animations/rocket-launch.js"},"require":{"types":"./dist/cjs/animations/rocket-launch.d.cts","default":"./dist/cjs/animations/rocket-launch.cjs"}},"./engines/little-3d-engine":{"import":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","default":"./dist/engines/little-3d-engine/little-3d-engine.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/little-3d-engine.d.cts","default":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"}},"./engines/little-tween-engine":{"import":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","default":"./dist/engines/little-tween-engine/little-tween-engine.js"},"require":{"types":"./dist/cjs/engines/little-tween-engine/little-tween-engine.d.cts","default":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"}},"./engines/little-3d-engine/loaders/obj":{"import":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","default":"./dist/engines/little-3d-engine/loaders/obj.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/loaders/obj.d.cts","default":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"}},"./engines/little-3d-engine/renderers/webgl-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgl-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"}},"./engines/little-3d-engine/renderers/webgpu-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"}},"./engines/little-3d-engine/renderers/canvas2d-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}}},"scripts":{"dev":"npx serve .","lint":"eslint src","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:browser","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","format":"prettier --write \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","format:check":"prettier --check \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","test:browser":"node --test tests/browser/*.test.mjs","build:browser":"node scripts/build-browser.mjs","prepublishOnly":"npm run build","pretest:browser":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser - ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.11.0","esbuild":"^0.28.1","prettier":"^3.9.9","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^5.7.0","@webgpu/types":"^0.1.74","typescript-eslint":"^8.70.1"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.29_1790326530098_0.2980582073396132","host":"s3://npm-registry-packages-npm-production"}},"0.9.30":{"name":"3d-spinner","version":"0.9.30","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.30","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"43b479bcef247ecfb49f3e537d24b78bb4095bf2","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.30.tgz","fileCount":221,"integrity":"sha512-/DoWu4wMZMWZm4rqtSTlIH5P/BnZG7YPJeZBW9sVIlkaUgZuOg7xWxK+7Hh6feN5RoB52O32yFaiNhDlgTW47w==","signatures":[{"sig":"MEUCIQDbyvRp8fF+8dKGkqclqk5tsCSIwsa0C0Eci2PI8xRXOgIgByUD2wnztI6kADFn9a+npWt59NHY3CMelYkLVkG4Gv8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGG6ccPj4W6yD1G2z4C2uAUGDeGmPAbx3hTuljdG8l3TAiB0MprS8Nj7GfMe8yFF+znfIjLPf2zsbrl5jMfMef4/HA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1634896},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.cjs"}},"./motion":{"import":{"types":"./dist/motion/motion.d.ts","default":"./dist/motion/motion.js"},"require":{"types":"./dist/cjs/motion/motion.d.cts","default":"./dist/cjs/motion/motion.cjs"}},"./prefabs":{"import":{"types":"./dist/prefabs/prefabs.d.ts","default":"./dist/prefabs/prefabs.js"},"require":{"types":"./dist/cjs/prefabs/prefabs.d.cts","default":"./dist/cjs/prefabs/prefabs.cjs"}},"./animations/spin":{"import":{"types":"./dist/animations/spin.d.ts","default":"./dist/animations/spin.js"},"require":{"types":"./dist/cjs/animations/spin.d.cts","default":"./dist/cjs/animations/spin.cjs"}},"./motion/transitions":{"import":{"types":"./dist/motion/transitions.d.ts","default":"./dist/motion/transitions.js"},"require":{"types":"./dist/cjs/motion/transitions.d.cts","default":"./dist/cjs/motion/transitions.cjs"}},"./composite-animation":{"import":{"types":"./dist/composite-animation.d.ts","default":"./dist/composite-animation.js"},"require":{"types":"./dist/cjs/composite-animation.d.cts","default":"./dist/cjs/composite-animation.cjs"}},"./animations/particles":{"import":{"types":"./dist/animations/particles.d.ts","default":"./dist/animations/particles.js"},"require":{"types":"./dist/cjs/animations/particles.d.cts","default":"./dist/cjs/animations/particles.cjs"}},"./animations/charged-orb":{"import":{"types":"./dist/animations/charged-orb.d.ts","default":"./dist/animations/charged-orb.js"},"require":{"types":"./dist/cjs/animations/charged-orb.d.cts","default":"./dist/cjs/animations/charged-orb.cjs"}},"./animations/ghost-train":{"import":{"types":"./dist/animations/ghost-train.d.ts","default":"./dist/animations/ghost-train.js"},"require":{"types":"./dist/cjs/animations/ghost-train.d.cts","default":"./dist/cjs/animations/ghost-train.cjs"}},"./animations/grid-assembly":{"import":{"types":"./dist/animations/grid-assembly.d.ts","default":"./dist/animations/grid-assembly.js"},"require":{"types":"./dist/cjs/animations/grid-assembly.d.cts","default":"./dist/cjs/animations/grid-assembly.cjs"}},"./animations/object-motion":{"import":{"types":"./dist/animations/object-motion.d.ts","default":"./dist/animations/object-motion.js"},"require":{"types":"./dist/cjs/animations/object-motion.d.cts","default":"./dist/cjs/animations/object-motion.cjs"}},"./animations/rocket-launch":{"import":{"types":"./dist/animations/rocket-launch.d.ts","default":"./dist/animations/rocket-launch.js"},"require":{"types":"./dist/cjs/animations/rocket-launch.d.cts","default":"./dist/cjs/animations/rocket-launch.cjs"}},"./engines/little-3d-engine":{"import":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","default":"./dist/engines/little-3d-engine/little-3d-engine.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/little-3d-engine.d.cts","default":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"}},"./engines/little-tween-engine":{"import":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","default":"./dist/engines/little-tween-engine/little-tween-engine.js"},"require":{"types":"./dist/cjs/engines/little-tween-engine/little-tween-engine.d.cts","default":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"}},"./engines/little-3d-engine/loaders/obj":{"import":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","default":"./dist/engines/little-3d-engine/loaders/obj.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/loaders/obj.d.cts","default":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"}},"./engines/little-3d-engine/renderers/webgl-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgl-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"}},"./engines/little-3d-engine/renderers/webgpu-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"}},"./engines/little-3d-engine/renderers/canvas2d-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}}},"scripts":{"dev":"npx serve .","lint":"eslint src","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:browser","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","format":"prettier --write \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","format:check":"prettier --check \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","test:browser":"node --test tests/browser/*.test.mjs","build:browser":"node scripts/build-browser.mjs","prepublishOnly":"npm run build","pretest:browser":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser - ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.11.0","esbuild":"^0.28.1","prettier":"^3.9.9","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^5.7.0","@webgpu/types":"^0.1.74","typescript-eslint":"^8.70.1"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.30_1790328026597_0.3756475812917983","host":"s3://npm-registry-packages-npm-production"}},"0.9.31":{"name":"3d-spinner","version":"0.9.31","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@0.9.31","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"c922f7cb1977d854d77bae753ed3ec0350a046e3","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-0.9.31.tgz","fileCount":224,"integrity":"sha512-78nx8SYP/APG2RlUV9WHecL7TNn3drncDcutjrcr8bsyTe2Jc994atzYwbRR/AS9rkCl22jXyds5MKF3PjlVdw==","signatures":[{"sig":"MEYCIQDwnQbPWeT/9CruYKQojn4yAFyryLBqKdWM3kwZAQGZDAIhAPzwbFFQWZLdPOW322bwYYoYc0xuFqJsponAmXnlJOWo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCa4PP+eU5SoRYtjqVlvBfysZu99cakWiosxh5lKtBDUwIgaj6AXuhex9KhX0xOXq3U11KTa/NcN7tRMSryHqTyrjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1673443},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.cjs"}},"./motion":{"import":{"types":"./dist/motion/motion.d.ts","default":"./dist/motion/motion.js"},"require":{"types":"./dist/cjs/motion/motion.d.cts","default":"./dist/cjs/motion/motion.cjs"}},"./prefabs":{"import":{"types":"./dist/prefabs/prefabs.d.ts","default":"./dist/prefabs/prefabs.js"},"require":{"types":"./dist/cjs/prefabs/prefabs.d.cts","default":"./dist/cjs/prefabs/prefabs.cjs"}},"./animations/spin":{"import":{"types":"./dist/animations/spin.d.ts","default":"./dist/animations/spin.js"},"require":{"types":"./dist/cjs/animations/spin.d.cts","default":"./dist/cjs/animations/spin.cjs"}},"./motion/transitions":{"import":{"types":"./dist/motion/transitions.d.ts","default":"./dist/motion/transitions.js"},"require":{"types":"./dist/cjs/motion/transitions.d.cts","default":"./dist/cjs/motion/transitions.cjs"}},"./composite-animation":{"import":{"types":"./dist/composite-animation.d.ts","default":"./dist/composite-animation.js"},"require":{"types":"./dist/cjs/composite-animation.d.cts","default":"./dist/cjs/composite-animation.cjs"}},"./animations/particles":{"import":{"types":"./dist/animations/particles.d.ts","default":"./dist/animations/particles.js"},"require":{"types":"./dist/cjs/animations/particles.d.cts","default":"./dist/cjs/animations/particles.cjs"}},"./animations/charged-orb":{"import":{"types":"./dist/animations/charged-orb.d.ts","default":"./dist/animations/charged-orb.js"},"require":{"types":"./dist/cjs/animations/charged-orb.d.cts","default":"./dist/cjs/animations/charged-orb.cjs"}},"./animations/ghost-train":{"import":{"types":"./dist/animations/ghost-train.d.ts","default":"./dist/animations/ghost-train.js"},"require":{"types":"./dist/cjs/animations/ghost-train.d.cts","default":"./dist/cjs/animations/ghost-train.cjs"}},"./animations/grid-assembly":{"import":{"types":"./dist/animations/grid-assembly.d.ts","default":"./dist/animations/grid-assembly.js"},"require":{"types":"./dist/cjs/animations/grid-assembly.d.cts","default":"./dist/cjs/animations/grid-assembly.cjs"}},"./animations/object-motion":{"import":{"types":"./dist/animations/object-motion.d.ts","default":"./dist/animations/object-motion.js"},"require":{"types":"./dist/cjs/animations/object-motion.d.cts","default":"./dist/cjs/animations/object-motion.cjs"}},"./animations/rocket-launch":{"import":{"types":"./dist/animations/rocket-launch.d.ts","default":"./dist/animations/rocket-launch.js"},"require":{"types":"./dist/cjs/animations/rocket-launch.d.cts","default":"./dist/cjs/animations/rocket-launch.cjs"}},"./engines/little-3d-engine":{"import":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","default":"./dist/engines/little-3d-engine/little-3d-engine.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/little-3d-engine.d.cts","default":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"}},"./engines/little-tween-engine":{"import":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","default":"./dist/engines/little-tween-engine/little-tween-engine.js"},"require":{"types":"./dist/cjs/engines/little-tween-engine/little-tween-engine.d.cts","default":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"}},"./engines/little-3d-engine/loaders/obj":{"import":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","default":"./dist/engines/little-3d-engine/loaders/obj.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/loaders/obj.d.cts","default":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"}},"./engines/little-3d-engine/renderers/webgl-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgl-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"}},"./engines/little-3d-engine/renderers/webgpu-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"}},"./engines/little-3d-engine/renderers/canvas2d-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}}},"scripts":{"dev":"npx serve .","lint":"eslint src","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:browser","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","format":"prettier --write \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","format:check":"prettier --check \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","test:browser":"node --test tests/browser/*.test.mjs","build:browser":"node scripts/build-browser.mjs","prepublishOnly":"npm run build","pretest:browser":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser - ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.11.0","esbuild":"^0.28.1","prettier":"^3.9.9","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^5.7.0","@webgpu/types":"^0.1.74","typescript-eslint":"^8.70.1"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_0.9.31_1790338877708_0.9900094407713904","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"3d-spinner","version":"1.0.0","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"author":{"name":"RuneL"},"license":"MIT","_id":"3d-spinner@1.0.0","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"homepage":"https://runelaang.github.io/3d-spinner/","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"5918c3ccae10f5ebe0a154a56296872859a8275c","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-1.0.0.tgz","fileCount":227,"integrity":"sha512-UDKnKjnfjM8pFC8dOlTr0QbUnV6cLXsmeKeZuhtKxipzY8IMiikK89S5IijvUjSSK2Hv9J/kZi1BofnsybEmRQ==","signatures":[{"sig":"MEYCIQCmITpaZ4NxxwWzz+1dJfn1f+PVNtzQJgNHrxhbkk5ceAIhAMAxH2/RgL4y/OVUobhTbhOSObCDMS/J/IuFK81tZgDs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIA2s9/jjSxHbaj9ciaUOd/5tXopPMAqKayX8SrK15amYAiEAjg6kbVC1bCKNnmJUJJAdzM8MbGPFY1SlOsrqgtp07Io=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1667121},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.cjs"}},"./motion":{"import":{"types":"./dist/motion/motion.d.ts","default":"./dist/motion/motion.js"},"require":{"types":"./dist/cjs/motion/motion.d.cts","default":"./dist/cjs/motion/motion.cjs"}},"./prefabs":{"import":{"types":"./dist/prefabs/prefabs.d.ts","default":"./dist/prefabs/prefabs.js"},"require":{"types":"./dist/cjs/prefabs/prefabs.d.cts","default":"./dist/cjs/prefabs/prefabs.cjs"}},"./animations/spin":{"import":{"types":"./dist/animations/spin.d.ts","default":"./dist/animations/spin.js"},"require":{"types":"./dist/cjs/animations/spin.d.cts","default":"./dist/cjs/animations/spin.cjs"}},"./motion/transitions":{"import":{"types":"./dist/motion/transitions.d.ts","default":"./dist/motion/transitions.js"},"require":{"types":"./dist/cjs/motion/transitions.d.cts","default":"./dist/cjs/motion/transitions.cjs"}},"./composite-animation":{"import":{"types":"./dist/composite-animation.d.ts","default":"./dist/composite-animation.js"},"require":{"types":"./dist/cjs/composite-animation.d.cts","default":"./dist/cjs/composite-animation.cjs"}},"./animations/particles":{"import":{"types":"./dist/animations/particles.d.ts","default":"./dist/animations/particles.js"},"require":{"types":"./dist/cjs/animations/particles.d.cts","default":"./dist/cjs/animations/particles.cjs"}},"./animations/charged-orb":{"import":{"types":"./dist/animations/charged-orb.d.ts","default":"./dist/animations/charged-orb.js"},"require":{"types":"./dist/cjs/animations/charged-orb.d.cts","default":"./dist/cjs/animations/charged-orb.cjs"}},"./animations/ghost-train":{"import":{"types":"./dist/animations/ghost-train.d.ts","default":"./dist/animations/ghost-train.js"},"require":{"types":"./dist/cjs/animations/ghost-train.d.cts","default":"./dist/cjs/animations/ghost-train.cjs"}},"./animations/grid-assembly":{"import":{"types":"./dist/animations/grid-assembly.d.ts","default":"./dist/animations/grid-assembly.js"},"require":{"types":"./dist/cjs/animations/grid-assembly.d.cts","default":"./dist/cjs/animations/grid-assembly.cjs"}},"./animations/object-motion":{"import":{"types":"./dist/animations/object-motion.d.ts","default":"./dist/animations/object-motion.js"},"require":{"types":"./dist/cjs/animations/object-motion.d.cts","default":"./dist/cjs/animations/object-motion.cjs"}},"./animations/rocket-launch":{"import":{"types":"./dist/animations/rocket-launch.d.ts","default":"./dist/animations/rocket-launch.js"},"require":{"types":"./dist/cjs/animations/rocket-launch.d.cts","default":"./dist/cjs/animations/rocket-launch.cjs"}},"./engines/little-3d-engine":{"import":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","default":"./dist/engines/little-3d-engine/little-3d-engine.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/little-3d-engine.d.cts","default":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"}},"./engines/little-tween-engine":{"import":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","default":"./dist/engines/little-tween-engine/little-tween-engine.js"},"require":{"types":"./dist/cjs/engines/little-tween-engine/little-tween-engine.d.cts","default":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"}},"./engines/little-3d-engine/loaders/obj":{"import":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","default":"./dist/engines/little-3d-engine/loaders/obj.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/loaders/obj.d.cts","default":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"}},"./engines/little-3d-engine/renderers/webgl-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgl-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"}},"./engines/little-3d-engine/renderers/webgpu-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"}},"./engines/little-3d-engine/renderers/canvas2d-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}}},"scripts":{"dev":"npx serve .","lint":"eslint src","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:browser","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","format":"prettier --write \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","format:check":"prettier --check \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","test:browser":"node --test tests/browser/*.test.mjs","build:browser":"node scripts/build-browser.mjs","prepublishOnly":"npm run build","pretest:browser":"npm run build"},"_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"jsdelivr":"./dist/umd/spinner.global.min.js","repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser - ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.11.0","esbuild":"^0.28.1","prettier":"^3.9.9","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^5.7.0","@webgpu/types":"^0.1.74","typescript-eslint":"^8.70.1"},"_npmOperationalInternal":{"tmp":"tmp/3d-spinner_1.0.0_1790671517864_0.35266391745086145","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"_id":"3d-spinner@1.1.0","bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"dist":{"shasum":"b43860de1add43b667215055006ed8e376df448d","tarball":"https://registry.npmjs.org/3d-spinner/-/3d-spinner-1.1.0.tgz","fileCount":227,"integrity":"sha512-v1UJj3kZWBVSs3jDI4HznGZUfEhmlwD/XU6B07UY1JuD6ia8fztEFNqGCQi44BCV82XErN4CdmxMTS5gJ8mMWA==","signatures":[{"sig":"MEYCIQC+Mjtx8OWtmn0RHr/4K6iEa2lJ2/+aH8saUqWVEG0ojgIhAPBUmlvZlaxhaHbIgKdbV5cH6Eh9JJz2Y908n7zQBn1S","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCa5Awg8aCCl2GX7mb2GUbgwXTlFIcN1ivz9KZ59FUZ9gIhAIaD+3TN32UV22FrHhR/1R+upiSBgek/d0YcpZ7HiDuO"}],"unpackedSize":1668905},"main":"./dist/cjs/index.cjs","name":"3d-spinner","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/umd/spinner.global.min.js","author":{"name":"RuneL"},"module":"./dist/index.js","browser":"./dist/umd/spinner.global.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/cjs/index.d.cts","default":"./dist/cjs/index.cjs"}},"./motion":{"import":{"types":"./dist/motion/motion.d.ts","default":"./dist/motion/motion.js"},"require":{"types":"./dist/cjs/motion/motion.d.cts","default":"./dist/cjs/motion/motion.cjs"}},"./prefabs":{"import":{"types":"./dist/prefabs/prefabs.d.ts","default":"./dist/prefabs/prefabs.js"},"require":{"types":"./dist/cjs/prefabs/prefabs.d.cts","default":"./dist/cjs/prefabs/prefabs.cjs"}},"./animations/spin":{"import":{"types":"./dist/animations/spin.d.ts","default":"./dist/animations/spin.js"},"require":{"types":"./dist/cjs/animations/spin.d.cts","default":"./dist/cjs/animations/spin.cjs"}},"./motion/transitions":{"import":{"types":"./dist/motion/transitions.d.ts","default":"./dist/motion/transitions.js"},"require":{"types":"./dist/cjs/motion/transitions.d.cts","default":"./dist/cjs/motion/transitions.cjs"}},"./composite-animation":{"import":{"types":"./dist/composite-animation.d.ts","default":"./dist/composite-animation.js"},"require":{"types":"./dist/cjs/composite-animation.d.cts","default":"./dist/cjs/composite-animation.cjs"}},"./animations/particles":{"import":{"types":"./dist/animations/particles.d.ts","default":"./dist/animations/particles.js"},"require":{"types":"./dist/cjs/animations/particles.d.cts","default":"./dist/cjs/animations/particles.cjs"}},"./animations/charged-orb":{"import":{"types":"./dist/animations/charged-orb.d.ts","default":"./dist/animations/charged-orb.js"},"require":{"types":"./dist/cjs/animations/charged-orb.d.cts","default":"./dist/cjs/animations/charged-orb.cjs"}},"./animations/ghost-train":{"import":{"types":"./dist/animations/ghost-train.d.ts","default":"./dist/animations/ghost-train.js"},"require":{"types":"./dist/cjs/animations/ghost-train.d.cts","default":"./dist/cjs/animations/ghost-train.cjs"}},"./animations/grid-assembly":{"import":{"types":"./dist/animations/grid-assembly.d.ts","default":"./dist/animations/grid-assembly.js"},"require":{"types":"./dist/cjs/animations/grid-assembly.d.cts","default":"./dist/cjs/animations/grid-assembly.cjs"}},"./animations/object-motion":{"import":{"types":"./dist/animations/object-motion.d.ts","default":"./dist/animations/object-motion.js"},"require":{"types":"./dist/cjs/animations/object-motion.d.cts","default":"./dist/cjs/animations/object-motion.cjs"}},"./animations/rocket-launch":{"import":{"types":"./dist/animations/rocket-launch.d.ts","default":"./dist/animations/rocket-launch.js"},"require":{"types":"./dist/cjs/animations/rocket-launch.d.cts","default":"./dist/cjs/animations/rocket-launch.cjs"}},"./engines/little-3d-engine":{"import":{"types":"./dist/engines/little-3d-engine/little-3d-engine.d.ts","default":"./dist/engines/little-3d-engine/little-3d-engine.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/little-3d-engine.d.cts","default":"./dist/cjs/engines/little-3d-engine/little-3d-engine.cjs"}},"./engines/little-tween-engine":{"import":{"types":"./dist/engines/little-tween-engine/little-tween-engine.d.ts","default":"./dist/engines/little-tween-engine/little-tween-engine.js"},"require":{"types":"./dist/cjs/engines/little-tween-engine/little-tween-engine.d.cts","default":"./dist/cjs/engines/little-tween-engine/little-tween-engine.cjs"}},"./engines/little-3d-engine/loaders/obj":{"import":{"types":"./dist/engines/little-3d-engine/loaders/obj.d.ts","default":"./dist/engines/little-3d-engine/loaders/obj.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/loaders/obj.d.cts","default":"./dist/cjs/engines/little-3d-engine/loaders/obj.cjs"}},"./engines/little-3d-engine/renderers/webgl-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgl-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgl-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgl-textured.cjs"}},"./engines/little-3d-engine/renderers/webgpu-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/webgpu-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/webgpu-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/webgpu-textured.cjs"}},"./engines/little-3d-engine/renderers/canvas2d-textured":{"import":{"types":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.d.ts","default":"./dist/engines/little-3d-engine/renderers/canvas2d-textured.js"},"require":{"types":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.d.cts","default":"./dist/cjs/engines/little-3d-engine/renderers/canvas2d-textured.cjs"}}},"license":"MIT","scripts":{"dev":"npx serve .","lint":"eslint src","test":"node --test tests/*.test.mjs","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:browser","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","format":"prettier --write \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","pretest":"npm run build","build:cjs":"node scripts/build-cjs.mjs","build:esm":"tsc","format:check":"prettier --check \"src/**/*.ts\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\" \"*.mjs\"","test:browser":"node --test tests/browser/*.test.mjs","build:browser":"node scripts/build-browser.mjs","prepublishOnly":"npm run build","pretest:browser":"npm run build"},"version":"1.1.0","_npmUser":{"name":"runelaang","email":"rune.laang@gmail.com"},"homepage":"https://runelaang.github.io/3d-spinner/","jsdelivr":"./dist/umd/spinner.global.min.js","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"_npmVersion":"11.19.0","description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser - ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","directories":{},"maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.11.0","esbuild":"^0.28.1","prettier":"^3.9.9","@eslint/js":"^10.0.1","playwright":"^1.63.0","typescript":"^5.7.0","@webgpu/types":"^0.1.74","typescript-eslint":"^8.70.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/3d-spinner_1.1.0_1790762788074_0.38337929488832434"}}},"time":{"created":"2026-06-29T14:25:49.657Z","modified":"2026-09-30T10:06:28.390Z","0.9.0":"2026-06-29T14:25:49.881Z","0.9.1":"2026-06-30T12:02:59.921Z","0.9.2":"2026-07-01T14:58:01.536Z","0.9.3":"2026-07-05T19:51:15.620Z","0.9.4":"2026-07-06T02:03:20.202Z","0.9.5":"2026-07-10T07:32:14.578Z","0.9.6":"2026-07-14T14:58:31.544Z","0.9.8":"2026-07-24T06:18:01.409Z","0.9.9":"2026-07-24T08:40:30.890Z","0.9.10":"2026-07-31T13:39:32.333Z","0.9.12":"2026-08-18T18:02:25.433Z","0.9.13":"2026-09-24T10:06:42.609Z","0.9.14":"2026-09-24T10:59:16.388Z","0.9.15":"2026-09-24T22:01:07.359Z","0.9.16":"2026-09-25T05:16:15.797Z","0.9.29":"2026-09-25T08:55:30.188Z","0.9.30":"2026-09-25T09:20:26.699Z","0.9.31":"2026-09-25T12:21:17.841Z","1.0.0":"2026-09-29T08:45:17.957Z","1.1.0":"2026-09-30T10:06:28.186Z"},"bugs":{"url":"https://github.com/runelaang/3d-spinner/issues"},"author":{"name":"RuneL"},"license":"MIT","homepage":"https://runelaang.github.io/3d-spinner/","keywords":["3d-spinner","spinner","loader","loading","3d","progress"],"repository":{"url":"git+https://github.com/runelaang/3d-spinner.git","type":"git"},"description":"Zero-dependency 3D spinners, loaders, and progress indicators for the browser - ready-made prefabs, GPU auto (WebGPU/WebGL) with Canvas 2D fallback.","maintainers":[{"name":"runelaang","email":"rune.laang@gmail.com"}],"readme":"# 3d-spinner and beyond\r\n\r\n[![tests](https://img.shields.io/github/actions/workflow/status/runelaang/3d-spinner/ci.yml?label=tests&logo=github&branch=main)](https://github.com/runelaang/3d-spinner/actions/workflows/ci.yml)\r\n[![npm](https://img.shields.io/npm/v/3d-spinner?logo=npm)](https://www.npmjs.com/package/3d-spinner)\r\n[![bundle size](https://img.shields.io/bundlejs/size/3d-spinner)](https://bundlejs.com/?q=3d-spinner)\r\n[![license](https://img.shields.io/github/license/runelaang/3d-spinner)](LICENSE)\r\n\r\nReal 3D spinners, loaders, and progress indicators for the browser - in one line, configuration\r\noptional:\r\n\r\n```js\r\nimport { createSpinner } from \"3d-spinner\";\r\nimport { starSwarm } from \"3d-spinner/prefabs\";\r\n\r\ncreateSpinner(document.getElementById(\"app\"), starSwarm());\r\n```\r\n\r\n- **Zero configuration needed.** Nine ready-made prefabs, each a complete spinner. Nothing to set up.\r\n- **Fully configurable when you want it.** Override any piece, compose your own from shapes,\r\n  animations, motion paths, and materials, or drop in your own OBJ models.\r\n- **Hardware 3D, automatically.** By default it renders on the GPU through WebGPU or WebGL and\r\n  falls back to a Canvas 2D software renderer that needs no GPU at all - picked for you, or pin\r\n  one yourself. Same API either way.\r\n- **Tiny download, fast start.** Only the code you touch is loaded: a full prefab on WebGL is\r\n  under 9 kB gzipped, renderer included, and the renderer itself is fetched on mount. Zero\r\n  dependencies.\r\n- **Works with your stack.** ES modules, CommonJS, or a plain `<script>` tag; TypeScript types\r\n  included. See [Module formats](#module-formats).\r\n\r\n## Screenshots\r\n\r\n| `starSwarm` with custom HTML | `pulsingStarfield` | `chargedOrb` at 74% |\r\n| --- | --- | --- |\r\n| ![starSwarm prefab with a custom HTML label](screenshots/shot1.png) | ![pulsingStarfield prefab with a Preparing launch label](screenshots/shot2.png) | ![chargedOrb progress prefab at 74 percent](screenshots/shot3.png) |\r\n\r\n| `ghostTrain` progress prefab | `ParticlesAnimation` with glow texture |\r\n| --- | --- |\r\n| ![ghostTrain progress prefab on a tilted track](screenshots/shot4.png) | ![particle loader with a Just a sec label](screenshots/shot5.png) |\r\n\r\n## Install\r\n\r\n```sh\r\nnpm install 3d-spinner\r\n```\r\n\r\n## Quick start\r\n\r\nA spinner is a renderer (the `animation`) plus a mode. The simplest case is an indeterminate\r\nspinner that runs until you stop it:\r\n\r\n```js\r\nimport { createSpinner } from \"3d-spinner\";\r\nimport { SpinAnimation } from \"3d-spinner/animations/spin\";\r\n\r\nconst spinner = createSpinner(document.getElementById(\"app\"), {\r\n  type: \"indeterminate\",\r\n  animation: new SpinAnimation(),\r\n});\r\n\r\n// When the work is done:\r\nspinner.stop();    // play the outro, then stop (leaves the element in place)\r\nspinner.destroy(); // stop now and remove the element\r\n\r\n// Or play the outro first, then remove the element:\r\nspinner.stop();\r\nawait spinner.finished;\r\nspinner.destroy();\r\n```\r\n\r\n## Reporting progress\r\n\r\nDrop the `type` (it defaults to `\"progress\"`) and report progress yourself as work completes.\r\nGive `SpinAnimation` a `progressAnimation` to make it pop in, scale with progress, and show a\r\nlabel:\r\n\r\n```js\r\nimport { createSpinner } from \"3d-spinner\";\r\nimport { SpinAnimation } from \"3d-spinner/animations/spin\";\r\n\r\nconst spinner = createSpinner(document.getElementById(\"app\"), {\r\n  animation: new SpinAnimation({ progressAnimation: {} }),\r\n});\r\n\r\nspinner.setProgress(0.4); // smoothly advances toward 40%\r\nspinner.setProgress(1);   // reaching 1 plays the outro\r\n```\r\n\r\n## Choosing a shape\r\n\r\n`SpinAnimation` spins a cube by default. Pass any built-in shape, or your own mesh:\r\n\r\n```js\r\nimport { SpinAnimation } from \"3d-spinner/animations/spin\";\r\nimport { tetrahedron } from \"3d-spinner/engines/little-3d-engine\";\r\n\r\nnew SpinAnimation({ shape: tetrahedron(), color: \"#3b82f6\" });\r\n```\r\n\r\nShapes exported from `3d-spinner/engines/little-3d-engine` include `cube`, `tetrahedron`,\r\n`octahedron`, `pyramid`, `quad`, and several spheres (`uvSphere`, `icosphere`, `octaSphere`,\r\n`cubeSphere`).\r\n\r\nMesh and particle colors are hex strings (`#rgb` or `#rrggbb`). Any other value makes the spinner's\r\n`ready` promise reject with a `RangeError`.\r\n\r\n## Surface materials\r\n\r\nFaces are flat-shaded from their color by default. A `Material` adds ambient scaling, a specular\r\nhighlight, and self-illumination on top, using the Wavefront MTL properties of the same names:\r\n\r\n| Field | MTL | Type | Description |\r\n| --- | --- | --- | --- |\r\n| `ambient` | `Ka` | `[r, g, b]` | Scales the scene ambient fill per channel, linear `0..1`. Omit or `[1,1,1]` for the full ambient (the engine default). |\r\n| `specular` | `Ks` | `[r, g, b]` | Highlight color and strength, linear `0..1`. Omit for a matte surface. |\r\n| `shininess` | `Ns` | `number` | Highlight tightness, `0..1000`. Higher is smaller and glossier. Defaults to `32` when `specular` is set. Ignored without `specular`. |\r\n| `emissive` | `Ke` | `[r, g, b]` | Color added after shading, linear `0..1`, so the face reads as self-lit. |\r\n| `opacity` | `d` (`1 - Tr`) | `number` | Face dissolve, linear `0..1`. `1` is opaque. Omit or `1` for an opaque face. Multiplies with instance `transparency`. Canvas 2D applies it; WebGL and WebGPU still use instance `transparency` only. |\r\n\r\n`SpinAnimation` takes a `material` that applies to every face, alongside `color`:\r\n\r\n```js\r\nimport { SpinAnimation } from \"3d-spinner/animations/spin\";\r\n\r\nnew SpinAnimation({\r\n  color: \"#3b82f6\",\r\n  material: { specular: [1, 1, 1], shininess: 64 },\r\n});\r\n```\r\n\r\nEvery shape builder also takes an optional trailing `material`, after its colors, for when you\r\nbuild the mesh yourself:\r\n\r\n```js\r\nimport { cube, icosphere } from \"3d-spinner/engines/little-3d-engine\";\r\n\r\ncube(1, [\"#3b82f6\"], { specular: [1, 0.9, 0.6], shininess: 120 }); // (size, colors, material)\r\nicosphere(1, 2, [\"#111827\"], { emissive: [0.1, 0.2, 0.3] });       // (size, detail, colors, material)\r\n```\r\n\r\nTo apply one to a mesh from elsewhere, `attachMaterial(mesh, material)` sets it on every face in\r\nplace.\r\n\r\nMeshes loaded through the OBJ loader pick their materials up from the accompanying MTL file when\r\n`useMtlColors` is set - `Kd` becomes the face color, and `Ka`/`Ks`/`Ns`/`Ke`/`d`/`Tr` become the\r\nface material:\r\n\r\n```js\r\nimport { parseObj } from \"3d-spinner/engines/little-3d-engine/loaders/obj\";\r\n\r\nconst mesh = parseObj(objText, { mtl: mtlText, useMtlColors: true });\r\n```\r\n\r\n`parseObj` throws an error naming the line when the geometry is malformed: a vertex without three\r\nnumeric coordinates, a face with fewer than three vertices, or a face index that points at a vertex\r\nnot defined before it.\r\n\r\nMaterials work on all three backends. Canvas 2D computes the highlight once per face, so it lands\r\nflat, while WebGL and WebGPU compute it per pixel and produce a gradient across the face. Per-face\r\nopacity is applied on Canvas 2D; WebGL and WebGPU still use instance `transparency` only. The\r\ntextured renderer variants do not apply materials.\r\n\r\n## How it fits together\r\n\r\nA spinner is assembled from a few independent pieces, so you can swap one without touching the\r\nothers:\r\n\r\n- **`createSpinner`** mounts the spinner into an element and runs a single animation loop.\r\n- **Spinner type** decides how progress is driven. `progress` is determinate - you report a value\r\n  from 0 to 1 with `setProgress`. `indeterminate` is self-driving - it loops a synthetic progress\r\n  on a timer until you `stop()`. Any animation works with either type.\r\n- **Animation** is the visual that plays (a spinning shape, a moving object). Each one lives at its\r\n  own import path, so you load only the animation you use.\r\n- **Intro and outro** are the entrance and exit. The loop plays the intro once when the spinner\r\n  starts and the outro when it finishes - progress reaching 1, or `stop()`. `destroy()` skips the\r\n  outro and removes the element immediately.\r\n- **Motion controller** (for `ObjectMotionAnimation`) is a small, separate object that decides\r\n  *how* a thing moves - a circle, square, figure-8, or wander. Swap the controller to change the\r\n  path without changing the animation.\r\n- **Transition** (for `ObjectMotionAnimation`) is the intro/outro effect - by default the object\r\n  flies in and out along the path; grow or shrink in place is available as an option.\r\n- **The 3D engine** is the renderer underneath: a small, dependency-free engine that draws shapes\r\n  and meshes to a canvas, with swappable Canvas 2D, WebGL, and WebGPU backends.\r\n\r\n## Animations\r\n\r\nEach animation is imported from its own subpath, so you only pull in the one you use.\r\n\r\n| Import | Class | Description |\r\n| --- | --- | --- |\r\n| `3d-spinner/animations/spin` | `SpinAnimation` | A spinning 3D shape, a cube by default. |\r\n| `3d-spinner/animations/object-motion` | `ObjectMotionAnimation` | A mesh that follows a motion path, with an intro/outro you choose. |\r\n| `3d-spinner/animations/particles` | `ParticlesAnimation` | A stream of camera-facing billboard particles: a burst, a fountain, snow, confetti. |\r\n| `3d-spinner/animations/charged-orb` | `ChargedOrbAnimation` | A progress story: a center orb pops out a ring of spark-trailing satellites as progress climbs. |\r\n| `3d-spinner/animations/ghost-train` | `GhostTrainAnimation` | A progress story: a translucent train gains a car per 2% of progress, then blasts off at 100%. |\r\n| `3d-spinner/animations/grid-assembly` | `GridAssemblyAnimation` | A progress story: 25 cubes circle the view edge and dock into a 5x5 grid as progress climbs. |\r\n| `3d-spinner/animations/rocket-launch` | `RocketLaunchAnimation` | A progress story: a rocket lines up on the pad every 5% of progress; the row blasts off at 100%. |\r\n| `3d-spinner/composite-animation` | `CompositeAnimation` | Plays several animations as layers of one spinner (how the prefabs combine effects). |\r\n\r\n## Prefabs\r\n\r\nPrefabs provide complete spinner options, including layered animation. They need\r\nno configuration and accept an optional override object.\r\n\r\n| Prefab | Mode | Description |\r\n| --- | --- | --- |\r\n| `crystalComet` | indeterminate | A spinning crystal primitive with a luminous comet trail. |\r\n| `monochromeStreak` | indeterminate | A fountain of black and white streaks that turn with their travel direction. |\r\n| `planeStarTrail` | indeterminate | A small plane looping through a stream of colorful star particles. |\r\n| `pulsingStarfield` | indeterminate | High-shine particles drifting around a slowly pulsing HTML message. |\r\n| `starSwarm` | indeterminate | Bright star particles wandering around a centered loading message. |\r\n| `chargedOrb` | progress | A center orb pops out spark-trailing satellites as progress climbs. |\r\n| `ghostTrain` | progress | A translucent ice-cube train gains cars with progress and blasts off at 100%. |\r\n| `gridAssembly` | progress | 25 shapes fly in, circle the view edge, and dock into a 5x5 grid. |\r\n| `rocketLaunch` | progress | Rockets line up on a launch pad and blast off in a loose stagger at 100%. |\r\n\r\n```js\r\nimport { createSpinner } from \"3d-spinner\";\r\nimport { planeStarTrail } from \"3d-spinner/prefabs\";\r\n\r\nconst spinner = createSpinner(document.getElementById(\"app\"), planeStarTrail());\r\n```\r\n\r\nCommon overrides include `backend`, `label`, `fadeLabel`, and `periodMs`. Labels fade with the\r\nintro and outro by default; set `fadeLabel: false` to keep one fully visible. Motion prefabs also accept\r\n`object` and `particles` option objects, and the progress stories take their own layer overrides\r\n(`orb`, `train`, `assembly`). A label can be text or any `HTMLElement`.\r\n\r\n```js\r\nconst message = document.createElement(\"div\");\r\nmessage.innerHTML = \"<strong>Preparing preview</strong>\";\r\n\r\ncreateSpinner(document.getElementById(\"app\"), planeStarTrail({\r\n  label: message,\r\n  particles: { rate: 48 },\r\n}));\r\n```\r\n\r\n`ObjectMotionAnimation` takes a motion controller from `3d-spinner/motion` (`circleMotion`,\r\n`squareMotion`, `figureEightMotion`, `wanderMotion`) and optional entrance/exit transitions from\r\n`3d-spinner/motion/transitions` (`grow`, `shrink`, `enterFromObjectDirection`,\r\n`leaveInObjectDirection`) - for example a figure-8 path with a fly-in and fly-out.\r\n\r\n`ParticlesAnimation` emits fading billboard quads from the center. The emission options shape the\r\neffect: `direction` and `spread` aim it, `gravity` bends it, and `rate`, `lifeMs`, `speed`,\r\n`size`, `spin`, and `colors` style it. The stream is deterministic for a given `seed`. Emission\r\nstarts on enter and stops on exit; the live particles fading out is the outro.\r\n\r\nA `texture` option (an image URL or a drawable element such as a canvas) puts an image on every\r\nparticle, tinted by the particle color, with the image's alpha shaping the particle. Textures\r\nrender through a backend-specific textured renderer fetched on demand for Canvas 2D, WebGL, or\r\nWebGPU. Canvas 2D texture mapping is limited to planar four-vertex billboards.\r\n\r\n```js\r\nimport { createSpinner } from \"3d-spinner\";\r\nimport { ParticlesAnimation } from \"3d-spinner/animations/particles\";\r\n\r\nconst spinner = createSpinner(document.getElementById(\"app\"), {\r\n  type: \"indeterminate\",\r\n  animation: new ParticlesAnimation({\r\n    direction: { x: 0, y: 1, z: 0 },\r\n    gravity: { x: 0, y: -1.6, z: 0 },\r\n    speed: 1.5,\r\n  }),\r\n});\r\n```\r\n\r\n## API\r\n\r\n### `createSpinner(target, options)`\r\n\r\nMounts a spinner inside `target` (an `HTMLElement`) and returns a `Spinner`. The options depend\r\non the mode.\r\n\r\n**Progress** (the default, `type: \"progress\"`):\r\n\r\n| Option | Type | Description |\r\n| --- | --- | --- |\r\n| `animation` | `SpinnerAnimation` | The renderer to play. Required. |\r\n| `progress` | `number` | Initial progress `0..1`. A value above 0 plays the intro immediately. |\r\n| `timeoutMs` | `number` | Auto-complete after this many milliseconds. `NaN` throws a `RangeError`. (`timeout` is the deprecated older name.) |\r\n| `until` | `Date` | Auto-complete at this time. If both are set, the earlier wins. |\r\n| `ariaLabel` | `string` | Accessible name of the hidden progress bar. Default `\"Loading\"`. |\r\n\r\n**Indeterminate** (`type: \"indeterminate\"`):\r\n\r\n| Option | Type | Description |\r\n| --- | --- | --- |\r\n| `animation` | `SpinnerAnimation` | The renderer to play. Required. |\r\n| `loop` | `\"bounce\" \\| \"restart\"` | `\"bounce\"` ramps 0 to 1 and back; `\"restart\"` repeats 0 to 1. Default `\"bounce\"`. |\r\n| `periodMs` | `number` | Milliseconds for one sweep. Must be finite and greater than zero. Default `2000`. |\r\n| `ariaLabel` | `string` | Accessible name of the hidden progress bar. Default `\"Loading\"`. |\r\n\r\n### `Spinner`\r\n\r\n| Member | Description |\r\n| --- | --- |\r\n| `ready` | Promise that resolves once the animation can draw, and rejects with the error when it cannot (for example a pinned backend the browser lacks). On rejection the spinner stops animating and leaves the page as it is. |\r\n| `finished` | Promise that resolves once the spinner has stopped animating: its outro finished (after `stop()`, progress reaching 1, `timeoutMs`, or `until`), it was stopped before its intro, it was destroyed, or its setup failed. Never rejects. |\r\n| `setProgress(target)` | Advance progress toward `target` (`0..1`). No-op for an indeterminate spinner. |\r\n| `stop()` | Play the outro, then stop animating. Keeps the injected element. Await `finished` to know when the outro is done. |\r\n| `destroy()` | Stop immediately and remove the injected element. Safe to call more than once. |\r\n\r\nThe spinner renders straight into `target`, so its size and placement come from your own CSS. It\r\nadds a canvas and a label and never replaces what is already inside. A `static` target becomes\r\n`position: relative` so the overlays have a positioning context; any other position is kept.\r\n\r\nAn animation instance drives one spinner: passing the same instance to a second `createSpinner`\r\nthrows. Prefab functions return a fresh animation on every call.\r\n\r\n```js\r\nconst spinner = createSpinner(target, gridAssembly({ backend: \"webgpu\" }));\r\nspinner.ready.catch((error) => showFallback(error.message));\r\n```\r\n\r\n## Accessibility\r\n\r\nEvery spinner adds one visually hidden ARIA `progressbar` to its target. A progress spinner keeps\r\n`aria-valuenow` at the rounded percentage (written only when it changes); an indeterminate one has\r\nno value, which is how ARIA marks indeterminate progress. Its name comes from the `ariaLabel`\r\noption, default `\"Loading\"`, also accepted by every prefab:\r\n\r\n```js\r\ncreateSpinner(target, gridAssembly({ ariaLabel: \"Uploading photos\" }));\r\n```\r\n\r\nThe overlay text drawn over the animation is hidden from assistive technology, so progress is\r\nannounced once even when layers stack labels. A custom `HTMLElement` label keeps its own semantics.\r\n\r\nThe spinner does not change its motion on its own when the system asks for reduced motion.\r\n`prefersReducedMotion()` reads that setting, for picking a calmer visual or none:\r\n\r\n```js\r\nimport { createSpinner, prefersReducedMotion } from \"3d-spinner\";\r\nimport { SpinAnimation } from \"3d-spinner/animations/spin\";\r\n\r\ncreateSpinner(target, {\r\n  type: \"indeterminate\",\r\n  animation: prefersReducedMotion()\r\n    ? new SpinAnimation({ spinX: 0.0002, spinY: 0.0003 })\r\n    : new SpinAnimation(),\r\n});\r\n```\r\n\r\n## Rendering backend\r\n\r\nBy default the backend is `\"auto\"`: the spinner picks the best renderer the browser supports -\r\nWebGPU, then WebGL, then the Canvas 2D software renderer, which needs no GPU and runs anywhere a\r\ncanvas does. Nothing to configure, and no capability checks to write.\r\n\r\n```js\r\ncreateSpinner(el, starSwarm());               // auto: WebGPU -> WebGL -> Canvas 2D\r\n```\r\n\r\nName a backend to pin it:\r\n\r\n```js\r\nnew SpinAnimation({ backend: \"webgl\" }); // \"auto\" (default), \"canvas2d\", \"webgl\", or \"webgpu\"\r\n```\r\n\r\nEvery prefab, animation, and the engine itself takes the same `backend` option:\r\n\r\n```js\r\nstarSwarm({ backend: \"webgpu\" });             // a prefab\r\nnew ParticlesAnimation({ backend: \"webgl\" }); // an animation\r\nnew Little3dEngine({ backend: \"canvas2d\" });  // the engine directly\r\n```\r\n\r\nBefore 0.9.9 the default was `\"canvas2d\"`; pass `backend: \"canvas2d\"` to keep that behavior.\r\n\r\nBackends are loaded on demand, and `\"auto\"` decides *before* it imports anything: it probes for a\r\nWebGPU adapter and a WebGL2 context directly, so the code for a backend it rejects is never\r\nfetched. If the chosen backend still fails to start, `\"auto\"` moves on to the next one. Pinning a\r\nbackend the browser cannot run rejects `spinner.ready` rather than falling back - `\"auto\"` is the\r\nresilient choice. To decide yourself, `detectBackendSupport()` and `chooseBackend()` are\r\nexported from the engine.\r\n\r\nThe same fallback covers a renderer that stops working after it started: if the GPU device or the\r\nWebGL context is lost (a driver reset, or the browser reclaiming contexts), `\"auto\"` switches to\r\nthe next backend and keeps animating. A pinned backend has nothing to switch to, so its canvas is\r\nremoved and a console warning says why.\r\n\r\nRenderer-specific features can look different between Canvas 2D, WebGL, and WebGPU. In\r\nparticular, transparent shapes are an approximate visual effect rather than a pixel-identical\r\ncross-renderer result.\r\n\r\nUse `transparency.mode` to choose visible-front-face transparency or a two-pass transparent-solid\r\neffect. Opacity defaults to `0.35` for one-sided rendering. Two-sided rendering defaults to\r\nfront `0.56` and back `0.84`.\r\n\r\n```js\r\nnew SpinAnimation({\r\n  backend: \"webgl\",\r\n  transparency: { mode: \"two-sided\", opacity: 0.6 }, // front 0.6, back 0.4\r\n});\r\n```\r\n\r\nFor two-sided rendering, explicit `frontOpacity` and `backOpacity` values override the shorthand\r\nfor their respective sides.\r\n\r\n## The engine\r\n\r\nThe renderer is a small, self-contained 3D engine, exported on its own in case you want it\r\ndirectly:\r\n\r\n- `3d-spinner/engines/little-3d-engine` - the engine (`Little3dEngine`), shapes, and textures.\r\n- `3d-spinner/engines/little-3d-engine/loaders/obj` - a minimal OBJ loader (`parseObj`).\r\n- `3d-spinner/engines/little-tween-engine` - a standalone tween and easing engine\r\n  (`LittleTweenEngine`).\r\n\r\nEach has no dependencies of its own.\r\n\r\n## Module formats\r\n\r\nEvery example above is **ES modules** - the primary, tree-shakeable format. Use a bundler or native `<script type=\"module\">`; the engine draws to a canvas, so\r\nthere is no server-side rendering. ES modules do not load over `file://`, so serve the page over\r\nHTTP rather than opening the file directly.\r\n\r\nTwo other formats are published for cases where ESM isn't an option:\r\n\r\n**CommonJS** (`require`), for older Node tooling:\r\n\r\n```js\r\nconst { createSpinner } = require(\"3d-spinner\");\r\nconst { SpinAnimation } = require(\"3d-spinner/animations/spin\");\r\n```\r\n\r\n**Browser global** (IIFE), for a plain `<script>` tag with no bundler or module loader. This build\r\nbundles the whole public API onto one `window.Spinner3D` object:\r\n\r\n```html\r\n<script src=\"https://unpkg.com/3d-spinner\"></script>\r\n<script>\r\n  const spinner = Spinner3D.createSpinner(document.getElementById(\"app\"), {\r\n    type: \"indeterminate\",\r\n    animation: new Spinner3D.SpinAnimation(),\r\n  });\r\n</script>\r\n```\r\n\r\n## Development\r\n\r\n```sh\r\nnpm install\r\nnpm run build   # compile src/ to dist/ (ESM + type declarations, CJS, and a browser-global build)\r\nnpm test        # build, then run the unit tests and the consumer type check\r\nnpm run test:browser  # real rendering in headless Chromium (npx playwright install chromium first)\r\nnpm run lint    # type-aware ESLint over src/\r\nnpm run format  # Prettier (format:check is what CI runs)\r\nnpm run dev     # serve this folder; open /examples/ or /examples/prefabs-progress.html\r\n```\r\n\r\n## License\r\n\r\nMIT (c) RuneL\r\n","readmeFilename":"README.md"}