{"_id":"@mkbabb/keyframes.js","_rev":"26-eff27f3174ff6b9cef3eb799684fc4c0","name":"@mkbabb/keyframes.js","dist-tags":{"latest":"6.0.0"},"versions":{"0.9.97":{"name":"@mkbabb/keyframes.js","version":"0.9.97","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"ISC","_id":"@mkbabb/keyframes.js@0.9.97","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"f3fcf470840f9d34086e55bba7d4c7ce1e250b48","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-0.9.97.tgz","fileCount":7,"integrity":"sha512-w7q8xSvrDPWu1XJHOz42M+v01DuUdyiX1JiOJmDjosxQizJeZRokfXplkREMV4pn9fbAG4ArC/tet7PXtBNcqw==","signatures":[{"sig":"MEUCIDcQEH+iVW/Cz+4yCZpErY2Z46EWk3415tB6OidyNmQMAiEApH6bhZ67NofOiZHQZ2n0u1U5BPAazbA0BqtR/Vnlh4U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":3136827},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","module":"./dist/keyframes.js","exports":{".":{"import":"./dist/keyframes.js","require":"./dist/keyframes.cjs"}},"gitHead":"aaf3533591e46c3a69b8072ea60bcca216fd4361","scripts":{"dev":"vite --port 8080 --mode production","test":"vitest","build":"vite build --mode production","gh-pages":"vite build --mode gh-pages"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"licenses":[{"url":"https://www.gnu.org/licenses/gpl-3.0.html","type":"GNU GPL v3"}],"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"10.7.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.2.0","dependencies":{"parsimmon":"^1.18.1"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.4.31","zod":"^3.23.8","clsx":"^2.1.1","sass":"^1.77.8","vite":"^5.3.3","jsdom":"^24.1.0","three":"^0.166.1","vitest":"^2.0.2","d3-color":"^3.1.0","prettier":"^3.3.3","vaul-vue":"^0.2.0","gl-matrix":"^3.4.3","radix-vue":"^1.9.1","@unovis/ts":"^1.4.2","typescript":"^5.5.3","v-calendar":"^3.1.2","vue-sonner":"^1.1.3","@types/node":"^20.14.10","@unovis/vue":"^1.4.2","tailwindcss":"^3.4.4","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^10.11.0","autoprefixer":"^10.4.19","highlight.js":"^11.10.0","vee-validate":"^4.13.2","monaco-editor":"^0.50.0","monaco-themes":"^0.4.4","tailwind-merge":"^2.4.0","@types/d3-color":"^3.1.3","@types/prettier":"^2.7.3","lucide-vue-next":"^0.408.0","vite-plugin-dts":"^3.9.1","@types/parsimmon":"^1.10.9","@vee-validate/zod":"^4.13.2","@vitejs/plugin-vue":"^5.0.5","embla-carousel-vue":"^8.1.6","tailwindcss-animate":"^1.0.7","unplugin-vue-macros":"^2.9.5","class-variance-authority":"^0.7.0","@guolao/vue-monaco-editor":"^1.5.1","@iconify-json/radix-icons":"^1.1.14","@fortawesome/vue-fontawesome":"^3.0.8","@fortawesome/fontawesome-svg-core":"^6.5.2","@fortawesome/free-solid-svg-icons":"^6.5.2","@fortawesome/free-brands-svg-icons":"^6.5.2","@mhsdesign/jit-browser-tailwindcss":"^0.4.1","@fortawesome/free-regular-svg-icons":"^6.5.2"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_0.9.97_1721273462789_0.018752597253463454","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@mkbabb/keyframes.js","version":"1.0.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"ISC","_id":"@mkbabb/keyframes.js@1.0.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"73ede5d09ab7dc46dc166503933af7f090573ae0","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-1.0.0.tgz","fileCount":6,"integrity":"sha512-Qt4STOelIEG1f8LygQPGJjr7rzy8SMKcInlHvwCAPrpMvrqCu2ijyKMQBpmSZXwI+M/277fD/YyGLwFCQi6dLA==","signatures":[{"sig":"MEUCIQCQLJooo1cpOkRHKcK03JXkisv42FST0F6BtZDPHFJ51wIgOEh77Yj+MzLxbmnkKMeyID+pGZDQTPB42gTmayqmNnc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259284},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","module":"./dist/keyframes.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","require":"./dist/keyframes.cjs"}},"gitHead":"79a81bc2fc2f911cbd4bb66a7478ab21a9b70b7a","scripts":{"dev":"vite --port 8080","test":"vitest","build":"vite build --mode production","gh-pages":"vite build --mode gh-pages"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"licenses":[{"url":"https://www.gnu.org/licenses/gpl-3.0.html","type":"GNU GPL v3"}],"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.6.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"@mkbabb/value.js":"^0.3.1","@mkbabb/parse-that":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","zod":"^3.23.8","clsx":"^2.1.1","vite":"^7.0.6","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^3.2.4","reka-ui":"^2.0.0","prettier":"^3.6.2","vaul-vue":"^0.2.0","@unovis/ts":"^1.5.2","typescript":"^5.8.3","v-calendar":"^3.1.2","vue-sonner":"^1.1.3","@types/node":"^24.1.0","@unovis/vue":"^1.5.2","tailwindcss":"^4.1.11","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.2.1","highlight.js":"^11.11.1","vee-validate":"^4.13.2","monaco-editor":"^0.50.0","monaco-themes":"^0.4.4","tailwind-merge":"^3.3.1","tw-animate-css":"^1.2.5","lucide-vue-next":"^0.525.0","vite-plugin-dts":"^4.5.4","@vee-validate/zod":"^4.13.2","@vitejs/plugin-vue":"^6.0.0","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.1","prettier-plugin-merge":"^0.7.0","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.1.14","prettier-plugin-classnames":"^0.7.0","prettier-plugin-tailwindcss":"^0.6.5","@fortawesome/vue-fontawesome":"^3.0.8","prettier-plugin-organize-imports":"^4.0.0","@fortawesome/fontawesome-svg-core":"^6.6.0","@fortawesome/free-solid-svg-icons":"^6.6.0","@fortawesome/free-brands-svg-icons":"^6.6.0","@fortawesome/free-regular-svg-icons":"^6.6.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_1.0.0_1772037827695_0.9193813708659364","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@mkbabb/keyframes.js","version":"1.0.1","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"ISC","_id":"@mkbabb/keyframes.js@1.0.1","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"6c6ae594ddcd85e64a302ef04a92b3e2972818d4","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-1.0.1.tgz","fileCount":6,"integrity":"sha512-chrCWhG7Wt6TB3+6zX6afI18iQ4Zb4GP0A6ubyt96ctGu1Uw2ytWFNGp5RDw0ycCYOuP5vxmPKgFSh75ZFLmMw==","signatures":[{"sig":"MEQCIGQjvLQ0+HAS4HWOqAEgatXikIyXnsBIBO5zVTca/1D5AiAp7hyElvGf56VbzEqtgBsuvfVBhLUspgPxwGp2ELPnhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259284},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","module":"./dist/keyframes.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","require":"./dist/keyframes.cjs"}},"gitHead":"a2be48ed27a2eb5f4f56d8e961a4032d4f078953","scripts":{"dev":"vite --port 8080","test":"vitest","build":"vite build --mode production","gh-pages":"vite build --mode gh-pages"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"licenses":[{"url":"https://www.gnu.org/licenses/gpl-3.0.html","type":"GNU GPL v3"}],"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.6.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"@mkbabb/value.js":"^0.3.1","@mkbabb/parse-that":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","zod":"^3.23.8","clsx":"^2.1.1","vite":"^7.0.6","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^3.2.4","reka-ui":"^2.0.0","prettier":"^3.6.2","vaul-vue":"^0.2.0","@unovis/ts":"^1.5.2","typescript":"^5.8.3","v-calendar":"^3.1.2","vue-sonner":"^1.1.3","@types/node":"^24.1.0","@unovis/vue":"^1.5.2","tailwindcss":"^4.1.11","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.2.1","highlight.js":"^11.11.1","vee-validate":"^4.13.2","monaco-editor":"^0.50.0","monaco-themes":"^0.4.4","tailwind-merge":"^3.3.1","tw-animate-css":"^1.2.5","lucide-vue-next":"^0.525.0","vite-plugin-dts":"^4.5.4","@vee-validate/zod":"^4.13.2","@vitejs/plugin-vue":"^6.0.0","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.1","prettier-plugin-merge":"^0.7.0","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.1.14","prettier-plugin-classnames":"^0.7.0","prettier-plugin-tailwindcss":"^0.6.5","@fortawesome/vue-fontawesome":"^3.0.8","prettier-plugin-organize-imports":"^4.0.0","@fortawesome/fontawesome-svg-core":"^6.6.0","@fortawesome/free-solid-svg-icons":"^6.6.0","@fortawesome/free-brands-svg-icons":"^6.6.0","@fortawesome/free-regular-svg-icons":"^6.6.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_1.0.1_1772038195078_0.11337122388651544","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@mkbabb/keyframes.js","version":"1.1.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"ISC","_id":"@mkbabb/keyframes.js@1.1.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"2abfde3174823ff8a958fc82c98d80b602901937","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-1.1.0.tgz","fileCount":6,"integrity":"sha512-sZHyohfExZ8KKFv2foNoDhimpKqyBT/CHmtogbfVWX9zDm8n5e12+5rSegc5v9YKZAQ+FnQ6HSOxUkrz5qCfUw==","signatures":[{"sig":"MEUCIQDt/vEXgch0XKXWVaH2X4TGXuGWlIQox4mB8BP44Z2IxQIgBXFQVVbvD1mhy0kL+94H4eavV1FaOjnCZ8uFc4vRFRc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289625},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","module":"./dist/keyframes.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","require":"./dist/keyframes.cjs"}},"gitHead":"b74ce1bcb7b48547b56fc1a9788db0c9f85168cc","scripts":{"dev":"vite --port 8080","test":"vitest","bench":"vitest bench","build":"vite build --mode production","gh-pages":"vite build --mode gh-pages"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"licenses":[{"url":"https://www.gnu.org/licenses/gpl-3.0.html","type":"GNU GPL v3"}],"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.6.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"@mkbabb/value.js":"^0.4.0","@mkbabb/parse-that":"^0.7.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","zod":"^3.23.8","clsx":"^2.1.1","vite":"^7.0.6","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^3.2.4","reka-ui":"^2.0.0","prettier":"^3.6.2","vaul-vue":"^0.2.0","@unovis/ts":"^1.5.2","typescript":"^5.8.3","v-calendar":"^3.1.2","vue-sonner":"^1.1.3","@types/node":"^24.1.0","@unovis/vue":"^1.5.2","tailwindcss":"^4.1.11","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.2.1","highlight.js":"^11.11.1","vee-validate":"^4.13.2","monaco-editor":"^0.50.0","monaco-themes":"^0.4.4","tailwind-merge":"^3.3.1","tw-animate-css":"^1.2.5","lucide-vue-next":"^0.525.0","vite-plugin-dts":"^4.5.4","@vee-validate/zod":"^4.13.2","@vitejs/plugin-vue":"^6.0.0","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.1","prettier-plugin-merge":"^0.7.0","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.1.14","prettier-plugin-classnames":"^0.7.0","prettier-plugin-tailwindcss":"^0.6.5","@fortawesome/vue-fontawesome":"^3.0.8","prettier-plugin-organize-imports":"^4.0.0","@fortawesome/fontawesome-svg-core":"^6.6.0","@fortawesome/free-solid-svg-icons":"^6.6.0","@fortawesome/free-brands-svg-icons":"^6.6.0","@fortawesome/free-regular-svg-icons":"^6.6.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_1.1.0_1772163467636_0.3631980408679141","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@mkbabb/keyframes.js","version":"1.1.5","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"ISC","_id":"@mkbabb/keyframes.js@1.1.5","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"56cd71d576d86327fdd13a0a563fa9e37e3307a4","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-1.1.5.tgz","fileCount":21,"integrity":"sha512-I8nfdOHuyblHWa/kVU+mli8KDKE2d5rPbevO5uZhOWoWBmyIRVXxAO/obzHTFsLRm7OXcD2XBCD5n99gOqRYHw==","signatures":[{"sig":"MEUCICZglI0jKULq4vyUc5XteSzx/0JhyP394za/2UlhrBb8AiEAyR6WCz9UfvCddKVNR7rvS4RWgBzmqskREmuwjq5rBk4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6565811},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","module":"./dist/keyframes.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","require":"./dist/keyframes.cjs"}},"gitHead":"138214c87c87b40a63513c6e1c23cfae1e6dbc1f","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"vite build --mode production","gh-pages":"vite build --mode gh-pages","dev:playground":"vite --mode playground"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"licenses":[{"url":"https://www.gnu.org/licenses/gpl-3.0.html","type":"GNU GPL v3"}],"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.6.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"@mkbabb/value.js":"file:../value.js","@mkbabb/parse-that":"^0.7.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","zod":"^3.23.8","clsx":"^2.1.1","vite":"^7.0.6","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^3.2.4","reka-ui":"^2.0.0","prettier":"^3.6.2","vaul-vue":"^0.2.0","@unovis/ts":"^1.5.2","typescript":"^5.8.3","v-calendar":"^3.1.2","vue-sonner":"^1.1.3","@types/node":"^24.1.0","@unovis/vue":"^1.5.2","html2canvas":"^1.4.1","tailwindcss":"^4.1.11","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.2.1","highlight.js":"^11.11.1","vee-validate":"^4.13.2","monaco-editor":"^0.50.0","monaco-themes":"^0.4.4","tailwind-merge":"^3.3.1","tw-animate-css":"^1.2.5","lucide-vue-next":"^0.525.0","vite-plugin-dts":"^4.5.4","@vee-validate/zod":"^4.13.2","@vitejs/plugin-vue":"^6.0.0","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.1","prettier-plugin-merge":"^0.7.0","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.1.14","prettier-plugin-classnames":"^0.7.0","prettier-plugin-tailwindcss":"^0.6.5","@fortawesome/vue-fontawesome":"^3.0.8","prettier-plugin-organize-imports":"^4.0.0","@fortawesome/fontawesome-svg-core":"^6.6.0","@fortawesome/free-solid-svg-icons":"^6.6.0","@fortawesome/free-brands-svg-icons":"^6.6.0","@fortawesome/free-regular-svg-icons":"^6.6.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_1.1.5_1773033328526_0.11687051490517542","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@mkbabb/keyframes.js","version":"1.1.6","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"ISC","_id":"@mkbabb/keyframes.js@1.1.6","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"46b68f1d5f9e006955212b780abe51746a09a3da","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-1.1.6.tgz","fileCount":6,"integrity":"sha512-1yENKHjm22dKAIfzE0kjmBFMf5/bFlrIvyK0P3sN55PopEOt87cLCwkM1hzbVhdtYGIoXK+uiMr2lBCB7mSbnA==","signatures":[{"sig":"MEQCIAnRzQbdRRtdgq4glUTzChHNCcDqgrRFOQ92n/FTxPejAiBUwYesgsxW4eQ6OOiHaeovK3IzOCKDRVCGv0U7qKEZbw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":316071},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","module":"./dist/keyframes.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","require":"./dist/keyframes.cjs"}},"gitHead":"7d5005d6e7a62f9101e4534cab1861f090d97a6b","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"vite build --mode production","gh-pages":"vite build --mode gh-pages","dev:playground":"vite --mode playground"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"licenses":[{"url":"https://www.gnu.org/licenses/gpl-3.0.html","type":"GNU GPL v3"}],"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.6.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"@mkbabb/value.js":"latest","@mkbabb/parse-that":"latest"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","zod":"^3.23.8","clsx":"^2.1.1","vite":"^7.0.6","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^3.2.4","reka-ui":"^2.0.0","prettier":"^3.6.2","vaul-vue":"^0.2.0","@unovis/ts":"^1.5.2","typescript":"^5.8.3","v-calendar":"^3.1.2","vue-sonner":"^1.1.3","@types/node":"^24.1.0","@unovis/vue":"^1.5.2","html2canvas":"^1.4.1","tailwindcss":"^4.1.11","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.2.1","highlight.js":"^11.11.1","vee-validate":"^4.13.2","monaco-editor":"^0.50.0","monaco-themes":"^0.4.4","tailwind-merge":"^3.3.1","tw-animate-css":"^1.2.5","lucide-vue-next":"^0.525.0","vite-plugin-dts":"^4.5.4","@vee-validate/zod":"^4.13.2","@vitejs/plugin-vue":"^6.0.0","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.1","prettier-plugin-merge":"^0.7.0","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.1.14","prettier-plugin-classnames":"^0.7.0","prettier-plugin-tailwindcss":"^0.6.5","@fortawesome/vue-fontawesome":"^3.0.8","prettier-plugin-organize-imports":"^4.0.0","@fortawesome/fontawesome-svg-core":"^6.6.0","@fortawesome/free-solid-svg-icons":"^6.6.0","@fortawesome/free-brands-svg-icons":"^6.6.0","@fortawesome/free-regular-svg-icons":"^6.6.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_1.1.6_1773033521319_0.5164568282985031","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@mkbabb/keyframes.js","version":"1.2.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"MIT","_id":"@mkbabb/keyframes.js@1.2.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"ece44de5d5f29136ac2503937e7c37711571dfbc","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-1.2.0.tgz","fileCount":5,"integrity":"sha512-TcQwx2PBzbKegZnnzWKz1ATb4uEoF25CO5AQY4pMq5mLKwcyUG3q6jUan4A9WiovDxxDReJ3WPX74hiS8fHQtw==","signatures":[{"sig":"MEUCIAIe80NNA516eRqa9QipWy4UK/XLjW4KYrDX2DWPg8tEAiEArGMWK38BW0UdmLabwVY3f5rwpqDZe6OFkF5jv4qgpEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74960},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js"}},"gitHead":"eb1066748bf42bd820ab281297fd1e6050f5f1c1","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"vite build --mode production","gh-pages":"vite build --mode gh-pages","dev:playground":"vite --mode playground"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.6.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"@mkbabb/value.js":"^0.5.0","@mkbabb/parse-that":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","zod":"^3.23.8","clsx":"^2.1.1","vite":"^7.0.6","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^3.2.4","reka-ui":"^2.0.0","prettier":"^3.6.2","vaul-vue":"^0.2.0","@unovis/ts":"^1.5.2","typescript":"^5.8.3","v-calendar":"^3.1.2","vue-sonner":"^1.1.3","@types/node":"^24.1.0","@unovis/vue":"^1.5.2","html2canvas":"^1.4.1","tailwindcss":"^4.1.11","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.2.1","highlight.js":"^11.11.1","vee-validate":"^4.13.2","monaco-editor":"^0.50.0","monaco-themes":"^0.4.4","tailwind-merge":"^3.3.1","tw-animate-css":"^1.2.5","lucide-vue-next":"^0.525.0","vite-plugin-dts":"^4.5.4","@vee-validate/zod":"^4.13.2","@vitejs/plugin-vue":"^6.0.0","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.1","prettier-plugin-merge":"^0.7.0","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.1.14","prettier-plugin-classnames":"^0.7.0","prettier-plugin-tailwindcss":"^0.6.5","@fortawesome/vue-fontawesome":"^3.0.8","prettier-plugin-organize-imports":"^4.0.0","@fortawesome/fontawesome-svg-core":"^6.6.0","@fortawesome/free-solid-svg-icons":"^6.6.0","@fortawesome/free-brands-svg-icons":"^6.6.0","@fortawesome/free-regular-svg-icons":"^6.6.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_1.2.0_1773165567149_0.5915802919117845","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@mkbabb/keyframes.js","version":"1.2.1","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"MIT","_id":"@mkbabb/keyframes.js@1.2.1","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"85b6aeb02413a901f47b4badcac62c80e8517fc3","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-1.2.1.tgz","fileCount":5,"integrity":"sha512-YdG90YzxRBIlZ+prUl4TMd5h+p4iDAzfP6KQTLvxfelucIVDHkl5exacDjbGY7zkPDdjsPTTNQx6YrXETHCjsQ==","signatures":[{"sig":"MEUCIQCGE8D7DinQd3zS8Y8LgeE1YZwC7E5g42o/av6lKo9UZAIgJMoDuSTlTLHrZaGSKGEim4flF24humPyE00E1pb4AbU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97462},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js"}},"gitHead":"bd0d6098cd1a0d2d01955e9b8fe0e940d56c17b4","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"vite build --mode production","prepare":"vite build --mode production","gh-pages":"vite build --mode gh-pages","dev:playground":"vite --mode playground"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.6.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"@mkbabb/value.js":"^0.5.1","@mkbabb/parse-that":"^0.8.1"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","zod":"^3.23.8","clsx":"^2.1.1","vite":"^7.0.6","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^3.2.4","reka-ui":"^2.0.0","prettier":"^3.6.2","vaul-vue":"^0.2.0","@unovis/ts":"^1.5.2","typescript":"^5.8.3","v-calendar":"^3.1.2","vue-sonner":"^1.1.3","@types/node":"^24.1.0","@unovis/vue":"^1.5.2","html2canvas":"^1.4.1","tailwindcss":"^4.1.11","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.2.1","highlight.js":"^11.11.1","vee-validate":"^4.13.2","monaco-editor":"^0.50.0","monaco-themes":"^0.4.4","tailwind-merge":"^3.3.1","tw-animate-css":"^1.2.5","lucide-vue-next":"^0.525.0","vite-plugin-dts":"^4.5.4","@mkbabb/glass-ui":"file:../glass-ui","@vee-validate/zod":"^4.13.2","@vitejs/plugin-vue":"^6.0.0","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.1","prettier-plugin-merge":"^0.7.0","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.1.14","prettier-plugin-classnames":"^0.7.0","prettier-plugin-tailwindcss":"^0.6.5","prettier-plugin-organize-imports":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_1.2.1_1775270805413_0.7979332420187","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@mkbabb/keyframes.js","version":"2.1.1","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"MIT","_id":"@mkbabb/keyframes.js@2.1.1","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"4d35acaa98c708c9396e67ff679d68ac52b63ac1","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-2.1.1.tgz","fileCount":6,"integrity":"sha512-H545cGopqSgc6qb6MYjlheXCUqphc1N/+EvhCZ9KjfomVtqnOmzmmqZj8JwLtEGmoB/1fG+THuqLn4qpkjBJHQ==","signatures":[{"sig":"MEUCIQCn+rX4M/pHznVCh9kQwEnPTc/dyrcPV8cFslxG+NmwGQIgKR/5CHCHGNQlRzy9RLQEYFYpwH/mbIcv6KlS597aMCA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102114},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"e10063f02f0d8cf12de8e9420f6438a94e019694","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"vite build --mode production","check":"tsc --noEmit","prepare":"vite build --mode production","gh-pages":"vite build --mode gh-pages","build:watch":"vite build --watch --mode production","dev:playground":"vite --mode playground"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.6.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"_nodeVersion":"22.15.0","dependencies":{"@mkbabb/value.js":"^0.10.0","@mkbabb/parse-that":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.34","zod":"^3.23.8","clsx":"^2.1.1","vite":"^8.0.13","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^4.1.7","reka-ui":"^2.9.7","prettier":"^3.8.3","vaul-vue":"^0.4.0","@unovis/ts":"^1.6.5","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.0.7","vue-sonner":"^1.1.3","@lucide/vue":"^1.16.0","@types/node":"^24.12.4","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.50.0","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^4.5.4","@mkbabb/glass-ui":"file:../glass-ui","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.1","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_2.1.1_1779980655923_0.9462257392218205","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@mkbabb/keyframes.js","version":"2.2.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"MIT","_id":"@mkbabb/keyframes.js@2.2.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"4166e1c04687c7d8da66f8bf0377e2c45ca34432","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-2.2.0.tgz","fileCount":8,"integrity":"sha512-YEcwxcH7+Qodr6KFRceiD5lkKFkXjkBSz+cv8XnOBGwIzSpBMUptls90ccyxBZMn597eZqARqmI14jj+UQQ85A==","signatures":[{"sig":"MEUCIQDH+quO0mkHdmz+OaE6wdu1/h5AsUB7iiH6EkPRubbhlQIgCqwvOZiicBEXPb8XidB4HfNTSZviK2k7krn86DuJQgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109335},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"f0920638c7ee663ac914aa7965083348c78ff722","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"vite build --mode production","check":"tsc --noEmit","prepare":"vite build --mode production","gh-pages":"vite build --mode gh-pages","build:watch":"vite build --watch --mode production","dev:playground":"vite --mode playground"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.12.1","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"@mkbabb/value.js":"^0.10.0","@mkbabb/parse-that":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.34","zod":"^3.23.8","clsx":"^2.1.1","vite":"^8.0.13","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^4.1.7","reka-ui":"^2.9.7","prettier":"^3.8.3","vaul-vue":"^0.4.0","@unovis/ts":"^1.6.5","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.0.7","vue-sonner":"^1.1.3","@lucide/vue":"^1.16.0","@types/node":"^24.12.4","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.50.0","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^4.5.4","@mkbabb/glass-ui":"file:../glass-ui","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.1","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_2.2.0_1780376953876_0.9843295034978499","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@mkbabb/keyframes.js","version":"3.0.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"MIT","_id":"@mkbabb/keyframes.js@3.0.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"8b8b8fd8cafab920d21e50f51d2f0445bfb1fc35","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-3.0.0.tgz","fileCount":7,"integrity":"sha512-m3D9TQ3oLYgShMPmmetzfuHVDM0FZL5DeuxtVf204Qp8luKZL0yK7H/tckKQRoSpHLUyjHrA/YrgLGQWvGZxbA==","signatures":[{"sig":"MEUCIQCcOHYYPv++FTryfyEiWcZXbq2JWmcDO6KDprDcUj4RUAIgXGNbxy8YQV8F5Vx2+mPIlgnG59f1kb3qHeyAytpKbW0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":118765},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"2105e7e217844dbf75ebc9e1da0ac023a392749a","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","build:watch":"vite build --watch --mode production","dev:playground":"vite --mode playground","proof:boundary":"node scripts/proof-boundary.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.13.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@mkbabb/value.js":"^0.10.0","@mkbabb/parse-that":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.34","zod":"^3.23.8","clsx":"^2.1.1","vite":"^8.0.13","jsdom":"^26.1.0","three":"^0.166.1","vitest":"^4.1.7","reka-ui":"^2.9.7","prettier":"^3.8.3","vaul-vue":"^0.4.0","@unovis/ts":"^1.6.5","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.0.7","vue-sonner":"^1.1.3","@lucide/vue":"^1.16.0","@types/node":"^24.12.4","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^4.1.2","@types/three":"^0.166.0","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.50.0","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^4.5.4","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.1","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"peerDependencies":{"vue":"^3.5.0"},"optionalDependencies":{"@mkbabb/glass-ui":"file:../glass-ui"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_3.0.0_1780524773544_0.4682257770544873","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@mkbabb/keyframes.js","version":"4.0.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"MIT","_id":"@mkbabb/keyframes.js@4.0.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"9e5019b6a409f1a92e00dccf1e8eebda7d75cc2f","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-4.0.0.tgz","fileCount":11,"integrity":"sha512-GSfRSu89iSc1HNp0sIfQF0wt3I8FOiVAQLSfJ8G2CAekOT5oLOngs67AR9FWIr3OdToTgDSbg0j8MAZUgV1ugA==","signatures":[{"sig":"MEYCIQDasIU9zHhP/mXFXqb9f5r6s32obvSdAEZpeOsTA6YFyQIhAKeKxPNGQG7GCzMHg+rWWiIlaB4ff5QJguFfMN9LNP79","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":227787},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"d2640533641eb9ea17f6d56ee7d18584ccc9823e","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"npm run proof:boundary && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:idioms && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:zero-alloc && npm run proof:engine-correctness && npm run proof:standalone-zero-alloc && npm run proof:compile-deterministic && npm run proof:platform-adopt && npm run proof:orchestration && npm run proof:interp-fastprops && npm run proof:sync-step && npm run proof:roundtrip-easing && npm run proof:adapter-capture && npm run proof:motion-path && npm run proof:cohesion && npm run proof:bench-runs && npm run proof:ci-coverage && vitest run","build:watch":"vite build --watch --mode production","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","dev:playground":"vite --mode playground","proof:boundary":"node scripts/proof-boundary.mjs","proof:cohesion":"vitest run test/boundary-cohesion.test.ts","proof:sync-step":"vitest run test/sync-step.test.ts","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:zero-alloc":"vitest run test/zero-alloc.test.ts test/snap-symmetry.test.ts test/frame-compiler.test.ts","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:ci-coverage":"node scripts/proof-ci-coverage.mjs","proof:motion-path":"node scripts/proof-motion-path.mjs && vitest run test/motion-path.test.ts","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/platform-adopt.test.ts","proof:adapter-capture":"vitest run test/adapter-capture.test.ts","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/interp-fastprops.test.ts","proof:roundtrip-easing":"vitest run test/roundtrip-easing.test.ts","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:engine-correctness":"vitest run test/engine-correctness.test.ts","proof:compile-deterministic":"vitest run test/compile-deterministic.test.ts","proof:standalone-zero-alloc":"vitest run test/standalone-zero-alloc.test.ts"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.13.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@mkbabb/value.js":"^0.10.0","@mkbabb/parse-that":"^0.8.2"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","zod":"^3.25.76","clsx":"^2.1.1","vite":"^8.0.16","jsdom":"^29.1.1","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","vaul-vue":"^0.4.1","@unovis/ts":"^1.6.5","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^25.9.1","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"peerDependencies":{"vue":"^3.5.0"},"optionalDependencies":{"@mkbabb/glass-ui":"file:../glass-ui"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_4.0.0_1780793070010_0.7966651809960728","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@mkbabb/keyframes.js","version":"4.1.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":"","license":"MIT","_id":"@mkbabb/keyframes.js@4.1.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"37e87268f23daf6de764997b34468303b699566d","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-4.1.0.tgz","fileCount":12,"integrity":"sha512-ozckJ3RcXDRY3tY79vWtr9Vr2cKJjN/X5nj70MOO5393P9qvRVcEfSE8Lz3EgpZ159fZpZS9NvOqrc55A8iALw==","signatures":[{"sig":"MEYCIQDtWxBRuxyyq00p2/CcwTxI5qeuVShy3LgtBJ8WnJPUnQIhAI6vCGFrUf3KusTYhZETs5ooVsqSfCp3u7jyK1iKwb/A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@4.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":240293},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"98dab540d186aec8ca868497964b93cfbdb1fc67","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:idioms && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:zero-alloc && npm run proof:engine-correctness && npm run proof:standalone-zero-alloc && npm run proof:compile-deterministic && npm run proof:platform-adopt && npm run proof:orchestration && npm run proof:interp-fastprops && npm run proof:sync-step && npm run proof:roundtrip-easing && npm run proof:adapter-capture && npm run proof:motion-path && npm run proof:blend && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:interpolate-anything && npm run proof:roundtrip-fidelity && npm run proof:orbital-rotate3d && npm run proof:asset-store-singleton && npm run proof:scene-raf-leak && npm run proof:resize-tracks && npm run proof:cohesion && npm run proof:bench-runs && npm run proof:ci-coverage && vitest run","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/blend.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/draw-svg.test.ts","dev:playground":"vite --mode playground","proof:boundary":"node scripts/proof-boundary.mjs","proof:cohesion":"vitest run test/boundary-cohesion.test.ts","proof:finished":"node scripts/proof-finished.mjs && vitest run test/finished.test.ts","proof:sync-step":"vitest run test/sync-step.test.ts","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:repin-safe":"node scripts/proof-repin-safe.mjs","proof:zero-alloc":"vitest run test/zero-alloc.test.ts test/snap-symmetry.test.ts test/frame-compiler.test.ts","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:ci-coverage":"node scripts/proof-ci-coverage.mjs","proof:motion-path":"node scripts/proof-motion-path.mjs && vitest run test/motion-path.test.ts","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:resize-tracks":"vitest run test/resize-tracks.test.ts","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/adopt-compiled.test.ts","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/platform-adopt.test.ts","proof:scene-raf-leak":"vitest run test/scene-raf-leak.test.ts","proof:adapter-capture":"vitest run test/adapter-capture.test.ts","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/interp-fastprops.test.ts","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/orbital-rotate3d.test.ts","proof:roundtrip-easing":"vitest run test/roundtrip-easing.test.ts","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:engine-correctness":"vitest run test/engine-correctness.test.ts","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/roundtrip-fidelity.test.ts","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/interpolate-anything.test.ts","proof:asset-store-singleton":"vitest run test/asset-store-singleton.test.ts","proof:compile-deterministic":"vitest run test/compile-deterministic.test.ts","proof:standalone-zero-alloc":"vitest run test/standalone-zero-alloc.test.ts"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.13.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@mkbabb/value.js":"^0.11.1","@mkbabb/parse-that":"^0.9.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","zod":"^3.25.76","clsx":"^2.1.1","vite":"^8.0.16","jsdom":"^29.1.1","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","vaul-vue":"^0.4.1","@unovis/ts":"^1.6.5","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^25.9.1","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"peerDependencies":{"vue":"^3.5.0"},"optionalDependencies":{"@mkbabb/glass-ui":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_4.1.0_1780852762943_0.23977633815394706","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@mkbabb/keyframes.js","version":"4.2.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@4.2.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"fbfb70a7a54928be5c3b16eeff0c099def7c1db6","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-4.2.0.tgz","fileCount":12,"integrity":"sha512-oX/xXHah93nAWY0h9lKnCzpEKVHg5Izh0Reus225nzYHlUyxkCjJ7VEwRVQSRFACPliX/hbognFErBuCOGXqDw==","signatures":[{"sig":"MEUCIQCefM5aTKPSdIaz7fymyxBHHeYqhgHbirHSOjY6NtgVigIgI5jrdwid13fV4EL2X33mFdJjK4LUEZ3vldt1iHBp7IQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@4.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":275539},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"f0822a1b7762504e677d5ccb65eeca8e1ce90e1e","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"npm run proof:correctness && npm run proof:hygiene","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/blend.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/draw-svg.test.ts","proof:hygiene":"npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:demo-no-oversize && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-control-dfa && npm run proof:scene-transition-perf && npm run proof:dock-zorder && npm run proof:drawer-spring && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:motion-path-editable && npm run proof:motion-path-copy && npm run proof:easter-egg && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:easing-canvas-bounded && npm run proof:scene-uses-standard-ribbon && npm run proof:easing-sidebar-normalized && npm run proof:easing-sidebar-minimal && npm run proof:easing-stage-is-ball && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:bezier-no-scroll && npm run proof:bezier-single-card && npm run proof:bezier-grown && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:hero-rung && npm run proof:hero-balance && npm run proof:hero-cls && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:zero-alloc && npm run proof:engine-correctness && npm run proof:standalone-zero-alloc && npm run proof:compile-deterministic && npm run proof:platform-adopt && npm run proof:orchestration && npm run proof:interp-fastprops && npm run proof:sync-step && npm run proof:roundtrip-easing && npm run proof:adapter-capture && npm run proof:motion-path && npm run proof:blend && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:interpolate-anything && npm run proof:roundtrip-fidelity && npm run proof:orbital-rotate3d && npm run proof:asset-store-singleton && npm run proof:scene-raf-leak && npm run proof:scene-contract-identity && npm run proof:group-snapshot-identity && npm run proof:resize-tracks && npm run proof:cohesion && npm run proof:visual-lock && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:readme-runs && npm run proof:event-ordering && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:gate-is-runtime && npm run proof:chronic-closure && npm run proof:ci-coverage && vitest run","dev:playground":"vite --mode playground","proof:boundary":"node scripts/proof-boundary.mjs","proof:cohesion":"vitest run test/boundary-cohesion.test.ts","proof:finished":"node scripts/proof-finished.mjs && vitest run test/finished.test.ts","proof:hero-cls":"node scripts/proof-hero-cls.mjs","proof:hero-rung":"node scripts/proof-hero-rung.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/sync-step.test.ts","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:easter-egg":"node scripts/proof-easter-egg.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:zero-alloc":"vitest run test/zero-alloc.test.ts test/snap-symmetry.test.ts test/frame-compiler.test.ts","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:ci-coverage":"node scripts/proof-ci-coverage.mjs","proof:correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:motion-path":"node scripts/proof-motion-path.mjs && vitest run test/motion-path.test.ts","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:visual-lock":"node scripts/proof-visual-lock.mjs","proof:bezier-grown":"node scripts/proof-bezier-grown.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:hero-balance":"node scripts/proof-hero-balance.mjs","proof:live-session":"node scripts/proof-live-session.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:resize-tracks":"vitest run test/resize-tracks.test.ts","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/adopt-compiled.test.ts","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:event-ordering":"vitest run test/event-ordering.test.ts","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/platform-adopt.test.ts","proof:scene-raf-leak":"vitest run test/scene-raf-leak.test.ts","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:adapter-capture":"vitest run test/adapter-capture.test.ts","proof:chronic-closure":"node scripts/proof-chronic-closure.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:gate-is-runtime":"node scripts/proof-gate-is-runtime.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:bezier-no-scroll":"node scripts/proof-bezier-no-scroll.mjs","proof:demo-no-oversize":"node scripts/proof-demo-no-oversize.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:motion-path-copy":"node scripts/proof-motion-path-copy.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/orbital-rotate3d.test.ts","proof:roundtrip-easing":"vitest run test/roundtrip-easing.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:bezier-single-card":"node scripts/proof-bezier-single-card.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:engine-correctness":"vitest run test/engine-correctness.test.ts","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:easing-stage-is-ball":"node scripts/proof-easing-stage-is-ball.mjs","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/interpolate-anything.test.ts","proof:motion-path-editable":"node scripts/proof-motion-path-editable.mjs","proof:asset-store-singleton":"vitest run test/asset-store-singleton.test.ts","proof:compile-deterministic":"vitest run test/compile-deterministic.test.ts","proof:easing-canvas-bounded":"node scripts/proof-easing-canvas-bounded.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:standalone-zero-alloc":"vitest run test/standalone-zero-alloc.test.ts","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:easing-sidebar-minimal":"node scripts/proof-easing-sidebar-minimal.mjs","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:group-snapshot-identity":"vitest run test/group-snapshot-identity.test.ts","proof:scene-contract-identity":"vitest run test/scene-contract-identity.test.ts","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:easing-sidebar-normalized":"node scripts/proof-easing-sidebar-normalized.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.13.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@mkbabb/value.js":"^0.11.2","@mkbabb/parse-that":"^0.9.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","zod":"^3.25.76","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","vaul-vue":"^0.4.1","@unovis/ts":"^1.6.5","pixelmatch":"^7.2.0","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^25.9.1","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"~3.11.2"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_4.2.0_1781213089455_0.6289737552207217","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"name":"@mkbabb/keyframes.js","version":"4.3.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@4.3.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"d2649311742d7acd56abe2c914ae146a6d98b3cb","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-4.3.0.tgz","fileCount":19,"integrity":"sha512-EmVYgirvnO4MAOD48ArmwBz5sqDtFxABBXZE7GapkxzNMZkPWDxwNVbkdLax1zpHVuIPLqt0UvhFnhmjbnpASw==","signatures":[{"sig":"MEQCIA99Df90a6P8upfPb/qAWiIq3iEgF6kSHMw0wd49WiOsAiBOO8VFq28z4YuWGgFAy7IawlllaYb9uX5+eWRRrGXXcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@4.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":362887},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"4737ab39917a95115d9449ba91324b39e650d41b","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"npm run proof:correctness && npm run proof:hygiene","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/blend.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/draw-svg.test.ts","proof:hygiene":"npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:demo-no-oversize && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-control-dfa && npm run proof:scene-transition-perf && npm run proof:dock-zorder && npm run proof:drawer-spring && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:motion-path-editable && npm run proof:motion-path-copy && npm run proof:easter-egg && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:easing-canvas-bounded && npm run proof:scene-uses-standard-ribbon && npm run proof:easing-sidebar-normalized && npm run proof:easing-sidebar-minimal && npm run proof:easing-stage-is-ball && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:bezier-no-scroll && npm run proof:bezier-single-card && npm run proof:bezier-grown && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:hero-rung && npm run proof:hero-balance && npm run proof:hero-cls && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:zero-alloc && npm run proof:engine-correctness && npm run proof:standalone-zero-alloc && npm run proof:compile-deterministic && npm run proof:compile-replay && npm run proof:platform-adopt && npm run proof:orchestration && npm run proof:interp-fastprops && npm run proof:sync-step && npm run proof:roundtrip-easing && npm run proof:adapter-capture && npm run proof:composition-honored && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:motion-path && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:interpolate-anything && npm run proof:roundtrip-fidelity && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:asset-store-singleton && npm run proof:scene-raf-leak && npm run proof:scene-contract-identity && npm run proof:group-snapshot-identity && npm run proof:resize-tracks && npm run proof:cohesion && npm run proof:visual-lock && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:agent-surface && npm run proof:demo-on-published-surface && npm run proof:color-fidelity && npm run proof:readme-runs && npm run proof:event-ordering && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:gate-is-runtime && npm run proof:chronic-closure && npm run proof:taste-packet && npm run proof:ci-coverage && vitest run","dev:playground":"vite --mode playground","proof:boundary":"node scripts/proof-boundary.mjs","proof:cohesion":"vitest run test/boundary-cohesion.test.ts","proof:finished":"node scripts/proof-finished.mjs && vitest run test/finished.test.ts","proof:hero-cls":"node scripts/proof-hero-cls.mjs","proof:hero-rung":"node scripts/proof-hero-rung.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/sync-step.test.ts","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:easter-egg":"node scripts/proof-easter-egg.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:zero-alloc":"vitest run test/zero-alloc.test.ts test/snap-symmetry.test.ts test/frame-compiler.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:ci-coverage":"node scripts/proof-ci-coverage.mjs","proof:correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:spring-slider-continuous","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:motion-path":"node scripts/proof-motion-path.mjs && vitest run test/motion-path.test.ts","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:visual-lock":"node scripts/proof-visual-lock.mjs","proof:bezier-grown":"node scripts/proof-bezier-grown.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:hero-balance":"node scripts/proof-hero-balance.mjs","proof:live-session":"node scripts/proof-live-session.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:resize-tracks":"vitest run test/resize-tracks.test.ts","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","bench:color-fidelity":"vitest run test/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/adopt-compiled.test.ts","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile-roundtrip.test.ts","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:event-ordering":"vitest run test/event-ordering.test.ts","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/platform-adopt.test.ts","proof:scene-raf-leak":"vitest run test/scene-raf-leak.test.ts","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:adapter-capture":"vitest run test/adapter-capture.test.ts","proof:chronic-closure":"node scripts/proof-chronic-closure.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:gate-is-runtime":"node scripts/proof-gate-is-runtime.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:bezier-no-scroll":"node scripts/proof-bezier-no-scroll.mjs","proof:demo-no-oversize":"node scripts/proof-demo-no-oversize.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:motion-path-copy":"node scripts/proof-motion-path-copy.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/orbital-rotate3d.test.ts","proof:roundtrip-easing":"vitest run test/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:bezier-single-card":"node scripts/proof-bezier-single-card.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:engine-correctness":"vitest run test/engine-correctness.test.ts","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/composition-honored.test.ts","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/diagnostics-channel.test.ts","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:easing-stage-is-ball":"node scripts/proof-easing-stage-is-ball.mjs","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/interpolate-anything.test.ts","proof:motion-path-editable":"node scripts/proof-motion-path-editable.mjs","proof:asset-store-singleton":"vitest run test/asset-store-singleton.test.ts","proof:compile-deterministic":"vitest run test/compile-deterministic.test.ts","proof:easing-canvas-bounded":"node scripts/proof-easing-canvas-bounded.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:standalone-zero-alloc":"vitest run test/standalone-zero-alloc.test.ts","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:easing-sidebar-minimal":"node scripts/proof-easing-sidebar-minimal.mjs","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:group-snapshot-identity":"vitest run test/group-snapshot-identity.test.ts","proof:scene-contract-identity":"vitest run test/scene-contract-identity.test.ts","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:easing-sidebar-normalized":"node scripts/proof-easing-sidebar-normalized.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.13.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@mkbabb/value.js":"^0.13.0","@mkbabb/parse-that":"^0.9.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","zod":"^3.25.76","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","vaul-vue":"^0.4.1","@unovis/ts":"^1.6.5","pixelmatch":"^7.2.0","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^25.9.1","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"~4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_4.3.0_1781636064628_0.8378413359729571","host":"s3://npm-registry-packages-npm-production"}},"4.4.0":{"name":"@mkbabb/keyframes.js","version":"4.4.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@4.4.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"53744d2e788bc20e4cb727e3274f9bc662e271c0","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-4.4.0.tgz","fileCount":26,"integrity":"sha512-0dWrmhj2kGZWfTuxISA9hL5MRjlUWJGExIdohKrXYfneZyOUxqRalOxKsTuoGYG9EI5KQ39d21uZDANh4+3Vsw==","signatures":[{"sig":"MEYCIQD3AaNRK+Nrfvd1JI+9qmC0xhtFMp5spQCIL/8SJVxMsgIhANvVT06Zynos/I8RLQU/HtgE5thXTZBkuIz/gfbQFc7i","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":431925},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"c69bbb0f2092e44e478f4a925b846d7e8fa22e4e","scripts":{"dev":"vite","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"node scripts/run-all.mjs --all","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/blend.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/draw-svg.test.ts","proof:hygiene":"npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:consume-bundle && npm run proof:css-parity && npm run proof:packrat-sound && npm run proof:workaround-deletion && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:demo-no-oversize && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:no-single-option-select && npm run proof:settle-is-predicate && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-control-dfa && npm run proof:scene-transition-perf && npm run proof:dock-zorder && npm run proof:drawer-spring && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:motion-path-editable && npm run proof:motion-path-copy && npm run proof:easter-egg && npm run proof:crayon-preserved && npm run proof:design-refinement && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:easing-canvas-bounded && npm run proof:scene-uses-standard-ribbon && npm run proof:easing-sidebar-normalized && npm run proof:easing-sidebar-minimal && npm run proof:easing-stage-is-ball && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:bezier-no-scroll && npm run proof:bezier-single-card && npm run proof:bezier-grown && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:hero-rung && npm run proof:hero-balance && npm run proof:hero-cls && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:zero-alloc && npm run proof:engine-correctness && npm run proof:standalone-zero-alloc && npm run proof:compile-deterministic && npm run proof:compile-replay && npm run proof:replay-equality && npm run proof:platform-adopt && npm run proof:orchestration && npm run proof:transport-events && npm run proof:animate-orchestration && npm run proof:interp-fastprops && npm run proof:sync-step && npm run proof:roundtrip-easing && npm run proof:adapter-capture && npm run proof:composition-honored && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:motion-path && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:interpolate-anything && npm run proof:roundtrip-fidelity && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:asset-store-singleton && npm run proof:scene-raf-leak && npm run proof:scene-contract-identity && npm run proof:group-snapshot-identity && npm run proof:resize-tracks && npm run proof:cohesion && npm run proof:visual-lock && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:agent-surface && npm run proof:agent-validate && npm run proof:demo-on-published-surface && npm run proof:color-fidelity && npm run proof:readme-runs && npm run proof:event-ordering && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:bench-taxonomy && npm run proof:scheduler-posttask && npm run proof:epf1-measure && npm run proof:spring-vector && npm run proof:gate-is-runtime && npm run proof:chronic-closure && npm run proof:taste-packet && npm run proof:ci-coverage && npm run proof:no-foreign-symbol-stamp && npm run proof:soa-composite && npm run proof:morphsvg-consume && npm run proof:portable-perf && npm run proof:report-all && vitest run","dev:playground":"vite --mode playground","proof:all:demo":"npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:peer-satisfied","proof:boundary":"node scripts/proof-boundary.mjs","proof:cohesion":"vitest run test/boundary-cohesion.test.ts","proof:finished":"node scripts/proof-finished.mjs && vitest run test/finished.test.ts","proof:hero-cls":"node scripts/proof-hero-cls.mjs","proof:hero-rung":"node scripts/proof-hero-rung.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/sync-step.test.ts","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:css-parity":"node scripts/proof-css-parity.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:easter-egg":"node scripts/proof-easter-egg.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:report-all":"node scripts/proof-report-all.mjs","proof:zero-alloc":"vitest run test/zero-alloc.test.ts test/snap-symmetry.test.ts test/frame-compiler.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:ci-coverage":"node scripts/proof-ci-coverage.mjs","proof:correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:spring-slider-continuous && npm run proof:emerging-css-resolve-now","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:motion-path":"node scripts/proof-motion-path.mjs && vitest run test/motion-path.test.ts","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:visual-lock":"node scripts/proof-visual-lock.mjs","proof:bezier-grown":"node scripts/proof-bezier-grown.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:epf1-measure":"node scripts/proof-epf1-measure.mjs","proof:hero-balance":"node scripts/proof-hero-balance.mjs","proof:live-session":"node scripts/proof-live-session.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:packrat-sound":"node scripts/proof-packrat-sound.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:portable-perf":"node scripts/proof-portable-perf.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:resize-tracks":"vitest run test/resize-tracks.test.ts","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:soa-composite":"node scripts/proof-soa-composite.mjs && npm run proof:blend","proof:spring-vector":"node scripts/proof-spring-vector.mjs","bench:color-fidelity":"vitest run test/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/adopt-compiled.test.ts","proof:agent-validate":"node scripts/proof-agent-validate.mjs && vitest run test/agent-validate.test.ts","proof:bench-taxonomy":"node scripts/proof-bench-taxonomy.mjs","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile-roundtrip.test.ts","proof:consume-bundle":"node scripts/proof-consume-bundle.mjs","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:event-ordering":"vitest run test/event-ordering.test.ts","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:peer-satisfied":"node scripts/proof-peer-satisfied.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/platform-adopt.test.ts","proof:scene-raf-leak":"vitest run test/scene-raf-leak.test.ts","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:adapter-capture":"vitest run test/adapter-capture.test.ts","proof:chronic-closure":"node scripts/proof-chronic-closure.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:gate-is-runtime":"node scripts/proof-gate-is-runtime.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:replay-equality":"node scripts/proof-replay-equality.mjs && vitest run test/replay-equality.test.ts","proof:bezier-no-scroll":"node scripts/proof-bezier-no-scroll.mjs","proof:crayon-preserved":"node scripts/proof-crayon-preserved.mjs","proof:demo-no-oversize":"node scripts/proof-demo-no-oversize.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:morphsvg-consume":"node scripts/proof-morphsvg-consume.mjs && vitest run test/morph-svg.test.ts","proof:motion-path-copy":"node scripts/proof-motion-path-copy.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/orbital-rotate3d.test.ts","proof:roundtrip-easing":"vitest run test/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:transport-events":"node scripts/proof-transport-events.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:design-refinement":"node scripts/proof-design-refinement.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:bezier-single-card":"node scripts/proof-bezier-single-card.mjs","proof:control-point-live":"node scripts/proof-control-point-live.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:engine-correctness":"vitest run test/engine-correctness.test.ts","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:scheduler-posttask":"node scripts/proof-scheduler-posttask.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/composition-honored.test.ts","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/diagnostics-channel.test.ts","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:settle-is-predicate":"node scripts/proof-settle-is-predicate.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:workaround-deletion":"node scripts/proof-workaround-deletion.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:easing-stage-is-ball":"node scripts/proof-easing-stage-is-ball.mjs","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/interpolate-anything.test.ts","proof:motion-path-editable":"node scripts/proof-motion-path-editable.mjs","proof:animate-orchestration":"vitest run test/animate-orchestration.test.ts","proof:asset-store-singleton":"vitest run test/asset-store-singleton.test.ts","proof:compile-deterministic":"vitest run test/compile-deterministic.test.ts","proof:easing-canvas-bounded":"node scripts/proof-easing-canvas-bounded.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:standalone-zero-alloc":"vitest run test/standalone-zero-alloc.test.ts","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:easing-sidebar-minimal":"node scripts/proof-easing-sidebar-minimal.mjs","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:group-snapshot-identity":"vitest run test/group-snapshot-identity.test.ts","proof:keyframes-vue-published":"node scripts/proof-keyframes-vue-published.mjs","proof:no-foreign-symbol-stamp":"node scripts/proof-no-foreign-symbol-stamp.mjs","proof:no-single-option-select":"node scripts/proof-no-single-option-select.mjs","proof:scene-contract-identity":"vitest run test/scene-contract-identity.test.ts","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:emerging-css-resolve-now":"node scripts/proof-emerging-css-resolve-now.mjs && vitest run test/emerging-css-resolve-now.test.ts","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:easing-sidebar-normalized":"node scripts/proof-easing-sidebar-normalized.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.12.1","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"@mkbabb/value.js":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","zod":"^3.25.76","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","vaul-vue":"^0.4.1","@unovis/ts":"^1.6.5","pixelmatch":"^7.2.0","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^25.9.1","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"~4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_4.4.0_1782193322295_0.5913419606018713","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@mkbabb/keyframes.js","version":"5.0.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.0.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"10bfee2d8d2873ae88b27e78519b468fed3430b2","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.0.0.tgz","fileCount":26,"integrity":"sha512-12gLhuqAHzvbO290cg7OqMdpS/hxJvGqpUQxMWf2l4muniMkdemB9+DNv9kp5cu1o+Ef1c/hUEIg6/gYKbPb5w==","signatures":[{"sig":"MEYCIQDvkx8LTN9G9mjTNEVSct7lEgWS7XgDEVpuo1SNj402rAIhAPCVu7yxt3R1qBGLQuYOmFczh19noGJTQ3SzgbIUCKdZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":447602},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"}},"gitHead":"186acec549b34adeeb34be91c2078b82ce0d0a93","scripts":{"dev":"vite","lint":"depcruise src --ignore-known","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"node scripts/run-all.mjs --all","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/blend.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/draw-svg.test.ts","proof:hygiene":"node scripts/run-all.mjs --tier=proof:hygiene-chain","dev:playground":"vite --mode playground","proof:all:demo":"npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:peer-satisfied","proof:boundary":"node scripts/proof-boundary.mjs","proof:cohesion":"vitest run test/boundary-cohesion.test.ts","proof:finished":"node scripts/proof-finished.mjs && vitest run test/finished.test.ts","proof:hero-cls":"node scripts/proof-hero-cls.mjs","proof:color-soa":"node scripts/proof-color-soa.mjs","proof:hero-rung":"node scripts/proof-hero-rung.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:nan-frame":"node scripts/proof-nan-frame.mjs && vitest run test/nan-frame.test.ts","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/sync-step.test.ts","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:css-parity":"node scripts/proof-css-parity.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:easter-egg":"node scripts/proof-easter-egg.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:lint-clean":"node scripts/proof-lint-clean.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:report-all":"node scripts/proof-report-all.mjs","proof:zero-alloc":"vitest run test/zero-alloc.test.ts test/snap-symmetry.test.ts test/frame-compiler.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:changelog-5":"node scripts/proof-changelog-5.mjs","proof:ci-coverage":"node scripts/proof-ci-coverage.mjs","proof:correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:spring-slider-continuous && npm run proof:emerging-css-resolve-now && npm run proof:spring-heatmap && npm run proof:demo-control-point && npm run proof:easing-curve-editor && npm run proof:scene-switcher-mobile && npm run proof:amiga-decay-visible && npm run proof:morph-scene","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:morph-scene":"node scripts/proof-morph-scene.mjs","proof:motion-path":"node scripts/proof-motion-path.mjs && vitest run test/motion-path.test.ts","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:visual-lock":"node scripts/proof-visual-lock.mjs","proof:bezier-grown":"node scripts/proof-bezier-grown.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:epf1-measure":"node scripts/proof-epf1-measure.mjs","proof:grammar-fuzz":"node scripts/proof-grammar-fuzz.mjs && vitest run test/grammar-fuzz.test.ts","proof:hero-balance":"node scripts/proof-hero-balance.mjs","proof:live-session":"node scripts/proof-live-session.mjs","proof:record-truth":"node scripts/proof-record-truth.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:wave-charter":"node scripts/proof-wave-charter.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:alias-dropped":"node scripts/proof-alias-dropped.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:hygiene-chain":"npm run proof:record-truth && npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:consume-bundle && npm run proof:css-parity && npm run proof:packrat-sound && npm run proof:workaround-deletion && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:demo-no-oversize && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:no-single-option-select && npm run proof:settle-is-predicate && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-control-dfa && npm run proof:scene-transition-perf && npm run proof:dock-zorder && npm run proof:drawer-spring && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:motion-path-editable && npm run proof:motion-path-copy && npm run proof:easter-egg && npm run proof:crayon-preserved && npm run proof:design-refinement && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:easing-canvas-bounded && npm run proof:scene-uses-standard-ribbon && npm run proof:easing-sidebar-normalized && npm run proof:easing-sidebar-minimal && npm run proof:easing-stage-is-ball && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:bezier-no-scroll && npm run proof:bezier-single-card && npm run proof:bezier-grown && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:hero-rung && npm run proof:hero-balance && npm run proof:hero-cls && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:zero-alloc && npm run proof:engine-correctness && npm run proof:standalone-zero-alloc && npm run proof:compile-deterministic && npm run proof:compile-replay && npm run proof:replay-equality && npm run proof:platform-adopt && npm run proof:orchestration && npm run proof:transport-events && npm run proof:animate-orchestration && npm run proof:interp-fastprops && npm run proof:sync-step && npm run proof:roundtrip-easing && npm run proof:adapter-capture && npm run proof:composition-honored && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:motion-path && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:interpolate-anything && npm run proof:roundtrip-fidelity && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:asset-store-singleton && npm run proof:scene-raf-leak && npm run proof:scene-contract-identity && npm run proof:group-snapshot-identity && npm run proof:resize-tracks && npm run proof:cohesion && npm run proof:visual-lock && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:alias-dropped && npm run proof:changelog-5 && npm run proof:agent-surface && npm run proof:agent-validate && npm run proof:demo-on-published-surface && npm run proof:color-fidelity && npm run proof:readme-runs && npm run proof:event-ordering && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:bench-taxonomy && npm run proof:scheduler-posttask && npm run proof:epf1-measure && npm run proof:spring-vector && npm run proof:gate-is-runtime && npm run proof:chronic-closure && npm run proof:taste-packet && npm run proof:ci-coverage && npm run proof:no-foreign-symbol-stamp && npm run proof:soa-composite && npm run proof:morphsvg-consume && npm run proof:portable-perf && npm run proof:published-on-master && npm run proof:deploy-roundtrip && npm run proof:lint-clean && npm run proof:drag2d-light-certified && npm run proof:wave-charter && npm run proof:pin-ledger-current && npm run proof:emerging-css-resolve-p2 && npm run proof:processframe-soa && npm run proof:nan-frame && npm run proof:waapi-adaptive-densify && npm run proof:grammar-fuzz && npm run proof:kf-differential && npm run proof:morph-renders-d && npm run proof:morph-orients && npm run proof:emerging-css-resolve-fn && npm run proof:no-cross-realm-cast && npm run proof:color-soa && npm run proof:glassui-aria-ask && npm run proof:report-all && vitest run","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:morph-orients":"node scripts/proof-morph-orients.mjs && vitest run test/morph-svg.test.ts","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:packrat-sound":"node scripts/proof-packrat-sound.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:portable-perf":"node scripts/proof-portable-perf.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:resize-tracks":"vitest run test/resize-tracks.test.ts","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:soa-composite":"node scripts/proof-soa-composite.mjs && npm run proof:blend","proof:spring-vector":"node scripts/proof-spring-vector.mjs","bench:color-fidelity":"vitest run test/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/adopt-compiled.test.ts","proof:agent-validate":"node scripts/proof-agent-validate.mjs && vitest run test/agent-validate.test.ts","proof:bench-taxonomy":"node scripts/proof-bench-taxonomy.mjs","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile-roundtrip.test.ts","proof:consume-bundle":"node scripts/proof-consume-bundle.mjs","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:event-ordering":"vitest run test/event-ordering.test.ts","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:peer-satisfied":"node scripts/proof-peer-satisfied.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/platform-adopt.test.ts","proof:scene-raf-leak":"vitest run test/scene-raf-leak.test.ts","proof:spring-heatmap":"node scripts/proof-spring-heatmap.mjs","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:adapter-capture":"vitest run test/adapter-capture.test.ts","proof:chronic-closure":"node scripts/proof-chronic-closure.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:gate-is-runtime":"node scripts/proof-gate-is-runtime.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:kf-differential":"node scripts/proof-kf-differential.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:morph-renders-d":"node scripts/proof-morph-renders-d.mjs && vitest run test/morph-svg.test.ts","proof:replay-equality":"node scripts/proof-replay-equality.mjs && vitest run test/replay-equality.test.ts","proof:bezier-no-scroll":"node scripts/proof-bezier-no-scroll.mjs","proof:crayon-preserved":"node scripts/proof-crayon-preserved.mjs","proof:demo-no-oversize":"node scripts/proof-demo-no-oversize.mjs","proof:deploy-roundtrip":"node scripts/proof-deploy-roundtrip.mjs","proof:glassui-aria-ask":"node scripts/proof-glassui-aria-ask.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:morphsvg-consume":"node scripts/proof-morphsvg-consume.mjs && vitest run test/morph-svg.test.ts","proof:motion-path-copy":"node scripts/proof-motion-path-copy.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/orbital-rotate3d.test.ts","proof:processframe-soa":"node scripts/proof-processframe-soa.mjs","proof:roundtrip-easing":"vitest run test/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:transport-events":"node scripts/proof-transport-events.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:design-refinement":"node scripts/proof-design-refinement.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:bezier-single-card":"node scripts/proof-bezier-single-card.mjs","proof:demo-control-point":"node scripts/proof-demo-control-point.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:engine-correctness":"vitest run test/engine-correctness.test.ts","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:pin-ledger-current":"node scripts/proof-pin-ledger-current.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:scheduler-posttask":"node scripts/proof-scheduler-posttask.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:amiga-decay-visible":"node scripts/proof-amiga-decay-visible.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/composition-honored.test.ts","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/diagnostics-channel.test.ts","proof:easing-curve-editor":"node scripts/proof-easing-curve-editor.mjs","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-cross-realm-cast":"node scripts/proof-no-cross-realm-cast.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:published-on-master":"node scripts/proof-published-on-master.mjs","proof:settle-is-predicate":"node scripts/proof-settle-is-predicate.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:workaround-deletion":"node scripts/proof-workaround-deletion.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:easing-stage-is-ball":"node scripts/proof-easing-stage-is-ball.mjs","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/interpolate-anything.test.ts","proof:motion-path-editable":"node scripts/proof-motion-path-editable.mjs","proof:animate-orchestration":"vitest run test/animate-orchestration.test.ts","proof:asset-store-singleton":"vitest run test/asset-store-singleton.test.ts","proof:compile-deterministic":"vitest run test/compile-deterministic.test.ts","proof:easing-canvas-bounded":"node scripts/proof-easing-canvas-bounded.mjs","proof:scene-switcher-mobile":"node scripts/proof-scene-switcher-mobile.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:standalone-zero-alloc":"vitest run test/standalone-zero-alloc.test.ts","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:drag2d-light-certified":"node scripts/proof-drag2d-light-certified.mjs","proof:easing-sidebar-minimal":"node scripts/proof-easing-sidebar-minimal.mjs","proof:waapi-adaptive-densify":"node scripts/proof-waapi-adaptive-densify.mjs","proof:emerging-css-resolve-fn":"node scripts/proof-emerging-css-resolve-fn.mjs && vitest run test/emerging-css-resolve-fn.test.ts","proof:emerging-css-resolve-p2":"node scripts/proof-emerging-css-resolve-p2.mjs && vitest run test/emerging-css-resolve-p2.test.ts","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:group-snapshot-identity":"vitest run test/group-snapshot-identity.test.ts","proof:keyframes-vue-published":"node scripts/proof-keyframes-vue-published.mjs","proof:no-foreign-symbol-stamp":"node scripts/proof-no-foreign-symbol-stamp.mjs","proof:no-single-option-select":"node scripts/proof-no-single-option-select.mjs","proof:scene-contract-identity":"vitest run test/scene-contract-identity.test.ts","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:emerging-css-resolve-now":"node scripts/proof-emerging-css-resolve-now.mjs && vitest run test/emerging-css-resolve-now.test.ts","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:easing-sidebar-normalized":"node scripts/proof-easing-sidebar-normalized.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.12.1","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"@mkbabb/value.js":"^1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","zod":"^3.25.76","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","vaul-vue":"^0.4.1","@unovis/ts":"^1.6.5","fast-check":"^3.23.2","pixelmatch":"^7.2.0","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^25.9.1","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^17.4.3","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"~4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.0.0_1782280529022_0.377561475831653","host":"s3://npm-registry-packages-npm-production"}},"5.1.0":{"name":"@mkbabb/keyframes.js","version":"5.1.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.1.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"fa9cf47915f510909f2acccdc312fb6ca6d7d122","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.1.0.tgz","fileCount":28,"integrity":"sha512-MtjINp/r3my3KT7EjgDsxxjDBLqFHNs7cYnHVjz+1q/eqJcp4c7w2ieUkIeIwYvJEerJ6NrDyuW+oSMKrsICwQ==","signatures":[{"sig":"MEQCIBuh5bbcttiwIyPGtZL9YeTrwXMWiUJEkpwAe2PaACjjAiBs1Saz4SHgZeR/ytmtPF2SFP/1/pbdzvi3Vtn8hMs4Zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@5.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":564530},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","import":"./dist/engine/index.js","default":"./dist/engine/index.js"}},"gitHead":"5a5f7db6c99ad7c7bbb3ea1c22477337cc8fdefc","scripts":{"dev":"vite","lint":"depcruise src --ignore-known","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"node scripts/run-all.mjs --all","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/blend.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/draw-svg.test.ts","proof:hygiene":"node scripts/run-all.mjs --tier=proof:hygiene-chain","dev:playground":"vite --mode playground","proof:all:demo":"npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:peer-satisfied","proof:boundary":"node scripts/proof-boundary.mjs","proof:cohesion":"vitest run test/boundary-cohesion.test.ts","proof:finished":"node scripts/proof-finished.mjs && vitest run test/finished.test.ts","proof:hero-cls":"node scripts/proof-hero-cls.mjs","proof:color-soa":"node scripts/proof-color-soa.mjs","proof:hero-rung":"node scripts/proof-hero-rung.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:nan-frame":"node scripts/proof-nan-frame.mjs && vitest run test/nan-frame.test.ts","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/sync-step.test.ts","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:css-parity":"node scripts/proof-css-parity.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:easter-egg":"node scripts/proof-easter-egg.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:lint-clean":"node scripts/proof-lint-clean.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:report-all":"node scripts/proof-report-all.mjs","proof:zero-alloc":"vitest run test/zero-alloc.test.ts test/snap-symmetry.test.ts test/frame-compiler.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:changelog-5":"node scripts/proof-changelog-5.mjs","proof:ci-coverage":"node scripts/proof-ci-coverage.mjs","proof:correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:spring-slider-continuous && npm run proof:emerging-css-resolve-now && npm run proof:spring-heatmap && npm run proof:demo-control-point && npm run proof:easing-curve-editor && npm run proof:scene-switcher-mobile && npm run proof:amiga-decay-visible && npm run proof:morph-scene","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:morph-scene":"node scripts/proof-morph-scene.mjs","proof:motion-path":"node scripts/proof-motion-path.mjs && vitest run test/motion-path.test.ts","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:visual-lock":"node scripts/proof-visual-lock.mjs","proof:bezier-grown":"node scripts/proof-bezier-grown.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:epf1-measure":"node scripts/proof-epf1-measure.mjs","proof:grammar-fuzz":"node scripts/proof-grammar-fuzz.mjs && vitest run test/grammar-fuzz.test.ts","proof:hero-balance":"node scripts/proof-hero-balance.mjs","proof:live-session":"node scripts/proof-live-session.mjs","proof:record-truth":"node scripts/proof-record-truth.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:wave-charter":"node scripts/proof-wave-charter.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:alias-dropped":"node scripts/proof-alias-dropped.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:hygiene-chain":"npm run proof:record-truth && npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:consume-bundle && npm run proof:css-parity && npm run proof:packrat-sound && npm run proof:workaround-deletion && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:no-flat-siblings && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:demo-no-oversize && npm run proof:scene-colocated && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:no-single-option-select && npm run proof:settle-is-predicate && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-control-dfa && npm run proof:scene-transition-perf && npm run proof:dock-zorder && npm run proof:drawer-spring && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:motion-path-editable && npm run proof:motion-path-copy && npm run proof:easter-egg && npm run proof:crayon-preserved && npm run proof:design-refinement && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:easing-canvas-bounded && npm run proof:scene-uses-standard-ribbon && npm run proof:easing-sidebar-normalized && npm run proof:easing-sidebar-minimal && npm run proof:easing-stage-is-ball && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:bezier-no-scroll && npm run proof:bezier-single-card && npm run proof:bezier-grown && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:hero-rung && npm run proof:hero-balance && npm run proof:hero-cls && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:zero-alloc && npm run proof:engine-correctness && npm run proof:standalone-zero-alloc && npm run proof:compile-deterministic && npm run proof:compile-replay && npm run proof:replay-equality && npm run proof:platform-adopt && npm run proof:orchestration && npm run proof:transport-events && npm run proof:animate-orchestration && npm run proof:interp-fastprops && npm run proof:sync-step && npm run proof:roundtrip-easing && npm run proof:adapter-capture && npm run proof:composition-honored && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:motion-path && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:interpolate-anything && npm run proof:roundtrip-fidelity && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:asset-store-singleton && npm run proof:scene-raf-leak && npm run proof:scene-contract-identity && npm run proof:group-snapshot-identity && npm run proof:resize-tracks && npm run proof:cohesion && npm run proof:visual-lock && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:alias-dropped && npm run proof:changelog-5 && npm run proof:agent-surface && npm run proof:in-is-importable && npm run proof:agent-validate && npm run proof:demo-on-published-surface && npm run proof:color-fidelity && npm run proof:readme-runs && npm run proof:readme-paths-live && npm run proof:event-ordering && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:bench-taxonomy && npm run proof:scheduler-posttask && npm run proof:epf1-measure && npm run proof:spring-vector && npm run proof:gate-is-runtime && npm run proof:chronic-closure && npm run proof:taste-packet && npm run proof:ci-coverage && npm run proof:no-foreign-symbol-stamp && npm run proof:soa-composite && npm run proof:morphsvg-consume && npm run proof:portable-perf && npm run proof:published-on-master && npm run proof:deploy-roundtrip && npm run proof:lint-clean && npm run proof:no-silent-fallback && npm run proof:drag2d-light-certified && npm run proof:wave-charter && npm run proof:pin-ledger-current && npm run proof:emerging-css-resolve-p2 && npm run proof:processframe-soa && npm run proof:nan-frame && npm run proof:waapi-adaptive-densify && npm run proof:grammar-fuzz && npm run proof:kf-differential && npm run proof:morph-renders-d && npm run proof:morph-orients && npm run proof:emerging-css-resolve-fn && npm run proof:no-cross-realm-cast && npm run proof:color-soa && npm run proof:glassui-aria-ask && npm run proof:report-all && vitest run","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:morph-orients":"node scripts/proof-morph-orients.mjs && vitest run test/morph-svg.test.ts","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:packrat-sound":"node scripts/proof-packrat-sound.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:portable-perf":"node scripts/proof-portable-perf.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:resize-tracks":"vitest run test/resize-tracks.test.ts","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:soa-composite":"node scripts/proof-soa-composite.mjs && npm run proof:blend","proof:spring-vector":"node scripts/proof-spring-vector.mjs","bench:color-fidelity":"vitest run test/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/adopt-compiled.test.ts","proof:agent-validate":"node scripts/proof-agent-validate.mjs && vitest run test/agent-validate.test.ts","proof:bench-taxonomy":"node scripts/proof-bench-taxonomy.mjs","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile-roundtrip.test.ts","proof:consume-bundle":"node scripts/proof-consume-bundle.mjs","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:event-ordering":"vitest run test/event-ordering.test.ts","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:peer-satisfied":"node scripts/proof-peer-satisfied.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/platform-adopt.test.ts","proof:scene-raf-leak":"vitest run test/scene-raf-leak.test.ts","proof:spring-heatmap":"node scripts/proof-spring-heatmap.mjs","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:adapter-capture":"vitest run test/adapter-capture.test.ts","proof:chronic-closure":"node scripts/proof-chronic-closure.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:gate-is-runtime":"node scripts/proof-gate-is-runtime.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:kf-differential":"node scripts/proof-kf-differential.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:morph-renders-d":"node scripts/proof-morph-renders-d.mjs && vitest run test/morph-svg.test.ts","proof:replay-equality":"node scripts/proof-replay-equality.mjs && vitest run test/replay-equality.test.ts","proof:scene-colocated":"node scripts/proof-scene-colocated.mjs","proof:bezier-no-scroll":"node scripts/proof-bezier-no-scroll.mjs","proof:crayon-preserved":"node scripts/proof-crayon-preserved.mjs","proof:demo-no-oversize":"node scripts/proof-demo-no-oversize.mjs","proof:deploy-roundtrip":"node scripts/proof-deploy-roundtrip.mjs","proof:glassui-aria-ask":"node scripts/proof-glassui-aria-ask.mjs","proof:in-is-importable":"node scripts/proof-in-is-importable.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:morphsvg-consume":"node scripts/proof-morphsvg-consume.mjs && vitest run test/morph-svg.test.ts","proof:motion-path-copy":"node scripts/proof-motion-path-copy.mjs","proof:no-flat-siblings":"node scripts/proof-no-flat-siblings.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/orbital-rotate3d.test.ts","proof:processframe-soa":"node scripts/proof-processframe-soa.mjs","proof:roundtrip-easing":"vitest run test/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:transport-events":"node scripts/proof-transport-events.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:design-refinement":"node scripts/proof-design-refinement.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:readme-paths-live":"node scripts/proof-readme-paths-live.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:bezier-single-card":"node scripts/proof-bezier-single-card.mjs","proof:demo-control-point":"node scripts/proof-demo-control-point.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:engine-correctness":"vitest run test/engine-correctness.test.ts","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:no-silent-fallback":"node scripts/proof-no-silent-fallback.mjs","proof:pin-ledger-current":"node scripts/proof-pin-ledger-current.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:scheduler-posttask":"node scripts/proof-scheduler-posttask.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:amiga-decay-visible":"node scripts/proof-amiga-decay-visible.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/composition-honored.test.ts","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/diagnostics-channel.test.ts","proof:easing-curve-editor":"node scripts/proof-easing-curve-editor.mjs","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-cross-realm-cast":"node scripts/proof-no-cross-realm-cast.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:published-on-master":"node scripts/proof-published-on-master.mjs","proof:settle-is-predicate":"node scripts/proof-settle-is-predicate.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:workaround-deletion":"node scripts/proof-workaround-deletion.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:easing-stage-is-ball":"node scripts/proof-easing-stage-is-ball.mjs","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/interpolate-anything.test.ts","proof:motion-path-editable":"node scripts/proof-motion-path-editable.mjs","proof:animate-orchestration":"vitest run test/animate-orchestration.test.ts","proof:asset-store-singleton":"vitest run test/asset-store-singleton.test.ts","proof:compile-deterministic":"vitest run test/compile-deterministic.test.ts","proof:easing-canvas-bounded":"node scripts/proof-easing-canvas-bounded.mjs","proof:scene-switcher-mobile":"node scripts/proof-scene-switcher-mobile.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:standalone-zero-alloc":"vitest run test/standalone-zero-alloc.test.ts","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:drag2d-light-certified":"node scripts/proof-drag2d-light-certified.mjs","proof:easing-sidebar-minimal":"node scripts/proof-easing-sidebar-minimal.mjs","proof:waapi-adaptive-densify":"node scripts/proof-waapi-adaptive-densify.mjs","proof:emerging-css-resolve-fn":"node scripts/proof-emerging-css-resolve-fn.mjs && vitest run test/emerging-css-resolve-fn.test.ts","proof:emerging-css-resolve-p2":"node scripts/proof-emerging-css-resolve-p2.mjs && vitest run test/emerging-css-resolve-p2.test.ts","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:group-snapshot-identity":"vitest run test/group-snapshot-identity.test.ts","proof:no-foreign-symbol-stamp":"node scripts/proof-no-foreign-symbol-stamp.mjs","proof:no-single-option-select":"node scripts/proof-no-single-option-select.mjs","proof:scene-contract-identity":"vitest run test/scene-contract-identity.test.ts","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:emerging-css-resolve-now":"node scripts/proof-emerging-css-resolve-now.mjs && vitest run test/emerging-css-resolve-now.test.ts","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:easing-sidebar-normalized":"node scripts/proof-easing-sidebar-normalized.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.13.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"@mkbabb/value.js":"^1.2.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","zod":"^3.25.76","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","vaul-vue":"^0.4.1","@unovis/ts":"^1.6.5","fast-check":"^3.23.2","pixelmatch":"^7.2.0","typescript":"^6.0.3","v-calendar":"^3.1.2","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^25.9.1","@unovis/vue":"^1.6.5","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","vee-validate":"^4.15.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vee-validate/zod":"^4.15.1","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^17.4.3","embla-carousel-vue":"^8.6.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"~4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.1.0_1782354820434_0.5143686001262606","host":"s3://npm-registry-packages-npm-production"}},"5.2.0":{"name":"@mkbabb/keyframes.js","version":"5.2.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.2.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"6dc64c8c4805a22b4d56ae2f6f284e8bd407b821","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.2.0.tgz","fileCount":31,"integrity":"sha512-CkMIArJz5E8NGG+RjgavblpA5uintxehbmsMR3f3IFNZyk7H4S+ojmWYieJIZDzfjWUgDRnicrkAMO1BbCNsTA==","signatures":[{"sig":"MEUCIQDk3oug0XfzA5JXc5FlT5cZ+YjcjCcPiVBztiyHyQCpNgIgYSB00VzrqVUJvPFHmIl+jW1+SHRx+I3IessRSGRvQIs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@5.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":645181},"main":"./dist/keyframes.js","type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","import":"./dist/keyframes.js","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","import":"./dist/engine/index.js","default":"./dist/engine/index.js"}},"gitHead":"cf9b268e20628a9ab17e446702a51af5999479db","scripts":{"dev":"vite","lint":"depcruise src --ignore-known","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"node scripts/run-all.mjs --all","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/group/blend.test.ts","proof:morph":"node scripts/proof-morphsvg-consume.mjs && node scripts/proof-morph-renders-d.mjs && node scripts/proof-morph-orients.mjs && vitest run test/svg/morph-svg.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/svg/draw-svg.test.ts","proof:hygiene":"node scripts/run-all.mjs --tier=proof:hygiene-chain","proof:all:demo":"npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:peer-satisfied","proof:boundary":"node scripts/proof-boundary.mjs","proof:cohesion":"vitest run test/engine/boundary-cohesion.test.ts","proof:finished":"node scripts/proof-finished.mjs && vitest run test/engine/finished.test.ts","proof:changelog":"node scripts/proof-changelog.mjs","proof:color-soa":"node scripts/proof-color-soa.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:nan-frame":"node scripts/proof-nan-frame.mjs && vitest run test/engine/nan-frame.test.ts","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/physics/sync-step.test.ts","demo:correctness":"node scripts/run-demo-roster.mjs --tier=correctness","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:board-live":"node scripts/proof-board-live.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:colocation":"node scripts/proof-colocation.mjs","proof:css-parity":"node scripts/proof-css-parity.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:lint-clean":"node scripts/proof-lint-clean.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:report-all":"node scripts/proof-report-all.mjs","proof:split-a11y":"node scripts/proof-split-a11y.mjs","proof:zero-alloc":"vitest run test/engine/zero-alloc.test.ts test/physics/snap-symmetry.test.ts test/compile/frame-compiler.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:any-ceiling":"node scripts/proof-any-ceiling.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:ci-coverage":"node scripts/proof-ci-coverage.mjs","proof:cube-settle":"node scripts/proof-cube-settle.mjs","proof:dfa-derived":"node scripts/proof-dfa-derived.mjs","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:one-adapter":"node scripts/proof-one-adapter.mjs","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:scene-rests":"node scripts/proof-scene-rests.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:app-is-shell":"node scripts/proof-app-is-shell.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dock-elision":"node scripts/proof-dock-elision.mjs","proof:dock-grammar":"node scripts/proof-dock-grammar.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:epf1-measure":"node scripts/proof-epf1-measure.mjs","proof:grammar-fuzz":"node scripts/proof-grammar-fuzz.mjs && vitest run test/compile/grammar-fuzz.test.ts","proof:live-session":"node scripts/proof-live-session.mjs","proof:owner-golden":"node scripts/proof-owner-golden.mjs","proof:record-truth":"node scripts/proof-record-truth.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:subject-full":"node scripts/proof-subject-full.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:vt-roundtrip":"node scripts/proof-vt-roundtrip.mjs","proof:wave-charter":"node scripts/proof-wave-charter.mjs","proof:accent-census":"node scripts/proof-accent-census.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:alias-dropped":"node scripts/proof-alias-dropped.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:hygiene-chain":"npm run proof:record-truth && npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:consume-bundle && npm run proof:css-parity && npm run proof:packrat-sound && npm run proof:workaround-deletion && npm run proof:glass-ui-gap-tripwire && npm run proof:no-hand-rolled-labeled-select && npm run proof:transport-action-order && npm run proof:scene-facility && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:zone-cohesion && npm run proof:compile-backward-leg && npm run proof:no-flat-siblings && npm run proof:no-orphan-module && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:demo-no-oversize && npm run proof:scene-colocated && npm run proof:app-is-shell && npm run proof:shared-has-n-consumers && npm run proof:colocation && npm run proof:style-file-ceiling && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:no-single-option-select && npm run proof:dock-grammar && npm run proof:dock-elision && npm run proof:dock-single-tooltip && npm run proof:transport-play-first-render && npm run proof:settle-is-predicate && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-superkey-single-source && npm run proof:scene-control-dfa && npm run proof:dfa-derived && npm run proof:no-shadow-playback-authority && npm run proof:one-adapter && npm run proof:scene-transition-perf && npm run proof:drawer-spring && npm run proof:panel-naked-rail && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:crayon-preserved && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:scene-uses-standard-ribbon && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:no-hand-rolled-cursor-tracker && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:platform-adopt && npm run proof:claude-paths-live && npm run proof:scene-raf-leak && npm run proof:scene-contract-identity && npm run proof:group-snapshot-identity && npm run proof:resize-tracks && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:alias-dropped && npm run proof:changelog && npm run proof:agent-surface && npm run proof:in-is-importable && npm run proof:agent-validate && npm run proof:demo-on-published-surface && npm run proof:readme-runs && npm run proof:readme-paths-live && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:bench-taxonomy && npm run proof:epf1-measure && npm run proof:gate-is-runtime && npm run proof:chronic-closure && npm run proof:taste-packet && npm run proof:ci-coverage && npm run proof:no-foreign-symbol-stamp && npm run proof:portable-perf && npm run proof:published-on-master && npm run proof:deploy-roundtrip && npm run proof:lint-clean && npm run proof:no-silent-fallback && npm run proof:drag2d-light-certified && npm run proof:wave-charter && npm run proof:pin-ledger-current && npm run proof:no-cross-realm-cast && npm run proof:glassui-aria-ask && npm run proof:no-dead-dependency && npm run proof:kf-differential && npm run proof:owner-verdict-recorded && npm run proof:owner-review-gate && npm run proof:gate-authority && npm run proof:retirement-ledger && npm run proof:board-live && npm run proof:prompt-recap-t && npm run proof:engine-subpath-mirror && npm run proof:no-any-default && npm run proof:dts-rollups-agree && npm run proof:no-dead-export && npm run proof:any-ceiling      && npm run proof:report-all && vitest run","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:packrat-sound":"node scripts/proof-packrat-sound.mjs","proof:perf-counters":"node scripts/proof-perf-counters.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:portable-perf":"node scripts/proof-portable-perf.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:resize-tracks":"vitest run test/demo/resize-tracks.test.ts","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:soa-composite":"node scripts/proof-soa-composite.mjs && npm run proof:blend","proof:spring-vector":"node scripts/proof-spring-vector.mjs","proof:square-honest":"node scripts/proof-square-honest.mjs","proof:stage-visible":"node scripts/proof-stage-visible.mjs","proof:zone-cohesion":"node scripts/proof-zone-cohesion.mjs","bench:color-fidelity":"vitest run test/engine/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/ingest/adopt-compiled.test.ts","proof:agent-validate":"node scripts/proof-agent-validate.mjs && vitest run test/compile/agent-validate.test.ts","proof:bench-taxonomy":"node scripts/proof-bench-taxonomy.mjs","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/engine/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile/compile-roundtrip.test.ts","proof:consume-bundle":"node scripts/proof-consume-bundle.mjs","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:easing-gallery":"node scripts/proof-easing-gallery.mjs","proof:event-ordering":"vitest run test/engine/event-ordering.test.ts","proof:gate-authority":"node scripts/proof-gate-authority.mjs","proof:hero-two-focal":"node scripts/proof-hero-two-focal.mjs","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-any-default":"node scripts/proof-no-any-default.mjs","proof:no-dead-export":"node scripts/proof-no-dead-export.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:peer-satisfied":"node scripts/proof-peer-satisfied.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/ingest/platform-adopt.test.ts","proof:prompt-recap-t":"node scripts/proof-prompt-recap-t.mjs","proof:roster-ceiling":"node scripts/proof-roster-ceiling.mjs","proof:scene-facility":"node scripts/proof-scene-facility.mjs","proof:scene-raf-leak":"vitest run test/demo/scene-raf-leak.test.ts","proof:spring-heatmap":"node scripts/proof-spring-heatmap.mjs","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:adapter-capture":"vitest run test/compile/adapter-capture.test.ts","proof:chronic-closure":"node scripts/proof-chronic-closure.mjs","proof:cube-silhouette":"node scripts/proof-cube-silhouette.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:dock-rest-crisp":"node scripts/proof-dock-rest-crisp.mjs","proof:entry-roundtrip":"node scripts/proof-entry-roundtrip.mjs","proof:gate-is-runtime":"node scripts/proof-gate-is-runtime.mjs","proof:hero-deck-voice":"node scripts/proof-hero-deck-voice.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:kf-differential":"node scripts/proof-kf-differential.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:replay-equality":"node scripts/proof-replay-equality.mjs && vitest run test/engine/replay-equality.test.ts","proof:scene-colocated":"node scripts/proof-scene-colocated.mjs","proof:stage-inventory":"node scripts/proof-stage-inventory.mjs","proof:subject-legible":"node scripts/proof-subject-legible.mjs","proof:crayon-preserved":"node scripts/proof-crayon-preserved.mjs","proof:demo-correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:easing-gallery && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:accent-census && npm run proof:spring-slider-continuous && npm run proof:spring-heatmap && npm run proof:amiga-decay-visible && npm run proof:square-honest && npm run proof:perf-counters && npm run proof:scene-rests && npm run proof:no-layout-animation","proof:demo-no-oversize":"node scripts/proof-demo-no-oversize.mjs","proof:deploy-roundtrip":"node scripts/proof-deploy-roundtrip.mjs","proof:glassui-aria-ask":"node scripts/proof-glassui-aria-ask.mjs","proof:in-is-importable":"node scripts/proof-in-is-importable.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/engine/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:no-flat-siblings":"node scripts/proof-no-flat-siblings.mjs","proof:no-orphan-module":"node scripts/proof-no-orphan-module.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/demo/orbital-rotate3d.test.ts","proof:panel-naked-rail":"node scripts/proof-panel-naked-rail.mjs","proof:processframe-soa":"node scripts/proof-processframe-soa.mjs","proof:roundtrip-easing":"vitest run test/compile/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:transport-events":"node scripts/proof-transport-events.mjs","proof:claude-paths-live":"node scripts/proof-claude-paths-live.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:dts-rollups-agree":"node scripts/proof-dts-rollups-agree.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:owner-review-gate":"node scripts/proof-owner-review-gate.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:readme-paths-live":"node scripts/proof-readme-paths-live.mjs","proof:retirement-ledger":"node scripts/proof-retirement-ledger.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/demo/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/demo/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:trigger-roundtrip":"node scripts/proof-trigger-roundtrip.mjs","proof:blur-not-resampled":"node scripts/proof-blur-not-resampled.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:engine-correctness":"vitest run test/engine/engine-correctness.test.ts","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:no-dead-dependency":"node scripts/proof-no-dead-dependency.mjs","proof:no-silent-fallback":"node scripts/proof-no-silent-fallback.mjs","proof:pin-ledger-current":"node scripts/proof-pin-ledger-current.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/compile/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:scheduler-posttask":"node scripts/proof-scheduler-posttask.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:style-file-ceiling":"node scripts/proof-style-file-ceiling.mjs","proof:amiga-decay-visible":"node scripts/proof-amiga-decay-visible.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/engine/composition-honored.test.ts","proof:cube-relight-writes":"node scripts/proof-cube-relight-writes.mjs","proof:cursor-light-subtle":"node scripts/proof-cursor-light-subtle.mjs","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/compile/diagnostics-channel.test.ts","proof:dock-single-tooltip":"node scripts/proof-dock-single-tooltip.mjs","proof:library-correctness":"npm run proof:replay-equality && npm run proof:engine-correctness && npm run proof:compile-deterministic && npm run proof:compile-replay && npm run proof:zero-alloc && npm run proof:standalone-zero-alloc && npm run proof:roundtrip-fidelity && npm run proof:roundtrip-easing && npm run proof:nan-frame && npm run proof:grammar-fuzz && npm run proof:interpolate-anything && npm run proof:composition-honored && npm run proof:interp-fastprops && npm run proof:sync-step && npm run proof:event-ordering && npm run proof:adapter-capture && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:spring-vector && npm run proof:orchestration && npm run proof:transport-events && npm run proof:soa-composite && npm run proof:color-soa && npm run proof:processframe-soa && npm run proof:waapi-adaptive-densify && npm run proof:color-fidelity && npm run proof:cohesion && npm run proof:scheduler-posttask && npm run proof:morph && npm run proof:emerging-css-resolve","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-collision-rename":"node scripts/proof-no-collision-rename.mjs","proof:no-cross-realm-cast":"node scripts/proof-no-cross-realm-cast.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:no-layout-animation":"node scripts/proof-no-layout-animation.mjs","proof:published-on-master":"node scripts/proof-published-on-master.mjs","proof:settle-is-predicate":"node scripts/proof-settle-is-predicate.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/group/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:workaround-deletion":"node scripts/proof-workaround-deletion.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:compile-backward-leg":"node scripts/proof-compile-backward-leg.mjs","proof:emerging-css-resolve":"node scripts/proof-emerging-css-resolve-now.mjs && node scripts/proof-emerging-css-resolve-p2.mjs && node scripts/proof-emerging-css-resolve-fn.mjs && vitest run test/resolve/emerging-css-resolve-now.test.ts test/resolve/emerging-css-resolve-p2.test.ts test/resolve/emerging-css-resolve-fn.test.ts","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/engine/interpolate-anything.test.ts","proof:compile-browser-parse":"node scripts/proof-compile-browser-parse.mjs","proof:compile-deterministic":"vitest run test/compile/compile-deterministic.test.ts","proof:dock-morph-continuity":"node scripts/proof-dock-morph-continuity.mjs","proof:engine-subpath-mirror":"node scripts/proof-engine-subpath-mirror.mjs","proof:glass-ui-gap-tripwire":"node scripts/proof-glass-ui-gap-tripwire.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:standalone-zero-alloc":"vitest run test/engine/standalone-zero-alloc.test.ts","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:drag2d-light-certified":"node scripts/proof-drag2d-light-certified.mjs","proof:owner-verdict-recorded":"node scripts/proof-owner-verdict-recorded.mjs","proof:shared-has-n-consumers":"node scripts/proof-shared-has-n-consumers.mjs","proof:transport-action-order":"node scripts/proof-transport-action-order.mjs","proof:waapi-adaptive-densify":"node scripts/proof-waapi-adaptive-densify.mjs","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:group-snapshot-identity":"vitest run test/group/group-snapshot-identity.test.ts","proof:no-foreign-symbol-stamp":"node scripts/proof-no-foreign-symbol-stamp.mjs","proof:no-single-option-select":"node scripts/proof-no-single-option-select.mjs","proof:scene-contract-identity":"vitest run test/demo/scene-contract-identity.test.ts","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:no-nested-self-dependency":"node scripts/proof-no-nested-self-dependency.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:transport-play-first-render":"node scripts/proof-transport-play-first-render.mjs","proof:no-shadow-playback-authority":"node scripts/proof-no-shadow-playback-authority.mjs && vitest run test/demo/no-shadow-playback-authority.test.ts","proof:scene-superkey-single-source":"node scripts/proof-scene-superkey-single-source.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs","proof:no-hand-rolled-cursor-tracker":"node scripts/proof-no-hand-rolled-cursor-tracker.mjs","proof:no-hand-rolled-labeled-select":"node scripts/proof-no-hand-rolled-labeled-select.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.16.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@mkbabb/value.js":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","gl-matrix":"^3.4.4","fast-check":"^4.8.0","pixelmatch":"^7.2.0","typescript":"^6.0.3","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^22.20.0","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^18.0.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"~4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.2.0_1783636103843_0.43883705806739237","host":"s3://npm-registry-packages-npm-production"}},"5.3.0":{"name":"@mkbabb/keyframes.js","version":"5.3.0","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.3.0","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"e4f3644b4b94aa189caaa4533e8d22aef0b22b90","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.3.0.tgz","fileCount":10,"integrity":"sha512-6vwvxjzn9TBTUcoIfkqY4iDs3CLNP6dZltdSwsOA/9wrYE0k1rmunK4SUBFQoEGYR9nBnoRf2iPE0V/A3iD2Gg==","signatures":[{"sig":"MEYCIQCvW9xARJ6PxbC+zyfrfy+0j4FpJjWIYZV6MrR90IgSdAIhAJT2ROgT2NC2Q/AUYAaqvzUs3MvQ2I5QuI0VXUDvHhCE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@5.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":632734},"type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","default":"./dist/engine/index.js"}},"gitHead":"0bb77c174256e82d7e246e910a9b342acc85cfb1","scripts":{"dev":"vite","lint":"depcruise src","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"node scripts/run-all.mjs --all","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/group/blend.test.ts","proof:morph":"node scripts/proof-morphsvg-consume.mjs && node scripts/proof-morph-renders-d.mjs && node scripts/proof-morph-orients.mjs && vitest run test/svg/morph-svg.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/svg/draw-svg.test.ts","proof:hygiene":"node scripts/run-all.mjs --tier=proof:hygiene-chain","proof:publish":"node scripts/gates/surface/index.mjs","proof:all:demo":"npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:peer-satisfied","proof:boundary":"node scripts/proof-boundary.mjs","proof:finished":"node scripts/proof-finished.mjs && vitest run test/engine/finished.test.ts","proof:observed":"node scripts/run-all.mjs --tier=proof:observed-chain","proof:changelog":"node scripts/proof-changelog.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:nan-frame":"node scripts/proof-nan-frame.mjs && vitest run test/engine/nan-frame.test.ts","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/physics/sync-step.test.ts","demo:correctness":"node scripts/run-demo-roster.mjs --tier=correctness","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:colocation":"node scripts/proof-colocation.mjs","proof:css-parity":"node scripts/proof-css-parity.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:lint-clean":"node scripts/proof-lint-clean.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:split-a11y":"node scripts/proof-split-a11y.mjs","proof:zero-alloc":"vitest run test/engine/zero-alloc.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:any-ceiling":"node scripts/proof-any-ceiling.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:cube-settle":"node scripts/proof-cube-settle.mjs","proof:dfa-derived":"node scripts/proof-dfa-derived.mjs","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:one-adapter":"node scripts/proof-one-adapter.mjs","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:scene-rests":"node scripts/proof-scene-rests.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:app-is-shell":"node scripts/proof-app-is-shell.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dock-elision":"node scripts/proof-dock-elision.mjs","proof:dock-grammar":"node scripts/proof-dock-grammar.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:epf1-measure":"node scripts/proof-epf1-measure.mjs","proof:grammar-fuzz":"node scripts/proof-grammar-fuzz.mjs && vitest run test/compile/grammar-fuzz.test.ts","proof:live-session":"node scripts/proof-live-session.mjs","proof:owner-golden":"node scripts/proof-owner-golden.mjs","proof:record-truth":"node scripts/proof-record-truth.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:subject-full":"node scripts/proof-subject-full.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:vt-roundtrip":"node scripts/proof-vt-roundtrip.mjs","proof:wave-charter":"node scripts/proof-wave-charter.mjs","proof:accent-census":"node scripts/proof-accent-census.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:alias-dropped":"node scripts/proof-alias-dropped.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:hygiene-chain":"npm run proof:publish && npm run proof:record-truth && npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:consume-bundle && npm run proof:css-parity && npm run proof:packrat-sound && npm run proof:workaround-deletion && npm run proof:glass-ui-gap-tripwire && npm run proof:no-hand-rolled-labeled-select && npm run proof:transport-action-order && npm run proof:scene-facility && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:zone-cohesion && npm run proof:compile-backward-leg && npm run proof:no-flat-siblings && npm run proof:no-orphan-module && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:scene-colocated && npm run proof:app-is-shell && npm run proof:shared-has-n-consumers && npm run proof:colocation && npm run proof:style-file-ceiling && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:no-single-option-select && npm run proof:dock-grammar && npm run proof:dock-elision && npm run proof:dock-single-tooltip && npm run proof:transport-play-first-render && npm run proof:settle-is-predicate && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-superkey-single-source && npm run proof:scene-control-dfa && npm run proof:dfa-derived && npm run proof:no-shadow-playback-authority && npm run proof:one-adapter && npm run proof:scene-transition-perf && npm run proof:drawer-spring && npm run proof:panel-naked-rail && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:crayon-preserved && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:scene-uses-standard-ribbon && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:no-hand-rolled-cursor-tracker && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:platform-adopt && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:alias-dropped && npm run proof:changelog && npm run proof:agent-surface && npm run proof:in-is-importable && npm run proof:agent-validate && npm run proof:demo-on-published-surface && npm run proof:readme-runs && npm run proof:readme-paths-live && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:bench-taxonomy && npm run proof:epf1-measure && npm run proof:taste-packet && npm run proof:no-foreign-symbol-stamp && npm run proof:portable-perf && npm run proof:lint-clean && npm run proof:no-silent-fallback && npm run proof:drag2d-light-certified && npm run proof:wave-charter && npm run proof:pin-ledger-current && npm run proof:no-cross-realm-cast && npm run proof:glassui-aria-ask && npm run proof:no-dead-dependency && npm run proof:kf-differential && npm run proof:owner-verdict-recorded && npm run proof:owner-review-gate && npm run proof:gate-authority && npm run proof:prompt-recap-u && npm run proof:engine-subpath-mirror && npm run proof:no-any-default && npm run proof:dts-rollups-agree && npm run proof:no-dead-export && npm run proof:any-ceiling      && vitest run --project=library && vitest run --project=demo","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:packrat-sound":"node scripts/proof-packrat-sound.mjs","proof:perf-counters":"node scripts/proof-perf-counters.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:portable-perf":"node scripts/proof-portable-perf.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:square-honest":"node scripts/proof-square-honest.mjs","proof:stage-visible":"node scripts/proof-stage-visible.mjs","proof:zone-cohesion":"node scripts/proof-zone-cohesion.mjs","bench:color-fidelity":"vitest run test/engine/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/ingest/adopt-compiled.test.ts","proof:agent-validate":"node scripts/proof-agent-validate.mjs && vitest run test/compile/agent-validate.test.ts","proof:bench-taxonomy":"node scripts/proof-bench-taxonomy.mjs","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/engine/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile/compile-roundtrip.test.ts","proof:consume-bundle":"node scripts/proof-consume-bundle.mjs","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:easing-gallery":"node scripts/proof-easing-gallery.mjs","proof:gate-authority":"node scripts/proof-gate-authority.mjs","proof:hero-two-focal":"node scripts/proof-hero-two-focal.mjs","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-any-default":"node scripts/proof-no-any-default.mjs","proof:no-dead-export":"node scripts/proof-no-dead-export.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:observed-chain":"npm run proof:compile-browser-parse && npm run proof:split-a11y && npm run proof:vt-roundtrip && npm run proof:entry-roundtrip && npm run proof:trigger-roundtrip && npm run proof:cube-silhouette && npm run proof:cube-settle && npm run proof:cube-relight-writes && npm run proof:stage-visible && npm run proof:hero-two-focal && npm run proof:hero-deck-voice && npm run proof:cursor-light-subtle","proof:peer-satisfied":"node scripts/proof-peer-satisfied.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/ingest/platform-adopt.test.ts","proof:prompt-recap-u":"node scripts/proof-prompt-recap-u.mjs","proof:scene-facility":"node scripts/proof-scene-facility.mjs","proof:spring-heatmap":"node scripts/proof-spring-heatmap.mjs","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:cube-silhouette":"node scripts/proof-cube-silhouette.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:dock-rest-crisp":"node scripts/proof-dock-rest-crisp.mjs","proof:entry-roundtrip":"node scripts/proof-entry-roundtrip.mjs","proof:hero-deck-voice":"node scripts/proof-hero-deck-voice.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:kf-differential":"node scripts/proof-kf-differential.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:replay-equality":"node scripts/proof-replay-equality.mjs && vitest run test/engine/replay-equality.test.ts","proof:scene-colocated":"node scripts/proof-scene-colocated.mjs","proof:stage-inventory":"node scripts/proof-stage-inventory.mjs","proof:subject-legible":"node scripts/proof-subject-legible.mjs","proof:crayon-preserved":"node scripts/proof-crayon-preserved.mjs","proof:demo-correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:easing-gallery && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:accent-census && npm run proof:spring-slider-continuous && npm run proof:spring-heatmap && npm run proof:amiga-decay-visible && npm run proof:square-honest && npm run proof:perf-counters && npm run proof:scene-rests && npm run proof:no-layout-animation","proof:glassui-aria-ask":"node scripts/proof-glassui-aria-ask.mjs","proof:in-is-importable":"node scripts/proof-in-is-importable.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/engine/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:no-flat-siblings":"node scripts/proof-no-flat-siblings.mjs","proof:no-orphan-module":"node scripts/proof-no-orphan-module.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/demo/scenes/orbital-rotate3d.test.ts","proof:panel-naked-rail":"node scripts/proof-panel-naked-rail.mjs","proof:roundtrip-easing":"vitest run test/compile/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:transport-events":"node scripts/proof-transport-events.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:dts-rollups-agree":"node scripts/proof-dts-rollups-agree.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:owner-review-gate":"node scripts/proof-owner-review-gate.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:readme-paths-live":"node scripts/proof-readme-paths-live.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/demo/state/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/demo/scenes/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:trigger-roundtrip":"node scripts/proof-trigger-roundtrip.mjs","proof:blur-not-resampled":"node scripts/proof-blur-not-resampled.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:no-dead-dependency":"node scripts/proof-no-dead-dependency.mjs","proof:no-silent-fallback":"node scripts/proof-no-silent-fallback.mjs","proof:pin-ledger-current":"node scripts/proof-pin-ledger-current.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/compile/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:scheduler-posttask":"node scripts/proof-scheduler-posttask.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:style-file-ceiling":"node scripts/proof-style-file-ceiling.mjs","proof:amiga-decay-visible":"node scripts/proof-amiga-decay-visible.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/engine/composition-honored.test.ts","proof:cube-relight-writes":"node scripts/proof-cube-relight-writes.mjs","proof:cursor-light-subtle":"node scripts/proof-cursor-light-subtle.mjs","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/compile/diagnostics-channel.test.ts","proof:dock-single-tooltip":"node scripts/proof-dock-single-tooltip.mjs","proof:library-correctness":"vitest run --project=library && npm run proof:replay-equality && npm run proof:compile-replay && npm run proof:roundtrip-fidelity && npm run proof:roundtrip-easing && npm run proof:sync-step && npm run proof:zero-alloc && npm run proof:nan-frame && npm run proof:grammar-fuzz && npm run proof:interpolate-anything && npm run proof:composition-honored && npm run proof:interp-fastprops && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:orchestration && npm run proof:transport-events && npm run proof:color-fidelity && npm run proof:scheduler-posttask && npm run proof:morph && npm run proof:emerging-css-resolve","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-collision-rename":"node scripts/proof-no-collision-rename.mjs","proof:no-cross-realm-cast":"node scripts/proof-no-cross-realm-cast.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:no-layout-animation":"node scripts/proof-no-layout-animation.mjs","proof:settle-is-predicate":"node scripts/proof-settle-is-predicate.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/group/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:workaround-deletion":"node scripts/proof-workaround-deletion.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:compile-backward-leg":"node scripts/proof-compile-backward-leg.mjs","proof:emerging-css-resolve":"node scripts/proof-emerging-css-resolve-now.mjs && node scripts/proof-emerging-css-resolve-p2.mjs && node scripts/proof-emerging-css-resolve-fn.mjs && vitest run test/resolve/emerging-css-resolve-now.test.ts test/resolve/emerging-css-resolve-p2.test.ts test/resolve/emerging-css-resolve-fn.test.ts","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/engine/interpolate-anything.test.ts","proof:compile-browser-parse":"node scripts/proof-compile-browser-parse.mjs","proof:dock-morph-continuity":"node scripts/proof-dock-morph-continuity.mjs","proof:engine-subpath-mirror":"node scripts/proof-engine-subpath-mirror.mjs","proof:glass-ui-gap-tripwire":"node scripts/proof-glass-ui-gap-tripwire.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:drag2d-light-certified":"node scripts/proof-drag2d-light-certified.mjs","proof:owner-verdict-recorded":"node scripts/proof-owner-verdict-recorded.mjs","proof:shared-has-n-consumers":"node scripts/proof-shared-has-n-consumers.mjs","proof:transport-action-order":"node scripts/proof-transport-action-order.mjs","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:no-foreign-symbol-stamp":"node scripts/proof-no-foreign-symbol-stamp.mjs","proof:no-single-option-select":"node scripts/proof-no-single-option-select.mjs","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:no-nested-self-dependency":"node scripts/proof-no-nested-self-dependency.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:transport-play-first-render":"node scripts/proof-transport-play-first-render.mjs","proof:no-shadow-playback-authority":"node scripts/proof-no-shadow-playback-authority.mjs && vitest run test/demo/state/no-shadow-playback-authority.test.ts","proof:scene-superkey-single-source":"node scripts/proof-scene-superkey-single-source.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs","proof:no-hand-rolled-cursor-tracker":"node scripts/proof-no-hand-rolled-cursor-tracker.mjs","proof:no-hand-rolled-labeled-select":"node scripts/proof-no-hand-rolled-labeled-select.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.16.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@mkbabb/value.js":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","gl-matrix":"^3.4.4","fast-check":"^4.8.0","pixelmatch":"^7.2.0","typescript":"^6.0.3","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^22.20.0","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^18.0.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"4.2.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.3.0_1784127798950_0.23477771921166068","host":"s3://npm-registry-packages-npm-production"}},"5.3.1":{"name":"@mkbabb/keyframes.js","version":"5.3.1","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.3.1","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"d0be97855e1c2d10f845921c65007f359c98d066","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.3.1.tgz","fileCount":10,"integrity":"sha512-0oJgajIfLNAhEJ6dI+xrvZL6ejS5urORYpU14v/efu5xOU6UwkoPhK7AYiJxAPZlmF4lzzA4jLDq6xv+TwFAYg==","signatures":[{"sig":"MEQCIEj9pbFs6hd/SbSxmlsPuhrf/mGr5wBbabXdnP0R3AJpAiABO0EgdQErisSjqItz4Q5T+4SPsGyDWXrM1Ryqy5bmHQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@5.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":632734},"type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","default":"./dist/engine/index.js"}},"gitHead":"85a4826e46b0ffbb8c44f837ef7a7aa738868979","scripts":{"dev":"vite","lint":"depcruise src","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"node scripts/run-all.mjs --all","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/group/blend.test.ts","proof:morph":"node scripts/proof-morphsvg-consume.mjs && node scripts/proof-morph-renders-d.mjs && node scripts/proof-morph-orients.mjs && vitest run test/svg/morph-svg.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/svg/draw-svg.test.ts","proof:hygiene":"node scripts/run-all.mjs --tier=proof:hygiene-chain","proof:publish":"node scripts/gates/surface/index.mjs","proof:all:demo":"npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:peer-satisfied","proof:boundary":"node scripts/proof-boundary.mjs","proof:finished":"node scripts/proof-finished.mjs && vitest run test/engine/finished.test.ts","proof:observed":"node scripts/run-all.mjs --tier=proof:observed-chain","proof:changelog":"node scripts/proof-changelog.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:nan-frame":"node scripts/proof-nan-frame.mjs && vitest run test/engine/nan-frame.test.ts","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/physics/sync-step.test.ts","demo:correctness":"node scripts/run-demo-roster.mjs --tier=correctness","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:colocation":"node scripts/proof-colocation.mjs","proof:css-parity":"node scripts/proof-css-parity.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:lint-clean":"node scripts/proof-lint-clean.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:split-a11y":"node scripts/proof-split-a11y.mjs","proof:zero-alloc":"vitest run test/engine/zero-alloc.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:any-ceiling":"node scripts/proof-any-ceiling.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:cube-settle":"node scripts/proof-cube-settle.mjs","proof:dfa-derived":"node scripts/proof-dfa-derived.mjs","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:one-adapter":"node scripts/proof-one-adapter.mjs","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:scene-rests":"node scripts/proof-scene-rests.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:app-is-shell":"node scripts/proof-app-is-shell.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dock-elision":"node scripts/proof-dock-elision.mjs","proof:dock-grammar":"node scripts/proof-dock-grammar.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:epf1-measure":"node scripts/proof-epf1-measure.mjs","proof:grammar-fuzz":"node scripts/proof-grammar-fuzz.mjs && vitest run test/compile/grammar-fuzz.test.ts","proof:live-session":"node scripts/proof-live-session.mjs","proof:owner-golden":"node scripts/proof-owner-golden.mjs","proof:record-truth":"node scripts/proof-record-truth.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:subject-full":"node scripts/proof-subject-full.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:vt-roundtrip":"node scripts/proof-vt-roundtrip.mjs","proof:wave-charter":"node scripts/proof-wave-charter.mjs","proof:accent-census":"node scripts/proof-accent-census.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:alias-dropped":"node scripts/proof-alias-dropped.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:hygiene-chain":"npm run proof:publish && npm run proof:record-truth && npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:consume-bundle && npm run proof:css-parity && npm run proof:packrat-sound && npm run proof:workaround-deletion && npm run proof:glass-ui-gap-tripwire && npm run proof:no-hand-rolled-labeled-select && npm run proof:transport-action-order && npm run proof:scene-facility && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:zone-cohesion && npm run proof:compile-backward-leg && npm run proof:no-flat-siblings && npm run proof:no-orphan-module && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:scene-colocated && npm run proof:app-is-shell && npm run proof:shared-has-n-consumers && npm run proof:colocation && npm run proof:style-file-ceiling && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:no-single-option-select && npm run proof:dock-grammar && npm run proof:dock-elision && npm run proof:dock-single-tooltip && npm run proof:transport-play-first-render && npm run proof:settle-is-predicate && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-superkey-single-source && npm run proof:scene-control-dfa && npm run proof:dfa-derived && npm run proof:no-shadow-playback-authority && npm run proof:one-adapter && npm run proof:scene-transition-perf && npm run proof:drawer-spring && npm run proof:panel-naked-rail && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:crayon-preserved && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:scene-uses-standard-ribbon && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:no-hand-rolled-cursor-tracker && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:platform-adopt && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:alias-dropped && npm run proof:changelog && npm run proof:agent-surface && npm run proof:in-is-importable && npm run proof:agent-validate && npm run proof:demo-on-published-surface && npm run proof:readme-runs && npm run proof:readme-paths-live && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:bench-taxonomy && npm run proof:epf1-measure && npm run proof:taste-packet && npm run proof:no-foreign-symbol-stamp && npm run proof:portable-perf && npm run proof:lint-clean && npm run proof:no-silent-fallback && npm run proof:drag2d-light-certified && npm run proof:wave-charter && npm run proof:pin-ledger-current && npm run proof:no-cross-realm-cast && npm run proof:glassui-aria-ask && npm run proof:no-dead-dependency && npm run proof:kf-differential && npm run proof:owner-verdict-recorded && npm run proof:owner-review-gate && npm run proof:gate-authority && npm run proof:prompt-recap-u && npm run proof:engine-subpath-mirror && npm run proof:no-any-default && npm run proof:dts-rollups-agree && npm run proof:no-dead-export && npm run proof:any-ceiling      && vitest run --project=library && vitest run --project=demo","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:packrat-sound":"node scripts/proof-packrat-sound.mjs","proof:perf-counters":"node scripts/proof-perf-counters.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:portable-perf":"node scripts/proof-portable-perf.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:square-honest":"node scripts/proof-square-honest.mjs","proof:stage-visible":"node scripts/proof-stage-visible.mjs","proof:zone-cohesion":"node scripts/proof-zone-cohesion.mjs","bench:color-fidelity":"vitest run test/engine/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/ingest/adopt-compiled.test.ts","proof:agent-validate":"node scripts/proof-agent-validate.mjs && vitest run test/compile/agent-validate.test.ts","proof:bench-taxonomy":"node scripts/proof-bench-taxonomy.mjs","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/engine/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile/compile-roundtrip.test.ts","proof:consume-bundle":"node scripts/proof-consume-bundle.mjs","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:easing-gallery":"node scripts/proof-easing-gallery.mjs","proof:gate-authority":"node scripts/proof-gate-authority.mjs","proof:hero-two-focal":"node scripts/proof-hero-two-focal.mjs","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-any-default":"node scripts/proof-no-any-default.mjs","proof:no-dead-export":"node scripts/proof-no-dead-export.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:observed-chain":"npm run proof:compile-browser-parse && npm run proof:split-a11y && npm run proof:vt-roundtrip && npm run proof:entry-roundtrip && npm run proof:trigger-roundtrip && npm run proof:cube-silhouette && npm run proof:cube-settle && npm run proof:cube-relight-writes && npm run proof:stage-visible && npm run proof:hero-two-focal && npm run proof:hero-deck-voice && npm run proof:cursor-light-subtle","proof:peer-satisfied":"node scripts/proof-peer-satisfied.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/ingest/platform-adopt.test.ts","proof:prompt-recap-u":"node scripts/proof-prompt-recap-u.mjs","proof:scene-facility":"node scripts/proof-scene-facility.mjs","proof:spring-heatmap":"node scripts/proof-spring-heatmap.mjs","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:cube-silhouette":"node scripts/proof-cube-silhouette.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:dock-rest-crisp":"node scripts/proof-dock-rest-crisp.mjs","proof:entry-roundtrip":"node scripts/proof-entry-roundtrip.mjs","proof:hero-deck-voice":"node scripts/proof-hero-deck-voice.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:kf-differential":"node scripts/proof-kf-differential.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:replay-equality":"node scripts/proof-replay-equality.mjs && vitest run test/engine/replay-equality.test.ts","proof:scene-colocated":"node scripts/proof-scene-colocated.mjs","proof:stage-inventory":"node scripts/proof-stage-inventory.mjs","proof:subject-legible":"node scripts/proof-subject-legible.mjs","proof:crayon-preserved":"node scripts/proof-crayon-preserved.mjs","proof:demo-correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:easing-gallery && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:accent-census && npm run proof:spring-slider-continuous && npm run proof:spring-heatmap && npm run proof:amiga-decay-visible && npm run proof:square-honest && npm run proof:perf-counters && npm run proof:scene-rests && npm run proof:no-layout-animation","proof:glassui-aria-ask":"node scripts/proof-glassui-aria-ask.mjs","proof:in-is-importable":"node scripts/proof-in-is-importable.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/engine/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:no-flat-siblings":"node scripts/proof-no-flat-siblings.mjs","proof:no-orphan-module":"node scripts/proof-no-orphan-module.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/demo/scenes/orbital-rotate3d.test.ts","proof:panel-naked-rail":"node scripts/proof-panel-naked-rail.mjs","proof:roundtrip-easing":"vitest run test/compile/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:transport-events":"node scripts/proof-transport-events.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:dts-rollups-agree":"node scripts/proof-dts-rollups-agree.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:owner-review-gate":"node scripts/proof-owner-review-gate.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:readme-paths-live":"node scripts/proof-readme-paths-live.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/demo/state/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/demo/scenes/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:trigger-roundtrip":"node scripts/proof-trigger-roundtrip.mjs","proof:blur-not-resampled":"node scripts/proof-blur-not-resampled.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:no-dead-dependency":"node scripts/proof-no-dead-dependency.mjs","proof:no-silent-fallback":"node scripts/proof-no-silent-fallback.mjs","proof:pin-ledger-current":"node scripts/proof-pin-ledger-current.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/compile/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:scheduler-posttask":"node scripts/proof-scheduler-posttask.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:style-file-ceiling":"node scripts/proof-style-file-ceiling.mjs","proof:amiga-decay-visible":"node scripts/proof-amiga-decay-visible.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/engine/composition-honored.test.ts","proof:cube-relight-writes":"node scripts/proof-cube-relight-writes.mjs","proof:cursor-light-subtle":"node scripts/proof-cursor-light-subtle.mjs","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/compile/diagnostics-channel.test.ts","proof:dock-single-tooltip":"node scripts/proof-dock-single-tooltip.mjs","proof:library-correctness":"vitest run --project=library && npm run proof:replay-equality && npm run proof:compile-replay && npm run proof:roundtrip-fidelity && npm run proof:roundtrip-easing && npm run proof:sync-step && npm run proof:zero-alloc && npm run proof:nan-frame && npm run proof:grammar-fuzz && npm run proof:interpolate-anything && npm run proof:composition-honored && npm run proof:interp-fastprops && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:orchestration && npm run proof:transport-events && npm run proof:color-fidelity && npm run proof:scheduler-posttask && npm run proof:morph && npm run proof:emerging-css-resolve","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-collision-rename":"node scripts/proof-no-collision-rename.mjs","proof:no-cross-realm-cast":"node scripts/proof-no-cross-realm-cast.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:no-layout-animation":"node scripts/proof-no-layout-animation.mjs","proof:settle-is-predicate":"node scripts/proof-settle-is-predicate.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/group/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:workaround-deletion":"node scripts/proof-workaround-deletion.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:compile-backward-leg":"node scripts/proof-compile-backward-leg.mjs","proof:emerging-css-resolve":"node scripts/proof-emerging-css-resolve-now.mjs && node scripts/proof-emerging-css-resolve-p2.mjs && node scripts/proof-emerging-css-resolve-fn.mjs && vitest run test/resolve/emerging-css-resolve-now.test.ts test/resolve/emerging-css-resolve-p2.test.ts test/resolve/emerging-css-resolve-fn.test.ts","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/engine/interpolate-anything.test.ts","proof:compile-browser-parse":"node scripts/proof-compile-browser-parse.mjs","proof:dock-morph-continuity":"node scripts/proof-dock-morph-continuity.mjs","proof:engine-subpath-mirror":"node scripts/proof-engine-subpath-mirror.mjs","proof:glass-ui-gap-tripwire":"node scripts/proof-glass-ui-gap-tripwire.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:drag2d-light-certified":"node scripts/proof-drag2d-light-certified.mjs","proof:owner-verdict-recorded":"node scripts/proof-owner-verdict-recorded.mjs","proof:shared-has-n-consumers":"node scripts/proof-shared-has-n-consumers.mjs","proof:transport-action-order":"node scripts/proof-transport-action-order.mjs","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:no-foreign-symbol-stamp":"node scripts/proof-no-foreign-symbol-stamp.mjs","proof:no-single-option-select":"node scripts/proof-no-single-option-select.mjs","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:no-nested-self-dependency":"node scripts/proof-no-nested-self-dependency.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:transport-play-first-render":"node scripts/proof-transport-play-first-render.mjs","proof:no-shadow-playback-authority":"node scripts/proof-no-shadow-playback-authority.mjs && vitest run test/demo/state/no-shadow-playback-authority.test.ts","proof:scene-superkey-single-source":"node scripts/proof-scene-superkey-single-source.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs","proof:no-hand-rolled-cursor-tracker":"node scripts/proof-no-hand-rolled-cursor-tracker.mjs","proof:no-hand-rolled-labeled-select":"node scripts/proof-no-hand-rolled-labeled-select.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.16.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@mkbabb/value.js":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","gl-matrix":"^3.4.4","fast-check":"^4.8.0","pixelmatch":"^7.2.0","typescript":"^6.0.3","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^22.20.0","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^18.0.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.3.1_1784128509692_0.3040783927208326","host":"s3://npm-registry-packages-npm-production"}},"5.3.2":{"name":"@mkbabb/keyframes.js","version":"5.3.2","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.3.2","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"a0701241bf5d0ae24bc8db8ab8bdbd8294946859","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.3.2.tgz","fileCount":10,"integrity":"sha512-w+epizVOWwSU+PilSJTZJ2uL08+6P4n5BjYpv0UjaxPy2B3Rb1/fAJfl36MdjF8Z6vTJDuFr5NPabnjcnSK1sw==","signatures":[{"sig":"MEUCIErvUUKvozTFm1hlQcceKrXPeVaGx6M7vkvilKEfV6tNAiEAwZlLztabKcbTsmyD5lxRXVwhAHYxs6e7KlQsIvf8nPI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@5.3.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":632734},"type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","default":"./dist/engine/index.js"}},"gitHead":"049966464ab27cb476192b95abc2c4d77a4fd19c","scripts":{"dev":"vite","lint":"depcruise src","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"node scripts/run-all.mjs --all","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/group/blend.test.ts","proof:morph":"node scripts/proof-morphsvg-consume.mjs && node scripts/proof-morph-renders-d.mjs && node scripts/proof-morph-orients.mjs && vitest run test/svg/morph-svg.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/svg/draw-svg.test.ts","proof:hygiene":"node scripts/run-all.mjs --tier=proof:hygiene-chain","proof:publish":"node scripts/gates/surface/index.mjs","proof:all:demo":"npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:peer-satisfied","proof:boundary":"node scripts/proof-boundary.mjs","proof:finished":"node scripts/proof-finished.mjs && vitest run test/engine/finished.test.ts","proof:observed":"node scripts/run-all.mjs --tier=proof:observed-chain","proof:changelog":"node scripts/proof-changelog.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:nan-frame":"node scripts/proof-nan-frame.mjs && vitest run test/engine/nan-frame.test.ts","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/physics/sync-step.test.ts","demo:correctness":"node scripts/run-demo-roster.mjs --tier=correctness","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:colocation":"node scripts/proof-colocation.mjs","proof:css-parity":"node scripts/proof-css-parity.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:lint-clean":"node scripts/proof-lint-clean.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:split-a11y":"node scripts/proof-split-a11y.mjs","proof:zero-alloc":"vitest run test/engine/zero-alloc.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:any-ceiling":"node scripts/proof-any-ceiling.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:cube-settle":"node scripts/proof-cube-settle.mjs","proof:dfa-derived":"node scripts/proof-dfa-derived.mjs","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:one-adapter":"node scripts/proof-one-adapter.mjs","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:scene-rests":"node scripts/proof-scene-rests.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:app-is-shell":"node scripts/proof-app-is-shell.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dock-elision":"node scripts/proof-dock-elision.mjs","proof:dock-grammar":"node scripts/proof-dock-grammar.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:epf1-measure":"node scripts/proof-epf1-measure.mjs","proof:grammar-fuzz":"node scripts/proof-grammar-fuzz.mjs && vitest run test/compile/grammar-fuzz.test.ts","proof:live-session":"node scripts/proof-live-session.mjs","proof:owner-golden":"node scripts/proof-owner-golden.mjs","proof:record-truth":"node scripts/proof-record-truth.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:subject-full":"node scripts/proof-subject-full.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:vt-roundtrip":"node scripts/proof-vt-roundtrip.mjs","proof:wave-charter":"node scripts/proof-wave-charter.mjs","proof:accent-census":"node scripts/proof-accent-census.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:alias-dropped":"node scripts/proof-alias-dropped.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:hygiene-chain":"npm run proof:publish && npm run proof:record-truth && npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:consume-bundle && npm run proof:css-parity && npm run proof:packrat-sound && npm run proof:workaround-deletion && npm run proof:glass-ui-gap-tripwire && npm run proof:no-hand-rolled-labeled-select && npm run proof:transport-action-order && npm run proof:scene-facility && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:zone-cohesion && npm run proof:compile-backward-leg && npm run proof:no-flat-siblings && npm run proof:no-orphan-module && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:scene-colocated && npm run proof:app-is-shell && npm run proof:shared-has-n-consumers && npm run proof:colocation && npm run proof:style-file-ceiling && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:no-single-option-select && npm run proof:dock-grammar && npm run proof:dock-elision && npm run proof:dock-single-tooltip && npm run proof:transport-play-first-render && npm run proof:settle-is-predicate && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-superkey-single-source && npm run proof:scene-control-dfa && npm run proof:dfa-derived && npm run proof:no-shadow-playback-authority && npm run proof:one-adapter && npm run proof:scene-transition-perf && npm run proof:drawer-spring && npm run proof:panel-naked-rail && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:crayon-preserved && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:scene-uses-standard-ribbon && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:no-hand-rolled-cursor-tracker && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:platform-adopt && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:alias-dropped && npm run proof:changelog && npm run proof:agent-surface && npm run proof:in-is-importable && npm run proof:agent-validate && npm run proof:demo-on-published-surface && npm run proof:readme-runs && npm run proof:readme-paths-live && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:bench-taxonomy && npm run proof:epf1-measure && npm run proof:taste-packet && npm run proof:no-foreign-symbol-stamp && npm run proof:portable-perf && npm run proof:lint-clean && npm run proof:no-silent-fallback && npm run proof:drag2d-light-certified && npm run proof:wave-charter && npm run proof:pin-ledger-current && npm run proof:no-cross-realm-cast && npm run proof:glassui-aria-ask && npm run proof:no-dead-dependency && npm run proof:kf-differential && npm run proof:owner-verdict-recorded && npm run proof:owner-review-gate && npm run proof:gate-authority && npm run proof:prompt-recap-u && npm run proof:engine-subpath-mirror && npm run proof:no-any-default && npm run proof:dts-rollups-agree && npm run proof:no-dead-export && npm run proof:any-ceiling      && vitest run --project=library && vitest run --project=demo","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:packrat-sound":"node scripts/proof-packrat-sound.mjs","proof:perf-counters":"node scripts/proof-perf-counters.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:portable-perf":"node scripts/proof-portable-perf.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:square-honest":"node scripts/proof-square-honest.mjs","proof:stage-visible":"node scripts/proof-stage-visible.mjs","proof:zone-cohesion":"node scripts/proof-zone-cohesion.mjs","bench:color-fidelity":"vitest run test/engine/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/ingest/adopt-compiled.test.ts","proof:agent-validate":"node scripts/proof-agent-validate.mjs && vitest run test/compile/agent-validate.test.ts","proof:bench-taxonomy":"node scripts/proof-bench-taxonomy.mjs","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/engine/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile/compile-roundtrip.test.ts","proof:consume-bundle":"node scripts/proof-consume-bundle.mjs","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:easing-gallery":"node scripts/proof-easing-gallery.mjs","proof:gate-authority":"node scripts/proof-gate-authority.mjs","proof:hero-two-focal":"node scripts/proof-hero-two-focal.mjs","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-any-default":"node scripts/proof-no-any-default.mjs","proof:no-dead-export":"node scripts/proof-no-dead-export.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:observed-chain":"npm run proof:compile-browser-parse && npm run proof:split-a11y && npm run proof:vt-roundtrip && npm run proof:entry-roundtrip && npm run proof:trigger-roundtrip && npm run proof:cube-silhouette && npm run proof:cube-settle && npm run proof:cube-relight-writes && npm run proof:stage-visible && npm run proof:hero-two-focal && npm run proof:hero-deck-voice && npm run proof:cursor-light-subtle","proof:peer-satisfied":"node scripts/proof-peer-satisfied.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/ingest/platform-adopt.test.ts","proof:prompt-recap-u":"node scripts/proof-prompt-recap-u.mjs","proof:scene-facility":"node scripts/proof-scene-facility.mjs","proof:spring-heatmap":"node scripts/proof-spring-heatmap.mjs","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:cube-silhouette":"node scripts/proof-cube-silhouette.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:dock-rest-crisp":"node scripts/proof-dock-rest-crisp.mjs","proof:entry-roundtrip":"node scripts/proof-entry-roundtrip.mjs","proof:hero-deck-voice":"node scripts/proof-hero-deck-voice.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:kf-differential":"node scripts/proof-kf-differential.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:replay-equality":"node scripts/proof-replay-equality.mjs && vitest run test/engine/replay-equality.test.ts","proof:scene-colocated":"node scripts/proof-scene-colocated.mjs","proof:stage-inventory":"node scripts/proof-stage-inventory.mjs","proof:subject-legible":"node scripts/proof-subject-legible.mjs","proof:crayon-preserved":"node scripts/proof-crayon-preserved.mjs","proof:demo-correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:easing-gallery && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:accent-census && npm run proof:spring-slider-continuous && npm run proof:spring-heatmap && npm run proof:amiga-decay-visible && npm run proof:square-honest && npm run proof:perf-counters && npm run proof:scene-rests && npm run proof:no-layout-animation","proof:glassui-aria-ask":"node scripts/proof-glassui-aria-ask.mjs","proof:in-is-importable":"node scripts/proof-in-is-importable.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/engine/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:no-flat-siblings":"node scripts/proof-no-flat-siblings.mjs","proof:no-orphan-module":"node scripts/proof-no-orphan-module.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/demo/scenes/orbital-rotate3d.test.ts","proof:panel-naked-rail":"node scripts/proof-panel-naked-rail.mjs","proof:roundtrip-easing":"vitest run test/compile/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:transport-events":"node scripts/proof-transport-events.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:dts-rollups-agree":"node scripts/proof-dts-rollups-agree.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:owner-review-gate":"node scripts/proof-owner-review-gate.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:readme-paths-live":"node scripts/proof-readme-paths-live.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/demo/state/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/demo/scenes/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:trigger-roundtrip":"node scripts/proof-trigger-roundtrip.mjs","proof:blur-not-resampled":"node scripts/proof-blur-not-resampled.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:no-dead-dependency":"node scripts/proof-no-dead-dependency.mjs","proof:no-silent-fallback":"node scripts/proof-no-silent-fallback.mjs","proof:pin-ledger-current":"node scripts/proof-pin-ledger-current.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/compile/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:scheduler-posttask":"node scripts/proof-scheduler-posttask.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:style-file-ceiling":"node scripts/proof-style-file-ceiling.mjs","proof:amiga-decay-visible":"node scripts/proof-amiga-decay-visible.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/engine/composition-honored.test.ts","proof:cube-relight-writes":"node scripts/proof-cube-relight-writes.mjs","proof:cursor-light-subtle":"node scripts/proof-cursor-light-subtle.mjs","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/compile/diagnostics-channel.test.ts","proof:dock-single-tooltip":"node scripts/proof-dock-single-tooltip.mjs","proof:library-correctness":"vitest run --project=library && npm run proof:replay-equality && npm run proof:compile-replay && npm run proof:roundtrip-fidelity && npm run proof:roundtrip-easing && npm run proof:sync-step && npm run proof:zero-alloc && npm run proof:nan-frame && npm run proof:grammar-fuzz && npm run proof:interpolate-anything && npm run proof:composition-honored && npm run proof:interp-fastprops && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:orchestration && npm run proof:transport-events && npm run proof:color-fidelity && npm run proof:scheduler-posttask && npm run proof:morph && npm run proof:emerging-css-resolve","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-collision-rename":"node scripts/proof-no-collision-rename.mjs","proof:no-cross-realm-cast":"node scripts/proof-no-cross-realm-cast.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:no-layout-animation":"node scripts/proof-no-layout-animation.mjs","proof:settle-is-predicate":"node scripts/proof-settle-is-predicate.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/group/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:workaround-deletion":"node scripts/proof-workaround-deletion.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:compile-backward-leg":"node scripts/proof-compile-backward-leg.mjs","proof:emerging-css-resolve":"node scripts/proof-emerging-css-resolve-now.mjs && node scripts/proof-emerging-css-resolve-p2.mjs && node scripts/proof-emerging-css-resolve-fn.mjs && vitest run test/resolve/emerging-css-resolve-now.test.ts test/resolve/emerging-css-resolve-p2.test.ts test/resolve/emerging-css-resolve-fn.test.ts","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/engine/interpolate-anything.test.ts","proof:compile-browser-parse":"node scripts/proof-compile-browser-parse.mjs","proof:dock-morph-continuity":"node scripts/proof-dock-morph-continuity.mjs","proof:engine-subpath-mirror":"node scripts/proof-engine-subpath-mirror.mjs","proof:glass-ui-gap-tripwire":"node scripts/proof-glass-ui-gap-tripwire.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:drag2d-light-certified":"node scripts/proof-drag2d-light-certified.mjs","proof:owner-verdict-recorded":"node scripts/proof-owner-verdict-recorded.mjs","proof:shared-has-n-consumers":"node scripts/proof-shared-has-n-consumers.mjs","proof:transport-action-order":"node scripts/proof-transport-action-order.mjs","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:no-foreign-symbol-stamp":"node scripts/proof-no-foreign-symbol-stamp.mjs","proof:no-single-option-select":"node scripts/proof-no-single-option-select.mjs","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:no-nested-self-dependency":"node scripts/proof-no-nested-self-dependency.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:transport-play-first-render":"node scripts/proof-transport-play-first-render.mjs","proof:no-shadow-playback-authority":"node scripts/proof-no-shadow-playback-authority.mjs && vitest run test/demo/state/no-shadow-playback-authority.test.ts","proof:scene-superkey-single-source":"node scripts/proof-scene-superkey-single-source.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs","proof:no-hand-rolled-cursor-tracker":"node scripts/proof-no-hand-rolled-cursor-tracker.mjs","proof:no-hand-rolled-labeled-select":"node scripts/proof-no-hand-rolled-labeled-select.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.16.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@mkbabb/value.js":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","gl-matrix":"^3.4.4","fast-check":"^4.8.0","pixelmatch":"^7.2.0","typescript":"^6.0.3","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^22.20.0","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^18.0.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.3.2_1784129615006_0.8722824976655745","host":"s3://npm-registry-packages-npm-production"}},"5.3.3":{"name":"@mkbabb/keyframes.js","version":"5.3.3","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.3.3","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"d706d42489df62c120c59a636fdf4cb5a5c55612","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.3.3.tgz","fileCount":10,"integrity":"sha512-bkR2MMzNYEF/mM/nuYzy4JJlQn1tiqIWjHe1Tr11N4073SC7GKhqRzOEzN9exI17ihtpFLLLE+C6MqYA046kaw==","signatures":[{"sig":"MEYCIQDjfAPHpR4A2Mhoo+45JId2byE2qBPtlq25ROFegeXiewIhAO16ZiuMpSV03oVw3IUuIlmTpnvPTqUVcVoEDmzYg9OM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@5.3.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":632734},"type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","default":"./dist/engine/index.js"}},"gitHead":"8cca894a79654bb99810c48f58fac91179172bfc","scripts":{"dev":"vite","lint":"depcruise src","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","proof:all":"node scripts/run-all.mjs --all","build:watch":"vite build --watch --mode production","proof:blend":"node scripts/proof-blend.mjs && vitest run test/group/blend.test.ts","proof:morph":"node scripts/proof-morphsvg-consume.mjs && node scripts/proof-morph-renders-d.mjs && node scripts/proof-morph-orients.mjs && vitest run test/svg/morph-svg.test.ts","proof:engine":"node scripts/proof-engine.mjs","proof:idioms":"node scripts/proof-idioms.mjs","proof:browser":"node scripts/proof-browser.mjs","proof:dogfood":"node scripts/proof-dogfood.mjs","proof:drawsvg":"node scripts/proof-drawsvg.mjs && vitest run test/svg/draw-svg.test.ts","proof:hygiene":"node scripts/run-all.mjs --tier=proof:hygiene-chain","proof:publish":"node scripts/gates/surface/index.mjs","proof:all:demo":"npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:peer-satisfied","proof:boundary":"node scripts/proof-boundary.mjs","proof:finished":"node scripts/proof-finished.mjs && vitest run test/engine/finished.test.ts","proof:observed":"node scripts/run-all.mjs --tier=proof:observed-chain","proof:changelog":"node scripts/proof-changelog.mjs","proof:idle-fade":"node scripts/proof-idle-fade.mjs","proof:nan-frame":"node scripts/proof-nan-frame.mjs && vitest run test/engine/nan-frame.test.ts","proof:occlusion":"node scripts/occlusion-gate.mjs","proof:sync-step":"vitest run test/physics/sync-step.test.ts","demo:correctness":"node scripts/run-demo-roster.mjs --tier=correctness","proof:bench-runs":"node scripts/proof-bench-runs.mjs","proof:cold-entry":"node scripts/proof-cold-entry.mjs","proof:colocation":"node scripts/proof-colocation.mjs","proof:css-parity":"node scripts/proof-css-parity.mjs","proof:demo-fonts":"node scripts/proof-demo-fonts.mjs","proof:demo-smoke":"node scripts/demo-smoke.mjs","proof:icon-idiom":"node scripts/proof-icon-idiom.mjs","proof:lint-clean":"node scripts/proof-lint-clean.mjs","proof:modern-web":"node scripts/proof-modern-web.mjs","proof:split-a11y":"node scripts/proof-split-a11y.mjs","proof:zero-alloc":"vitest run test/engine/zero-alloc.test.ts","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:any-ceiling":"node scripts/proof-any-ceiling.mjs","proof:brittleness":"node scripts/proof-brittleness.mjs","proof:cube-settle":"node scripts/proof-cube-settle.mjs","proof:dfa-derived":"node scripts/proof-dfa-derived.mjs","proof:dock-zorder":"node scripts/proof-dock-zorder.mjs","proof:font-census":"node scripts/proof-font-census.mjs","proof:one-adapter":"node scripts/proof-one-adapter.mjs","proof:pp-logo-svg":"node scripts/proof-pp-logo-svg.mjs","proof:readme-runs":"node scripts/proof-readme-runs.mjs","proof:scene-rests":"node scripts/proof-scene-rests.mjs","proof:typing-dots":"node scripts/proof-typing-dots.mjs","proof:app-is-shell":"node scripts/proof-app-is-shell.mjs","proof:demo-elevate":"node scripts/proof-demo-elevate.mjs","proof:deps-current":"node scripts/proof-deps-current.mjs","proof:dock-elision":"node scripts/proof-dock-elision.mjs","proof:dock-grammar":"node scripts/proof-dock-grammar.mjs","proof:dogfood-hero":"node scripts/proof-dogfood-hero.mjs","proof:drag-gesture":"node scripts/proof-drag-gesture.mjs","proof:epf1-measure":"node scripts/proof-epf1-measure.mjs","proof:grammar-fuzz":"node scripts/proof-grammar-fuzz.mjs && vitest run test/compile/grammar-fuzz.test.ts","proof:live-session":"node scripts/proof-live-session.mjs","proof:owner-golden":"node scripts/proof-owner-golden.mjs","proof:record-truth":"node scripts/proof-record-truth.mjs","proof:scene-parity":"node scripts/proof-scene-parity.mjs","proof:subject-full":"node scripts/proof-subject-full.mjs","proof:taste-packet":"node scripts/proof-taste-packet.mjs","proof:vt-roundtrip":"node scripts/proof-vt-roundtrip.mjs","proof:wave-charter":"node scripts/proof-wave-charter.mjs","proof:accent-census":"node scripts/proof-accent-census.mjs","proof:agent-surface":"node scripts/proof-agent-surface.mjs","proof:alias-dropped":"node scripts/proof-alias-dropped.mjs","proof:decomposition":"node scripts/proof-decomposition.mjs","proof:drawer-spring":"node scripts/proof-drawer-spring.mjs","proof:hygiene-chain":"npm run proof:publish && npm run proof:record-truth && npm run proof:deps-current && npm run proof:repin-witness && npm run proof:boundary && npm run proof:consume-bundle && npm run proof:css-parity && npm run proof:packrat-sound && npm run proof:workaround-deletion && npm run proof:glass-ui-gap-tripwire && npm run proof:no-hand-rolled-labeled-select && npm run proof:transport-action-order && npm run proof:scene-facility && npm run proof:dogfood && npm run proof:engine && npm run proof:decomposition && npm run proof:zone-cohesion && npm run proof:compile-backward-leg && npm run proof:no-flat-siblings && npm run proof:no-orphan-module && npm run proof:no-deprecated-guard && npm run proof:single-writer && npm run proof:composable-encapsulation && npm run proof:scene-colocated && npm run proof:app-is-shell && npm run proof:shared-has-n-consumers && npm run proof:colocation && npm run proof:style-file-ceiling && npm run proof:no-brittle-selector && npm run proof:no-dup-utility && npm run proof:no-single-option-select && npm run proof:dock-grammar && npm run proof:dock-elision && npm run proof:dock-single-tooltip && npm run proof:transport-play-first-render && npm run proof:settle-is-predicate && npm run proof:demo-smoke && npm run proof:occlusion && npm run proof:cartoon-is-panel-depth && npm run proof:glass-and-cartoon && npm run proof:dock-popover-opens && npm run proof:single-toggle && npm run proof:darkmode-row-toggle && npm run proof:idle-fade && npm run proof:single-column-pack && npm run proof:label-subgrid && npm run proof:timeline-rail-width && npm run proof:demo-shell-grid && npm run proof:layout-cluster && npm run proof:stage-not-clipped && npm run proof:cartoon-shadow-unclipped && npm run proof:scene-machine-irrefragable && npm run proof:scene-superkey-single-source && npm run proof:scene-control-dfa && npm run proof:dfa-derived && npm run proof:no-shadow-playback-authority && npm run proof:one-adapter && npm run proof:scene-transition-perf && npm run proof:drawer-spring && npm run proof:panel-naked-rail && npm run proof:idioms && npm run proof:phi-leaf-zero && npm run proof:icon-idiom && npm run proof:styling-idioms && npm run proof:scene-parity && npm run proof:sequence-rows-draggable && npm run proof:crayon-preserved && npm run proof:typing-dots && npm run proof:dogfood-hero && npm run proof:scene-uses-standard-ribbon && npm run proof:scene-card-rounded && npm run proof:stage-glass-card && npm run proof:card-rounded-primitive && npm run proof:stage-within-docks && npm run proof:mobile-single-page && npm run proof:pp-logo-svg && npm run proof:scene-perf-budget && npm run proof:no-hand-rolled-cursor-tracker && npm run proof:brittleness && npm run proof:demo-elevate && npm run proof:modern-web && npm run proof:platform-adopt && npm run proof:demo-usability && npm run proof:computed-real-dom && npm run proof:lighthouse-a11y && npm run proof:lighthouse-mobile && npm run proof:published-surface && npm run proof:alias-dropped && npm run proof:changelog && npm run proof:agent-surface && npm run proof:in-is-importable && npm run proof:agent-validate && npm run proof:demo-on-published-surface && npm run proof:readme-runs && npm run proof:readme-paths-live && npm run proof:manifest-sourced && npm run proof:bench-runs && npm run proof:bench-taxonomy && npm run proof:epf1-measure && npm run proof:taste-packet && npm run proof:no-foreign-symbol-stamp && npm run proof:portable-perf && npm run proof:lint-clean && npm run proof:no-silent-fallback && npm run proof:drag2d-light-certified && npm run proof:wave-charter && npm run proof:pin-ledger-current && npm run proof:no-cross-realm-cast && npm run proof:glassui-aria-ask && npm run proof:no-dead-dependency && npm run proof:kf-differential && npm run proof:owner-verdict-recorded && npm run proof:owner-review-gate && npm run proof:gate-authority && npm run proof:prompt-recap-u && npm run proof:engine-subpath-mirror && npm run proof:no-any-default && npm run proof:dts-rollups-agree && npm run proof:no-dead-export && npm run proof:any-ceiling      && vitest run --project=library && vitest run --project=demo","proof:ingest-replay":"node scripts/proof-ingest-replay.mjs && vitest run test/ingest/ingest.test.ts","proof:label-subgrid":"node scripts/proof-label-subgrid.mjs","proof:orchestration":"node scripts/proof-orchestration.mjs","proof:packrat-sound":"node scripts/proof-packrat-sound.mjs","proof:perf-counters":"node scripts/proof-perf-counters.mjs","proof:phi-leaf-zero":"node scripts/proof-phi-leaf-zero.mjs","proof:portable-perf":"node scripts/proof-portable-perf.mjs","proof:repin-witness":"node scripts/proof-repin-witness.mjs","proof:single-toggle":"node scripts/proof-single-toggle.mjs","proof:single-writer":"node scripts/proof-single-writer.mjs","proof:square-honest":"node scripts/proof-square-honest.mjs","proof:stage-visible":"node scripts/proof-stage-visible.mjs","proof:zone-cohesion":"node scripts/proof-zone-cohesion.mjs","bench:color-fidelity":"vitest run test/engine/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","proof:adopt-compiled":"node scripts/proof-adopt-compiled.mjs && vitest run test/ingest/adopt-compiled.test.ts","proof:agent-validate":"node scripts/proof-agent-validate.mjs && vitest run test/compile/agent-validate.test.ts","proof:bench-taxonomy":"node scripts/proof-bench-taxonomy.mjs","proof:color-fidelity":"node scripts/proof-color-fidelity.mjs && vitest run test/engine/color-fidelity.test.ts","proof:compile-replay":"node scripts/proof-compile-replay.mjs && vitest run test/compile/compile-roundtrip.test.ts","proof:consume-bundle":"node scripts/proof-consume-bundle.mjs","proof:demo-usability":"node scripts/proof-demo-usability.mjs","proof:easing-gallery":"node scripts/proof-easing-gallery.mjs","proof:gate-authority":"node scripts/proof-gate-authority.mjs","proof:hero-two-focal":"node scripts/proof-hero-two-focal.mjs","proof:layout-cluster":"node scripts/proof-layout-cluster.mjs","proof:no-any-default":"node scripts/proof-no-any-default.mjs","proof:no-dead-export":"node scripts/proof-no-dead-export.mjs","proof:no-dup-utility":"node scripts/proof-no-dup-utility.mjs","proof:observed-chain":"npm run proof:compile-browser-parse && npm run proof:split-a11y && npm run proof:vt-roundtrip && npm run proof:entry-roundtrip && npm run proof:trigger-roundtrip && npm run proof:cube-silhouette && npm run proof:cube-settle && npm run proof:cube-relight-writes && npm run proof:stage-visible && npm run proof:hero-two-focal && npm run proof:hero-deck-voice && npm run proof:cursor-light-subtle","proof:peer-satisfied":"node scripts/proof-peer-satisfied.mjs","proof:platform-adopt":"node scripts/proof-platform-adopt.mjs && vitest run test/ingest/platform-adopt.test.ts","proof:prompt-recap-u":"node scripts/proof-prompt-recap-u.mjs","proof:scene-facility":"node scripts/proof-scene-facility.mjs","proof:spring-heatmap":"node scripts/proof-spring-heatmap.mjs","proof:styling-idioms":"node scripts/proof-styling-idioms.mjs","proof:cube-silhouette":"node scripts/proof-cube-silhouette.mjs","proof:demo-shell-grid":"node scripts/proof-demo-shell-grid.mjs","proof:dock-rest-crisp":"node scripts/proof-dock-rest-crisp.mjs","proof:entry-roundtrip":"node scripts/proof-entry-roundtrip.mjs","proof:hero-deck-voice":"node scripts/proof-hero-deck-voice.mjs","proof:icon-paint-live":"node scripts/proof-icon-paint-live.mjs","proof:kf-differential":"node scripts/proof-kf-differential.mjs","proof:lighthouse-a11y":"node scripts/lighthouse-gate.mjs","proof:replay-equality":"node scripts/proof-replay-equality.mjs && vitest run test/engine/replay-equality.test.ts","proof:scene-colocated":"node scripts/proof-scene-colocated.mjs","proof:stage-inventory":"node scripts/proof-stage-inventory.mjs","proof:subject-legible":"node scripts/proof-subject-legible.mjs","proof:crayon-preserved":"node scripts/proof-crayon-preserved.mjs","proof:demo-correctness":"npm run proof:engine-no-throw-on-play && npm run proof:subject-animates && npm run proof:cold-entry && npm run proof:fsm-suspend-resume-live && npm run proof:easing-editor-live && npm run proof:easing-gallery && npm run proof:amiga-subject-is-pivot && npm run proof:drag-gesture && npm run proof:control-surface-single-writer && npm run proof:sheet-reopen-scroll && npm run proof:perf-frame-budget && npm run proof:icon-paint-live && npm run proof:specular-absent-at-rest && npm run proof:demo-fonts && npm run proof:font-census && npm run proof:live-session && npm run proof:live-session-mobile && npm run proof:appearance-suffusion && npm run proof:accent-census && npm run proof:spring-slider-continuous && npm run proof:spring-heatmap && npm run proof:amiga-decay-visible && npm run proof:square-honest && npm run proof:perf-counters && npm run proof:scene-rests && npm run proof:no-layout-animation","proof:glassui-aria-ask":"node scripts/proof-glassui-aria-ask.mjs","proof:in-is-importable":"node scripts/proof-in-is-importable.mjs","proof:interp-fastprops":"node --allow-natives-syntax scripts/proof-interp-fastprops.mjs && vitest run test/engine/interp-fastprops.test.ts","proof:manifest-sourced":"node scripts/proof-manifest-sourced.mjs","proof:no-flat-siblings":"node scripts/proof-no-flat-siblings.mjs","proof:no-orphan-module":"node scripts/proof-no-orphan-module.mjs","proof:orbital-rotate3d":"node scripts/proof-orbital-rotate3d.mjs && vitest run test/demo/scenes/orbital-rotate3d.test.ts","proof:panel-naked-rail":"node scripts/proof-panel-naked-rail.mjs","proof:roundtrip-easing":"vitest run test/compile/roundtrip-easing.test.ts","proof:scroll-roundtrip":"node scripts/proof-scroll-roundtrip.mjs && vitest run test/scroll/scroll-scene.test.ts","proof:stage-glass-card":"node scripts/proof-stage-glass-card.mjs","proof:subject-animates":"node scripts/proof-subject-animates.mjs","proof:transport-events":"node scripts/proof-transport-events.mjs","proof:computed-real-dom":"node scripts/proof-computed-real-dom.mjs","proof:dts-rollups-agree":"node scripts/proof-dts-rollups-agree.mjs","proof:glass-and-cartoon":"node scripts/proof-glass-and-cartoon.mjs","proof:lighthouse-mobile":"node scripts/proof-lighthouse-mobile.mjs","proof:owner-review-gate":"node scripts/proof-owner-review-gate.mjs","proof:perf-frame-budget":"node scripts/proof-perf-frame-budget.mjs","proof:published-surface":"node scripts/proof-published-surface.mjs","proof:readme-paths-live":"node scripts/proof-readme-paths-live.mjs","proof:scene-control-dfa":"node scripts/proof-scene-control-dfa.mjs && vitest run test/demo/state/control-surface-dfa.test.ts","proof:scene-perf-budget":"node scripts/proof-scene-perf-budget.mjs && vitest run test/demo/scenes/amiga-sphere-spin.test.ts","proof:stage-not-clipped":"node scripts/proof-stage-not-clipped.mjs","proof:trigger-roundtrip":"node scripts/proof-trigger-roundtrip.mjs","proof:blur-not-resampled":"node scripts/proof-blur-not-resampled.mjs","proof:dock-popover-opens":"node scripts/proof-dock-popover-opens.mjs","proof:easing-editor-live":"node scripts/proof-easing-editor-live.mjs","proof:mobile-single-page":"node scripts/proof-mobile-single-page.mjs","proof:no-dead-dependency":"node scripts/proof-no-dead-dependency.mjs","proof:no-silent-fallback":"node scripts/proof-no-silent-fallback.mjs","proof:pin-ledger-current":"node scripts/proof-pin-ledger-current.mjs","proof:roundtrip-fidelity":"node scripts/proof-roundtrip-fidelity.mjs && vitest run test/compile/roundtrip-fidelity.test.ts","proof:scene-card-rounded":"node scripts/proof-scene-card-rounded.mjs","proof:scheduler-posttask":"node scripts/proof-scheduler-posttask.mjs","proof:single-column-pack":"node scripts/proof-single-column-pack.mjs","proof:stage-within-docks":"node scripts/proof-stage-within-docks.mjs","proof:style-file-ceiling":"node scripts/proof-style-file-ceiling.mjs","proof:amiga-decay-visible":"node scripts/proof-amiga-decay-visible.mjs","proof:composition-honored":"node scripts/proof-composition-honored.mjs && vitest run test/engine/composition-honored.test.ts","proof:cube-relight-writes":"node scripts/proof-cube-relight-writes.mjs","proof:cursor-light-subtle":"node scripts/proof-cursor-light-subtle.mjs","proof:darkmode-row-toggle":"node scripts/proof-darkmode-row-toggle.mjs","proof:diagnostics-channel":"node scripts/proof-diagnostics-channel.mjs && vitest run test/compile/diagnostics-channel.test.ts","proof:dock-single-tooltip":"node scripts/proof-dock-single-tooltip.mjs","proof:library-correctness":"vitest run --project=library && npm run proof:replay-equality && npm run proof:compile-replay && npm run proof:roundtrip-fidelity && npm run proof:roundtrip-easing && npm run proof:sync-step && npm run proof:zero-alloc && npm run proof:nan-frame && npm run proof:grammar-fuzz && npm run proof:interpolate-anything && npm run proof:composition-honored && npm run proof:interp-fastprops && npm run proof:diagnostics-channel && npm run proof:scroll-roundtrip && npm run proof:blend && npm run proof:spring-blend-weight && npm run proof:drawsvg && npm run proof:finished && npm run proof:adopt-compiled && npm run proof:ingest-replay && npm run proof:orbital-rotate3d && npm run proof:orchestration && npm run proof:transport-events && npm run proof:color-fidelity && npm run proof:scheduler-posttask && npm run proof:morph && npm run proof:emerging-css-resolve","proof:live-session-mobile":"node scripts/proof-live-session-mobile.mjs","proof:no-brittle-selector":"node scripts/proof-no-brittle-selector.mjs","proof:no-collision-rename":"node scripts/proof-no-collision-rename.mjs","proof:no-cross-realm-cast":"node scripts/proof-no-cross-realm-cast.mjs","proof:no-deprecated-guard":"node scripts/proof-no-deprecated-guard.mjs","proof:no-layout-animation":"node scripts/proof-no-layout-animation.mjs","proof:settle-is-predicate":"node scripts/proof-settle-is-predicate.mjs","proof:sheet-reopen-scroll":"node scripts/proof-sheet-reopen-scroll.mjs","proof:spring-blend-weight":"node scripts/proof-spring-blend-weight.mjs && vitest run test/group/spring-blend-weight.test.ts","proof:timeline-rail-width":"node scripts/proof-timeline-rail-width.mjs","proof:workaround-deletion":"node scripts/proof-workaround-deletion.mjs","proof:appearance-suffusion":"node scripts/proof-appearance-suffusion.mjs","proof:compile-backward-leg":"node scripts/proof-compile-backward-leg.mjs","proof:emerging-css-resolve":"node scripts/proof-emerging-css-resolve-now.mjs && node scripts/proof-emerging-css-resolve-p2.mjs && node scripts/proof-emerging-css-resolve-fn.mjs && vitest run test/resolve/emerging-css-resolve-now.test.ts test/resolve/emerging-css-resolve-p2.test.ts test/resolve/emerging-css-resolve-fn.test.ts","proof:interpolate-anything":"node scripts/proof-interpolate-anything.mjs && vitest run test/engine/interpolate-anything.test.ts","proof:compile-browser-parse":"node scripts/proof-compile-browser-parse.mjs","proof:dock-morph-continuity":"node scripts/proof-dock-morph-continuity.mjs","proof:engine-subpath-mirror":"node scripts/proof-engine-subpath-mirror.mjs","proof:glass-ui-gap-tripwire":"node scripts/proof-glass-ui-gap-tripwire.mjs","proof:scene-transition-perf":"node scripts/proof-scene-transition-perf.mjs","proof:amiga-subject-is-pivot":"node scripts/proof-amiga-subject-is-pivot.mjs","proof:card-rounded-primitive":"node scripts/proof-card-rounded-primitive.mjs","proof:cartoon-is-panel-depth":"node scripts/proof-cartoon-is-panel-depth.mjs","proof:drag2d-light-certified":"node scripts/proof-drag2d-light-certified.mjs","proof:owner-verdict-recorded":"node scripts/proof-owner-verdict-recorded.mjs","proof:shared-has-n-consumers":"node scripts/proof-shared-has-n-consumers.mjs","proof:transport-action-order":"node scripts/proof-transport-action-order.mjs","proof:engine-no-throw-on-play":"node scripts/proof-engine-no-throw-on-play.mjs","proof:fsm-suspend-resume-live":"node scripts/proof-fsm-suspend-resume-live.mjs","proof:no-foreign-symbol-stamp":"node scripts/proof-no-foreign-symbol-stamp.mjs","proof:no-single-option-select":"node scripts/proof-no-single-option-select.mjs","proof:sequence-rows-draggable":"node scripts/proof-sequence-rows-draggable.mjs","proof:specular-absent-at-rest":"node scripts/proof-specular-absent-at-rest.mjs","proof:cartoon-shadow-unclipped":"node scripts/proof-cartoon-shadow-unclipped.mjs","proof:composable-encapsulation":"node scripts/proof-composable-encapsulation.mjs","proof:spring-slider-continuous":"node scripts/proof-spring-slider-continuous.mjs","proof:demo-on-published-surface":"node scripts/proof-demo-on-published-surface.mjs","proof:no-nested-self-dependency":"node scripts/proof-no-nested-self-dependency.mjs","proof:scene-machine-irrefragable":"node scripts/proof-scene-machine-irrefragable.mjs","proof:scene-uses-standard-ribbon":"node scripts/proof-scene-uses-standard-ribbon.mjs","proof:transport-play-first-render":"node scripts/proof-transport-play-first-render.mjs","proof:no-shadow-playback-authority":"node scripts/proof-no-shadow-playback-authority.mjs && vitest run test/demo/state/no-shadow-playback-authority.test.ts","proof:scene-superkey-single-source":"node scripts/proof-scene-superkey-single-source.mjs","proof:control-surface-single-writer":"node scripts/proof-control-surface-single-writer.mjs","proof:no-hand-rolled-cursor-tracker":"node scripts/proof-no-hand-rolled-cursor-tracker.mjs","proof:no-hand-rolled-labeled-select":"node scripts/proof-no-hand-rolled-labeled-select.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.16.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@mkbabb/value.js":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","gl-matrix":"^3.4.4","fast-check":"^4.8.0","pixelmatch":"^7.2.0","typescript":"^6.0.3","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^22.20.0","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^18.0.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.3.3_1784130276565_0.7239090106556603","host":"s3://npm-registry-packages-npm-production"}},"5.3.4":{"name":"@mkbabb/keyframes.js","version":"5.3.4","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.3.4","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"efea64198fd5e6ca0e4a6fcf1a5db32aa2282cb0","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.3.4.tgz","fileCount":10,"integrity":"sha512-6A6nh59XXfindvKZSmWqzyRuFRx5fkNUPWN2/RgBMbCZL5lALyh2FmXqxjenB1y4oM5NzexmfTFfX01aGdAAiw==","signatures":[{"sig":"MEUCID/oS0iddrNXdiHXKo88Gu2i5Ds/sGMzIFtvayCKeq2nAiEAzXtUc/uNmSb/J8J8HV1Cq3Pc1DdYnIl5mymnH/cIV4M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@5.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":609000},"type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","default":"./dist/engine/index.js"}},"gitHead":"c80ad0bfafd0691daf0477b74d74333e069846cd","scripts":{"dev":"vite","lint":"depcruise src","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","build:watch":"vite build --watch --mode production","proof:publish":"node scripts/gates/surface/index.mjs","audit:lighthouse":"node scripts/observe/lighthouse.mjs","demo:correctness":"node scripts/run-demo-roster.mjs","gen:agent-surface":"node scripts/gen-agent-surface.mjs","release:changelog":"node scripts/release/changelog.mjs","proof:owner-golden":"node scripts/gates/visual/index.mjs","bench:color-fidelity":"vitest run test/engine/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.16.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@mkbabb/value.js":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","gl-matrix":"^3.4.4","fast-check":"^4.8.0","pixelmatch":"^7.2.0","typescript":"^6.0.3","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^22.20.0","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^18.0.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.3.4_1784139491308_0.13232176772928805","host":"s3://npm-registry-packages-npm-production"}},"5.3.5":{"name":"@mkbabb/keyframes.js","version":"5.3.5","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","_id":"@mkbabb/keyframes.js@5.3.5","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"homepage":"https://github.com/mkbabb/keyframes.js#readme","bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"dist":{"shasum":"764e956831bbf23725ebab87779f4c0b79254681","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-5.3.5.tgz","fileCount":10,"integrity":"sha512-wpOSrxruyccxk5N5KJ3gctSKFrOro6lCgrswFRwubv+sj/xDYpoe7sNwkvrajgsMT16BWbaUItUgt8dLn7mdpQ==","signatures":[{"sig":"MEUCIG89vVfTzIZcF31EotibDjYBRCi/IwNk7+TwZnyRKNn8AiEAgTrII7v98lyNT/MLB1Ufb6ptQZi2IgOzciWojuV+dC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@5.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":609000},"type":"module","types":"./dist/keyframes.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/keyframes.d.ts","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","default":"./dist/engine/index.js"}},"gitHead":"a59d3a22da080a8ed224e8d675112bb3bb0135b0","scripts":{"dev":"vite","lint":"depcruise src","test":"vitest","bench":"vitest bench","build":"npm run build:lib","check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","prepare":"npm run build:lib","gh-pages":"vite build --mode gh-pages","build:lib":"vite build --mode production","check:lib":"tsc --noEmit -p tsconfig.lib.json","build:watch":"vite build --watch --mode production","proof:publish":"node scripts/gates/surface/index.mjs","audit:lighthouse":"node scripts/observe/lighthouse.mjs","demo:correctness":"node scripts/run-demo-roster.mjs","gen:agent-surface":"node scripts/gen-agent-surface.mjs","release:changelog":"node scripts/release/changelog.mjs","proof:owner-golden":"node scripts/gates/visual/index.mjs","bench:color-fidelity":"vitest run test/engine/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs"},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"repository":{"url":"git+https://github.com/mkbabb/keyframes.js.git","type":"git"},"_npmVersion":"11.16.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@mkbabb/value.js":"^3.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.35","clsx":"^2.1.1","vite":"^8.0.16","yaml":"^2.9.0","jsdom":"^29.1.1","pngjs":"^7.0.0","three":"^0.184.0","vitest":"^4.1.8","reka-ui":"^2.9.9","prettier":"^3.8.3","rolldown":"^1.0.0","gl-matrix":"^3.4.4","fast-check":"^4.8.0","pixelmatch":"^7.2.0","typescript":"^6.0.3","vue-router":"^5.1.0","vue-sonner":"^2.0.9","@lucide/vue":"^1.17.0","@types/node":"^22.20.0","html2canvas":"^1.4.1","tailwindcss":"^4.3.0","@iconify/vue":"^5.0.1","@types/three":"^0.184.1","@vueuse/core":"^14.3.0","highlight.js":"^11.11.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","@vitejs/plugin-vue":"^6.0.7","dependency-cruiser":"^18.0.0","@tailwindcss/postcss":"^4.3.0","prettier-plugin-merge":"^0.10.1","@microsoft/api-extractor":"^7.58.7","class-variance-authority":"^0.7.1","@iconify-json/radix-icons":"^1.2.6","prettier-plugin-classnames":"^0.10.2","prettier-plugin-tailwindcss":"^0.8.0","prettier-plugin-organize-imports":"^4.3.0"},"optionalDependencies":{"@mkbabb/glass-ui":"6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/keyframes.js_5.3.5_1784151955405_0.06408216981401194","host":"s3://npm-registry-packages-npm-production"}},"6.0.0":{"name":"@mkbabb/keyframes.js","version":"6.0.0","description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","license":"MIT","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"type":"module","sideEffects":false,"types":"./dist/keyframes.d.ts","exports":{".":{"types":"./dist/keyframes.d.ts","default":"./dist/keyframes.js"},"./engine":{"types":"./dist/engine/index.d.ts","default":"./dist/engine/index.js"}},"scripts":{"prepare":"npm run build:lib","check":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","check:lib":"tsc --noEmit -p tsconfig.lib.json","dev":"vite","build":"npm run build:lib","build:lib":"vite build --mode production","build:watch":"vite build --watch --mode production","gh-pages":"vite build --mode gh-pages","lint":"depcruise src","test":"vitest","test:lib":"vitest run --project library","bench":"vitest bench","bench:color-fidelity":"vitest run test/engine/color-fidelity.test.ts && node scripts/color-fidelity-harness.mjs","gen:agent-surface":"node scripts/gen-agent-surface.mjs","proof:publish":"node scripts/gates/surface/index.mjs","proof:owner-golden":"node scripts/gates/visual/index.mjs","demo:correctness":"node scripts/run-demo-roster.mjs","audit:lighthouse":"node scripts/observe/lighthouse.mjs","release:changelog":"node scripts/release/changelog.mjs"},"repository":{"type":"git","url":"git+https://github.com/mkbabb/keyframes.js.git"},"author":{"name":"Mike Babb","email":"mike@babb.dev"},"engines":{"node":">=22"},"bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"homepage":"https://github.com/mkbabb/keyframes.js#readme","dependencies":{"@mkbabb/value.js":"4.0.0"},"devDependencies":{"@iconify-json/radix-icons":"^1.2.6","@iconify/vue":"^5.0.1","@lucide/vue":"^1.17.0","@microsoft/api-extractor":"^7.58.7","@tailwindcss/postcss":"^4.3.0","@types/node":"^22.20.0","@types/three":"^0.184.1","@vitejs/plugin-vue":"^6.0.7","@vueuse/core":"^14.3.0","class-variance-authority":"^0.7.1","clsx":"^2.1.1","dependency-cruiser":"^18.0.0","fast-check":"^4.8.0","gl-matrix":"^3.4.4","highlight.js":"^11.11.1","html2canvas":"^1.4.1","jsdom":"^29.1.1","monaco-editor":"^0.55.1","monaco-themes":"^0.4.8","pixelmatch":"^7.2.0","pngjs":"^7.0.0","prettier":"^3.8.3","prettier-plugin-classnames":"^0.10.2","prettier-plugin-merge":"^0.10.1","prettier-plugin-organize-imports":"^4.3.0","prettier-plugin-tailwindcss":"^0.8.0","reka-ui":"^2.9.9","rolldown":"^1.0.0","tailwind-merge":"^3.6.0","tailwindcss":"^4.3.0","three":"^0.184.0","tw-animate-css":"^1.4.0","typescript":"^6.0.3","vite":"^8.0.16","vite-plugin-dts":"^5.0.2","vite-svg-loader":"^5.1.0","vitest":"^4.1.8","vue":"^3.5.35","vue-router":"^5.1.0","vue-sonner":"^2.0.9","yaml":"^2.9.0"},"gitHead":"5a9183a7afe24702081a7b87c8adc7286ddce9a0","_id":"@mkbabb/keyframes.js@6.0.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-mpb3gSxU8UgO4HBBG2he6CFNCq7tW+k9id82DgAjeeDdeAmtEzmZ2/kuK3j5AbUZRULcN1QNkNJychNk49bT4Q==","shasum":"5cc5fdecb886f4df33371d3358239594a8965b6b","tarball":"https://registry.npmjs.org/@mkbabb/keyframes.js/-/keyframes.js-6.0.0.tgz","fileCount":10,"unpackedSize":599202,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mkbabb%2fkeyframes.js@6.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCEVuUANS0g2ACFnMP47ZXeDJIJw2aGDxloInQaNs/CKwIgeiKngmygrbVNrghWVmQuER4ISoyur9u8ii10uyhIksw="}]},"_npmUser":{"name":"mkbabb","email":"mike7400@gmail.com"},"directories":{},"maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/keyframes.js_6.0.0_1784206318527_0.6038931980634044"},"_hasShrinkwrap":false}},"time":{"created":"2024-07-18T03:31:02.672Z","modified":"2026-07-16T12:51:59.068Z","0.9.97":"2024-07-18T03:31:03.039Z","1.0.0":"2026-02-25T16:43:47.878Z","1.0.1":"2026-02-25T16:49:55.219Z","1.1.0":"2026-02-27T03:37:47.841Z","1.1.5":"2026-03-09T05:15:28.783Z","1.1.6":"2026-03-09T05:18:41.511Z","1.2.0":"2026-03-10T17:59:27.287Z","1.2.1":"2026-04-04T02:46:45.560Z","2.1.1":"2026-05-28T15:04:16.075Z","2.2.0":"2026-06-02T05:09:14.009Z","3.0.0":"2026-06-03T22:12:53.684Z","4.0.0":"2026-06-07T00:44:30.145Z","4.1.0":"2026-06-07T17:19:23.138Z","4.2.0":"2026-06-11T21:24:49.595Z","4.3.0":"2026-06-16T18:54:24.893Z","4.4.0":"2026-06-23T05:42:02.467Z","5.0.0":"2026-06-24T05:55:29.171Z","5.1.0":"2026-06-25T02:33:40.651Z","5.2.0":"2026-07-09T22:28:23.999Z","5.3.0":"2026-07-15T15:03:19.171Z","5.3.1":"2026-07-15T15:15:09.950Z","5.3.2":"2026-07-15T15:33:35.194Z","5.3.3":"2026-07-15T15:44:36.766Z","5.3.4":"2026-07-15T18:18:11.584Z","5.3.5":"2026-07-15T21:45:55.562Z","6.0.0":"2026-07-16T12:51:58.673Z"},"bugs":{"url":"https://github.com/mkbabb/keyframes.js/issues"},"author":{"name":"Mike Babb","email":"mike@babb.dev"},"license":"MIT","homepage":"https://github.com/mkbabb/keyframes.js#readme","keywords":["keyframes","keyframes-library","animation","css","css-animations","typescript","web","browser","parsing"],"repository":{"type":"git","url":"git+https://github.com/mkbabb/keyframes.js.git"},"description":"Create keyframe animations for anything in JavaScript; specify your keyframes in standards-complaint CSS.","maintainers":[{"name":"mkbabb","email":"mike7400@gmail.com"}],"readme":"# keyframes.js ![image](./assets/cube.png)\n\nCSS keyframe animations for anything in JavaScript. Specify your keyframes in standards-compliant CSS; animate any object, DOM element, or data structure. General-purpose interpolation primitives — smoothing, morphing, scroll-driven timelines — ship alongside.\n\n[Try the demo here!](https://keyframes.babb.dev/)\n\n## Quick Start\n\nCreate a `CSSKeyframesAnimation`, feed it CSS `@keyframes`, add targets, play. The engine class is a static, synchronous import from the `@mkbabb/keyframes.js/engine` subpath (it carries Value's CSS parser and color/value capabilities; the light `.` barrel shares only Value's small `/math` leaf):\n\n```ts run\nimport { CSSKeyframesAnimation } from \"@mkbabb/keyframes.js/engine\";\n\nconst anim = new CSSKeyframesAnimation({\n    duration: 2000,\n    iterationCount: Infinity,\n    direction: \"alternate\",\n    fillMode: \"forwards\",\n});\n\nanim.fromString(`\n    @keyframes mijn-keyframes {\n        from { transform: translateX(-100%); background-color: #C462D8; }\n        to   { transform: translateX(50%);  background-color: #E85252; }\n    }\n`);\nanim.setTargets(document.getElementById(\"myElement\"));\nanim.play();\n```\n\nThis animates the element's style properties as specified in the keyframes. The default behavior, but you can get far more inventive with it.\n\nThe [demo apps](demo/) exercise this pattern end-to-end — [try them live](https://keyframes.babb.dev/).\n\n## Installation\n\n```bash\nnpm install @mkbabb/keyframes.js\n```\n\nWorks both in and out of the browser. Anything that touches the DOM (`getComputedStyle`, `document`, etc.) won't work in Node.\n\n## Project Structure\n\n```\nsrc/animation/   # THE library — engine + every primitive\ndemo/            # Vue 3 demo apps\ntest/            # Vitest suites (jsdom)\nbench/           # Vitest benchmarks\nscripts/         # package/demo checks + code generators\ndocs/            # Migration guide, published surface manifest, architecture notes\n```\n\nEach library zone documents its contract at its owning barrel; the published\nsurface and package manifests are the authorities for exports and build shape.\n\n## Animation\n\nThe `KeyframesAnimation` object drives `CSSKeyframesAnimation` and `AnimationGroup`. It's composed of:\n\n- **options** (`AnimationOptions`)\n- **transform function**: interpolates between keyframes\n- **timing function**: eases the animation\n- **keyframes** (`TemplateAnimationFrame`)\n\n### `AnimationOptions`\n\n- `duration`: time in milliseconds (default: 1000)\n- `delay`: time in milliseconds before the animation begins (default: 0)\n- `iterationCount`: number of repetitions (default: 1)\n- `direction`: `normal`, `reverse`, `alternate`, `alternate-reverse`\n- `fillMode`: `none`, `forwards`, `backwards`, `both`\n- `timingFunction`: easing function (default: `easeInOutCubic`)\n- `colorSpace`: color interpolation space (default: `oklab`)\n- `hueMethod`: hue interpolation method for cylindrical color spaces (optional)\n- `useWAAPI`: delegate to Web Animations API when eligible (default: `true`)\n\nValidation is fail-explicit: a malformed option — a negative `duration`, an unknown `direction` — throws a typed `AnimationOptionError` naming the option and the offending value.\n\n### The transform function\n\n```ts\ntype TransformFunction<V extends Vars> = (v: V, t: number) => void;\n```\n\nCalled at each timestep `t` (0 to `duration`) with the interpolated variables `v`. The variables arrive in the same shape you specified in your keyframes—deeply nested objects included.\n\nEvery declaration is parsed into a structural `CssValue` tree. Numeric scalar leaves retain their CSS unit (`px`, `em`, `deg`, etc.); compatible units share a numeric interpolation slot, computed lengths resolve against the bound browser target, and incompatible kinds fail explicitly.\n\n### The timing function\n\n```ts\ntype TimingFunction = (t: number) => number;\n```\n\nTakes `t` in `[0, 1]`, returns `[0, 1]`. All CSS timing functions are implemented in `easing.ts`.\n\n#### Step functions\n\nImplemented as `steppedEase(t, steps, jumpTerm)`:\n\n- `jump-none`: the value is held until the end of the step\n- `jump-start` / `start`: step occurs at the start\n- `jump-end` / `end`: step occurs at the end\n- `jump-both` / `both`: steps at both boundaries\n\n#### Bezier curves\n\n`cubicBezier(t, x1, y1, x2, y2)` implements the cubic case. The general case uses de Casteljau's algorithm iteratively.\n\nFor Bezier visualizations, see [this Desmos graph](https://www.desmos.com/calculator/tvivnkflzv).\n\n### `TemplateAnimationFrame`\n\nA template keyframe prior to resolution. Composed of:\n\n- `id`: auto-incremented identifier\n- `start`: start time (CSS time string, number, or percentage)\n- `vars`: the variables to interpolate\n- `transform`: per-keyframe transform function (optional)\n- `timingFunction`: per-keyframe timing function (optional)\n\nOnce a transform or timing function is specified, it propagates to all subsequent keyframes. Keyframes needn't declare the same variables — the resolver walks backward from each keyframe to fill gaps.\n\n### The dynamic engine — `loadAnimationEngine()`\n\nThe package splits along a static/dynamic boundary (see [tree-shaking](#baseline-tree-shaking--reduced-motion)). The classes above — `KeyframesAnimation`, `CSSKeyframesAnimation`, `AnimationGroup` — are the **heavy** tier: they carry the CSS parser and `@mkbabb/value.js`, and their runtime constructors are reached **only** through `loadAnimationEngine()`, one awaited dynamic import:\n\n```ts run\nimport { loadAnimationEngine } from \"@mkbabb/keyframes.js\";\n\n// ONE await loads the CSS engine (and value.js with it); repeat calls\n// resolve from the module cache. Light-only consumers never pay this.\nconst { CSSKeyframesAnimation, presets } = await loadAnimationEngine();\n\nconst anim = presets.fadeIn({ duration: 200 });\nanim.setTargets(element);\nawait anim.play();\n```\n\nThe engine surface (`AnimationEngine`): `KeyframesAnimation`, `CSSKeyframesAnimation`, `AnimationGroup`, `getAnimationId`, `resolveKeyframes`, `MotionPath`/`fromMotionPath`, `DrawSVG`/`fromDrawSVG`, `MorphSVG`/`fromMorphSVG`, `presets`, and the option constants `DIRECTIONS`, `FILL_MODES`, `defaultOptions`, `defaultLayerConfig`. The **type** surface stays on the static barrel — `import type { KeyframesAnimation } from \"@mkbabb/keyframes.js\"` costs no runtime edge.\n\n### `MotionPath`\n\nCSS-native path motion: sweep `offset-distance` from → to over an author `offset-path`. The browser owns the geometry — keyframes interpolates one scalar — so the sweep is WAAPI-eligible and runs on the compositor thread where possible.\n\n```ts run\nconst { fromMotionPath, MotionPath } = await loadAnimationEngine();\n\nconst along = fromMotionPath(box, {\n    path: \"path('M 0 0 Q 100 -100 200 0')\",\n    rotate: \"auto\", // offset-rotate — face along the path\n    duration: 200,\n    autoPlay: false,\n});\nawait along.play();\n\nnew MotionPath(card, { path: \"path('M 0 0 H 200')\", autoPlay: false }); // class form\n```\n\nOptions: `path` (required — any `offset-path` value: `path()`, `ray()`, `url(#id)`, a basic shape), `from` (default `\"0%\"`), `to` (default `\"100%\"`), `rotate` (a static `offset-rotate`), `autoPlay`, plus every `AnimationOptions` key.\n\n### `DrawSVG`\n\nCSS-native SVG line drawing: ONE `getTotalLength()` read sets `stroke-dasharray` to the path length; the animation sweeps `stroke-dashoffset` `L → 0`, so the stroke draws in. A bare `<length>` — WAAPI-eligible, the simplest compositor-thread shape.\n\n```ts run\nconst { fromDrawSVG, DrawSVG } = await loadAnimationEngine();\n\nconst draw = fromDrawSVG(pathEl, { duration: 200, autoPlay: false });\nawait draw.play();\n\n// Erase instead — sweep 100% → 0% (percent strings, or 0..1 fractions):\nfromDrawSVG(pathEl, { from: \"100%\", to: \"0%\", autoPlay: false });\nnew DrawSVG(pathEl, { autoPlay: false }); // class form; `.finished` resolves on completion\n```\n\nOptions: `from`/`to` (`\"0%\"`–`\"100%\"` strings or `0`–`1` numbers; default draw-in `0% → 100%`), `autoPlay`, plus every `AnimationOptions` key. The target must be SVG geometry (`<path>`, `<line>`, `<circle>`, …) exposing `getTotalLength()`.\n\n### `MorphSVG`\n\nPath-shape morphing — interpolate one SVG path `d` into another. value.js's `PathGeometry` owns the geometry (arc-length sampling via `getTotalLength()`/`getPointAtLength()`); keyframes samples both paths at `samples` uniform points and lerps the matched point sets, so the engine's native numeric interpolation _is_ the morph (a true blend — the midpoint is distinct from both endpoints, not a cross-fade).\n\n```ts run\nconst { fromMorphSVG, MorphSVG } = await loadAnimationEngine();\n\n// Morph a triangle into a square over 600ms:\nconst morph = new MorphSVG(\"M0,0 L10,0 L5,10 Z\", \"M0,0 L10,0 L10,10 L0,10 Z\", {\n    samples: 64,\n    duration: 600,\n});\nconst dAtMid = morph.sampleD(0.5); // the interpolated `d` at t = 0.5\n```\n\nOptions: `samples` (point count per path; default `64`), plus every `AnimationOptions` key. Both inputs must be non-degenerate path `d` strings (non-zero arc length, ≥ 2 samples) — a degenerate input refuses with a typed `AnimationOptionError`. `MorphSVG.sampleD(t)` reassembles the morphed `d` at any `t`; the per-point coordinates also surface as `--morph-{i}-x`/`--morph-{i}-y` custom properties for direct CSS binding.\n\n### The emerging-CSS resolver\n\nkf's parser accepts CSS the platform can't animate yet. The `resolve/` zone lowers `if(supports(...))` / `if(media(...))` / `if(style(--custom-prop))` and `@function` calls to concrete values **in JS, at parse/bind time** — so a `@keyframes` block authored against tomorrow's conditional grammar plays correctly **today, in every browser kf runs in**, even though the native CSS features themselves are Chromium-only (`if()` shipped Chrome 137; `@function`, Chrome 139 — neither ships in Firefox or Safari). `env()` sits outside this: it's ordinary CSS the platform has resolved for years, so there's no cross-browser gap for kf to bridge there.\n\nThis is a **resolve-once, not react-forever** lowering, not a live binding. The element-independent forms (`if(supports)`, `if(media)`, `@function`) resolve once when the keyframes parse; the element-aware forms (`if(style(--p))`, `sibling-index()`, `sibling-count()`) resolve once per `setTargets()`. None of them re-evaluate on a later media-query flip or custom-property write — rebuild the animation to re-resolve.\n\n```ts run\nconst { resolveKeyframes } = await loadAnimationEngine();\n\n// Author against a condition the browser can't natively evaluate in if() yet —\n// kf resolves it in JS and bakes the concrete branch into the parsed frame.\n// Off-DOM (no CSS.supports), the SSR-safe default deterministically picks `else`:\nconst { keyframes } = resolveKeyframes(`\n    @keyframes x {\n        0%   { color: if(supports(color: lch(0 0 0)): red; else: blue) }\n        100% { color: green }\n    }\n`);\nconst resolvedColor = keyframes.get(\"0%\")?.color;\nresolvedColor?.kind; // => \"scalar\"\nconst channels = resolvedColor?.kind === \"scalar\" && resolvedColor.payload.type === \"color\"\n    ? resolvedColor.payload.value.channels\n    : [];\nchannels; // => [0, 0, 255]\n```\n\n**What it refuses.** A condition that resolves to nothing is a CSS _guaranteed-invalid value_ — `if()` with no matching branch and no `else`, or an over-deep/self-referential `@function` chain (cycle-guarded at depth 32) — **drops the declaration** (the prior/initial value wins), never an empty or malformed string. A `@function` call whose argument can't be coerced to the parameter's declared syntax drops the whole call too, surfaced as a named `CUSTOM_FN_ARG_DROP` diagnostic on `resolveKeyframes`'s `diagnostics` channel — never a silent `NaN`.\n\nCovered by the three focused Vitest files in `test/resolve/` (the\n`if(supports)`/`if(media)` pass, the element-aware\n`if(style)`/`sibling-index()`/`sibling-count()` pass, and `@function`\ncall-inlining) — all jsdom-clean, behavior-level; no browser required, because\nthe resolution is kf's JS, not a platform feature.\n\n## `CSSKeyframesAnimation`\n\nAn abstraction over `KeyframesAnimation` that parses CSS `@keyframes` into `TemplateAnimationFrame` objects, then adds them to a base `KeyframesAnimation`.\n\nThree ways to create keyframes:\n\n```ts\n// From CSS string (underlying parser is memoized; results cloned per call)\nanim.fromString(`from { opacity: 0; } to { opacity: 1; }`);\n\n// From keyframe map\nanim.fromKeyframes({ \"0%\": { opacity: 0 }, \"100%\": { opacity: 1 } });\n\n// From variable array\nanim.fromVars([{ opacity: 0 }, { opacity: 1 }]);\n```\n\nThe default transform applies interpolated values to `element.style` for each target.\n\n### Parsing CSS keyframes\n\n`keyframes.ts` covers most of the CSS spec:\n\n- `from`, `to`, and percentages\n- Time units (`s`, `ms`)\n- Lengths (`px`, `em`, etc.)\n- Angles (`deg`, `rad`, etc.)\n- Colors (`#fff`, `rgb(255, 255, 255)`, `lab(100, 0, 0)`, `lightblue`, etc.)\n- Transforms (`translateX(100%)`, `rotate(1turn)`, etc.)\n- Variables (`var(--my-var)`)\n- Math expressions (`calc(100% - 10px)`)\n- Any `key: value` pair parseable as a CSS value, function, or list thereof\n\nThe parser consumes [`@mkbabb/value.js/css`](https://github.com/mkbabb/value.js) for CSS grammar and typed parse results. Keyframes does not carry a second parser dependency or consume Value's package root.\n\n### Units\n\nUnit parsing and resolution (length, angle, time, percentage, color, and container-query units) are handled through Value 4's rootless capability entries. Parsed values use immutable structural `CssScalar`, `CssList`, and `CssCall` nodes; parsing returns an explicit result rather than mutable token objects. Computed container units are resolved against the measured layout epoch; consumers that change the containing layout must call `bumpLayoutEpoch()` before sampling again so cached conversions are invalidated.\n\n## `AnimationGroup`\n\nComposites multiple animations with layer blending. Each animation gets a layer config controlling how it merges with others.\n\n```ts\nconst group = anim1.group(anim2, anim3);\ngroup.setTargets(element);\ngroup.play();\n```\n\nThree composition operators:\n\n- **`replace`**: highest `zIndex` wins (default)\n- **`add`**: numeric values accumulate\n- **`accumulate`**: numeric values accumulate across repeated composition\n\nReplacement and composition are orthogonal to the layer's `weight` (0–1). A\nstatic `weight` produces a linear blend; `weightSpring` lets the same scalar be\ndriven by the group's spring-transition API.\n\nManaged children are paused and resumed by the group clock: pause captures the\nlast rAF timestamp, resume clears the managed pause directly (never by calling a\nchild's public `resume()`), and settling releases the child from group ownership.\n\nLayer configuration per animation: `zIndex`, `op`, `weight`, `weightSpring`,\n`enabled`, `properties` (whitelist). Property whitelisting enables effect\nlayering—one layer animates position, another animates opacity.\n\nThe group manages its own `requestAnimationFrame` loop and marks child animations as `managed`.\n\n`AnimationGroup` (parallel children, blended per-frame) and [`Sequence`](#sequence) (children positioned along a master clock) are the production realization of Web Animations Level 2's `GroupEffect`/`SequenceEffect` model — see [`Sequence`](#sequence) for the correspondence table.\n\n## Presets\n\n30+ ready-to-use animations in `src/animation/presets/`. All return `CSSKeyframesAnimation` instances and accept optional `InputAnimationOptions`. Each builds a `CSSKeyframesAnimation` with Value's parser/color graph, so the presets ride the heavy dynamic boundary (the `presets` namespace on `loadAnimationEngine()`) rather than the parser-free static barrel:\n\n```ts\nimport { loadAnimationEngine } from \"@mkbabb/keyframes.js\";\n\nconst { presets } = await loadAnimationEngine();\nconst anim = presets.fadeIn({ duration: 500 });\nanim.setTargets(element);\nanim.play();\n```\n\n**Fade**: `fadeIn`, `fadeOut` · **Attention**: `pulse`, `heartbeat`, `glow`, `shake`, `bounce` · **Entrance/Exit**: `flip`, `rotateIn`, `slideIn`, `slideInLeft/Right`, `slideOutLeft/Right`, `blurIn/Out/InOut`, `jumpUp/Down`, `warpLeft/Right` · **Effects**: `hover`, `typewriter`, `typingCursor`, `rainbowText`, `progressBar`, `skeletonLoading`, `spinner`, `parallaxScroll`, `gradientBackground`, `rotateScale`, `accordionExpand`, `notificationBounce`, `textFocusBlur`\n\n## The round-trip — ingest, drive, compile\n\nkeyframes.js's authoring object **is** parsed CSS `@keyframes`. That one fact opens a loop no other engine can close:\n\n1. **Ingest** — read the live web's CSS (`@keyframes` in a stylesheet, or a _running_ CSS animation) straight into a kf `CSSKeyframesAnimation`.\n2. **Drive** — run it through the engine: physics-shaped springs, perceptual `oklab` color, scroll-driven progress, weighted blending.\n3. **Compile** — emit the result **back** to zero-runtime CSS. Three sibling emitters run the SAME parser _backward_ over the same data model (`format.ts` is `keyframes.ts` in reverse): [`compileToCSS`](#compile--the-parser-run-backward) (plain `@keyframes`), [`compileToViewTransition`](#compiletoviewtransition) (the `::view-transition-*` pseudo tree), and [`compileToEntry`](#compiletoentry) (`@starting-style`/`allow-discrete` entry-exit).\n\nThis is the moat. GSAP, Motion, and anime author in a bespoke tween model — for them \"export to CSS\" is a lossy re-derivation nobody ships, and \"import the page's CSS\" has no meaning. Because kf's internal model is _already_ CSS, the forward and backward halves are inverses over one structure: a `var()`, a `matrix3d()`, a `cqw` round-trips **verbatim**. The whole round-trip rides the heavy engine, reached through one `await loadAnimationEngine()`.\n\n### Ingest — read the live web's CSS\n\nWalk the document's stylesheets into kf objects, or take over a CSS animation _mid-flight_. Every entry point returns a **diagnostics** channel — a cross-origin sheet whose `cssRules` throws becomes a `CORS_SKIP` row, never a silent drop.\n\n```ts\nconst { fromStyleSheets, fromLiveAnimations, adoptRunning } =\n    await loadAnimationEngine();\n\n// Every @keyframes rule in document.styleSheets, reconstructed and keyed by name.\n// The sibling `.class { animation: spin 2s … }` rule's options are recovered too,\n// so each reconstructed animation carries its AUTHORED timing.\nconst { animations, diagnostics } = fromStyleSheets();\nconst spin = animations.get(\"spin\")?.animation; // a CSSKeyframesAnimation\nfor (const d of diagnostics) console.warn(d.code, d.message); // e.g. CORS_SKIP\n\n// Narrow to one name, or pass an explicit source (a sheet / array of sheets):\nfromStyleSheets({ animationName: \"spin\" });\nfromStyleSheets([...document.styleSheets]);\n\n// fromLiveAnimations — the same walk, scoped to a RUNNING element's animations.\nfromLiveAnimations(element);\n\n// adoptRunning — the mid-flight TEMPORAL takeover: read the element's running\n// CSS animation via getAnimations(), seed kf at the SAME currentTime (continuity,\n// not seed-at-zero), and hand back the kf object to keep driving.\nconst { animation } = await adoptRunning(element, { animationName: \"spin\" });\n```\n\n`fromStyleSheets(source?, options?)` and `fromLiveAnimations(element, options?)` return `{ animations: Map<name, { name, animation, diagnostics }>, diagnostics }`. `resolveLiveKeyframes` is the lower-level walk both share. `adoptRunning(el, options)` returns `{ animation, … }` — the reconstructed kf object seeded at the live playhead.\n\n### Scroll-as-CSS — the animation-timeline grammar\n\nThe CSS `animation-timeline` / `animation-range` grammar, round-tripped through value.js's typed extractor, and driven by a JS `ScrollScene` where the platform's native scroll-driven timelines aren't available. value.js owns the scroll **values** (the grammar, parsed verbatim — `scroll(root block)`, `entry 0%`, `cover 100%`); the kf `ScrollScene` owns **time** (resolving the live scroller against the DOM).\n\n```ts\nconst {\n    parseScrollCSS,\n    roundTripScrollCSS,\n    createScrollScene,\n    driveScrollCSS,\n    pinCSS,\n} = await loadAnimationEngine();\n\n// PARSE the author grammar into typed options — verbatim, no DOM resolution:\nconst opts = parseScrollCSS(`\n    .hero { animation-timeline: scroll(root block); animation-range: entry 0% cover 100%; }\n`);\n// opts.timeline => { kind: \"scroll\", scroller: \"root\", axis: \"block\" }\n// opts.range    => { start: { phase: \"entry\", offset: \"0%\" }, end: { phase: \"cover\", offset: \"100%\" } }\n\n// roundTripScrollCSS proves the grammar is an inverse pair (parse → serialize):\nroundTripScrollCSS(`.hero { animation-timeline: scroll(root block); }`);\n\n// DRIVE it — the JS fallback scene resolves the scroller against the DOM and\n// maps the resolved range onto [0, 1]; feed `.progress` to any interpolator.\nconst scene = createScrollScene({ range: opts.range, scrub: 0.2 });\nelement.style.opacity = String(scene.progress);\n\n// DRIVE the complete parsed value through the range scene, optional trigger,\n// and conservative native-vs-JS backend decision in one symmetric entry:\nconst driven = driveScrollCSS(opts, element, { scrub: 0.2 });\ndriven.backend; // \"native\" or \"js\"\n\n// pinCSS — synthesize the position:sticky pin a scroll-pinned scene needs:\npinCSS(); // => \"position: sticky; top: 0px;\"\npinCSS({ top: 24 }); // => \"position: sticky; top: 24px;\"\n```\n\n`dispatchScrollBackend` picks the conservative-correct backend (native `ScrollTimeline` where eligible, the JS scene otherwise); `serializeScrollOptions` is the inverse of `parseScrollCSS`. Where the platform ships native scroll-driven timelines, [`createNativeTimeline`](#timeline) is the additive fast lane and this scene is the general fallback.\n\n### Compile — the parser run backward\n\n`compileToCSS` walks an orchestration graph — an [`AnimationGroup`](#animationgroup), a [`Sequence`](#sequence), or a bare child list (e.g. a [`stagger`](#stagger)-delayed cohort) — and emits a **pure, zero-runtime CSS** artifact: one `@keyframes` block + an `animation` shorthand per child, `replace`/`add` layering as `animation-composition`, springs as `linear()`, materialized stagger delays, and computed units (`vh`/`cqw`/`calc()`/`var()`) verbatim. A human pastes the result and ships with **zero kf bytes on the page**. Two siblings emit from the same substrate for two other target surfaces — [`compileToViewTransition`](#compiletoviewtransition) (the `::view-transition-*` pseudo tree) and [`compileToEntry`](#compiletoentry) (`@starting-style`/`allow-discrete` entry-exit) — both taught under [Beyond CSS](#beyond-css).\n\n```ts\nconst { CSSKeyframesAnimation, compileToCSS } = await loadAnimationEngine();\n\nconst fade = new CSSKeyframesAnimation({ duration: 600 })\n    .fromString(\n        `from { background-color: #c462d8; } to { background-color: #e85252; }`,\n    )\n    .setTargets(element);\n\nconst { css, eligible, refusals } = await compileToCSS([fade]);\n// eligible === true, refusals === []\n// css is a paste-ready @keyframes block. Because the platform interpolates color\n// in sRGB but kf interpolates in perceptual oklab, the compiler DENSIFIES the\n// color track into intermediate oklab() stops, so the browser's piecewise-linear\n// fill TRACKS kf's perceptual lerp — gated on a ΔE proof (ship only if it matches):\n//\n//   @keyframes a0 {\n//     0%      { background-color: oklab(0.6573 0.1489 -0.1223); }\n//     6.6667% { background-color: oklab(0.6563 0.1503 -0.1091); }\n//     …\n//   }\n```\n\n**The honest-refusal surface (the trust seam).** What cannot round-trip faithfully is **refused** with a named reason — never silently approximated. `compileToCSS` returns `{ css, eligible, refusals }`; when `eligible` is `false`, `refusals` names each child and why, and the JS playback is the only faithful path for those:\n\n| Refusal reason        | What it proves                                  | The faithful path                  |\n| --------------------- | ----------------------------------------------- | ---------------------------------- |\n| `weighted-blend`      | no `animation-composition` twin exists          | JS `AnimationGroup`                |\n| `custom-renderer`     | a closure cannot be CSS                         | JS playback                        |\n| `perceptual-oklab`    | the oklab densify exceeds the ΔE band           | JS playback (true perceptual lerp) |\n| `computed-unit-drift` | the narrow case where verbatim emit would drift | JS playback                        |\n\nA refusal is **marketing for the moat**: it names exactly the kf axis (weighted blending, perceptual color) that exceeds pure CSS. `compileToCSS(input, options?)` options: `staggerDelays` (the materialized `stagger.delays(total)`, emitted as literal per-child `animation-delay`), `densifyStops` (the oklab stop count), `deltaEEpsilon` (the ship-vs-refuse threshold).\n\n> The snippets in this section are reached through `loadAnimationEngine()` and run against the built `dist/`; the executable examples are covered by the test suite.\n\n## Web Animations API\n\nWhen `useWAAPI` is `true` (default), eligible animations run on the compositor thread via `Element.animate()`. Eligibility requires: DOM targets, uniform timing function across frames, no computed units, no custom transform function, no color interpolation. Falls back to `requestAnimationFrame` silently.\n\nA spring timing function (`springTimingFunction`) carries its CSS `linear()` equivalent, so a WAAPI-delegated spring animation runs the true overshoot/settle curve on the compositor instead of a flattened `linear` ramp — the JS easing and the compositor curve are one solver.\n\nA spring keyframed across **multiple** declared stops is compositor-eligible too: rather than restart the curve at each stop (WAAPI's one-easing-per-segment model would), kf **densifies** the composite curve into extra keyframe stops fed a single bare `linear` effect easing, so the compositor's piecewise-linear fill still tracks the true multi-segment curve. Covered by `test/waapi/waapi-densify.test.ts`.\n\n## Baseline, tree-shaking & reduced motion\n\nkeyframes.js targets a modern-web Baseline and documents the tier of every platform facility it leans on:\n\n| Facility                    | Baseline tier                   | Behavior                                                                                                |\n| --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------- |\n| `prefers-reduced-motion`    | Widely available                | Native `matchMedia`; SSR-safe no-op off-DOM                                                             |\n| `scheduler.yield()`         | Newly available                 | Feature-detected; falls back to a `MessageChannel` macrotask (≤20 LOC)                                  |\n| WAAPI `linear()` springs    | Newly available                 | Feature-detected; the rAF spring path is the default fallback                                           |\n| `Element.animate()` (WAAPI) | Widely available                | Opt-out via `useWAAPI: false`                                                                           |\n| CSS `if()` / `@function`    | Limited availability (Chromium) | kf resolves both in JS at parse/bind time — see [The emerging-CSS resolver](#the-emerging-css-resolver) |\n\n**Tree-shaking — the Value boundary.** The package is `\"sideEffects\": false` and splits along a static/dynamic boundary. The light physics/interpolation engines — `SpringProgress`, `SmoothProgress`, `NumericAnimation`, `ElementMorph`, the `Timeline` family, `RAFPlayback`, and the spring-stop helpers — share only the rootless `@mkbabb/value.js/math` leaf. They do not pull Value's CSS parser, color system, or Keyframes' heavy engine into the eager graph. The heavy engine (`KeyframesAnimation`, `CSSKeyframesAnimation`, `AnimationGroup`) is reached through `loadAnimationEngine()`'s dynamic `import()` or the explicit `./engine` entry.\n\n**Reduced motion.** Both the light and heavy engines honor `prefers-reduced-motion: reduce`. Opt in per surface:\n\n- **Light interpolators** (`NumericAnimation`, `SmoothProgress`, `SpringProgress`, `ElementMorph`) — pass `respectReducedMotion: true`. `RAFPlayback` owns the shared snap-to-final gate, so the managed `.play()` path skips the rAF loop and lands on the final value in a single paint.\n- **Heavy engine** (`KeyframesAnimation` / `CSSKeyframesAnimation`) — pass `respectReducedMotion: true`; `play()` snaps to the final frame (a single paint, `animationstart` → `animationend`) instead of running the rAF/WAAPI loop.\n- **`AnimationGroup`** — set `group.respectReducedMotion = true`; `play()` composites every child's final frame once rather than driving the draw loop.\n\nOff-DOM (SSR / Node) the check is a no-op and animations proceed normally.\n\n**INP.** `AnimationGroup` composites N children per frame; for large groups (`> AnimationGroup.YIELD_BATCH`) `tick()` yields to the main thread between batches via `scheduler.yield()` (feature-detected) so a big composite doesn't run as one long task.\n\n## Beyond CSS\n\nThe library also ships general-purpose interpolation primitives, decoupled from CSS and the DOM. These compose into a pipeline: `timeline → progress → interpolator → values → apply`.\n\nEverything in this section lives on the **light static barrel** — `import { NumericAnimation, SpringProgress, … } from \"@mkbabb/keyframes.js\"` — and carries only Value's rootless `/math` leaf, never its parser/color graph (see [tree-shaking](#baseline-tree-shaking--reduced-motion)). Two conventions hold throughout:\n\n- **Easing is callable.** Every light primitive takes a `TimingFunction` (`t => t'`) or a typed `Easing` — `toEasing` normalizes a bare callable to the typed shape, synchronously. A string easing _name_ throws an `UnknownEasingError` — resolve it once, up front: `const easing = await resolveEasing(\"easeOutCubic\")`.\n- **Every snippet executes.** Each example below runs against the built package in CI; `// =>` comments are asserted results, not aspirations.\n\n### `NumericAnimation`\n\nKeyframe interpolation over plain `{key: number}` objects. Zero-allocation hot path — returns the same object reference each call. Two usage modes: stateless `.at()` queries, or managed `.play()` with rAF-driven playback.\n\n```ts run\n// Stateless — drive from your own render loop\nconst anim = new NumericAnimation([\n    { x: 0, y: 0, opacity: 0 },\n    { x: 100, y: 200, opacity: 1 },\n]);\nanim.at(0.5); // => { x: 50, y: 100, opacity: 0.5 }\n\n// Managed — rAF playback with a per-frame callback; a string easing\n// name resolves once, up front:\nconst easing = await resolveEasing(\"easeOutCubic\");\nconst dial = new NumericAnimation([{ angle: 0 }, { angle: Math.PI * 4 }], {\n    duration: 250,\n    timingFunction: easing,\n});\nawait dial.play(({ angle }) => {\n    ctx.clearRect(0, 0, w, h);\n    drawDial(angle);\n});\n```\n\nOptions: `duration` (ms, required for `.play()`), `timingFunction` (callable or `Easing` — string names throw; resolve via `resolveEasing`), `positions` (explicit keyframe positions as percentages), `respectReducedMotion`. Call `.stop()` to cancel a running playback — the play promise resolves immediately.\n\n### `SmoothProgress`\n\nExponential smoothing for progress values. Frame-rate independent via `tickDt(dt)` — the canonical millisecond step, the same `Tickable` surface [`RAFPlayback.drive`](#rafplayback) owns.\n\n```ts run\nconst smooth = new SmoothProgress({ damping: 0.15 });\nsmooth.setTarget(1);\nsmooth.tickDt(16.7); // one frame step — asymptotically approaches the target\nsmooth.snap(); // instantly converge\nsmooth.current; // => 1\n\n// Managed — the smoother owns a rAF loop until it settles:\nsmooth.setTarget(0);\nsmooth.play((value) => element.style.setProperty(\"--p\", String(value)));\nsmooth.stop();\n```\n\nOptions: `damping` (lerp factor, default 0.1), `snapThreshold` (auto-snap distance, default 0.001), `targetEpsilon` (ignore target changes smaller than this — filters scroll jitter, default 0), `initial`, `clamp` (default `true` — constrain to `[0, 1]`), `respectReducedMotion`. Reads: `.current`, `.target`, `.settled`.\n\n### `ElementMorph`\n\nInterpolates position and scale between two DOM elements (or rects). Produces CSS transforms. Stateless `.apply()` or managed `.play()`.\n\n```ts run\n// Stateless\nconst morph = new ElementMorph(sourceEl, targetEl);\nmorph.apply(element, 0.5); // writes transform + transformOrigin at progress 0.5\n\n// Managed playback — feed it a spring for the canonical overshoot\nconst springy = new ElementMorph(sourceEl, targetEl, {\n    duration: 250,\n    timingFunction: springTimingFunction({\n        response: 0.4,\n        dampingFraction: 0.7,\n    }),\n});\nawait springy.play(element);\n```\n\nRe-measures on demand via `morph.measure(from, to)` (elements or `{ x, y, width, height }` rects). Call `.stop()` to cancel. Options: `duration`, `timingFunction` (callable or `Easing`), `transformOrigin` (default `\"top left\"`).\n\n### `Timeline`\n\nAbstract progress driver. Pipeline: `sample() → clamp → easing → boundary snap → smoothing`.\n\n```ts run\nconst easing = await resolveEasing(\"easeOutCubic\");\nconst timeline = new KeyframesScrollTimeline({\n    threshold: 0.35,\n    easing,\n    boundaryEpsilon: 0.005,\n    smoothing: { damping: 0.15, targetEpsilon: 0.002 },\n});\n\nfunction update() {\n    element.style.opacity = String(timeline.tick());\n    requestAnimationFrame(update);\n}\n\n// ManualTimeline — externally-set value → progress; smoothing off by default\nconst manual = new ManualTimeline();\nmanual.set(0.25);\nmanual.tick(); // => 0.25\n```\n\nOptions: `easing` (callable or `Easing`), `smoothing` (`SmoothProgressOptions` or `false`), `boundaryEpsilon` (snap eased values within this distance of 0/1 to the boundary — prevents scroll-endpoint oscillation, default 0.005).\n\nSubclasses:\n\n- **`KeyframesScrollTimeline`** — scroll position → progress. `threshold` sets viewport fraction for full progress (default 0.35). Injectable `getScrollY`/`getViewportHeight`.\n- **`ManualTimeline`** — externally set value → progress. Smoothing off by default.\n\nWhere the platform ships native scroll-driven timelines, `createNativeTimeline({ kind: \"scroll\" | \"view\", … })` feature-detects and returns a native `AnimationTimeline` (or `null`) as an additive fast lane — the JS sampler stays the general fallback.\n\nSee [`docs/scroll-morph.md`](docs/scroll-morph.md) for an architecture guide on building jitter-free scroll-driven morph animations.\n\n### `SpringProgress`\n\nA live-target spring tracker — the physics core under [`drag`](#drag--draggable). The solver integrates the damped harmonic oscillator **analytically** between target changes; setting `target` mid-flight re-seats the closed-form solution from the current `(value, velocity)`, so the trajectory never jumps. API mirrors SwiftUI's `.spring(response:dampingFraction:)`.\n\n```ts run\nconst spring = new SpringProgress({ response: 0.5, dampingFraction: 0.86 });\nspring.target = 1; // re-seat the closed form — continuous, no jump\nspring.tickDt(16.7); // advance one frame (milliseconds); returns the new value\nspring.settled; // => false\n\n// Managed — the spring owns a rAF loop until it settles; a new target\n// while playing auto-resumes the loop:\nspring.play((value, velocity) => {\n    element.style.transform = `translateX(${value * 100}px)`;\n});\nspring.target = 0.5;\nspring.stop();\n\n// The time-based surface (Motion's idiom): perceptual duration + bounce\nconst bouncy = SpringProgress.fromDuration({\n    visualDuration: 0.4,\n    bounce: 0.3,\n});\nbouncy.settled; // => true\n```\n\nOptions: `response` (oscillation period in seconds, default 0.5), `dampingFraction` (ζ — `1` critically damped, `< 1` rings, `> 1` overdamped; default 0.86), `initial`, `initialVelocity` (units/s), `settleThreshold` / `velocitySettleThreshold` (default `1e-3`), `respectReducedMotion`. Reads: `.value`, `.velocity`, `.target`, `.settled`; plus `subscribe(fn)` → unsubscribe, `reset(value?, velocity?)`, `snap()`, `dispose()`. `SpringProgress.fromDuration({ visualDuration | duration, bounce })` maps `response = visualDuration`, `dampingFraction = 1 − bounce`.\n\n### `springLinearStops` & `springTimingFunction`\n\nOne analytic solver, two emissions. `springLinearStops` samples a `0 → 1` spring into a CSS `linear()` timing-function string (stylesheets, design tokens); `springTimingFunction` samples the same curve into a typed `Easing` — `.fn` is the callable for JS interpolation, `.css` its identical `linear()` twin, so a WAAPI delegation runs the true overshoot on the compositor (see [Web Animations API](#web-animations-api)).\n\n```ts run\n// CSS: a linear() string for transition/animation-timing-function\nconst stops = springLinearStops({ response: 0.5, dampingFraction: 0.45 });\nstops.startsWith(\"linear(0, \"); // => true\nstops.endsWith(\", 1)\"); // => true\n\n// JS: a typed Easing — feed it to NumericAnimation / ElementMorph / KeyframesAnimation\nconst spring = springTimingFunction({ response: 0.5, dampingFraction: 0.45 });\nspring.fn(0); // => 0\nspring.fn(1); // => 1\n// ζ < 1 overshoots past 1 mid-curve — the whole point:\nMath.max(...Array.from({ length: 101 }, (_, i) => spring.fn(i / 100))) > 1; // => true\n// Same solver, same preset, ONE curve:\nspring.css === springLinearStops({ response: 0.5, dampingFraction: 0.45 }); // => true\n```\n\nOptions (both): `response`, `dampingFraction`, `sampleCount` (default 24 stops / 64 samples), `settleThreshold` (default `1e-3`), `maxDuration` (default `4 × response` — raise it for very underdamped springs, ζ < 0.3).\n\n### `RAFPlayback`\n\nTHE managed rAF driver — every loop in the engine rides this one generation-guarded core, through three entry shapes: `play(duration, onTick)` (progress loop), `drive(tickable)` (step a `Tickable` — `SpringProgress`, `SmoothProgress` — until it settles), and `loop(cb)` (self-rescheduling async frame loop).\n\n```ts run\nconst playback = new RAFPlayback();\n\n// Duration loop — progress 0 → 1 over 200ms; resolves on completion or stop():\nawait playback.play(200, (progress) => {\n    element.style.opacity = String(progress);\n});\n\n// Bind-proof by construction: the control surface is arrow class-fields, so a\n// destructured method keeps its receiver — no .bind(), ever:\nconst { stop } = playback;\nplayback.play(10_000, () => {});\nstop(); // safe — the pending play promise resolves immediately\nplayback.running; // => false\n\n// Settle loop — drive any Tickable to rest:\nconst spring = new SpringProgress({ response: 0.3 });\nspring.target = 1;\nplayback.drive(spring, () => {\n    element.style.transform = `translateX(${spring.value * 100}px)`;\n});\nplayback.stop();\n```\n\nNotes: `play(duration, onTick, { respectReducedMotion })` snaps to `onTick(1)` in a single paint under `prefers-reduced-motion: reduce` — the shared reduced-motion gate the light primitives route through. `drive` is idempotent (re-arm freely on every target re-seat; the loop auto-stops on settle). `loop(cb)` reschedules only after the (possibly async) callback completes, so a slow frame never double-schedules. `.running` reports loop ownership.\n\n### `stagger`\n\nA construction-time per-index delay generator — a pure distribution, zero per-frame cost. Returns `(index, total) => delayMs` with a `.delays(total)` materializer.\n\n```ts run\nconst delay = stagger(5, { each: 50, from: \"center\" });\ndelay.delays(5); // => [100, 50, 0, 50, 100]\ndelay(0, 5); // => 100\n\n// Reshape the distribution with an easing (resolved up front):\nconst eased = stagger(4, {\n    each: 100,\n    ease: await resolveEasing(\"easeOutCubic\"),\n});\neased(3, 4); // => 300\n```\n\nOptions: `each` (per-step ms, default 100), `from` (`\"first\"` | `\"last\"` | `\"center\"` | `\"edges\"` | an index; default `\"first\"`), `ease` (callable or `Easing`; string names throw). Feed the delays to `AnimationGroup` per-child `delay`, `setTimeout`, or `animation-delay` — the generator is just arithmetic.\n\n### `flip` / `flipShared`\n\nFLIP (First-Last-Invert-Play) layout animation over [`ElementMorph`](#elementmorph). `flip` animates a layout change on one element: measure (First) → `mutate()` (Last) → invert + play, with the two layout reads batched (no read/write thrash). `flipShared` animates element `a` onto element `b`'s rect — the shared-element / `layoutId` idiom.\n\n```ts run\n// FLIP a layout change — class toggle, reparent, any synchronous mutation:\nawait flip(card, () => card.classList.toggle(\"expanded\"), { duration: 200 });\n\n// Shared-element FLIP — animate `a` onto `b`'s rect; springs welcome:\nawait flipShared(a, b, {\n    duration: 200,\n    timingFunction: springTimingFunction({\n        response: 0.3,\n        dampingFraction: 0.8,\n    }),\n});\n```\n\nOptions: `duration` (default 300), `timingFunction` (callable or `Easing` — `springTimingFunction(…)` makes the FLIP springy), `transformOrigin` (default `\"top left\"`). Both return the play promise.\n\n### `drag` / `Draggable`\n\nA one-axis spring-backed drag: pointer capture follows the pointer as a live spring target; release hands the sampled pointer velocity (a rolling 100ms window) to the spring's re-seat, so the fling leaves the hand C¹-continuous — at exactly the flick speed. A 2-D drag composes two `Draggable`s, one per axis.\n\n```ts run\nconst draggable = drag(element, {\n    axis: \"x\",\n    springOptions: { response: 0.3, dampingFraction: 0.9 },\n});\n\nconst unsubscribe = draggable.subscribe((value, velocity) => {\n    element.style.transform = `translateX(${value}px)`;\n});\n\ndraggable.dragging; // => false\nunsubscribe();\ndraggable.detach(); // remove listeners; `.dispose()` tears down spring and all\n```\n\nOptions: `axis` (`\"x\"` | `\"y\"`, default `\"x\"`), `transform` (map a client px coordinate → your value domain), `spring` (bring your own `SpringProgress`) or `springOptions`, `velocityWindow` (ms, default 100). Reads: `.value`, `.velocity`, `.dragging`, `.settled`, and `.spring` (the physics core). `drag(element, options)` is the one-call form of `new Draggable(options)` + `.attach(element)`.\n\n### `decay` / `decayRest`\n\nFrictional decay (inertial glide) — the closed-form sibling of the spring, for the fling with no target: velocity bleeds off under friction (`v' = −k·v`), coasting toward a finite rest point. `decay` returns a pure sampler; `decayRest` returns just the projected endpoint — the snap-target / paginated-fling decision without running a loop.\n\n```ts run\nconst glide = decay({ initial: 0, velocity: 1200, friction: 5 });\nglide(0); // => { value: 0, velocity: 1200 }\nglide(0.25).value < 240; // => true\n\n// The projected endpoint, x0 + v0/k — no loop needed:\ndecayRest({ velocity: 1200, friction: 5 }); // => 240\n```\n\nOptions: `velocity` (required — release speed, units/s), `initial` (default 0), `friction` (1/s, strictly positive — larger = shorter glide; default 5). The sampler takes `t` in **seconds** (the spring's native clock).\n\n### `Sequence`\n\nThe temporal orchestrator: position many animations along ONE master clock and drive them with a GSAP-class transport. Where [`AnimationGroup`](#animationgroup) composites many animations on one target per frame (spatial), `Sequence` maps a master playhead onto each child's local clock (temporal) — they compose, not compete. `Sequence` itself is light; the children arrive from the heavy engine.\n\n```ts run\nconst { CSSKeyframesAnimation } = await loadAnimationEngine();\n\nconst fade = new CSSKeyframesAnimation({ duration: 300 })\n    .fromString(`from { opacity: 0; } to { opacity: 1; }`)\n    .setTargets(box);\nconst slide = new CSSKeyframesAnimation({ duration: 400 })\n    .fromString(\n        `from { transform: translateX(-100px); } to { transform: translateX(0); }`,\n    )\n    .setTargets(card);\n\nconst seq = new Sequence()\n    .add(fade) // auto-append at 0\n    .add(slide, \"-=100\"); // overlap the previous segment by 100ms\n\nseq.duration; // => 600\nseq.seek(300); // scrub — master playhead → each child's local clock\nawait seq.play(); // the rAF transport drives the SAME map: play ≡ seek\nseq.timeScale(2).repeat(2).yoyo(); // transport persists across plays\n```\n\nPositions: a number (absolute ms), `\"+=n\"` / `\"-=n\"` (relative to the insertion cursor), or a label registered via `.label(name, at)` (unknown labels throw). Transport: `play()` / `pause()` / `resume()` / `stop()`, `seek(ms)`, `progress` (get/set, `[0, 1]`), `timeScale(n)`, `reverse()`, `repeat(n | Infinity)`, `yoyo()`, `await seq.finished`. Options: `respectReducedMotion` (snap to the rest frame in one paint).\n\n**Web Animations Level 2, in production.** `AnimationGroup` and `Sequence` are the production realization of WAAPI Level 2's `GroupEffect`/`SequenceEffect` model — grouping semantics no browser has ever shipped (polyfill-only, still a Working Draft, with `SequenceEffect` proposed for deletion upstream — [csswg-drafts#9557](https://github.com/w3c/csswg-drafts/issues/9557)) — running over real WAAPI children where eligible, with weighted blending and a transport the spec lacks. The correspondence is named, not mimicked: keyframes.js does not mirror the unsettled L2 class shapes, polyfill the missing native API, or pin its surface to class names the CSSWG is actively reworking.\n\n| Web Animations Level 2 concept                               | keyframes.js surface                |\n| ------------------------------------------------------------ | ----------------------------------- |\n| `GroupEffect` (parallel children)                            | [`AnimationGroup`](#animationgroup) |\n| `SequenceEffect` / proposed `EffectTiming` `align: sequence` | `Sequence` auto-append              |\n| `EffectTiming` `align: start`                                | `Sequence` `at: 0`                  |\n\n### `viewTransition`\n\nThe LIGHT View-Transitions dispatch: mutate the DOM behind a native View Transition where the platform ships one, and fall back to a `flipShared` shared-element morph (or a bare immediate mutation) everywhere else — behind ONE normalized handle whose `backend` is queryable and whose promises never reject. Feature-detects `startViewTransition` (and its typed-`update` object overload); PRM routes through the ONE `withReducedMotion` gate (mutate directly, settle).\n\n```ts run\n// Off-platform (no `document.startViewTransition`, no shared pairs) it degrades\n// to a bare immediate mutation — backend queryable SYNCHRONOUSLY at dispatch:\nconst vt = viewTransition(() => box.classList.add(\"open\"), {\n    types: [\"forward\"],\n});\nvt.backend; // => \"immediate\"\nawait vt.finished; // never rejects — a skipped/aborted transition settles cleanly\n```\n\nOptions: `types` (typed same-doc VT), `shared` (`[from, to]` `flipShared` fallback pairs — `backend: \"flip\"`), `duration`/`timingFunction` (the fallback play), `fallback` (`\"flip\"` | `\"none\"` | a custom async runner), `respectReducedMotion` (default `true` — PRM snaps to `\"immediate\"`). The `backend` is `\"view-transition\"` (native), `\"flip\"` (the `flipShared` fallback), or `\"immediate\"` (bare mutate). Its zero-runtime CSS twin is [`compileToViewTransition`](#compiletoviewtransition).\n\n### `compileToViewTransition`\n\nThe round-trip engine pointed at native View Transitions: compile a **name-keyed role spec** to a PURE, ZERO-RUNTIME CSS artifact over the `::view-transition-*` pseudo tree (HEAVY — reached via `loadAnimationEngine()`). Each name's `old`/`new` get a full kf `@keyframes` block + `animation` shorthand (springs → `linear()`); `::view-transition-group(name)` gets a **timing-only** override (duration + timing-function, never `animation-name` — the UA's rect-morph keyframes ARE the free zero-runtime FLIP), so the group stays temporally coherent with the tracks. Non-round-trippable shapes REFUSE with a named reason (the CC-3 four ∪ `vt-scroll-grammar` / `vt-element-scoped-computed` / `vt-snapshot-inapplicable` / `vt-name-collision`).\n\n```ts run\nconst { CSSKeyframesAnimation, compileToViewTransition } =\n    await loadAnimationEngine();\n\nconst out = new CSSKeyframesAnimation({ duration: 300 });\nout.fromString(\n    `@keyframes o { from { opacity: 1 } to { opacity: 0; transform: scale(0.9) } }`,\n);\nconst enter = new CSSKeyframesAnimation({ duration: 300 });\nenter.fromString(\n    `@keyframes n { from { opacity: 0; transform: scale(1.05) } to { opacity: 1 } }`,\n);\n\nconst vt = await compileToViewTransition(\n    { hero: { old: out, new: enter } },\n    { types: [\"forward\"] },\n);\nvt.names; // => [\"hero\"]\nvt.css.includes(\"::view-transition-group(hero)\"); // => true\nvt.css.includes(\"animation-name\"); // => false   // the group override is timing-only\n```\n\nOptions: `types` (wraps rules in `:active-view-transition-type(...)`), `crossDocument` (prepend `@view-transition { navigation: auto }`), `reducedMotion` (append the PRM `animation: none` block, default `true`), plus every `CompileOptions` key. The consumer assigns `view-transition-name: <name>` to its elements from the returned `names`.\n\n### `compileToEntry`\n\nModern entry/exit compilation: compile a selector-keyed `{ enter?, exit? }` spec to zero-runtime **`@starting-style` + `transition-behavior: allow-discrete`** CSS — the two-endpoint entrance/exit grammar the platform shipped (Chromium 117+/Safari 26). HEAVY (reached via `loadAnimationEngine()`). It is a **declared-endpoint projection** (each animation is a 2-stop transition endpoint pair), emitting the three-rule grammar: a base/closed rule (exit's last frame + `display: none` + the exit transition list), an open rule (enter's last frame + `display` + the entry list), and `@starting-style { <open> { enter's first frame } }`. Asymmetric entry/exit duration+easing ride the two lists; `display`/`overlay <dur> allow-discrete` ride BOTH (`overlay` is inert-but-harmless off the top layer); spring `linear()`s ride verbatim; **color endpoints canonicalize to `oklab()`** so the transition interpolates in kf's default perceptual space natively — NO densify, ZERO intermediate stops (the `@keyframes` `perceptual-oklab` refusal INVERTED to a feature). Non-two-endpoint shapes REFUSE (3 inherited + 6 entry-specific: `entry-multi-keyframe` / `entry-iteration` / `entry-composition` / `entry-scroll-grammar` / `entry-color-space` / `entry-easing-twin`).\n\n```ts run\nconst { CSSKeyframesAnimation, compileToEntry } = await loadAnimationEngine();\n\nconst enter = new CSSKeyframesAnimation({ duration: 350 });\nenter.fromString(\n    `@keyframes en { from { opacity: 0; transform: translateY(8px) } to { opacity: 1; transform: translateY(0) } }`,\n);\n\nconst dialog = await compileToEntry(\n    { \".dialog\": { enter } },\n    { openSelector: \"[open]\" },\n);\ndialog.eligible; // => true\ndialog.css.includes(\"@starting-style\"); // => true\ndialog.css.includes(\"display 350ms allow-discrete\"); // => true\n```\n\nOptions: `openSelector` (`\".open\"` | `\"[data-open]\"` | `\":popover-open\"` | `\"[open]\"`, concatenated onto the base selector), `display` (the open display, default `\"block\"`), `overlay` (emit `overlay allow-discrete`, default `true`). The `exit` defaults to `enter` reversed. **Born-open elements RUN the entry at first render** (an `@starting-style` platform semantic — an SSR'd open dialog animates in on load; opt out by not matching the open selector at initial render). Where `transition-behavior` is unsupported the artifact **degrades honestly** — snap-entry, correct end state, no broken half-transition.\n\n## Ecosystem & agents\n\n- **`llms.txt`** — the agent surface: a machine-readable index of every capability, generated\n  from the CI-verified published surface (`docs/published-surface.md`) by running\n  `node scripts/gen-agent-surface.mjs`. The artifact is not tracked in git (generated at CI time);\n  `llms-full.txt` carries the expanded form.\n\n## Build & Development\n\n```sh\nnpm run build        # library (ESM) → dist/keyframes.js + lazy engine chunks + keyframes.d.ts\nnpm run gh-pages     # demo (multi-scene SPA, demo/app) → dist/gh-pages/\nnpm run dev          # vite dev server (demo/app)\nnpm test             # vitest (jsdom)\nnpm run bench        # vitest bench\nnpm test -- --run && npm run proof:publish  # correctness + packaged public surface\n```\n\n### Local CI repro\n\nA macOS-pass / Linux-fail CI flake (a render-race, an absolute frame/ms threshold) can be reproduced locally — no push, no 30-minute wait — by running the demo-smoke roster inside the same Linux container the CI runner uses:\n\n```sh\nmake ci-linux    # node:24-slim container · npm ci → gh-pages → demo:correctness\n```\n\nIt pulls `node:24-slim` (kf's CI Node), mounts the repo at `/workspace`, installs the Playwright browser, builds the demo, and runs the demo gate roster with `KF_REQUIRE_BROWSER=1`, exiting with the container's code. `docker` is the only requirement.\n\n**Dependency**: [`@mkbabb/value.js`](https://github.com/mkbabb/value.js), consumed only through its exact `/color`, `/value`, `/css`, `/easing`, `/math`, and `/transform` capability entries.\n\n**TypeScript**: `strict: true`, `verbatimModuleSyntax: true`, `target: ES2022`, `moduleResolution: bundler`.\n\n**Node**: >=22.\n\n## Contributing\n\nOpen a PR against `master`. Run `npm test -- --run && npm run proof:publish`\nbefore pushing.\n\n## License\n\n[MIT](./LICENSE) © 2026 Mike Babb.\n\n## Sources, acknowledgements, &c.\n\n- [CSS Animations Level 1](https://www.w3.org/TR/css-animations-1/). W3C. — `@keyframes`, `animation-*` properties, timing model.\n- [CSS Easing Functions Level 2](https://www.w3.org/TR/css-easing-2/). W3C. — `linear()` piecewise easing, `steps()` jump terms, `cubic-bezier()`.\n- [CSS Transforms Module Level 2](https://www.w3.org/TR/css-transforms-2/). W3C. — `matrix3d()`, decomposition algorithm, quaternion interpolation.\n- [CSSOM View Module](https://www.w3.org/TR/cssom-view-1/). W3C. — `getComputedStyle`, unit resolution for relative values.\n- [Web Animations API](https://www.w3.org/TR/web-animations-1/). W3C. — `Element.animate()`; the WAAPI delegation path.\n- [`@mkbabb/value.js`](https://github.com/mkbabb/value.js) — CSS value parsing, color spaces, unit conversion, easing functions.\n- de Casteljau, P. (1959). _Outillages méthodes calcul_. — The recursive subdivision algorithm used for general Bezier curves.\n","readmeFilename":"README.md"}