{"_id":"@buzztrail-ai/presentation","_rev":"10-edba3eda9b25ace67d52543029c81d1d","name":"@buzztrail-ai/presentation","dist-tags":{"latest":"1.4.1"},"versions":{"1.0.0":{"name":"@buzztrail-ai/presentation","version":"1.0.0","keywords":["buzztrail","presentation","slides","voice","ai","livekit","voice-control","screenshare","slidev","ai-agent","voice-conversation","real-time","collaboration","typescript"],"author":{"name":"BuzzTrail AI","email":"noreply@buzztrail.ai"},"license":"UNLICENSED","_id":"@buzztrail-ai/presentation@1.0.0","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"d1d74189e02a9b37b71378a6a46dc855b017b2a5","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.0.0.tgz","fileCount":6,"integrity":"sha512-t3+a/76scsm7wXrFJGPSgodfOTPEIxefSvsXvDmHFsBTv8ZozadyD1D0GB1b9ryQZy/YZRRLbQSKgqSKsGse8A==","signatures":[{"sig":"MEYCIQCHqXM85aea5BHabM8PwH1+b+5XZcpAZboAMVwpWYOUFgIhAMN7f/YZcTDYTw6QWszptUDCyTxsyL6uZlgLAJ5/Q3bJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1822952},"main":"./index.umd.js","type":"module","_from":"file:buzztrail-ai-presentation-1.0.0.tgz","types":"./index.d.ts","module":"./index.es.js","browser":"./index.umd.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./index.d.ts","import":"./index.es.js","require":"./index.umd.js"}},"scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_resolved":"/private/var/folders/q3/2p8p47mj6_70b5dm2lcqjqg80000gn/T/352ae507c4f17cfc2d9c308840469c09/buzztrail-ai-presentation-1.0.0.tgz","_integrity":"sha512-t3+a/76scsm7wXrFJGPSgodfOTPEIxefSvsXvDmHFsBTv8ZozadyD1D0GB1b9ryQZy/YZRRLbQSKgqSKsGse8A==","_npmVersion":"10.9.2","description":"Voice-enabled slide presentations with AI agents. Create interactive presentations with voice-controlled slides, AI conversation, and real-time collaboration.","directories":{},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.0.0_1762604378641_0.9511660976800818","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@buzztrail-ai/presentation","version":"1.1.0","_id":"@buzztrail-ai/presentation@1.1.0","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"518a42b11583c103c38d5d9fb06447e86ae11527","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.1.0.tgz","fileCount":53,"integrity":"sha512-Sr7bPcX4/A2fDkBngIjrKPwb4du0uzt+ALVdl+92AC55wc/pf7Q94XX/my6QHETuWesxsuupb0XBt5qy+TFTHQ==","signatures":[{"sig":"MEQCIHvJt6dx/FvSo9mmzj/cOKv3w60jidCVu3R9D1oEZbp/AiBbgww5nN8lJ4JoGbkrvNme44G6nPZDUTCtL5DFMQibvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":409379},"main":"./index.js","type":"module","types":"./index.d.ts","gitHead":"08db100239f96b86fbb66444e2805ae3f1ee8fcb","scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555","prepublishOnly":"bash scripts/security-check.sh"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_npmVersion":"11.6.2","description":"AI-powered slide presentations with voice interaction for any website platform.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"livekit-client":"^2.16.0","@buzztrail-ai/i18n":"workspace:*","@buzztrail-ai/theme":"workspace:*","@buzztrail-ai/gating":"workspace:*","@buzztrail-ai/logger":"workspace:*","@supabase/supabase-js":"^2.84.0","@buzztrail-ai/config-loader":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","jsdom":"~22.1.0","vitest":"^3.1.4","@nx/vite":"21.2.3","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.1.0_1763933313194_0.31793820572502907","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@buzztrail-ai/presentation","version":"1.2.0","keywords":["buzztrail","presentation","slides","voice","ai","livekit","voice-control","screenshare","slidev","ai-agent","voice-conversation","real-time","collaboration","typescript"],"author":{"name":"BuzzTrail AI","email":"noreply@buzztrail.ai"},"license":"UNLICENSED","_id":"@buzztrail-ai/presentation@1.2.0","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"21746a5e33fb8de9aac51b9d0d4a750fae17bfc3","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.2.0.tgz","fileCount":6,"integrity":"sha512-X3FMFttJoLxI/ioOei5jxNt+3Ouzp7h44wuN+xjQM9gWaQIev7EzHUXjIXw8LIjSpna4OGHcS/dc17UGz+Afvg==","signatures":[{"sig":"MEUCIQCfovSHRdkIsPVC35g84A+vLqj6rOt6oIBpv0ztHRc8bQIgT0oOKON+bEEnWwS8tka4ebYeoQj3sdhXd6K/liyp0Ac=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1984955},"main":"./index.umd.js","type":"module","_from":"file:buzztrail-ai-presentation-1.2.0.tgz","types":"./index.d.ts","module":"./index.es.js","browser":"./index.umd.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./index.d.ts","import":"./index.es.js","require":"./index.umd.js"}},"scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_resolved":"/private/var/folders/q3/2p8p47mj6_70b5dm2lcqjqg80000gn/T/9bb5279b0868a248cc2aa02f367df81d/buzztrail-ai-presentation-1.2.0.tgz","_integrity":"sha512-X3FMFttJoLxI/ioOei5jxNt+3Ouzp7h44wuN+xjQM9gWaQIev7EzHUXjIXw8LIjSpna4OGHcS/dc17UGz+Afvg==","_npmVersion":"11.6.2","description":"Voice-enabled slide presentations with AI agents. Create interactive presentations with voice-controlled slides, AI conversation, and real-time collaboration.","directories":{},"_nodeVersion":"24.2.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.2.0_1763977063858_0.6832162113911162","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@buzztrail-ai/presentation","version":"1.3.0","_id":"@buzztrail-ai/presentation@1.3.0","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"6e423d6e4e61e31ca03eb606972bb89100b90384","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.3.0.tgz","fileCount":29,"integrity":"sha512-bEgU3kNblcSenvcNn8OsZhs6C7bnjSAQDO5/x3qHsrmLmA11/NF2cWwFUdeV8h4+6UrQsXpdmH6JpkVTCqQJ0w==","signatures":[{"sig":"MEYCIQD2DafWPTSydXcj8kkFgd9vjCoLRkpmTf5XUBKO8ISA4wIhAPS8CeIyUcSPzRKPoUY6oCLUkGkgLO10wnh7zuuHyyS/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2067203},"main":"./index.js","type":"module","types":"./index.d.ts","gitHead":"4bedde1f0cd417ca55d05fddd68122a405069457","scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555","prepublishOnly":"bash scripts/security-check.sh"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_npmVersion":"11.6.2","description":"AI-powered slide presentations with voice interaction for any website platform.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"livekit-client":"^2.16.0","@buzztrail-ai/i18n":"workspace:*","@buzztrail-ai/theme":"workspace:*","@buzztrail-ai/gating":"workspace:*","@buzztrail-ai/logger":"workspace:*","@supabase/supabase-js":"^2.84.0","@buzztrail-ai/config-loader":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","jsdom":"~22.1.0","vitest":"^3.1.4","@nx/vite":"21.2.3","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.3.0_1763978002202_0.10169212757942603","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@buzztrail-ai/presentation","version":"1.3.1","_id":"@buzztrail-ai/presentation@1.3.1","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"390bee73181d2cd243e144c6da7e10cdc28e1dc8","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.3.1.tgz","fileCount":29,"integrity":"sha512-97O+RPHY7EjmtXMsNPIilvAiCTu9XmxjopFOX6Oqc7miziFRZ01fR1yQL2lTmypgUuu0JCeCkkvoZtdJp/4F6w==","signatures":[{"sig":"MEUCIB4Xp0B7/R+NzEQy1WyQvWVEWRZBQFGSaD/DkRd03ZiQAiEA79/VnYrik0X2RaoJvV1FUAx9I9F1mNMjGdcPbhpO4Sk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2067067},"main":"./index.js","type":"module","types":"./index.d.ts","gitHead":"524f828a088b1b210cb5cb5cfb7703a40329406f","scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_npmVersion":"11.6.2","description":"AI-powered slide presentations with voice interaction for any website platform.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"livekit-client":"^2.16.0","@buzztrail-ai/i18n":"workspace:*","@buzztrail-ai/theme":"workspace:*","@buzztrail-ai/gating":"workspace:*","@buzztrail-ai/logger":"workspace:*","@supabase/supabase-js":"^2.84.0","@buzztrail-ai/config-loader":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","jsdom":"~22.1.0","vitest":"^3.1.4","@nx/vite":"21.2.3","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.3.1_1763984684651_0.4159833497665777","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@buzztrail-ai/presentation","version":"1.3.2","_id":"@buzztrail-ai/presentation@1.3.2","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"ac29ca171a65d9cd2e7a17ae8061b780b120c3c5","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.3.2.tgz","fileCount":29,"integrity":"sha512-enDbONZm0EGQbIt+/IkY3D2ofFgbSg6MgfdYXceKAPTQwYMbGg4ju6q2o60lU3b1T2p0D/4HmJvjpBHv+dIBLQ==","signatures":[{"sig":"MEYCIQCzE2n0tBvp/AjA6txPwTVJZecObqtxO6U1aDH3hzvuoAIhAKC3zfLrP6V1/XPDHoWpKmYUPYs30YJQEYmt592KF/vN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2067051},"main":"./index.js","type":"module","types":"./index.d.ts","gitHead":"524f828a088b1b210cb5cb5cfb7703a40329406f","scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_npmVersion":"11.6.2","description":"AI-powered slide presentations with voice interaction for any website platform.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"livekit-client":"^2.16.0","@buzztrail-ai/i18n":"workspace:*","@buzztrail-ai/theme":"workspace:*","@buzztrail-ai/gating":"workspace:*","@buzztrail-ai/logger":"workspace:*","@supabase/supabase-js":"^2.84.0","@buzztrail-ai/config-loader":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","jsdom":"~22.1.0","vitest":"^3.1.4","@nx/vite":"21.2.3","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.3.2_1763986853013_0.5110267623530995","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@buzztrail-ai/presentation","version":"1.3.3","_id":"@buzztrail-ai/presentation@1.3.3","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"c2870d0c6ba6bd9df755323c722f3e7b08279932","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.3.3.tgz","fileCount":30,"integrity":"sha512-Twi93YZffk/sq1kzKo3V1euWdA6Gv3PYxXxhXwpSiufCr4t9lCtEVfrIwtGmC+z+oBpsiHgpCatT3apbz/vr1w==","signatures":[{"sig":"MEYCIQCPNJCMbZVjZ1yl5jWrDmyCcNFTZGKSCisbjMdTsx603gIhAKJCQ+DsFRD7MhlQ+CoMm6HDOhhzvtUZdyHODEPpAJvY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2453036},"main":"./index.js","type":"module","types":"./index.d.ts","gitHead":"524f828a088b1b210cb5cb5cfb7703a40329406f","scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_npmVersion":"11.6.2","description":"AI-powered slide presentations with voice interaction for any website platform.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"livekit-client":"^2.16.0","@buzztrail-ai/i18n":"workspace:*","@buzztrail-ai/theme":"workspace:*","@buzztrail-ai/gating":"workspace:*","@buzztrail-ai/logger":"workspace:*","@supabase/supabase-js":"^2.84.0","@buzztrail-ai/config-loader":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","jsdom":"~22.1.0","vitest":"^3.1.4","@nx/vite":"21.2.3","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.3.3_1763989124702_0.49296669965500395","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@buzztrail-ai/presentation","version":"1.3.4","_id":"@buzztrail-ai/presentation@1.3.4","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"5305f645eed2c08181ad8853073725c78638b0b8","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.3.4.tgz","fileCount":30,"integrity":"sha512-HA/MxULmkyy0NvQqu9Oi26VBuM493z5nN/d/NrYIaF69Iq7DZK34UCXEtDcMMaFbVNwCW5m2PdAHHb3bK9QWxA==","signatures":[{"sig":"MEUCIQCJTOelQc1IDR2RrXq0sZ6cPxZ4mYCeTt/DJkCfx3dOtwIgXdhfcZkqbnG84mANRGAZv2omBYoF6noDdf8qMwYMWq4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2439728},"main":"./index.js","type":"module","types":"./index.d.ts","gitHead":"524f828a088b1b210cb5cb5cfb7703a40329406f","scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_npmVersion":"11.6.2","description":"AI-powered slide presentations with voice interaction for any website platform.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"livekit-client":"^2.16.0","@buzztrail-ai/i18n":"workspace:*","@buzztrail-ai/theme":"workspace:*","@buzztrail-ai/gating":"workspace:*","@buzztrail-ai/logger":"workspace:*","@supabase/supabase-js":"^2.84.0","@buzztrail-ai/config-loader":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","jsdom":"~22.1.0","vitest":"^3.1.4","@nx/vite":"21.2.3","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.3.4_1763989570369_0.5402699250861178","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@buzztrail-ai/presentation","version":"1.4.0","_id":"@buzztrail-ai/presentation@1.4.0","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"dist":{"shasum":"f29325af8a7ddce0cb2e9446468b4c80885a1256","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.4.0.tgz","fileCount":32,"integrity":"sha512-CZXUXRbxuhrToHPrZ15+sS8r1tmGkdbHjVC6aMIu1yCd9ukOG3vmARWuUTGA2ZK3UqLKwkJVm3wNoB5DWkhV7Q==","signatures":[{"sig":"MEQCIFkK4Nj6dDGMTtM6Zg4Vps2t5yy1B2VC+9UvO7gQ7kfWAiBuce5g1A5j535E4zCdXHTFJMKwQy/S5ZajQijOQH8rTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2928244},"main":"./index.js","type":"module","types":"./index.d.ts","gitHead":"524f828a088b1b210cb5cb5cfb7703a40329406f","scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555"},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"_npmVersion":"11.6.2","description":"AI-powered slide presentations with voice interaction for any website platform.","directories":{},"_nodeVersion":"24.2.0","dependencies":{"livekit-client":"^2.16.0","@buzztrail-ai/i18n":"workspace:*","@buzztrail-ai/theme":"workspace:*","@buzztrail-ai/gating":"workspace:*","@buzztrail-ai/logger":"workspace:*","@supabase/supabase-js":"^2.84.0","@buzztrail-ai/config-loader":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.2.4","jsdom":"~22.1.0","vitest":"^3.1.4","@nx/vite":"21.2.3","vite-plugin-dts":"^4.5.4"},"_npmOperationalInternal":{"tmp":"tmp/presentation_1.4.0_1763995422266_0.7964386754794168","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@buzztrail-ai/presentation","version":"1.4.1","type":"module","main":"./index.js","types":"./index.d.ts","scripts":{"test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","test:report":"npx vite preview --outDir test-results --port 5555"},"devDependencies":{"@nx/vite":"21.2.3","jsdom":"~22.1.0","vite":"^7.2.4","vite-plugin-dts":"^4.5.4","vitest":"^3.1.4"},"dependencies":{"@buzztrail-ai/config-loader":"workspace:*","@buzztrail-ai/gating":"workspace:*","@buzztrail-ai/i18n":"workspace:*","@buzztrail-ai/logger":"workspace:*","@buzztrail-ai/theme":"workspace:*","@supabase/supabase-js":"^2.84.0","livekit-client":"^2.16.0"},"gitHead":"31ab5ce6525fdd95259e5169cf132814b2823cff","_id":"@buzztrail-ai/presentation@1.4.1","description":"AI-powered slide presentations with voice interaction for any website platform.","_nodeVersion":"24.2.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-5FQ2udxWfLEd8iUzFpbZEJY2GqXQ3aCFUAI0ZyJkrQ0l72fCawbIAfIUblVXHTaXmAViK5rFEzZZKCHuAgZ/1w==","shasum":"544193616f4161e0c8ae65dda9a303baa527da7a","tarball":"https://registry.npmjs.org/@buzztrail-ai/presentation/-/presentation-1.4.1.tgz","fileCount":33,"unpackedSize":1350734,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDEl7QNJ/SG/59Oku0AoeYFbH96mymiP3/gamXRUHkpIAiAHyv9JId6n3Ho8VKAnQNNM8bAMuronBujFQMX1pJ4McA=="}]},"_npmUser":{"name":"larsbuzz","email":"lars@buzztrail.ai"},"directories":{},"maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/presentation_1.4.1_1764003703731_0.04022190645787149"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-08T12:19:38.507Z","modified":"2025-11-24T17:01:44.206Z","1.0.0":"2025-11-08T12:19:38.961Z","1.1.0":"2025-11-23T21:28:33.422Z","1.2.0":"2025-11-24T09:37:44.103Z","1.3.0":"2025-11-24T09:53:22.381Z","1.3.1":"2025-11-24T11:44:44.909Z","1.3.2":"2025-11-24T12:20:53.202Z","1.3.3":"2025-11-24T12:58:44.957Z","1.3.4":"2025-11-24T13:06:10.645Z","1.4.0":"2025-11-24T14:43:42.506Z","1.4.1":"2025-11-24T17:01:44.025Z"},"description":"AI-powered slide presentations with voice interaction for any website platform.","maintainers":[{"name":"larsbuzz","email":"lars@buzztrail.ai"}],"readme":"# @buzztrail-ai/presentation\n\nAI-powered slide presentations with voice interaction for any website platform.\n\n[![npm version](https://badge.fury.io/js/@buzztrail-ai%2Fpresentation.svg)](https://www.npmjs.com/package/@buzztrail-ai/presentation)\n\n## Overview\n\n`@buzztrail-ai/presentation` enables AI-powered slide presentations with voice interaction on any website platform. Add an interactive AI-guided slide deck to your site in minutes - no complex setup required.\n\n**⚠️ Account Required**: You need an active BuzzTrail account to use this package. [Sign up at buzztrail.ai](https://buzztrail.ai) to get your customer ID and configure your presentations.\n\n## Features\n\n- **Interactive AI Presentations**: Engage website visitors with AI-guided slide presentations\n- **Voice Interaction**: Natural voice conversations about slide content\n- **Manual Controls**: Optional manual slide navigation controls\n- **Works Everywhere**: Wix, Webflow, WordPress, Shopify, or any custom website\n- **Simple Integration**: Just call `createPresentation()`\n- **Fast Loading**: Ultra-lightweight package that won't slow down your site\n- **Mobile-Friendly**: Automatically adapts to desktop, tablet, and mobile screens\n- **Customizable**: Match your brand with custom colors and theming\n- **Lead Capture**: Optional forms to collect visitor information before presentations\n- **Real-time Sync**: Slide changes sync across all viewers in real-time\n- **No Technical Skills**: Works without coding knowledge (perfect for Wix users)\n\n## Getting Started\n\n### Prerequisites\n\n1. **BuzzTrail Account**: [Sign up at buzztrail.ai](https://buzztrail.ai)\n2. **Customer ID**: You'll receive this after account setup\n3. **Deck ID**: Create a presentation deck in the BuzzTrail dashboard\n4. **Supabase Credentials**: You'll receive these from BuzzTrail support\n\n### Installation\n\n#### NPM (for developers)\n\n```bash\nnpm install @buzztrail-ai/presentation\n```\n\n```bash\nyarn add @buzztrail-ai/presentation\n```\n\n```bash\npnpm add @buzztrail-ai/presentation\n```\n\n#### CDN (for Wix, Webflow, no-code platforms)\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@buzztrail-ai/presentation@1/buzztrail-presentation.min.js\"></script>\n```\n\n**Fallback CDN (unpkg):**\n\n```html\n<script src=\"https://unpkg.com/@buzztrail-ai/presentation@1/buzztrail-presentation.min.js\"></script>\n```\n\n## Quick Start\n\n### CDN Usage (Wix, Webflow, etc.)\n\n```html\n<!-- 1. Add a container element to your page -->\n<div id=\"presentation-container\"></div>\n\n<!-- 2. Add the BuzzTrail Presentation script -->\n<script src=\"https://cdn.jsdelivr.net/npm/@buzztrail-ai/presentation@1/buzztrail-presentation.min.js\"></script>\n\n<!-- 3. Initialize the presentation -->\n<script>\n  const presentation = createPresentation('presentation-container', {\n    customerId: 'your-customer-id',\n    deckId: 'your-deck-id',\n    supabaseUrl: 'https://your-project.supabase.co',\n    supabaseKey: 'your-anon-key'\n  });\n\n  // Start the presentation\n  presentation.start();\n</script>\n```\n\nThat's it! The interactive presentation will appear in your container.\n\n### With Callbacks\n\nFor more control, add callback functions:\n\n```html\n<div id=\"my-presentation\"></div>\n\n<script src=\"https://cdn.jsdelivr.net/npm/@buzztrail-ai/presentation@1/buzztrail-presentation.min.js\"></script>\n<script>\n  const presentation = createPresentation('my-presentation', {\n    customerId: 'your-customer-id',\n    deckId: 'your-deck-id',\n    supabaseUrl: 'https://your-project.supabase.co',\n    supabaseKey: 'your-anon-key',\n\n    onStart: () => console.log('Presentation started'),\n    onEnd: () => console.log('Presentation ended'),\n    onError: (error) => console.error('Error:', error),\n    onStateChange: (state) => console.log('State:', state)\n  });\n\n  presentation.start();\n</script>\n```\n\n### NPM Usage (TypeScript/JavaScript)\n\n```typescript\nimport { createPresentation } from '@buzztrail-ai/presentation';\nimport type { PresentationConfig } from '@buzztrail-ai/presentation';\n\nconst config: PresentationConfig = {\n  customerId: 'acme-corp',\n  deckId: 'product-demo-2024',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key',\n\n  // Optional: Viewer configuration\n  viewer: {\n    position: 'center',\n    showControls: true,\n    controlsPosition: 'bottom',\n    aspectRatio: '16:9',\n    showLoading: true,\n    loadingMessage: 'Loading presentation...'\n  },\n\n  // Optional: Theme\n  theme: 'auto', // 'light', 'dark', or 'auto'\n\n  // Optional: Lead capture\n  gating: {\n    enabled: true,\n    fields: ['email', 'name']\n  },\n\n  // Lifecycle callbacks\n  onStart: () => {\n    console.log('Presentation started');\n  },\n  onEnd: () => {\n    console.log('Presentation ended');\n  },\n  onError: (error) => {\n    console.error('Error:', error);\n  },\n  onStateChange: (state) => {\n    console.log('State changed:', state);\n  }\n};\n\nconst presentation = createPresentation('my-container', config);\n\n// Start the presentation\nawait presentation.start();\n\n// Later: End the presentation\nawait presentation.end();\n\n// Get current state\nconst state = presentation.getState(); // 'idle' | 'connecting' | 'connected' | 'disconnected'\n\n// Cleanup\npresentation.destroy();\n```\n\n### Demo Experience\n\nThe `createDemoExperience()` function provides an automated investor demo experience with greeter agent warmup and seamless handoff to presentation.\n\n**Features**:\n- Automatic greeter agent (50-second warmup by default)\n- Natural conversation before presentation\n- Seamless transition to slide presentation\n- Configurable timeline (50s or 20s for testing)\n- System defaults for quick setup\n\n**Basic Usage**:\n\n```typescript\nimport { createDemoExperience } from '@buzztrail-ai/presentation';\n\nconst demo = createDemoExperience('container', {\n  // Required\n  customerName: 'Jane Investor',\n  customerEmail: 'jane@acme.com',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key',\n});\n\nawait demo.start();\n```\n\n**With Custom Options**:\n\n```typescript\nconst demo = createDemoExperience('container', {\n  // Required\n  customerName: 'Jane Investor',\n  customerEmail: 'jane@acme.com',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key',\n\n  // Optional\n  customerCompany: 'Acme Corp',\n  deckUrl: 'https://example.com/custom-deck',\n  timelineConfig: 'investor_demo_quick', // 20s handoff for testing\n\n  // Callbacks\n  onHandoff: () => console.log('Transitioning to presentation!'),\n  onStart: () => console.log('Demo started'),\n  onEnd: () => console.log('Demo ended'),\n});\n\nawait demo.start();\n```\n\n**Timeline Configurations**:\n- `investor_demo` (default): 50-second greeter warmup\n- `investor_demo_quick`: 20-second warmup for testing\n\n**System Defaults**:\n- Falls back to default investor deck if no `deckUrl` provided\n- Timeline defaults to `investor_demo` (50s)\n\n**CDN Usage**:\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@buzztrail-ai/presentation@1.1/index.umd.js\"></script>\n<script>\n  const demo = BuzztrailPresentation.createDemoExperience('container', {\n    customerName: 'Jane Investor',\n    customerEmail: 'jane@acme.com',\n    supabaseUrl: 'https://your-project.supabase.co',\n    supabaseKey: 'your-anon-key',\n  });\n\n  demo.start();\n</script>\n```\n\n## Wix Integration Guide\n\nWix requires special handling due to iframe permission restrictions. Follow these steps:\n\n### Step 1: Add a Container Element\n\n1. Open Wix Editor for your site\n2. Click \"Add Elements\" (+) → Select \"Strip\" or \"Box\"\n3. Position and size the element where you want the presentation (recommended: 900x600px or larger)\n4. Right-click the element → \"View Properties\" → Note the **Element ID** (e.g., `comp-mfy88b7h`)\n\n### Step 2: Add BuzzTrail via Custom Code\n\n1. Open **Settings** → **Advanced** → **Custom Code**\n2. Click **\"+ Add Custom Code\"**\n3. Paste the following code (replace credentials and element ID):\n\n```html\n<script src=\"https://cdn.jsdelivr.net/npm/@buzztrail-ai/presentation@1/buzztrail-presentation.min.js\"></script>\n<script>\n  const presentation = createPresentation('comp-mfy88b7h', {\n    customerId: 'your-customer-id',\n    deckId: 'your-deck-id',\n    supabaseUrl: 'https://your-project.supabase.co',\n    supabaseKey: 'your-anon-key'\n  });\n\n  presentation.start();\n</script>\n```\n\n4. Configure the snippet:\n   - **Name**: BuzzTrail Presentation\n   - **Add to Pages**: Choose \"All pages\" or specific pages\n   - **Place Code in**: Select **\"Body - end\"** (recommended)\n5. Click **\"Apply\"**\n6. **Publish your site**\n\n### Finding the Correct Container ID\n\nEach Wix page element has a unique ID. To find the correct container ID for your page:\n\n1. Open your published Wix page in a browser\n2. Open the browser's Developer Tools (F12 or right-click → Inspect)\n3. In the Console tab, paste this code and press Enter:\n\n```javascript\ndocument.querySelectorAll('[id^=\"comp-\"]').forEach(el => {\n  console.log(`ID: ${el.id}, Size: ${el.offsetWidth}x${el.offsetHeight}px`);\n});\n```\n\n4. Look for a container with dimensions around **900x600px or larger** - this is ideal for presentation display\n5. Copy that container's ID (e.g., `comp-abc123xyz`) and use it in `createPresentation()`\n\n### Why Custom Code (Not Embed HTML)?\n\n- **Wix Embed HTML** wraps code in an iframe, which blocks camera/microphone permissions\n- **Custom Code** runs directly on the page, allowing proper permissions for voice interaction\n- This is the **only way** to enable voice-interactive presentations on Wix\n\n## TypeScript Support\n\nThis package includes full TypeScript type definitions. No need to install `@types` packages.\n\n### Type Imports\n\n```typescript\nimport type {\n  // Main API\n  Presentation,\n  PresentationConfig,\n  PresentationState,\n\n  // Configuration types\n  ViewerConfig,\n  GatingConfig,\n  ThemeMode,\n  PresentationThemeConfig,\n\n  // Session types\n  Session,\n  SessionState,\n\n  // Error types\n  PresentationError,\n  SessionError,\n  NetworkError,\n  BotError,\n  ConfigError,\n  ErrorSeverity,\n  ErrorCategory,\n  RecoveryStrategy,\n} from '@buzztrail-ai/presentation';\n```\n\n### Example: Type-Safe Configuration\n\n```typescript\nimport { createPresentation } from '@buzztrail-ai/presentation';\nimport type { PresentationConfig, PresentationState } from '@buzztrail-ai/presentation';\n\nconst config: PresentationConfig = {\n  customerId: 'acme-corp',\n  deckId: 'product-demo',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key',\n\n  // TypeScript will autocomplete and validate these properties\n  viewer: {\n    position: 'center',  // Type-checked: 'left' | 'center' | 'right'\n    showControls: true,\n    aspectRatio: '16:9' // Type-checked: '16:9' | '4:3' | '21:9'\n  },\n\n  theme: 'auto', // Type-checked: 'light' | 'dark' | 'auto'\n\n  // TypeScript will autocomplete and validate callbacks\n  onStateChange: (state: PresentationState) => {\n    console.log('State:', state); // Type: 'idle' | 'connecting' | 'connected' | 'disconnected'\n  }\n};\n\nconst presentation = createPresentation('my-container', config);\n```\n\n## Configuration\n\n### createPresentation Options\n\n```typescript\ninterface PresentationConfig {\n  // Required: Your BuzzTrail customer ID\n  customerId: string;\n\n  // Required: Deck ID to present\n  deckId: string;\n\n  // Required: Supabase project URL\n  supabaseUrl: string;\n\n  // Required: Supabase anonymous key\n  supabaseKey: string;\n\n  // Optional: Backend API base URL (defaults to production)\n  apiUrl?: string;\n\n  // Optional: Viewer configuration\n  viewer?: ViewerConfig;\n\n  // Optional: Theme mode\n  theme?: ThemeMode; // 'light' | 'dark' | 'auto'\n\n  // Optional: Custom theme configuration\n  themeConfig?: PresentationThemeConfig;\n\n  // Optional: Lead capture configuration\n  gating?: GatingConfig;\n\n  // Optional: Customer metadata for session tracking\n  customerInfo?: {\n    name?: string;\n    email?: string;\n    [key: string]: unknown;\n  };\n\n  // Optional: Enable debug logging\n  debug?: boolean;\n\n  // Optional: Lifecycle callbacks\n  onStart?: () => void;\n  onEnd?: () => void;\n  onError?: (error: Error) => void;\n  onStateChange?: (state: PresentationState) => void;\n}\n```\n\n### Viewer Configuration\n\n```typescript\ninterface ViewerConfig {\n  // Viewer position in container\n  position?: 'left' | 'center' | 'right'; // default: 'center'\n\n  // Show manual slide controls\n  showControls?: boolean; // default: false\n\n  // Controls position\n  controlsPosition?: 'top' | 'bottom'; // default: 'bottom'\n\n  // Video aspect ratio\n  aspectRatio?: '16:9' | '4:3' | '21:9'; // default: '16:9'\n\n  // Show loading state\n  showLoading?: boolean; // default: true\n\n  // Custom loading message\n  loadingMessage?: string; // default: 'Loading presentation...'\n}\n```\n\n### Gating Configuration\n\n```typescript\ninterface GatingConfig {\n  // Enable lead capture form\n  enabled: boolean;\n\n  // Fields to collect\n  fields: Array<'name' | 'email' | 'phone' | 'company'>;\n\n  // Form title (optional)\n  title?: string;\n\n  // Form description (optional)\n  description?: string;\n}\n```\n\n### Theme Configuration\n\n```typescript\ninterface PresentationThemeConfig {\n  // Theme mode\n  mode: 'light' | 'dark' | 'auto';\n\n  // Custom colors (optional)\n  colors?: {\n    background?: string;\n    text?: string;\n    accent?: string;\n    border?: string;\n  };\n}\n```\n\n## API Reference\n\n### `createPresentation(containerOrId, config)`\n\nCreate a presentation instance in the specified container.\n\n**Parameters:**\n- `containerOrId` (string | HTMLElement): DOM element or element ID to inject the presentation into\n- `config` (PresentationConfig): Configuration options\n\n**Returns:** `Presentation` instance\n\n```typescript\nconst presentation = createPresentation('my-container', {\n  customerId: 'acme-corp',\n  deckId: 'product-demo',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key'\n});\n```\n\n### `endPresentation(sessionId)`\n\nEnd a presentation by session ID.\n\n**Parameters:**\n- `sessionId` (string): The session ID to end\n\n**Returns:** `Promise<void>`\n\n```typescript\nawait endPresentation('session-abc123');\n```\n\n### Presentation Instance\n\nThe object returned by `createPresentation()` has the following methods:\n\n#### `presentation.start()`\n\nStart the presentation session. Connects to LiveKit room, spawns bots, and begins the interactive presentation.\n\n**Returns:** `Promise<void>`\n\n```typescript\nawait presentation.start();\n```\n\n#### `presentation.end()`\n\nEnd the presentation session. Disconnects from room, cleans up resources.\n\n**Returns:** `Promise<void>`\n\n```typescript\nawait presentation.end();\n```\n\n#### `presentation.getState()`\n\nGet the current presentation state.\n\n**Returns:** `PresentationState` - `'idle' | 'connecting' | 'connected' | 'disconnected'`\n\n```typescript\nconst state = presentation.getState();\nconsole.log(state); // 'connected'\n```\n\n#### `presentation.destroy()`\n\nDestroy the presentation instance and clean up all resources. Call this when removing the presentation from the page.\n\n**Returns:** `void`\n\n```typescript\npresentation.destroy();\n```\n\n#### `presentation.sessionId`\n\nRead-only property containing the unique session ID.\n\n```typescript\nconsole.log(presentation.sessionId); // 'session-abc123'\n```\n\n## Configuration Scenarios\n\n### Scenario 1: Basic Presentation (Minimal Config)\n\n```typescript\nconst presentation = createPresentation('container', {\n  customerId: 'acme-corp',\n  deckId: 'product-demo',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key'\n});\n\nawait presentation.start();\n```\n\n### Scenario 2: With Manual Controls\n\n```typescript\nconst presentation = createPresentation('container', {\n  customerId: 'acme-corp',\n  deckId: 'product-demo',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key',\n\n  viewer: {\n    showControls: true,\n    controlsPosition: 'bottom'\n  }\n});\n\nawait presentation.start();\n```\n\n### Scenario 3: With Lead Capture\n\n```typescript\nconst presentation = createPresentation('container', {\n  customerId: 'acme-corp',\n  deckId: 'product-demo',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key',\n\n  gating: {\n    enabled: true,\n    fields: ['name', 'email', 'company'],\n    title: 'Get Access to Our Product Demo',\n    description: 'Please provide your information to continue'\n  }\n});\n\nawait presentation.start();\n```\n\n### Scenario 4: Full Configuration with Callbacks\n\n```typescript\nconst presentation = createPresentation('container', {\n  customerId: 'acme-corp',\n  deckId: 'product-demo',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key',\n  apiUrl: 'https://api.buzztrail.ai',\n\n  viewer: {\n    position: 'center',\n    showControls: true,\n    controlsPosition: 'bottom',\n    aspectRatio: '16:9',\n    showLoading: true,\n    loadingMessage: 'Preparing your personalized demo...'\n  },\n\n  theme: 'auto',\n\n  gating: {\n    enabled: true,\n    fields: ['name', 'email']\n  },\n\n  customerInfo: {\n    name: 'Jane Smith',\n    email: 'jane@example.com',\n    company: 'Acme Inc'\n  },\n\n  debug: true,\n\n  onStart: () => {\n    console.log('Presentation started');\n    // Track analytics, show UI elements, etc.\n  },\n\n  onEnd: () => {\n    console.log('Presentation ended');\n    // Hide UI elements, show follow-up actions, etc.\n  },\n\n  onError: (error) => {\n    console.error('Presentation error:', error);\n    // Show user-friendly error message\n  },\n\n  onStateChange: (state) => {\n    console.log('State changed to:', state);\n    // Update UI based on state\n    if (state === 'connected') {\n      // Show \"presentation is live\" indicator\n    }\n  }\n});\n\nawait presentation.start();\n```\n\n## Browser Support\n\n- Chrome/Edge: Latest 2 versions\n- Firefox: Latest 2 versions\n- Safari: Latest 2 versions\n- Mobile browsers: iOS Safari 14+, Chrome Android\n\n**Note**: Voice interaction requires browser support for WebRTC and getUserMedia API.\n\n## Troubleshooting\n\n### \"Domain not authorized\" Error\n\n**Solution**: Contact BuzzTrail support to authorize your domain. Domain authorization is managed by BuzzTrail admins for security purposes.\n\n### Camera/Microphone Not Working\n\n- **HTTPS Required**: Voice interaction only works on secure (HTTPS) websites\n- **Wix Users**: Use Custom Code (Settings → Advanced), NOT the Embed HTML element\n- **Browser Permissions**: Users must allow microphone access when prompted\n- **Check Container**: Ensure the container element exists before calling `createPresentation()`\n\n### Presentation Not Appearing\n\n- **Check Account**: Verify your BuzzTrail account is active\n- **Check Customer ID**: Ensure you're using the correct customer ID from your dashboard\n- **Check Deck ID**: Verify the deck ID exists and is published\n- **Check Supabase Credentials**: Ensure your Supabase URL and key are correct\n- **Check Container**: The HTML element with your container ID must exist on the page\n- **Check Console**: Open browser DevTools (F12) to see any error messages\n\n### Slides Not Advancing\n\n- **Voice Commands**: The AI voice agent controls slides based on conversation flow\n- **Manual Controls**: Enable manual controls with `viewer.showControls: true` if you want user control\n- **Database Connection**: Ensure Supabase credentials are correct - slides sync via database\n- **Network Issues**: Check browser console for network errors\n\n### Bot Spawn Failures\n\nIf you see \"Bot spawn failed\" errors:\n\n1. **Check API URL**: Verify `apiUrl` is correct (or omit to use default)\n2. **Check Session Creation**: Ensure the session was created successfully\n3. **Check Logs**: Enable `debug: true` to see detailed bot spawn logs\n4. **Retry**: Bot spawning includes automatic retry logic, wait a few seconds\n\n### Debugging Slide Control Issues\n\nEnable debug mode to see detailed logs:\n\n```typescript\nconst presentation = createPresentation('container', {\n  customerId: 'acme-corp',\n  deckId: 'product-demo',\n  supabaseUrl: 'https://your-project.supabase.co',\n  supabaseKey: 'your-anon-key',\n  debug: true // Enable debug logging\n});\n```\n\nDebug logs will show:\n- Session creation\n- Bot spawn attempts\n- LiveKit room connection\n- Slide control commands\n- Error details with recovery strategies\n\n## Examples\n\n### Wix Example (Copy-Paste Ready)\n\n```html\n<!-- Add via Wix Settings → Advanced → Custom Code → Body - end -->\n<script src=\"https://cdn.jsdelivr.net/npm/@buzztrail-ai/presentation@1/buzztrail-presentation.min.js\"></script>\n<script>\n  // Replace these values with your credentials\n  const CUSTOMER_ID = 'your-customer-id';\n  const DECK_ID = 'your-deck-id';\n  const SUPABASE_URL = 'https://your-project.supabase.co';\n  const SUPABASE_KEY = 'your-anon-key';\n  const CONTAINER_ID = 'comp-mfy88b7h'; // Your Wix element ID\n\n  const presentation = createPresentation(CONTAINER_ID, {\n    customerId: CUSTOMER_ID,\n    deckId: DECK_ID,\n    supabaseUrl: SUPABASE_URL,\n    supabaseKey: SUPABASE_KEY,\n\n    viewer: {\n      showControls: true,\n      aspectRatio: '16:9'\n    },\n\n    onStart: () => console.log('Presentation started!'),\n    onEnd: () => console.log('Presentation ended!'),\n    onError: (error) => console.error('Error:', error.message)\n  });\n\n  presentation.start().catch(error => {\n    console.error('Failed to start presentation:', error);\n  });\n</script>\n```\n\n### Generic HTML Example (Copy-Paste Ready)\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>BuzzTrail Presentation Demo</title>\n  <style>\n    body {\n      margin: 0;\n      padding: 20px;\n      font-family: Arial, sans-serif;\n      background: #f5f5f5;\n    }\n\n    h1 {\n      text-align: center;\n      color: #333;\n    }\n\n    #presentation-container {\n      max-width: 1200px;\n      margin: 0 auto;\n      background: white;\n      border-radius: 8px;\n      box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n      min-height: 600px;\n      padding: 20px;\n    }\n\n    .status {\n      text-align: center;\n      padding: 10px;\n      margin: 20px auto;\n      max-width: 400px;\n      border-radius: 4px;\n      background: #e3f2fd;\n      color: #1976d2;\n    }\n  </style>\n</head>\n<body>\n  <h1>Product Demo Presentation</h1>\n\n  <div id=\"status\" class=\"status\">\n    Initializing presentation...\n  </div>\n\n  <div id=\"presentation-container\"></div>\n\n  <!-- Load BuzzTrail Presentation SDK -->\n  <script src=\"https://cdn.jsdelivr.net/npm/@buzztrail-ai/presentation@1/buzztrail-presentation.min.js\"></script>\n\n  <script>\n    // Configuration\n    const config = {\n      customerId: 'your-customer-id',\n      deckId: 'your-deck-id',\n      supabaseUrl: 'https://your-project.supabase.co',\n      supabaseKey: 'your-anon-key',\n\n      viewer: {\n        position: 'center',\n        showControls: true,\n        controlsPosition: 'bottom',\n        aspectRatio: '16:9'\n      },\n\n      theme: 'auto',\n\n      debug: true,\n\n      onStart: () => {\n        updateStatus('Presentation is live!', 'success');\n      },\n\n      onEnd: () => {\n        updateStatus('Presentation ended. Thank you!', 'info');\n      },\n\n      onError: (error) => {\n        updateStatus('Error: ' + error.message, 'error');\n        console.error('Presentation error:', error);\n      },\n\n      onStateChange: (state) => {\n        console.log('State:', state);\n        if (state === 'connecting') {\n          updateStatus('Connecting...', 'info');\n        } else if (state === 'connected') {\n          updateStatus('Connected!', 'success');\n        } else if (state === 'disconnected') {\n          updateStatus('Disconnected', 'info');\n        }\n      }\n    };\n\n    // Helper function to update status\n    function updateStatus(message, type = 'info') {\n      const statusEl = document.getElementById('status');\n      statusEl.textContent = message;\n      statusEl.style.background = {\n        success: '#e8f5e9',\n        error: '#ffebee',\n        info: '#e3f2fd'\n      }[type];\n      statusEl.style.color = {\n        success: '#2e7d32',\n        error: '#c62828',\n        info: '#1976d2'\n      }[type];\n    }\n\n    // Create and start presentation\n    const presentation = createPresentation('presentation-container', config);\n\n    presentation.start()\n      .then(() => {\n        console.log('Presentation started successfully');\n      })\n      .catch(error => {\n        updateStatus('Failed to start: ' + error.message, 'error');\n        console.error('Failed to start presentation:', error);\n      });\n\n    // Cleanup on page unload\n    window.addEventListener('beforeunload', () => {\n      presentation.destroy();\n    });\n  </script>\n</body>\n</html>\n```\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md) for version history.\n\n## License\n\nProprietary - BuzzTrail AI\n\n---\n\n**Built with TypeScript** • **AI-Powered Presentations** • **Made for modern web platforms**\n","readmeFilename":"README.md"}