{"_id":"@bnm-p/curtain","_rev":"2-752181ffddd40c46ce4cdb7d2f10fe39","name":"@bnm-p/curtain","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@bnm-p/curtain","version":"0.1.0","license":"MIT","_id":"@bnm-p/curtain@0.1.0","maintainers":[{"name":"bnm.wag","email":"bnm.wag@gmail.com"}],"dist":{"shasum":"bbd664da2d0047ac0c4e1470943ab79179178cdb","tarball":"https://registry.npmjs.org/@bnm-p/curtain/-/curtain-0.1.0.tgz","fileCount":7,"integrity":"sha512-2Wm64EKUSGEFBv2lT4hbh4PS6ArcisWN5CStNkthngFuWpxn1ylFSYSZZn5hWoAGhOAdN1BYMUcjrArfjbFjGg==","signatures":[{"sig":"MEUCIFXQUz1ukjf/MveBWr9ncWThDiZ+6U2/2y+iRRLyv8/RAiEArNV5czUDvmdjnffbYqZGWdGQ65zmVSjGWpiBYuzjtLQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111381},"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":"8044cc5afd27ebbb3b69f4cb97ed6cff3f36ca20","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"bnm.wag","email":"bnm.wag@gmail.com"},"_npmVersion":"10.9.2","description":"Page transition system for Next.js App Router","directories":{},"_nodeVersion":"23.9.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"gsap":">=3.0.0","next":">=14.0.0","react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/curtain_0.1.0_1772838100023_0.7572645117855226","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bnm-p/curtain","version":"0.1.1","description":"Page transition system for Next.js App Router","type":"module","license":"MIT","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"},"peerDependencies":{"gsap":">=3.0.0","next":">=14.0.0","react":">=18.0.0","react-dom":">=18.0.0"},"devDependencies":{"@types/react":"^18.0.0","@types/react-dom":"^18.0.0","tsup":"^8.0.0","typescript":"^5.8.0"},"_id":"@bnm-p/curtain@0.1.1","gitHead":"2381a40eb279d22485a510a8e1dbd2f8e726cf75","_nodeVersion":"23.9.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-HxTEA5tP08QU4ft4I+4wXRxKbJ1BFhvImQBkgg0nu9L+VhoxN50A1fL6ROe1o8JqKFTPvkEuieECVsAS2GbE7A==","shasum":"1a16cbe1d209c9b1760ea22b6a6d2839006f950a","tarball":"https://registry.npmjs.org/@bnm-p/curtain/-/curtain-0.1.1.tgz","fileCount":8,"unpackedSize":113596,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBrJwBf5ZSU9FqqOMnwKDI7xwJDCuYrlTmhwZFBW4qctAiEAqsp3BBl7WrCZQZTBiTKhA4zqxrnLtZya5Ypn5qEotHA="}]},"_npmUser":{"name":"bnm.wag","email":"bnm.wag@gmail.com"},"directories":{},"maintainers":[{"name":"bnm.wag","email":"bnm.wag@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/curtain_0.1.1_1772838404485_0.555886247161439"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-06T23:01:39.933Z","modified":"2026-03-06T23:06:44.738Z","0.1.0":"2026-03-06T23:01:40.165Z","0.1.1":"2026-03-06T23:06:44.637Z"},"license":"MIT","description":"Page transition system for Next.js App Router","maintainers":[{"name":"bnm.wag","email":"bnm.wag@gmail.com"}],"readme":"# @bnm-p/curtain\n\nPage transition system for Next.js App Router.\n\n## Install\n\n```bash\nnpm install @bnm-p/curtain gsap\n```\n\n## Setup\n\n**1. Create `src/curtain.config.ts`**\n\n```ts\n\"use client\"\n\nimport { defaultTransition, defineCurtainConfig } from \"@bnm-p/curtain\"\n\nexport const curtainConfig = defineCurtainConfig({\n  default: defaultTransition,\n})\n```\n\n**2. Add `CurtainProvider` to your root layout**\n\n```tsx\nimport { CurtainProvider } from \"@bnm-p/curtain\"\nimport { curtainConfig } from \"@/curtain.config\"\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n  return (\n    <html lang=\"en\">\n      <body>\n        <CurtainProvider config={curtainConfig}>\n          <main className=\"page-content\">{children}</main>\n        </CurtainProvider>\n      </body>\n    </html>\n  )\n}\n```\n\nThe `.page-content` class tells curtain which element to animate. That's all you need.\n\n## Page animations\n\nAnimate elements in when a page enters:\n\n```tsx\n\"use client\"\n\nimport { usePageEntry } from \"@bnm-p/curtain\"\n\nexport default function Page() {\n  usePageEntry((tl) => {\n    tl.from(\".hero\", { y: 40, opacity: 0, duration: 0.6, ease: \"expo.out\" })\n  })\n\n  return <h1 className=\"hero\">Hello.</h1>\n}\n```\n\nAnimate elements out when the user navigates away:\n\n```tsx\nusePageLeave((tl) => {\n  tl.to(\".hero\", { y: -40, opacity: 0, duration: 0.5 })\n})\n```\n\n## Preloader\n\nBuild your own preloader — curtain handles the timing:\n\n```tsx\n\"use client\"\n\nimport { usePreloader } from \"@bnm-p/curtain\"\nimport { useEffect } from \"react\"\n\nexport const Preloader = () => {\n  const { notifyDone } = usePreloader()\n\n  useEffect(() => {\n    // run your intro, then:\n    notifyDone()\n  }, [])\n\n  return <div className=\"fixed inset-0 z-50 bg-black\" />\n}\n```\n\nPass it to `CurtainProvider` via `extras`:\n\n```tsx\n<CurtainProvider config={curtainConfig} extras={<Preloader />}>\n  {children}\n</CurtainProvider>\n```\n\n## Per-route transitions\n\n```ts\nexport const curtainConfig = defineCurtainConfig({\n  default: defaultTransition,\n\n  namespaces: {\n    \"/\": \"home\",\n    \"/about\": \"about\",\n  },\n\n  transitions: {\n    \"* -> about\": fadeTransition,\n  },\n})\n```\n\n## Docs\n\nFull documentation at [bnm-p.github.io/curtain](https://bnm-p.github.io/curtain) *(coming soon)*\n\n## License\n\nMIT\n","readmeFilename":"README.md"}