{"_id":"@blinn-motion/core","_rev":"4-b4bb2206b5f77a29c18c147fd7ef5470","name":"@blinn-motion/core","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@blinn-motion/core","version":"0.1.0","license":"MIT","_id":"@blinn-motion/core@0.1.0","maintainers":[{"name":"gron371","email":"ismailyagci371@gmail.com"}],"homepage":"https://blinnmotion.com","bugs":{"url":"https://github.com/ismailyagci/blinn-motion/issues"},"dist":{"shasum":"657e016198e3d31d0715fd03d1ec270ed5ac3c90","tarball":"https://registry.npmjs.org/@blinn-motion/core/-/core-0.1.0.tgz","fileCount":8,"integrity":"sha512-ZstOeX+VM9nDJ1ibclrc5PqBMH+qKvRYwspSWFQSZ5sZ6mxFwjBkMaiWckrFJPxKMFk9SYApVy7S7ek8Y5ezow==","signatures":[{"sig":"MEYCIQCSTrAAVR9qa+ZNc3qo9c9up+I7ojgFA+3dBR5xn5SLHAIhALbfqRlmu2KQHi6CBj1WJl9w7pouBrpzVNAJ/iKawgzv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blinn-motion%2fcore@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":226865},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2532aab4276d43f115627973bcd29cfcd0f95600","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"gron371","email":"ismailyagci371@gmail.com"},"repository":{"url":"git+https://github.com/ismailyagci/blinn-motion.git","type":"git"},"_npmVersion":"10.9.8","description":"Blinn Motion core — pure, DOM-free render engine. Samples a MotionDoc at time t into a backend-agnostic resolved render tree. Shared by every adapter.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/core_0.1.0_1784220065497_0.10877580872776105","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@blinn-motion/core","version":"0.1.1","license":"MIT","_id":"@blinn-motion/core@0.1.1","maintainers":[{"name":"gron371","email":"ismailyagci371@gmail.com"}],"homepage":"https://blinnmotion.com","bugs":{"url":"https://github.com/ismailyagci/blinn-motion/issues"},"dist":{"shasum":"c899ea37dc25fb131807d008621051ab8e274769","tarball":"https://registry.npmjs.org/@blinn-motion/core/-/core-0.1.1.tgz","fileCount":8,"integrity":"sha512-NA8Fbffze7etlgBbjcEcRH66I/49jOlxI0nlAPIYEiY9qgbo4p8HLZBbyTCPwHM+xaBfKtSFmj408z+GsntjaA==","signatures":[{"sig":"MEUCIQD9lEd3RkNizKdZZL5og6QkFIQju4TnsHwLDS3LqkjZ4wIgeZ7EDBf/ywyecG5/7BWgOGm0rDmBN3JKLgiqLvDUXt0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blinn-motion%2fcore@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":226865},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"befca5fac3e3f011f219a040b6cf69eff138bdf4","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"gron371","email":"ismailyagci371@gmail.com"},"repository":{"url":"git+https://github.com/ismailyagci/blinn-motion.git","type":"git"},"_npmVersion":"10.9.8","description":"Blinn Motion core — pure, DOM-free render engine. Samples a MotionDoc at time t into a backend-agnostic resolved render tree. Shared by every adapter.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/core_0.1.1_1784223386113_0.9663089634641915","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@blinn-motion/core","version":"0.1.2","license":"MIT","_id":"@blinn-motion/core@0.1.2","maintainers":[{"name":"gron371","email":"ismailyagci371@gmail.com"}],"homepage":"https://blinnmotion.com","bugs":{"url":"https://github.com/ismailyagci/blinn-motion/issues"},"dist":{"shasum":"9755d675c790029e2230fe0b9f6eedaf45d1e0d8","tarball":"https://registry.npmjs.org/@blinn-motion/core/-/core-0.1.2.tgz","fileCount":8,"integrity":"sha512-paInO186982s9//wvVq34WY4TG6nB/IiocQMicgDhz0fBP9XtG4O0/cUm4lZce3EOAE+SmucpCpNn2Ximfdpjw==","signatures":[{"sig":"MEUCIBTs1AvRz1IXdAgTCPockbEQ+8Od3BWVWdttW1fG0wYFAiEA2Iz1CoJxSor9P/Ef2eHGvkvj9IUPxmb9qWO08OdKWrw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blinn-motion%2fcore@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":226865},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"58f09492a6476c188e3c5b91676df6c6464a13d8","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"gron371","email":"ismailyagci371@gmail.com"},"repository":{"url":"git+https://github.com/ismailyagci/blinn-motion.git","type":"git"},"_npmVersion":"10.9.8","description":"Blinn Motion core — pure, DOM-free render engine. Samples a MotionDoc at time t into a backend-agnostic resolved render tree. Shared by every adapter.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/core_0.1.2_1784225018337_0.8612333666002157","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@blinn-motion/core","version":"0.1.3","description":"Blinn Motion core — pure, DOM-free render engine. Samples a MotionDoc at time t into a backend-agnostic resolved render tree. Shared by every adapter.","license":"MIT","type":"module","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/ismailyagci/blinn-motion.git","directory":"packages/core"},"homepage":"https://docs.blinnmotion.com/concepts/render-engine","bugs":{"url":"https://github.com/ismailyagci/blinn-motion/issues"},"keywords":["blinn-motion","figma","figma-motion","motiondoc","animation","motion","timeline","render-engine","sampler","easing"],"_id":"@blinn-motion/core@0.1.3","gitHead":"199359afa1ba483192cdd327730a411279238893","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-ElVoUTviYwKvQ55A/XcurXXaY64QYNMBu/53+pH0+C5l/T4RNcO8y1anJAzLLsddgIYjlj1xa6/KuyGVtQ9tvA==","shasum":"17b00f0244a44a8ed6998bef75508f3d3e05133f","tarball":"https://registry.npmjs.org/@blinn-motion/core/-/core-0.1.3.tgz","fileCount":9,"unpackedSize":231849,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@blinn-motion%2fcore@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB/aSdiXCc08TSDVbjHPS0AII8mfkutGSSAZr0zCoFWUAiEAq2pDf8Qu4R4LerGdGE19mxWOqr4Ppz3WvoVoLPM1eLM="}]},"_npmUser":{"name":"gron371","email":"ismailyagci371@gmail.com"},"directories":{},"maintainers":[{"name":"gron371","email":"ismailyagci371@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.1.3_1784231260399_0.3144235464700458"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-16T16:41:05.331Z","modified":"2026-07-16T19:47:40.842Z","0.1.0":"2026-07-16T16:41:05.661Z","0.1.1":"2026-07-16T17:36:26.264Z","0.1.2":"2026-07-16T18:03:38.499Z","0.1.3":"2026-07-16T19:47:40.530Z"},"bugs":{"url":"https://github.com/ismailyagci/blinn-motion/issues"},"license":"MIT","homepage":"https://docs.blinnmotion.com/concepts/render-engine","repository":{"type":"git","url":"git+https://github.com/ismailyagci/blinn-motion.git","directory":"packages/core"},"description":"Blinn Motion core — pure, DOM-free render engine. Samples a MotionDoc at time t into a backend-agnostic resolved render tree. Shared by every adapter.","maintainers":[{"name":"gron371","email":"ismailyagci371@gmail.com"}],"readme":"# @blinn-motion/core\n\n[![npm](https://img.shields.io/npm/v/@blinn-motion/core.svg)](https://www.npmjs.com/package/@blinn-motion/core)\n[![license](https://img.shields.io/npm/l/@blinn-motion/core.svg)](https://github.com/ismailyagci/blinn-motion/blob/main/LICENSE)\n\n**Pure, DOM-free render engine for [Blinn Motion](https://blinnmotion.com).**\n\nGiven a **MotionDoc** (portable JSON from Figma Motion) and a time `t`, `sample(doc, t)` returns a backend-agnostic tree of final numbers — transforms, fills, effects, text. Every adapter (DOM, Canvas, React, Vue, …) paints that *same* tree, so motion times identically across platforms.\n\n```\nFigma Motion  →  MotionDoc JSON  →  sample(doc, t)  →  adapters paint\n```\n\n## Install\n\n```bash\nnpm install @blinn-motion/core\n```\n\nZero runtime dependencies. Works in browsers, Node, React Native, workers — anywhere JS runs.\n\n## Quick start\n\n```ts\nimport { sample, Ticker, type MotionDoc } from \"@blinn-motion/core\";\nimport doc from \"./card.motion.json\";\n\n// Resolve one frame\nconst tree = sample(doc as MotionDoc, 0.4); // seconds\nconsole.log(tree.root); // resolved RenderNode tree\n\n// Or drive a clock\nconst ticker = new Ticker({ duration: doc.duration, loop: true });\nticker.onframe = (time, fraction) => {\n  const frame = sample(doc as MotionDoc, time);\n  // hand `frame` to your painter\n};\nticker.play();\n```\n\nYou usually **do not** paint with core alone — pick an adapter (`@blinn-motion/dom`, `@blinn-motion/react`, …). Core is for custom renderers, tooling, tests, and understanding the engine.\n\n## API surface\n\n| Export | Role |\n|--------|------|\n| `sample(doc, t)` | Resolve the full document at time `t` (seconds) |\n| `walk(node, fn)` / `findNode(tree, id)` | Traverse / look up resolved nodes |\n| `computeLayer(layer, t)` | Resolve a single layer’s animated state |\n| `Ticker` | Playback clock (`play` / `pause` / `seek` / `setProgress` / rate) |\n| `makeEasing` · `cubicBezier` · `springFn` | Easing functions |\n| `parseColor` · `lerpRgba` · … | Color helpers |\n| `evalTrack` · `interpKeys` · `applyOp` | Keyframe interpolation |\n| `resolvePaint` · `resolveStroke` · `resolveEffects` | Paint resolution |\n| `polygonVertices` · `starVertices` · … | Shape helpers |\n| `progressToTime` · `scrollProgress` · … | Progress / scroll utilities |\n| `VERSION` | Package version string |\n\nTypes (`MotionDoc`, `Layer`, `RenderTree`, …) are exported from the same entry.\n\n### Ticker (playback)\n\n```ts\nconst ticker = new Ticker({\n  duration: 2,   // seconds\n  loop: true,\n  rate: 1,\n  autoplay: false,\n});\n\nticker.onframe = (time, fraction) => { /* 0…duration, 0…1 */ };\nticker.play();\nticker.pause();\nticker.seek(0.5);           // absolute seconds\nticker.seekFraction(0.25);  // 0…1\nticker.setProgress(0.5);    // same as seekFraction; for scroll/gesture\nticker.setRate(1.5);\n```\n\n### Controlled progress\n\n`setProgress(0…1)` freezes clock-driven play and holds a specific frame — ideal for scroll-linked or scrubber-driven UIs. Adapters expose this as `progress` / `setProgress`.\n\n## MotionDoc\n\nA MotionDoc is plain JSON:\n\n```jsonc\n{\n  \"format\": \"motion-engine\",\n  \"version\": \"1.0\",\n  \"duration\": 1.2,\n  \"fps\": 60,\n  \"stage\": { \"width\": 375, \"height\": 600, \"background\": \"#0E1116FF\" },\n  \"layers\": [ /* … */ ]\n}\n```\n\n- Schema notes: [`SCHEMA.md`](./SCHEMA.md)\n- Full reference: [docs — MotionDoc](https://docs.blinnmotion.com/concepts/motiondoc)\n- Export from Figma with the [Blinn Motion plugin](https://docs.blinnmotion.com/guides/figma-plugin)\n\n## Related packages\n\n| Package | Role |\n|---------|------|\n| [`@blinn-motion/dom`](https://www.npmjs.com/package/@blinn-motion/dom) | Full-fidelity CSS / SVG painter |\n| [`@blinn-motion/canvas`](https://www.npmjs.com/package/@blinn-motion/canvas) | Pure-JS 2D canvas painter |\n| [`@blinn-motion/react`](https://www.npmjs.com/package/@blinn-motion/react) | React component + hooks |\n| [`@blinn-motion/vue`](https://www.npmjs.com/package/@blinn-motion/vue) | Vue 3 component + composable |\n| [`@blinn-motion/svelte`](https://www.npmjs.com/package/@blinn-motion/svelte) | Svelte action |\n| [`@blinn-motion/angular`](https://www.npmjs.com/package/@blinn-motion/angular) | Angular standalone component |\n| [`@blinn-motion/lit`](https://www.npmjs.com/package/@blinn-motion/lit) | `<blinn-motion>` custom element |\n| [`@blinn-motion/react-native`](https://www.npmjs.com/package/@blinn-motion/react-native) | React Native / Expo |\n\n## Links\n\n- [Documentation](https://docs.blinnmotion.com)\n- [Core API reference](https://docs.blinnmotion.com/reference/core-api)\n- [Landing](https://blinnmotion.com) · [GitHub](https://github.com/ismailyagci/blinn-motion)\n\n## License\n\nMIT © Blinn Motion\n","readmeFilename":"README.md","keywords":["blinn-motion","figma","figma-motion","motiondoc","animation","motion","timeline","render-engine","sampler","easing"]}