{"_id":"@aftership/ads-renderer-react","_rev":"10-a0dcaa7c97e094533155030d67fb81b5","name":"@aftership/ads-renderer-react","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.0":{"name":"@aftership/ads-renderer-react","version":"0.1.0","_id":"@aftership/ads-renderer-react@0.1.0","maintainers":[{"name":"aftership","email":"sdk@aftership.com"}],"dist":{"shasum":"e8971e35af31b08dd48a8b8b11a908918d75cf05","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.1.0.tgz","fileCount":37,"integrity":"sha512-oX9L+9q9qj94O0OIIbN18Hq0UFvXTrflsAc4lyCFTfwkJAVt+1V/K6Vn+7p33LyfPmW0S3g94hrzN+IJyYit+w==","signatures":[{"sig":"MEQCIASA6OAv2OmaTH+dgwim/A6l4XL3QYNir22LWWE83u5wAiA0VW4Igl1R7D/tuFrXBg3C7XTMJBd9i6qT8gSlSzdpuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60243},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"gitHead":"fa99ea94483c52b9cebae9e7283414f8c97db756","scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"_npmVersion":"10.9.4","description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","directories":{},"_nodeVersion":"22.21.0","dependencies":{"@aftership/ads-core":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","react":"^19.2.7","vitest":"^2.1.8","react-dom":"^19.2.7","typescript":"^5.7.2","@types/react":"^19.2.17","@testing-library/react":"^16.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/ads-renderer-react_0.1.0_1784526267165_0.8905736568022924","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aftership/ads-renderer-react","version":"0.1.1","_id":"@aftership/ads-renderer-react@0.1.1","maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"dist":{"shasum":"22262dca8476bfdd98cb3d123fe4274a4bda8d8c","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.1.1.tgz","fileCount":37,"integrity":"sha512-b+HSICubNKw4EhlXPIzmViNbQwtwvFFMy0phIUUhJirmjU3EwVgl5AYnrRTx6hB4b9cqfu9LXaH+yY7cUcTWww==","signatures":[{"sig":"MEQCICmXVUaE3T6k7mUNm0WMXZLHzn6p451qC2geRWHO23GCAiBhdC0zVwM86PhENGanwOJMhtI+XzX/kJZT52w6KVLD5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62973},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"gitHead":"0c9fadef7700c6bd16c69af8a8395d6b1c0c98e2","scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"_npmVersion":"10.9.4","description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","directories":{},"_nodeVersion":"22.21.0","dependencies":{"@aftership/ads-core":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","react":"^19.2.7","vitest":"^2.1.8","react-dom":"^19.2.7","typescript":"^5.7.2","@types/react":"^19.2.17","@testing-library/react":"^16.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/ads-renderer-react_0.1.1_1784712816778_0.847663406043516","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aftership/ads-renderer-react","version":"0.2.0","_id":"@aftership/ads-renderer-react@0.2.0","maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"dist":{"shasum":"0b993950d1326381f3157d2eab31a5be4e301421","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.2.0.tgz","fileCount":41,"integrity":"sha512-wglDEoPBbbTGPnfeVj2gRYD7PSuL5Iui0ouUN1CK6RyTSeutuemVX2W3gJnv/JLEGZLOUEwcrIsfD1igrvoguA==","signatures":[{"sig":"MEYCIQC2e/cCOEcgA+vFcJFgjZE8UAv8LIZFCRI9nmilHT9migIhAKkkl/bO299o3VBK4ZJ47zTZyZHAi0vM21uMG5RbKKUp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71910},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"gitHead":"c3f5bbb23522eaee2f9d28779acc790274f00d41","scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"_npmVersion":"10.9.4","description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","directories":{},"_nodeVersion":"22.21.0","dependencies":{"@aftership/ads-core":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","react":"^19.2.7","vitest":"^2.1.8","react-dom":"^19.2.7","typescript":"^5.7.2","@types/react":"^19.2.17","@testing-library/react":"^16.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/ads-renderer-react_0.2.0_1784790442907_0.21225421289504975","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@aftership/ads-renderer-react","version":"0.2.2","_id":"@aftership/ads-renderer-react@0.2.2","maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"dist":{"shasum":"60c211bf2c9d2a0ded0f78a6f4a6ab6d4f031cc0","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.2.2.tgz","fileCount":42,"integrity":"sha512-SwYYBEwEAqs6YSo58ihlDroXNnQ35yW8eXdmZa65nFqTUkY38l5JTNKByJ0ZRb9lMZ2Q+N7vd0y2+MKawXYjkw==","signatures":[{"sig":"MEUCIQCv5/81+vSVJFPBmvtgPU8FSsV/v+Kf882O9VRGvUaRKgIgGMW+9kwlzLw7qLBDeWSI3jxcX1K76ju4pqPBhsiszY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82333},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"gitHead":"bb4cd57ad3f0bde3e1627500d093ae53ea762516","scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"_npmVersion":"10.9.4","description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","directories":{},"_nodeVersion":"22.21.0","dependencies":{"@aftership/ads-core":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","react":"^19.2.7","vitest":"^2.1.8","react-dom":"^19.2.7","typescript":"^5.7.2","@types/react":"^19.2.17","@testing-library/react":"^16.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/ads-renderer-react_0.2.2_1785142853868_0.7472693255457086","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aftership/ads-renderer-react","version":"0.3.0","_id":"@aftership/ads-renderer-react@0.3.0","maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"dist":{"shasum":"0ecc06894563f57b0ed5f12c8f119aed41e9f70e","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.3.0.tgz","fileCount":42,"integrity":"sha512-9f8PVyba/xmbHs4tJ27yEG43IhmCxEHysUOPWUemWhu1AcNBfiY4h25rAE2GGd+aRvaH+1CGTugh+KKW9TNswQ==","signatures":[{"sig":"MEUCIQC1okeaXdCI6E2HThiwHPu7AhtuUdJ5Tn9Zx8ErJsAT3wIgK+L8igXLG3y7bgSDDje8Jn6jj5bcseQq9+Z9Si06j3s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79125},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"gitHead":"6f1d8a9f75e926eaa69be86fa3f8311a42835399","scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"_npmVersion":"10.9.4","description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","directories":{},"_nodeVersion":"22.21.0","dependencies":{"@aftership/ads-core":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","react":"^19.2.7","vitest":"^2.1.8","react-dom":"^19.2.7","typescript":"^5.7.2","@types/react":"^19.2.17","@testing-library/react":"^16.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/ads-renderer-react_0.3.0_1785220742667_0.6619784329502765","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@aftership/ads-renderer-react","version":"0.3.1","_id":"@aftership/ads-renderer-react@0.3.1","maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"dist":{"shasum":"669261b8c9d8c8b9e66c21c0c8fd55f029ecb1d2","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.3.1.tgz","fileCount":42,"integrity":"sha512-XDIGSB2ziuXFgFj1Ht+jDte+Oo6AWeVp/70bqOXRe4uEgiD24eqLLJEqLWnqkJyOphev1t545QTU+agosll9OA==","signatures":[{"sig":"MEYCIQCE7JoXB4XIEPY8JErUOJWrHEn5wTEnVpvPskPo6nNnhwIhAN0BR7PNHzn1XhdxdPiaigYIAfeWH2BCe00XMTpjVopM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87662},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"gitHead":"85347be2f0de2d599836878626208fca47d91ebe","scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"_npmVersion":"10.9.4","description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","directories":{},"_nodeVersion":"22.21.0","dependencies":{"@aftership/ads-core":"0.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","react":"^19.2.7","vitest":"^2.1.8","react-dom":"^19.2.7","typescript":"^5.7.2","@types/react":"^19.2.17","@testing-library/react":"^16.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/ads-renderer-react_0.3.1_1785305503061_0.538217727161189","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@aftership/ads-renderer-react","version":"0.3.2","_id":"@aftership/ads-renderer-react@0.3.2","maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"dist":{"shasum":"d98893ba76c19e29add206b91c78a0aafb95664e","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.3.2.tgz","fileCount":42,"integrity":"sha512-0M3VP+jff7dIftgl5C8B6As3+4z+JJ3LH/nchx4kuham0PNlfOgMvpVzLoX/+pum5GVE4nuuMpwyTwav/OMJ/Q==","signatures":[{"sig":"MEYCIQD4BfXeuoQUW3XWkYqzvCb4UbkrYvTJiKFeo/ol8HVSRwIhANq2A6VEARkcodlQoC2wtTiwY7BeEtoV4aZRBVe2Gf6m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87662},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"gitHead":"757c11bca2671e30525397642958849dc64baffa","scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"_npmVersion":"10.9.4","description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","directories":{},"_nodeVersion":"22.21.0","dependencies":{"@aftership/ads-core":"0.3.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","react":"^19.2.7","vitest":"^2.1.8","react-dom":"^19.2.7","typescript":"^5.7.2","@types/react":"^19.2.17","@testing-library/react":"^16.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/ads-renderer-react_0.3.2_1785764956291_0.8543070088150533","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aftership/ads-renderer-react","version":"0.4.0","_id":"@aftership/ads-renderer-react@0.4.0","maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"dist":{"shasum":"89f1e880ccb55941d916d268f7bd44634a5a27a7","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.4.0.tgz","fileCount":42,"integrity":"sha512-dYsnB3x6uXiT1KE594dfUFsJY/L9LmAVgWn6tSyRbkDvILRx1fyMRhNZoEI9PNhqp3SsfCSMixqrGhkI3ad3DA==","signatures":[{"sig":"MEQCIBlB+Q3r03w+EsXOIZAPMzJPpIwxVU7HJJOe1bdg/3rfAiBisNGAgYZGtJiXoneULs0G3fp6458Uk91kPPX0Wp+V6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98204},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"gitHead":"492596e97330f7003fd9da6380ba1c7b2ef8506e","scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"_npmVersion":"10.9.4","description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","directories":{},"_nodeVersion":"22.21.0","dependencies":{"@aftership/ads-core":"0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","react":"^19.2.7","vitest":"^2.1.8","react-dom":"^19.2.7","typescript":"^5.7.2","@types/react":"^19.2.17","@testing-library/react":"^16.1.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/ads-renderer-react_0.4.0_1788140101738_0.7332900753298015","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aftership/ads-renderer-react","version":"0.4.1","publishConfig":{"access":"public"},"description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./email":{"types":"./dist/email/index.d.ts","import":"./dist/email/index.js","default":"./dist/email/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","dev":"tsc -p tsconfig.build.json --watch","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run"},"peerDependencies":{"react":">=18"},"dependencies":{"@aftership/ads-core":"0.4.1"},"devDependencies":{"@testing-library/react":"^16.1.0","@types/react":"^19.2.17","jsdom":"^25.0.1","react":"^19.2.7","react-dom":"^19.2.7","typescript":"^5.7.2","vitest":"^2.1.8"},"_id":"@aftership/ads-renderer-react@0.4.1","gitHead":"9be66381b9547e39be641d9b141baf368f4a544b","_nodeVersion":"22.21.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-jglqLQ4w0GU62fFo6ctlgmWz50x+XpFBTYqDIUrT3ZJKmlZZjQkbxB+i/qw35QKQj1+u9hnd7Iny1y4oTOpzRw==","shasum":"4234d497416501dfd89632345f216d021d6a1185","tarball":"https://registry.npmjs.org/@aftership/ads-renderer-react/-/ads-renderer-react-0.4.1.tgz","fileCount":42,"unpackedSize":96088,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD57auo8VhGsNWJM+9ujATOOCZ5ukbHjuNTSxp1vlkQuAIhALfTyiyL7XCUyxqBeZLriFlyAjUAXOOK0m1cnHNdl+9D"}]},"_npmUser":{"name":"aftership","email":"sdk@aftership.com"},"directories":{},"maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ads-renderer-react_0.4.1_1788142223179_0.30559393805637924"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-20T05:44:26.996Z","modified":"2026-08-31T02:10:23.491Z","0.1.0":"2026-07-20T05:44:27.566Z","0.1.1":"2026-07-22T09:33:36.909Z","0.2.0":"2026-07-23T07:07:23.036Z","0.2.2":"2026-07-27T09:00:54.001Z","0.3.0":"2026-07-28T06:39:02.817Z","0.3.1":"2026-07-29T06:11:43.246Z","0.3.2":"2026-08-03T13:49:16.436Z","0.4.0":"2026-08-31T01:35:01.894Z","0.4.1":"2026-08-31T02:10:23.324Z"},"description":"Pure React renderers for AfterShip Ads self-render channel. Web: single-offer card + carousel per the Figma universal ad styles. Email: satori-safe creative template consumed by the render service. No data fetching, no tracking side effects — offers in, U","maintainers":[{"name":"aftership","email":"sdk@aftership.com"},{"name":"aftership-dev","email":"sre+aftership-dev@aftership.com"}],"readme":"# @aftership/ads-renderer-react\n\n用于标准化 AfterShip Ads decision 的纯 React renderer。\n\n## 边界\n\n本 package 负责展示：\n\n- Web `AdsSection` 的单 offer 和 carousel layout；\n- desktop/mobile 响应式渲染；\n- theme 解析；\n- 空结果 fail-safe；\n- 通过 `./email` export 提供兼容 satori 的 Email creative JSX。\n\n它不请求 decision、不拥有认证、不持久化数据，也不调用 backend Event API。Web 交互 event 只发送给可选 host callback。\n\n## Web 接口\n\n```tsx\nimport { AdsSection } from \"@aftership/ads-renderer-react\";\n\n<AdsSection\n  decision={decision}\n  variant=\"auto\"\n  layout=\"auto\"\n  onEvent={hostCallback}\n/>;\n```\n\n空 offer array 不渲染内容。可选字段缺失时直接省略，不虚构广告主文案或 URL。`target_url` 可能携带供应商 attribution，必须原样使用。\n\nsection 自己**不带外边距**（也没有 padding）：纵向节奏归 host——BTP 已经用 `--btp-s-section-padding` 包了一层，\nSDK 再加一层就是双份。需要的 host 通过 `style` 传。\n\n创意图取 `images[0]`，等比缩放（`object-fit: contain`，不裁切广告主素材）进一个固定尺寸的图块\n（desktop 220×160、mobile 满宽×120，圆角取 `borderRadius`）。**图块不涂底色**：`contain` 下任何不是该\n比例的素材都会留边，涂了底色，白底方图（真实数据里 612×612 很常见）就会变成「灰｜白｜灰」三段；不涂，\n留边就是 section 背景。编辑器画布和 onboarding 预览里那块灰色占位块来自 mock 自带的占位图，不是 renderer\n画的。高度固定而非跟随图片长宽比：广告主素材从方形 logo 到宽横幅\n都有，高度浮动会让 carousel 每张 slide 高度不同，decline 翻页时版面跳动。决策里没有图、或图加载失败\n（404）时**整块不渲染**，连同旁边的间距一起消失，退化成纯文字版式——不会留下浏览器碎图标或空白条。\n\n多 offer 没有左右箭头也没有 dots（2026-07-27 产品决策）：切换靠 offer 自己的 decline 按钮\n（文案取 `cta.decline_copy`，缺失时兜底 `\"No thanks\"`）——点一次换下一个，点到最后一个即关闭整个 section，\n这也是用户关闭广告的入口。单个 offer 同样展示该按钮，点击即关闭。accept 与 decline 放得下就并排、各自按内容宽度；\n放不下换行后每个各占一整行——按实际是否换行决定，不看 desktop/mobile，因为按钮文案由广告主下发、长度不可控。\n\n关闭状态只存在于组件内，刷新后广告照常出现。编辑器/预览态传 `closable={false}`：最后一个 decline 回到第一个而不是消失，\n避免商家在画布里点几下就把版面点空。decline **不产生上报事件**（`POST /v1/events` 没有对应类型）；\n切到下一个 offer 时照常发 `offer_display`。\n\n## 主题\n\n`theme`（`AdsTheme`）的每个值都是原样写进 inline style 的 CSS 值，**可以直接传 `var(...)`**——BTP 就是把\n`--btpb-ads-*`（定义在 C 端 `adaptor/CustomizationStyleProvider.tsx`，兜底链与 recommendation 同构）传进来，\n让广告位跟随店铺主题。数字按 px 处理。\n\n粗粒度字段单独用就够：`primaryColor` / `textColor` / `fontFamily` / `borderRadius`。需要拆的 host 再用细粒度字段：\n`buttonRadius` `buttonFontFamily` `buttonFontSize`、`descriptionColor` `advertiserColor`。创意图的圆角跟\n`borderRadius`，图块不涂底色，所以没有单独的图片主题字段。\n\n两个按钮的 hover 由 `primaryHoverColor` `buttonTextHoverColor` `buttonHoverRadius` `buttonHoverFontFamily`\n`buttonHoverFontSize` 控制，缺省回落到对应静态字段。inline style 写不了 `:hover`，所以 hover 是组件内部的\npointer 状态（touch pointer 会被忽略，避免点一下就留在 hover 态）——与 BTP 自己的按钮同构（astra 也是用\nreact-aria 的 `data-hovered` 而不是 CSS）。`primaryHoverColor` 写进 CSS `background` 简写，**可以是渐变**\n（BTP 传的 `--btp-btn-hover-bgi-color` 就是「半透明遮罩 + hover 底色」的 `linear-gradient`）；host 不传时\nSDK 自己叠一层 `rgba(0,0,0,0.12)` 压暗，保证任何 host 都有 hover 反馈。decline 是无边框按钮，hover 底色由\n`primaryColor` 经 `color-mix` 派生 12% 淡色（`color-mix` 不支持的浏览器整条声明失效，退回透明底）。\n\n⚠️ 描述与广告主标签的颜色默认从 `textColor` 按透明度派生，而 `var()` 字符串派生不了——传 CSS 变量的 host\n必须显式给 `descriptionColor` 和 `advertiserColor`，否则三级文字会挤成同一个颜色。\n\ncallback（`onEvent`）发送 `widget_load`、`widget_display`、`offer_display`、`offer_click` 与 host-local 的 `no_fill`，并携带 `report_token`（已签发时）。host 负责把有 token 的事件经自身 BFF 转发到 `POST /v1/events`（`no_fill` 与无 token 事件不转发）；事件模型详见 [`@aftership/ads-core`](../ads-core/README.md)。\n\n## Email 接口\n\n```tsx\nimport { EmailCreative } from \"@aftership/ads-renderer-react/email\";\n```\n\n`EmailCreative` 面向 satori CSS 子集，只渲染一个 offer。`apps/render` 负责图片拉取、SVG/PNG 转换、上传、缓存、redirect 和错误降级。\n\n当前 Email runtime 见 [Email rendering 架构](../../docs/architecture/email-rendering.md)。\n\n## 开发\n\n```bash\npnpm --filter @aftership/ads-renderer-react build\npnpm --filter @aftership/ads-renderer-react typecheck\npnpm --filter @aftership/ads-renderer-react test\n```\n\n交互式视觉验证使用 [`apps/renderer-demo`](../../apps/renderer-demo/README.md)。\n","readmeFilename":"README.md"}