{"_id":"paperlab","_rev":"14-83f8857e5e655f7720059955d6a33814","name":"paperlab","dist-tags":{"latest":"0.9.0"},"versions":{"0.0.1":{"name":"paperlab","version":"0.0.1","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":{"name":"Noor Mtir"},"license":"Apache-2.0","_id":"paperlab@0.0.1","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://github.com/NourMtir0722/Paperlab#readme","bugs":{"url":"https://github.com/NourMtir0722/Paperlab/issues"},"dist":{"shasum":"62cc4d560c7e8a8af44131c770a0f8f3ffb302a8","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.0.1.tgz","fileCount":10,"integrity":"sha512-0VdfH+VPpPLu9GgSYkIUCaZA24MuOKLQsiocB088WZj9+RLDhCEYwwcs08IJJNLfPoy50VpLiYTy6aLHoMVuUw==","signatures":[{"sig":"MEYCIQCvyDgmB8iOcneZDAVEn8a7FPWD31aPGDMveRgbzcuExQIhAKtd1PJmfWNsjqUG0LIyExs19ypWZPD7GD9W8ymTTDQj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1592215},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"b43c2c6d6484712761d186996863a199421e656b","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"noormtir","email":"nawaracontact@gmail.com"},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"_npmVersion":"11.5.1","description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"24.5.0","dependencies":{"zod":"^3.24.0","@react-three/drei":"^10.0.0","three-custom-shader-material":"^6.4.0"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.10","publint":"^0.3.22","typescript":"^5.7.0","@types/react":"^19.0.0","@types/three":"^0.185.1","@react-three/fiber":"^9.0.0","@arethetypeswrong/cli":"^0.18.5"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.160","@react-three/fiber":">=9"},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.0.1_1785346988781_0.6769750788638635","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"paperlab","version":"0.2.0","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":{"name":"Noor Mtir"},"license":"Apache-2.0","_id":"paperlab@0.2.0","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://github.com/NourMtir0722/Paperlab#readme","bugs":{"url":"https://github.com/NourMtir0722/Paperlab/issues"},"dist":{"shasum":"1c32fa391c6354c00ee8e84577477967e0c1dcc7","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.2.0.tgz","fileCount":10,"integrity":"sha512-Sl9CXXPoy/2AkIU8Yi/2xKsu+r7hp3wuSAutrV64hLZ8JYdKRUTwMUOsRYVU0yBLI5MTHHzt3zF9X75LrSm3Dg==","signatures":[{"sig":"MEQCIArWFS12Coq3TjZYKNsa0lyIez75JUd6cZ+DdC3Wj/l7AiBkxJtlQcnLac4UpfC4CA4yGROQ8XD5enrl9qBHLSaIrg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2196680},"main":"./dist/index.cjs","type":"module","_from":"file:paperlab-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"_resolved":"/tmp/b22a1fee33f957aa6f7bb45d4183d90d/paperlab-0.2.0.tgz","_integrity":"sha512-Sl9CXXPoy/2AkIU8Yi/2xKsu+r7hp3wuSAutrV64hLZ8JYdKRUTwMUOsRYVU0yBLI5MTHHzt3zF9X75LrSm3Dg==","repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"_npmVersion":"11.19.0","description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.0","@react-three/drei":"^10.0.0","three-custom-shader-material":"^6.4.0"},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.10","publint":"^0.3.22","typescript":"^5.7.0","@types/react":"^19.0.0","@types/three":"^0.185.1","@react-three/fiber":"^9.0.0","@arethetypeswrong/cli":"^0.18.5"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.160","@react-three/fiber":">=9"},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.2.0_1786644897402_0.12939285145876944","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"paperlab","version":"0.3.0","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":{"name":"Noor Mtir"},"license":"Apache-2.0","_id":"paperlab@0.3.0","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://github.com/NourMtir0722/Paperlab#readme","bugs":{"url":"https://github.com/NourMtir0722/Paperlab/issues"},"dist":{"shasum":"eb523f3c0152cb6e1e8ceeeac656c6e020a5eab4","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.3.0.tgz","fileCount":20,"integrity":"sha512-Mww3jbmEn+MUFkUaRKeqJiZ9jTwplA25484QsErDIhZQC4qP72ovlSthFG9HnJIj1JdcmDgdgDJ/FRFT2wIATQ==","signatures":[{"sig":"MEUCIQDJPHn/3W+otvR1RgXAsDM0s6WK+X10/cUUdk6aKCTaBwIgKMAxC9EB/lQk6yXIed/9Fnniie0UmxMfdami054Q4rc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4061110},"main":"./dist/index.cjs","type":"module","_from":"file:paperlab-0.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"_resolved":"/tmp/c21cfa8dcc874014a5b1bae6cbddc674/paperlab-0.3.0.tgz","_integrity":"sha512-Mww3jbmEn+MUFkUaRKeqJiZ9jTwplA25484QsErDIhZQC4qP72ovlSthFG9HnJIj1JdcmDgdgDJ/FRFT2wIATQ==","repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"_npmVersion":"11.19.0","description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.0","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.11","publint":"^0.3.23","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.0.5"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.3.0_1787487634693_0.9662512551341718","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"paperlab","version":"0.3.1","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":{"name":"Noor Mtir"},"license":"Apache-2.0","_id":"paperlab@0.3.1","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://github.com/NourMtir0722/Paperlab#readme","bugs":{"url":"https://github.com/NourMtir0722/Paperlab/issues"},"dist":{"shasum":"262086131d2ab7f12edeb4cc7b6dfffa256d7858","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.3.1.tgz","fileCount":20,"integrity":"sha512-xM3Zc+2V/tiL8s+ep6A1KHms6smkhAb/j/+DqHj4NgHH2695D9YRWwM+xQczc+b4TVrGygDoCqcdSzcHPZBlvQ==","signatures":[{"sig":"MEUCIQCQqaa1PB78eAPwMrLdKtjT68WRN3WxQdjINySMKWKtzQIgep5AMd/v/zqSD/INCA8kvy/DQhxt4EDhxH0Z/SO5afI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4067009},"main":"./dist/index.cjs","type":"module","_from":"file:paperlab-0.3.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"_resolved":"/tmp/c473a89dcb9d9adbe22d173c95c15093/paperlab-0.3.1.tgz","_integrity":"sha512-xM3Zc+2V/tiL8s+ep6A1KHms6smkhAb/j/+DqHj4NgHH2695D9YRWwM+xQczc+b4TVrGygDoCqcdSzcHPZBlvQ==","repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"_npmVersion":"11.19.0","description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.0","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.11","publint":"^0.3.23","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.0.5"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.3.1_1787521532987_0.8818541716890842","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"paperlab","version":"0.4.0","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":{"name":"Noor Mtir"},"license":"Apache-2.0","_id":"paperlab@0.4.0","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://github.com/NourMtir0722/Paperlab#readme","bugs":{"url":"https://github.com/NourMtir0722/Paperlab/issues"},"dist":{"shasum":"e29e38c10c75c13c3f1450913ad9e01d88fedc9a","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.4.0.tgz","fileCount":20,"integrity":"sha512-wqqw9eviYSjXtEbtbwsywB5ZAKANTduZmu1jxsFuRColFw0rC0vsh34JEsYGBoxjfHvJiFVoKlhB4M7T13bYEQ==","signatures":[{"sig":"MEYCIQCHPCMArGg9C7N3scdhu+8ekrgrYwNtb58Wd9HB0aTX1QIhALyrtWF2AGCdQW/13c5h9lli4JTV29+X1zQnbiFVVQVQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3860681},"main":"./dist/index.cjs","type":"module","_from":"file:paperlab-0.4.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"_resolved":"/tmp/68bfeb571d32f0298c1b6a59417963b0/paperlab-0.4.0.tgz","_integrity":"sha512-wqqw9eviYSjXtEbtbwsywB5ZAKANTduZmu1jxsFuRColFw0rC0vsh34JEsYGBoxjfHvJiFVoKlhB4M7T13bYEQ==","repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"_npmVersion":"11.19.0","description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.0","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.11","publint":"^0.3.23","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.0.5"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.4.0_1787527002817_0.5157402415478349","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"paperlab","version":"0.5.0","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":"Noor Mtir","license":"Apache-2.0","_id":"paperlab@0.5.0","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://paperlab.nawwara.studio","bugs":"https://github.com/NourMtir0722/Paperlab/issues","dist":{"shasum":"a04d42f1984b4cae8f2b6ce3e531790b5a3e0ddf","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.5.0.tgz","fileCount":20,"integrity":"sha512-Il4R8ym950I8nk8UURD/dotSHVBE1opxfpjYlyjWiQWt4WP1DopYMPXWmtzxKfn8B8SzBzRSJsKsll+ZgmEdcA==","signatures":[{"sig":"MEYCIQCrFy6gIYw2XX+pVrOcSznIsK9GtGbFnR8Gucv0R1s7jAIhAODIfSrSMd6UQMyCrR+FxfzDnhSrzw4baUL30wW3UKJO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4576334},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.0","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.11","publint":"^0.3.23","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.0.5"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.5.0_1787617471599_0.7267066508588771","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"paperlab","version":"0.5.1","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":"Noor Mtir","license":"Apache-2.0","_id":"paperlab@0.5.1","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://paperlab.nawwara.studio","bugs":"https://github.com/NourMtir0722/Paperlab/issues","dist":{"shasum":"7d82cecd2c1cec5b69e258b36c6726a884b6d131","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.5.1.tgz","fileCount":20,"integrity":"sha512-1OCbueBdjASDvoYyFfk5FX3MisociAxozoD75GAS8jNEg3VexuiVAto++ZudaJVFoCNkK9mOTHnnqCsFeHumqQ==","signatures":[{"sig":"MEUCIQDmNmxBflMUk5KK/AP48wghOvDfVRTQAhpqL1ZzcubHbgIgJ09BlzzzKReactJO2eWZlPZTB/nTUByFUYHCLomdjBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4588887},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.0","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.11","publint":"^0.3.24","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.1.0"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.5.1_1787923411207_0.3161582185725895","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"paperlab","version":"0.5.2","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":"Noor Mtir","license":"Apache-2.0","_id":"paperlab@0.5.2","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://paperlab.nawwara.studio","bugs":"https://github.com/NourMtir0722/Paperlab/issues","dist":{"shasum":"7afe0eb3f690604c60d15999bb2d9b944927da1c","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.5.2.tgz","fileCount":20,"integrity":"sha512-7KZg8DWHLGkXltFMjKOzmPMo3VBtM15uOpMfQC+GtBcvHid015x6I5t8V8f5BcamWoBxYgjGl2Wd8Ce6KwPSBg==","signatures":[{"sig":"MEQCIHCqm60ThFU8URnliBJx+PgG4yGG1KgckYwvJq51gSMvAiAMs2FnpAK1dyMKjhakQVsb1FqLx5DGhKVW/cmEJ1my+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4591660},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.24.0","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.11","publint":"^0.3.24","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.1.0"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.5.2_1787952940919_0.46613172222396404","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"paperlab","version":"0.6.0","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":"Noor Mtir","license":"Apache-2.0","_id":"paperlab@0.6.0","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://paperlab.nawwara.studio","bugs":"https://github.com/NourMtir0722/Paperlab/issues","dist":{"shasum":"9a417c369686724010e2c37192ed4bd6218a9e4d","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.6.0.tgz","fileCount":20,"integrity":"sha512-OAU1yjoBe7RQQTXH7zF00eoeS3PZTQqSAQky6xjgJm9r5SJUrFZvLaWrIWC4Nl2KTKXsWdMIsiAHsw87byoJ+Q==","signatures":[{"sig":"MEQCIB29XdsvpCO9qn7jg7QwBT56phWuZ/H5rg89RpO3cmpNAiBvysThtMUwRziin3CTs7m7vnDvhckGEvle6LcD3+tYaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4525655},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^4.1.11","publint":"^0.3.24","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.1.1"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.6.0_1788354007355_0.14675915701322872","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"paperlab","version":"0.7.0","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":"Noor Mtir","license":"Apache-2.0","_id":"paperlab@0.7.0","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://paperlab.nawwara.studio","bugs":"https://github.com/NourMtir0722/Paperlab/issues","dist":{"shasum":"6e5ef6deb5021af56e5966fdfc6753093dad8776","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.7.0.tgz","fileCount":36,"integrity":"sha512-6SensnU9LnepkF30gV8/mGsXXTU5016/0wl1in5l9u8KuFldFZKJRvsMTPTso1OonrDap3bReOPMxcleW14Pcw==","signatures":[{"sig":"MEYCIQD0mVegfAwVJswQoDtqyy4weYdWxFLqeMj0vmRuxRUMGAIhAIRtv8VGuIyRfB1tcTR5h7rEUr/TFhAcMtZw1BUECWIC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6286300},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./fx":{"import":{"types":"./dist/fx.d.ts","default":"./dist/fx.js"},"require":{"types":"./dist/fx.d.cts","default":"./dist/fx.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"fx":["./dist/fx.d.ts"],"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^5.0.0","publint":"^0.3.24","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.1.1"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.7.0_1789289061308_0.3108660887814294","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"paperlab","version":"0.7.1","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":"Noor Mtir","license":"Apache-2.0","_id":"paperlab@0.7.1","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://paperlab.nawwara.studio","bugs":"https://github.com/NourMtir0722/Paperlab/issues","dist":{"shasum":"66145b343d866a0493a52f8578f60c4bec7b280b","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.7.1.tgz","fileCount":36,"integrity":"sha512-JUOUNKd3Uy8uKXK3gAJ0B2+O9bLIflaoJzF404ugWitBmngLzcnSFKs4mhxy1q3qqRAwlC+cTznwLB7DvneRLg==","signatures":[{"sig":"MEUCIQC0KN9IgX7pkojZVS8wrP2LLFqiEDZIyWopNNbpGkh+qgIgTEzigF07PUCmotfYSb+Xdv3mu7uSqQmgqy6Zi0csHxg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6349076},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./fx":{"import":{"types":"./dist/fx.d.ts","default":"./dist/fx.js"},"require":{"types":"./dist/fx.d.cts","default":"./dist/fx.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"fx":["./dist/fx.d.ts"],"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^5.0.0","publint":"^0.3.24","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.1.1"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.7.1_1789331697702_0.8737496431349883","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"paperlab","version":"0.8.0","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":"Noor Mtir","license":"Apache-2.0","_id":"paperlab@0.8.0","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://paperlab.nawwara.studio","bugs":"https://github.com/NourMtir0722/Paperlab/issues","dist":{"shasum":"ac86ad625beb468c03d71f42f85abf6f3b036202","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.8.0.tgz","fileCount":36,"integrity":"sha512-vXArKm8YfYoNWs/VdNvHWDd+HvmNwbPgSZIDTbq77jRFIoc9s0xb8G/bcDeOe/gkBjbHTJFauDWMSWhchcSIEA==","signatures":[{"sig":"MEUCIQC48wSCvS1HuSzdCKpaJby/E/BvJ9U1aCs5kPZjGBEOBQIgJigHiOmn/TptZN7CS2nhYYz6u3WHcftG6we/fdt9xUo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6508607},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./fx":{"import":{"types":"./dist/fx.d.ts","default":"./dist/fx.js"},"require":{"types":"./dist/fx.d.cts","default":"./dist/fx.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"fx":["./dist/fx.d.ts"],"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.185.1","vitest":"^5.0.0","publint":"^0.3.24","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.185.4","postprocessing":"^6.36.0","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.1.1"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.8.0_1789337218372_0.5702316663414797","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"paperlab","version":"0.8.1","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"author":"Noor Mtir","license":"Apache-2.0","_id":"paperlab@0.8.1","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"homepage":"https://paperlab.nawwara.studio","bugs":"https://github.com/NourMtir0722/Paperlab/issues","dist":{"shasum":"f87909abce8516ec80992bc6e10d3bd4941c9a93","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.8.1.tgz","fileCount":36,"integrity":"sha512-PKXArVLRDzxWMgsNOH0mNw9PzQkc8vDBoLDXJVpxQTNm9DB2Rexis7V7vgWOKXVhRsnF67rIkVfGvHxwXLiXcw==","signatures":[{"sig":"MEQCIE4SjRP7Tc59nw4m2OSkMT7CIMX/UCyaavbL2jZevFcYAiB+MI8l5HyFsPZRvJAo6sZfQGFZs9stDe37siVc+ZqaGw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGaYJjyZVEyEV1vmb9mwMWwNTeKVJRE0vCX/FhUMeclfAiB9JNYRjPxzpLX5EPz2oIXWeSWM5Y0s8sqXZ7PsBg05sQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/paperlab@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6508145},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./fx":{"import":{"types":"./dist/fx.d.ts","default":"./dist/fx.js"},"require":{"types":"./dist/fx.d.cts","default":"./dist/fx.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b168eb4a-5ad0-4b0b-a673-61ee6b436de4"}},"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.6.4","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"fx":["./dist/fx.d.ts"],"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.186.0","vitest":"^5.0.0","publint":"^0.3.24","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.186.0","postprocessing":"^6.39.5","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.1.1"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/paperlab_0.8.1_1789738124144_0.5704156703639107","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"_id":"paperlab@0.9.0","bugs":{"url":"https://github.com/NourMtir0722/Paperlab/issues"},"dist":{"shasum":"bdac6f835bde7c24a3d7a69b2483a5879dffe9ca","tarball":"https://registry.npmjs.org/paperlab/-/paperlab-0.9.0.tgz","fileCount":36,"integrity":"sha512-+geN8pjqFU3qtM9SOnvjJbQ1s2wKfS1G/I/6Loqja9AS3v/zhdOthGX+ZGQs5+ScROtFCrEzKafKvQTFYbp2NA==","signatures":[{"sig":"MEQCIEXcO+hOp0T17ZwooTP6CW2j0ED9LNT3RTiEgK2qMfhnAiBlh98mPE764Qt61vE2pPdxCZeEQlSg/DejpQH6SHQkrA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCMDYfYf++tufciO+4xMBSMkWZ2ad1eB7lySpO4aXOqkAIhAKtBENZB6qAuPJFr2eoDoOXnuiaZ5KRC/GsXZNtWDYgh"}],"unpackedSize":7648596},"main":"./dist/index.cjs","name":"paperlab","type":"module","types":"./dist/index.d.ts","author":{"name":"Noor Mtir"},"module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./fx":{"import":{"types":"./dist/fx.d.ts","default":"./dist/fx.js"},"require":{"types":"./dist/fx.d.cts","default":"./dist/fx.cjs"}},"./stage":{"import":{"types":"./dist/stage.d.ts","default":"./dist/stage.js"},"require":{"types":"./dist/stage.d.cts","default":"./dist/stage.cjs"}}},"license":"Apache-2.0","scripts":{"dev":"tsup --watch","test":"vitest run","build":"node ../../tools/sync-readme.mjs && node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsup","typecheck":"tsc --noEmit","check:package":"publint && attw --pack ."},"version":"0.9.0","_npmUser":{"name":"noormtir","email":"nawaracontact@gmail.com"},"homepage":"https://paperlab.nawwara.studio","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"_npmVersion":"11.19.0","description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","directories":{},"maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{"zod":"^4.6.4","@react-three/drei":"^10.7.8","three-custom-shader-material":"^6.4.0"},"typesVersions":{"*":{"fx":["./dist/fx.d.ts"],"stage":["./dist/stage.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"gsap":"^3.12.0","tsup":"^8.3.0","react":"^19.2.8","three":"^0.186.0","vitest":"^5.0.1","publint":"^0.3.24","typescript":"^5.7.0","@types/react":"^19.2.18","@types/three":"^0.186.0","postprocessing":"^6.39.5","@react-three/fiber":"^9.7.0","@arethetypeswrong/cli":"^0.18.5","@react-three/postprocessing":"^3.1.1"},"peerDependencies":{"gsap":">=3.12","react":">=19","three":">=0.162","postprocessing":">=6.36","@react-three/fiber":">=9","@react-three/postprocessing":">=3"},"peerDependenciesMeta":{"postprocessing":{"optional":true},"@react-three/postprocessing":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/paperlab_0.9.0_1794248877315_0.30324825671014066"}}},"time":{"created":"2026-07-29T17:43:08.727Z","modified":"2026-11-09T18:27:57.639Z","0.0.1":"2026-07-29T17:43:08.945Z","0.2.0":"2026-08-13T18:14:57.585Z","0.3.0":"2026-08-23T12:20:34.886Z","0.3.1":"2026-08-23T21:45:33.152Z","0.4.0":"2026-08-23T23:16:42.975Z","0.5.0":"2026-08-25T00:24:31.767Z","0.5.1":"2026-08-28T13:23:31.394Z","0.5.2":"2026-08-28T21:35:41.164Z","0.6.0":"2026-09-02T13:00:07.564Z","0.7.0":"2026-09-13T08:44:21.487Z","0.7.1":"2026-09-13T20:34:57.873Z","0.8.0":"2026-09-13T22:06:58.612Z","0.8.1":"2026-09-18T13:28:44.275Z","0.9.0":"2026-11-09T18:27:57.473Z"},"bugs":{"url":"https://github.com/NourMtir0722/Paperlab/issues"},"author":{"name":"Noor Mtir"},"license":"Apache-2.0","homepage":"https://paperlab.nawwara.studio","keywords":["react","three","threejs","react-three-fiber","paper","3d","animation","gallery","webgl","receipt","page-curl","cloth"],"repository":{"url":"git+https://github.com/NourMtir0722/Paperlab.git","type":"git","directory":"packages/paperlab"},"description":"Physical, realistic paper as a React component. Sculptable sheets, preset-driven, geometry-true curl.","maintainers":[{"name":"noormtir","email":"nawaracontact@gmail.com"}],"readme":"# Paperlab\n\n**Physical, realistic paper as a React component.**\n\n[![npm](https://img.shields.io/npm/v/paperlab.svg)](https://www.npmjs.com/package/paperlab)\n[![CI](https://github.com/NourMtir0722/Paperlab/actions/workflows/ci.yml/badge.svg)](https://github.com/NourMtir0722/Paperlab/actions/workflows/ci.yml)\n[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](https://github.com/NourMtir0722/Paperlab/blob/main/LICENSE)\n\nA hero image that peels, a receipt that unrolls, a letter that folds, a poster rippling in wind, a gallery ring of prints — and a sheet that burns. A sheet is real 3D geometry, not a CSS trick and not a video — content is a texture on a mesh that genuinely bends, so text and imagery curl with perfect continuity.\n\n**[Try it →](https://paperlab.nawwara.studio/)**  ·  [the editor](https://paperlab.nawwara.studio/editor/) (desktop)  ·  [the reference](https://paperlab.nawwara.studio/docs/)  ·  [with your hands](https://paperlab.nawwara.studio/hands/) (webcam)  ·  [the FX Lab](https://paperlab.nawwara.studio/fx-lab/)  ·  [for coding agents](https://github.com/NourMtir0722/Paperlab/blob/main/AGENTS.md)\n\n| | |\n|---|---|\n| ![A thermal receipt unrolling from a paper roll](https://paperlab.nawwara.studio/media/receipt-unroll.gif) | ![A gloss card with its corner peeling up off the page](https://paperlab.nawwara.studio/media/hero-peel.gif) |\n| ![A letter folding itself into thirds](https://paperlab.nawwara.studio/media/letter-fold.gif) | ![A page turning on its spine](https://paperlab.nawwara.studio/media/page-flip.gif) |\n\nEvery frame above is real geometry — no video, no sprite sheet.\n\n## Install\n\n```sh\nnpm i paperlab three @react-three/fiber gsap\n```\n\nRequires React ≥ 19 and three ≥ 0.162. TypeScript types ship with the package; both ESM and CJS builds are published.\n\n> **npm users:** `@react-three/fiber@9.7.0` caps React at `>=19 <19.3`, and npm installs React 19.3 by default, so the line above can fail with `ERESOLVE`. Ask for a React the renderer accepts — `npm i paperlab three @react-three/fiber gsap react@19.2 react-dom@19.2` — until fiber widens its range. pnpm and yarn resolve it without complaint. This is upstream's ceiling, not Paperlab's: the library itself supports any React ≥ 19.\n\nPaperlab has three entry points, and a bundle only resolves the ones it imports:\n\n| | |\n|---|---|\n| `paperlab` | `<Paper>`, `<PaperMesh>` and `<PaperField>` — the sheet, and many sheets |\n| `paperlab/stage` | `<PaperStage>` — paper as architecture |\n| `paperlab/fx` | what happens **to** the paper — the fire, and everything it throws off |\n\nStage mode and the fire's glow need two more peers:\n\n```sh\nnpm i @react-three/postprocessing postprocessing\n```\n\nThey are genuinely optional, in both directions. `<Paper>` and `<PaperField>` never reach for them, so a bundle that does not import `paperlab/stage` or `paperlab/fx` contains none of it — the subpath keeps the import specifier itself out of your build graph. And both load their print pass on demand rather than at module scope, so they render without the peers too: you lose the tone curve, bloom, vignette and grain, and the console says so once.\n\n## Quick start\n\n```tsx\nimport { Paper } from 'paperlab'\n\n// One line. (The parent element needs a height — <Paper> fills it.)\n<Paper preset=\"receipt-unroll\" autoplay />\n```\n\nOr configure it yourself:\n\n```tsx\n<Paper\n  sheet={{ width: 1, height: 2.6 }}\n  stock=\"thermal\"\n  content={{ type: 'receipt', store: 'your.store', items: [{ name: 'Thing', price: 12 }] }}\n  behavior={{ type: 'unroll', progress: 0.6, tightness: 0.5 }}\n  surface={{ deckle: { edges: ['bottom'] } }}\n  interactive\n  autoplay\n/>\n```\n\n## The four components\n\n| | |\n|---|---|\n| `<Paper>` | one sheet, owns its own `<Canvas>`, fills its parent |\n| `<PaperMesh>` | the same sheet without a canvas, for an existing React Three Fiber scene |\n| `<PaperField>` | many sheets in **one instanced draw call**, arranged by a layout |\n| `<PaperStage>` | paper as architecture — a room of hanging banners you can walk through (`paperlab/stage`) |\n\nA gallery is one component:\n\n```tsx\nimport { PaperField } from 'paperlab'\n\n<PaperField images={photos} preset=\"photo-print\" layout=\"ring\" />\n```\n\nAnd a space built out of a sentence is one component:\n\n```tsx\nimport { PaperStage } from 'paperlab/stage'\n\n<PaperStage text=\"the paper remembers every hand that folded it\" progress={scroll} />\n```\n\n## The catalogue\n\nEverything below is rendered by the library itself and regenerated from the\nregistries — `pnpm media`, `pnpm shot:catalogue`, `pnpm sheet`. No mockups.\n\n### Behaviors — 12\n\n- **Behaviors** — `peel`, `unroll`, `flip`, `letter-fold`, `hang`, `fly`, `fall`, `carry`, `flight`, `crumple`, `settle`, `ribbon`, `sticker`: human-named params (\"tightness\", not \"cylinderRadius\") over a stack of pure geometry deformers. Each behavior nominates the two or three params that *are* it, so tools can lead with those. Draggable handles when `interactive`.\n\nUnderneath them are seven **deformers** — `roll`, `curl`, `bend`, `fold`, `wave`, `drape`, `crumple` — each a pure vertex mapping written twice: a JS implementation for the CPU/hero path and a GLSL twin for the GPU/field path. A 37-case golden-vector gate holds the two identical, and a separate test asserts each one actually draws a surface. All arc-length preserving, because paper does not stretch.\n\n### Stocks — 7\n\n![The same letter on all seven paper stocks, side by side](https://paperlab.nawwara.studio/media/stocks.jpg)\n\nOne sheet of words, seven papers. Stock is not a colour swap: thermal takes on banding, newsprint takes grain, vellum goes translucent and lets the light through it. On top of stock sit composable surface effects — grain, torn deckle edges, crease lines, perforation, aging — as shader chunks. Alpha-affecting effects use `alphaTest` rather than blending, so shadows stay correct.\n\n### Memory — the paper keeps what you do to it\n\nPaper is plastic where cloth is elastic. Every deformer here is a pure function of its options, so a sheet folded to 180° and back to 0° used to come out pristine — right for cloth, wrong for the one material this library models. Now it creases.\n\nA fold that closes past 45° at a line that stays put leaves a crease behind at `peak × set`, where `set` is how much that paper keeps: kraft holds one hard, vellum springs back. A fold whose line *travels* leaves nothing, which is why paper coming off a roll is bent at the floor rather than creased along it. Creases bend the sheet as well as marking it, they can be handed to a paper that was never folded (a letter that arrives having been folded once), and they serialize — into a preset, and down a share link.\n\n```tsx\n<Paper preset=\"letter-fold\" memory={{ set: 0.6 }} onCrease={save} />\n```\n\n### Fire — paper that burns\n\n`<Paper damage={source}>` hands a sheet a grid of char, water, heat and missing paper over its own UV, and the sheet draws it without knowing what caused it — the same split `content` already has. So a live simulation, a baked texture and a recorded burn played back all work the same way.\n\nA burnt edge is drawn in the layers a real one has, measured in millimetres from the cut: a pale ash lip, a beaded ember line (the only part of the sheet that gives off light), a black char band, and a scorch with a steep edge into clean paper. On a cloth sheet the same grid reaches the physics too — char shrinks the paper and curls it toward the flame, wet paper gets heavier, and paper that has burnt away leaves the simulation, so a piece the fire cuts loose falls away with its own burnt edge.\n\nWhat *causes* the damage lives in `paperlab/fx`:\n\n- **`DamageField`** — heat, water, char and presence, simulated on the CPU with the paper's grain and fibre direction in it. It is untiered, so the same seed burns the same way on any device, and it burns at the speed real paper does: a few millimetres a second.\n- **`FxFireFluid`** — the flames: a small GPU fire simulation fed from the hot rim in uneven clusters. Fuel burns where air reaches it, so a tongue has a pale core, a yellow body and a torn tip, and every zone of it is an option.\n- **`FxFireLight`** — the burn is a light source. It lights the sheet, glows through it, and through `DamageSource.firelight` the room it burns in dims around it.\n- **The rest of a fire** — embers, smoke and ash (`FxParticles`), a match held in a hand (`FxMatchFlame`), the thread of smoke from a smouldering bead (`FxWisps`), the embers left after the flames (`Afterglow`), and the bloom and heat haze (`FxPost`).\n\nEvery default is a tune made in the [FX Lab](https://paperlab.nawwara.studio/fx-lab/), and every one of them is an option you can set. See [AGENTS.md](https://github.com/NourMtir0722/Paperlab/blob/main/AGENTS.md) for the wiring.\n\n### Layouts — 12\n\n![All twelve field layouts rendered side by side](https://paperlab.nawwara.studio/media/layouts.jpg)\n\nEvery layout names somewhere paper actually sits: `book` (pages splayed from a spine — `split: 0` makes it a swatch deck), `accordion` (one continuous concertina strip), `fan` (a hand of cards), `spread` (a stack slid sideways), `pile` (a heap on a desk), `rack` (prints stood in a row, leaning back), `wall` (a pinned studio wall), `spill` (a dropped stack mid-air), `colonnade` (banners along a walk, for stage mode), `ring`, `sheet`, and `sweep` — a specimen chart of one sheet at ten stages of the same curl.\n\nEach pose also carries a **bias**: how strongly that one sheet takes the deformation. So the top of a pile curls while the sheets pressed underneath lie flat — in the same draw call. A whole field is **one instanced draw call** with the deformers running on the GPU, and the camera frames itself from the layout's own poses, so a wide `wall` and a deep `ring` both land without hand-tuning.\n\n![Twelve cards standing in a ring, each with its corner peeling, rotating slowly](https://paperlab.nawwara.studio/media/field-ring.gif)\n\nTwelve sheets, twelve peeled corners, **one draw call** — the deformers run on the GPU and the text curls with the mesh.\n\n### Lighting — 8 rigs\n\n![The same letter under all eight lighting rigs](https://paperlab.nawwara.studio/media/lighting.jpg)\n\nA rig is the starting point, not the ceiling. `light={{ exposure, film, key, color, direction, height, ambient, studio, haze }}` moves the lamp in the terms a person would say it in — degrees around the room, degrees above the horizon — and **studio** is the room itself as an environment map, which is what gives paper directional fill and something for its sheen to reflect. `window` and `leaves` carry a gobo; `lightbox` puts the source behind the sheet and lets you read it through the paper.\n\nOverrides serialize *as* overrides, so a shared scene carries the two sliders you moved rather than a frozen copy of a rig you never touched.\n\n### Stage — paper as architecture\n\n![Printed banners hung down both sides of a colonnade, lit from an opening at the far end](https://paperlab.nawwara.studio/media/stage-nave.gif)\n\nBanners hung the height of a room along a walk you travel, with light coming through the paper from an opening at the far end. `<PaperStage text=\"…\" />` builds the whole space out of a sentence, and binding `progress` to scroll makes the page scroll the walk.\n\nThe room is real — a ceiling, poured floor slabs, columns with base plates, and a doorway the source shines through — because **architecture carries scale better than a figure does**. There is a walking figure, and it is off by default: the stage is navigable, so the person in the hall is the viewer.\n\n**Six rooms ship**, and they are not variations on a theme — the walk changes shape, the paper changes proportion, the light changes where it comes from:\n\n![The six stage presets — nave, procession, cloister, threshold, ribbon and archive](https://paperlab.nawwara.studio/media/stages.jpg)\n\nEvery one of those is built from the same two things: sheets of paper, and words printed on them. No imagery, no textures from anywhere else.\n\n**Four camera shots** frame any of them, each reading the same walk as the arrangement and the light, so they cannot drift apart:\n\n![The four stage camera shots — follow, lead, low and wide](https://paperlab.nawwara.studio/media/camera.jpg)\n\nAnd it is navigable rather than a video. It drifts on its own until you touch it, then drag it (with inertia), wheel it, step banner to banner with the arrow keys, or click the paper you want to stand in front of. The stops come from the layout, so a step lands *on* a banner. `motion={{ capture: false }}` for a stage inside a scrolling page, so it never eats a reader's scroll. Quality adapts to the machine on its own across four tiers.\n\n### The rest\n\n- **Content** — `blank`, `image`, `text`, `card` and `receipt`, any of which can also sit on the reverse of the sheet via `content.back`. Text is measured and wrapped with real tracking applied *before* measurement, so the painted line matches the line it was broken to.\n- **Physics** — curated idle motion (`float`, `tumble`, `dangle`, `taped`, `breeze`) that composes with behaviors, and a verlet **cloth** mode: pin the top edge, add wind, grab the sheet and pull. Cloth and behaviors are mutually exclusive by schema — cloth owns the vertices.\n- **A floor** — `scene.floor` puts dark, matte ground under the paper. The contact shadow, a simulated sheet and anything the paper lets go of all meet at the same height, so a falling piece lands on the thing casting its shadow instead of through it.\n- **Interaction states** — a preset can carry `states`: overrides-on-base diffs keyed `rest` / `hover` / `pressed` / `picked` / `placed`, with the triggers built in. Drag a stamp past its threshold and it tears off its sheet (the perforation edges facing its neighbours flip to torn), release it over a `<DropZone>` and it settles, release it anywhere else and it flutters home. The whole flow is reachable from the keyboard: focus a paper, Enter picks, arrows move between zones, Enter places, Escape returns it.\n- **Hardware that holds the paper up** — thread to the ceiling or a rod across the top edge, gripped by a clip or a peg. A hung thing that shows what holds it stops reading as a rectangle that happens to float.\n- **Presets** — 19 paper presets and 6 stage presets, and everything serializes to `.paper` JSON validated by a zod schema. Diffable, forkable, shareable.\n- **Agent-first export** — the editor's **Copy for AI** produces a self-contained brief you paste into a coding agent: install line, inlined component, placement contract, and a verification step the agent can self-check. See [AGENTS.md](https://github.com/NourMtir0722/Paperlab/blob/main/AGENTS.md) and [docs/llms.txt](https://github.com/NourMtir0722/Paperlab/blob/main/docs/llms.txt).\n- **Accessible by default** — `prefers-reduced-motion` freezes behaviors at their pose and disables physics, entrances and the fire's simulations, a hidden DOM mirror carries the content for screen readers and find-in-page, and a flat DOM fallback renders when WebGL isn't available.\n\nThe zod schema in `config/schema.ts` is the single source of truth: it validates the API, generates the editor's controls, defines the file format and feeds the docs. If a feature can't serialize into a preset, it doesn't ship. (Damage is the one deliberate exception: it is live state, so it is a prop and never part of a preset or a share link.)\n\n## Papers are made to be passed around\n\nA paper is data — a `.paper` JSON object validated by a zod schema — so it travels without asking anyone's permission. **You do not need to fork this repo to share one.**\n\n**Sending one.** Sculpt a paper in the [editor](https://paperlab.nawwara.studio/editor/) and pick **Export → Copy share link**: you get a link with the whole paper packed into it. Anyone who opens that link lands in their own editor with your paper loaded and *editable* — a fork, not a read-only view. (Uploaded images are too big for a URL; use the ⬇ download and send the `.paper` file instead.)\n\n**Receiving one.** Open the link, or drag a `.paper` file onto the preset panel. Either way it lands in your library next to the built-ins.\n\n**Using one in your project.** A `.paper` file *is* a preset object, so it goes straight in:\n\n```tsx\nimport alice from './alice-note.paper.json'\n\n<Paper preset={alice} autoplay />\n```\n\nOr register it once by name and refer to it everywhere:\n\n```tsx\nimport { registerPreset } from 'paperlab'\n\nregisterPreset('alice-note', alice)\n<Paper preset=\"alice-note\" />\n```\n\nThat's the whole loop: **make → send → remix → ship.** If you'd rather your paper shipped *with* the library so everyone gets it by name, that's the first rung of [CONTRIBUTING.md](https://github.com/NourMtir0722/Paperlab/blob/main/CONTRIBUTING.md) — a preset PR is JSON and no code.\n\n## The apps\n\nTwo sites ship alongside the library, both built on its public API only. [paperlab.nawwara.studio](https://paperlab.nawwara.studio/) opens the editor.\n\n**[The editor](https://paperlab.nawwara.studio/editor/)** — a three-rail canvas tool: presets on the left, sculpt on canvas, inspector on the right, transport at the bottom (space = play/pause), undo and redo on ⌘Z. One switch along the top moves between five surfaces that all wear that same frame — **Paper · Field · Stage · Hands · FX Lab** — and the top-right holds a single button, **Export**.\n\n![The Paperlab editor in paper mode, showing a thermal receipt on the canvas with the inspector open](https://paperlab.nawwara.studio/media/editor.jpg)\n\nThe inspector is generated from the zod schema, so it can never drift from the API. Each behavior nominates the two or three params that *are* it — `unroll` opens on progress and tightness, and folds sheet, stock, content, surface, physics and scene away behind their own headings. Labels drag to scrub: full range in ~300px, shift for a 4× finer pass, click the readout to type an exact value.\n\n![The editor in field mode, fourteen cards arranged in a ring with the layout panel open](https://paperlab.nawwara.studio/media/editor-field.jpg)\n\nField mode composes galleries against the same panel — swap the layout, watch fourteen papers rearrange in one draw call. **Export** ends the session wherever you are going next: a share link, an image framed for a post, a story or a slide, the component or its JSON for your codebase, or **Copy for AI** for a coding agent. It wants a real screen: under about 900px it says so rather than handing you half a tool.\n\n- **[FX Lab](https://paperlab.nawwara.studio/fx-lab/)** — every knob behind the burn, around the sheet it is burning: the flame's zones, the fluid, the bloom, the light it throws, the ash lip and the char, how fast it eats and how much of the sheet it takes. The library's defaults are a tune made here. Scrub the burn, turn something, and **Export** copies the tune out as JSON to pass to `<Paper>`.\n- **[Hands](https://paperlab.nawwara.studio/hands/)** — set fire to the paper with a real flame. Hold a lighter up to the camera and the sheet catches where the flame is; with no lighter, pinch and hold still and you are holding a match; with no camera, there is a button. The page draws your hand as it tracks it and boxes the flame when it finds one, and once a flame touches the paper the fire runs from there until the whole sheet has burnt. Blow to put it out. It burns the way the FX Lab burns, from the same defaults, and the page is a hundred percent public API — `packages/paperlab` doesn't know it exists.\n\nThe flame detector is arithmetic over the camera's pixels, not a model: a flame is bright, warm in the order red-green-blue, and never still, and the last of those three is what keeps a desk lamp from lighting your paper. The hand tracking is [MediaPipe](https://ai.google.dev/edge/mediapipe) (`@mediapipe/tasks-vision`, Apache-2.0) and it runs entirely in your browser: the models download from Google once, and after that no video and no measurement taken from it leaves the device. There is no server to send it to, and a `connect-src` CSP on the page makes that enforceable rather than a promise — including against MediaPipe's own usage telemetry, which the page blocks. Needs a camera, and asks before it takes one.\n\n**[The reference](https://paperlab.nawwara.studio/docs/)** — the whole catalogue with every behavior, deformer, layout, stock and surface rendering live. The catalogue is generated from the registries, so it cannot advertise something the library doesn't have.\n\n## Development\n\npnpm + Turborepo, Node 22, [Biome](https://biomejs.dev) for lint and format.\n\n```sh\npnpm install\npnpm hands:setup    # once — vendors the hand tracker's wasm and models (35 MB, not committed)\npnpm dev            # the editor at localhost:5173\n```\n\n| | |\n|---|---|\n| [`packages/paperlab`](https://github.com/NourMtir0722/Paperlab/blob/main/packages/paperlab/) | the npm library — the only published artifact |\n| [`apps/editor`](https://github.com/NourMtir0722/Paperlab/blob/main/apps/editor/) | the editor — Paper, Field and Stage, plus Hands (`/hands`) and the FX Lab (`/fx-lab`), each built from the same app in a pass of its own |\n| [`apps/docs`](https://github.com/NourMtir0722/Paperlab/blob/main/apps/docs/) | the reference site, with every behavior running live |\n| [`tools/`](https://github.com/NourMtir0722/Paperlab/blob/main/tools/) | browser harnesses — parity, perf, screenshots, the fire's checks, the README's motion |\n| [`AGENTS.md`](https://github.com/NourMtir0722/Paperlab/blob/main/AGENTS.md) · [`docs/llms.txt`](https://github.com/NourMtir0722/Paperlab/blob/main/docs/llms.txt) | the agent-readable API reference |\n| [`docs/design.md`](https://github.com/NourMtir0722/Paperlab/blob/main/docs/design.md) | the design language the apps share, enforced by a test |\n\n### Checks\n\n```sh\npnpm test             # 1,100+ unit tests — deformer math, schema, cloth, layouts, the fire, exports\npnpm test:parity      # 37 golden-vector cases: every deformer's GLSL twin vs its JS twin\npnpm test:drive       # the stage really walks when you drag, wheel or arrow it\npnpm test:share       # sculpt → link → a browser that has never seen the paper\npnpm test:dropdown    # every dropdown option is reachable, including below the fold\npnpm test:route       # the site root routes by device, and links every route it deploys\npnpm test:consumer    # installs the packed library into an empty project and imports it\npnpm test:damage      # an untouched damage field changes not one pixel\npnpm test:fire-budget # what a burn must measure in the frame — the stage stays black, paper never blooms\npnpm test:hands       # the ways to light the paper really light it (needs a camera-less Chromium)\npnpm test:fire-look   # the burn, moment by moment, beside the stills it is judged against\npnpm typecheck\npnpm lint\npnpm knip             # dead code and unused exports\npnpm build\n```\n\nAnything that needs a real GPU, real pointer events or a second browser profile is a browser harness in `tools/` rather than a unit test. All of them but `test:hands` and `test:fire-look` are CI gates, along with `publint` and `are-the-types-wrong` on the published package. `test:hands` runs in [its own workflow](https://github.com/NourMtir0722/Paperlab/blob/main/.github/workflows/hands.yml) instead — on the paths that can break it, and weekly — because it fetches its models from Google and a required gate would let someone else's CDN block every unrelated PR. A red X you have to read, rather than a veto. `test:fire-look` is run by hand: it lays each render beside a reference still, those stills are kept out of the repo, and passing it still takes someone looking.\n\n### Measurement\n\n```sh\npnpm perf           # stage frame cost      (--gpu for the platform GPU, --soft for the SwiftShader floor)\npnpm perf:field     # field frame cost\npnpm shot           # stage PNGs into .shots/   (also shot:ui, shot:play)\npnpm shot:light     # every lighting rig, one frame each\npnpm shot:catalogue # sweep any axis — --vary=layout|stock|lighting --all\npnpm sheet          # compose those frames into a labelled contact sheet\npnpm media          # the README's GIFs and MP4s, stepped frame-exact (needs ffmpeg)\npnpm film           # the burn playing, first contact to cold, one video per origin (needs ffmpeg)\n```\n\n## Contributing\n\nContributions climb a ladder, easiest first: **presets** (JSON only, zero code) → **behaviors** (~50 lines over existing deformers) → **layouts** (a ~30-line pure function) → **deformers** (dual JS + GLSL implementation with parity cases) → **surface effects** (GLSL chunks). Merged work ships in the editor's library with attribution. See [CONTRIBUTING.md](https://github.com/NourMtir0722/Paperlab/blob/main/CONTRIBUTING.md).\n\n## License\n\nApache 2.0 © Noor Mtir. Attribution travels with the code: redistributions must reproduce the [NOTICE](https://github.com/NourMtir0722/Paperlab/blob/main/NOTICE) file. If Paperlab made it into something you shipped, a visible credit or link back is warmly appreciated.\n","readmeFilename":"README.md"}