{"_id":"react-helios","_rev":"30-4bdb17d6733dea0d922df972b9c973f1","name":"react-helios","dist-tags":{"latest":"2.14.0"},"versions":{"2.0.0":{"name":"react-helios","version":"2.0.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.0.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"e8dc60c9aa468e087fe77f79fe42bdde8396176a","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.0.0.tgz","fileCount":12,"integrity":"sha512-e+W+KO9y+sXdQlHU7/0LMtRfu8IcKVUCJIQUOWv9qTM5M6DscYJd7PXTYX2E63o8luDEv3phGZ0mLZMr+I/18g==","signatures":[{"sig":"MEUCID+Gb963aDPiBo39arz2ZkV2HbgIh48hizAlzdgQIE46AiEAiMDlpbpH5q/r/SrXTN3lBxVp3M9a/T8dZTIYWnAANWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":330221},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":"./dist/styles.css"},"gitHead":"e315a09af927637dd9a9576a295cc18133bbb927","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.3.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and thumbnail preview","directories":{},"_nodeVersion":"23.11.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.0.0_1771663563662_0.12151692961440164","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"react-helios","version":"2.0.1","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.0.1","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"9c3f29e67be821e203f5f14e5d4e64d60aa1d906","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.0.1.tgz","fileCount":12,"integrity":"sha512-pBSTAfEZdeoVJ6kQkb2wXxRJWOFnxAq6YsPSFGN+5ynEZhUsgifGHPDJwLLOlzUiByRERv0Eo77O7nqeQPcsVA==","signatures":[{"sig":"MEUCIQC0UxhWBaO9g8jF4/rMTyacuh1u+TH2lqZq/ci1yg1zzQIgRJ3hdDF9a4GS/I/A4l74xJxVKq2jEktDdU7BtK7WRjo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":330113},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":"./dist/styles.css"},"gitHead":"c24393479113f65349cf9088cbe5b7200dfd1939","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.3.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and thumbnail preview","directories":{},"_nodeVersion":"23.11.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.0.1_1771663730718_0.43142614959559245","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"react-helios","version":"2.1.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.1.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"87eb7e6e7c9783a9bcf02274d2adc89e73683ef9","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.1.0.tgz","fileCount":11,"integrity":"sha512-Ep9fzj5YQk65PCfomighfvBLIzcCSIDPNTDDrKMb3ALZYstuFCcbXOFNKza89U5KeonRDkoQqnQJnBKW5uBCDA==","signatures":[{"sig":"MEQCIDckzI84q4tMtwl66Az0n7rIwpKDh6I+sGuTVUl+xAmZAiA1RrjA9x1+oWtpP4yiVjkjOoXflAUTJ0AislopOT0njA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":336017},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"a2dedfe4e23fdf204086d0911767ba6f55e40968","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.3.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"23.11.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.1.0_1771677556766_0.7028881056050211","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"react-helios","version":"2.1.1","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.1.1","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"d8516afb52a38a0701d93285143084a7338b7627","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.1.1.tgz","fileCount":11,"integrity":"sha512-5rbvth2fJb0RgcAIjA4jIWj9adFMsZb6yMnX/U2U/bnnRzyaSQAsFZdrhcIHjy4DK+P91tGwW1B2XR6WciJpZg==","signatures":[{"sig":"MEUCIQCDUokx2+NcYAr/joyuPCHciMMqquH5nLFv7quv40YTzwIgSe4TZUlNyIbocSEgSFLyZy49g8nQKMjjpQnxP75qNJY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372646},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"c3e66deb7a8463fe07c1028a6a5a6a9a9070ad2f","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.3.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"23.11.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.1.1_1771680178313_0.5179889527025843","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"react-helios","version":"2.2.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.2.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"03f05ec536d3f6e8c559077ef88c9ca0ed267ce9","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.2.0.tgz","fileCount":11,"integrity":"sha512-7MziP4ULcxTeagw6I9pi6OIzp9krdBKO3lsYWv3cw9ftlubM08dmKLhv6XKWp2pzeuaEZVqPaWvW3rtQlmKfZA==","signatures":[{"sig":"MEUCIQCWt2dgJ8melvAxjSV3tbZs6HNVLwBiBLzkEYSUT+Vs0AIgHyWu99tiIpqjdq6gXc+91jh/vZ1aFVmYyeJHS1tEzBk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375694},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"ac725243e91b0f708c94dd6b1db36e2b4cadbeca","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.3.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"23.11.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.2.0_1771681409412_0.5901782025099198","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"react-helios","version":"2.3.1","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.3.1","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"a008f07bf10888b2e347616b5c1ff2836678bf31","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.3.1.tgz","fileCount":11,"integrity":"sha512-m8HHYF/72yhB9bZSDf0s53ACiL328nkkx6fc1KxH76I8ZBwrd7c1Qpz/Rt+eZ+F9qlXY5sC/T3pIf2Cphz2BkA==","signatures":[{"sig":"MEQCIFTLOxFrR4I1Ie3BjRlBQ4mR+HVbFKgb7m9vkxnTNU3bAiAc3ZkvkXy2GRYQFzKqdw1S66ORFzxaawtXZG9xHKkdCg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":382456},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"c8463eb9694c98c8b4fd0d4d3484c2509b946b07","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.3.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"23.11.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.3.1_1771682235190_0.5021438480706879","host":"s3://npm-registry-packages-npm-production"}},"2.3.2":{"name":"react-helios","version":"2.3.2","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.3.2","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"572d26150d1c730fce4883c1947b0434df03ed0e","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.3.2.tgz","fileCount":11,"integrity":"sha512-oOXVNKGuvsnOQ26vuynZZgqm9PxD7rSf4L5znBpeSbwlwDkIe9xPhWCk7tUxJexPyv6F3M8D5saDXimdVNYrdQ==","signatures":[{"sig":"MEMCHwNppqRg7qbVv3SrU/HdkoUu5yQfYM5XFtkZpox5oHgCIAh/UCIDZH5dJp1ZnVGaAs9Gaxsems+CKqVUPfSM0H2v","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":383667},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"e09f440834120e77af21cef2b4e4931f61ad48fb","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.3.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"23.11.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.3.2_1771697119398_0.5165612259871635","host":"s3://npm-registry-packages-npm-production"}},"2.3.3":{"name":"react-helios","version":"2.3.3","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.3.3","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"0be0f309c717d9b0848e5dcb2f0a473b99937e23","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.3.3.tgz","fileCount":11,"integrity":"sha512-daEdUss38PUVH8sSUBNTzOwihKBvboKzv012xhYFgm4mj122JCVqvl2pKFsmHDNjaGZRYSh30BIRvSz7+Vps5Q==","signatures":[{"sig":"MEUCIA02sgPVfgLsrlkVUJNY9a1qE2OIwyc7OzM0sAnYKkaPAiEAqxvFCUXUPKz0poOlnVqB5btiZMZit3QiaE3AgeY9pkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":385498},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"69b5abda1bc0800bbe39c794aa215a19665272b3","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.3.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"23.11.0","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.3.3_1771724642684_0.9161392929143892","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"react-helios","version":"2.4.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.4.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"4edf64acf03312cdea0b5d699e0f1223ffbf122a","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.4.0.tgz","fileCount":13,"integrity":"sha512-wOJD4yXPW5PqaLiHdI8KEZWdBNAxyLrponTx0c8FxJ/7qbW0kJdCPshX8D22iRoxvCwVG28wSQkRhYnqWAKkdw==","signatures":[{"sig":"MEYCIQDfj9uRQqB5zVq7znoTdGpYYKhLxJOyNcf7x2HWc5z/jQIhAPgNAWu35dcSQCRbN2fEMPaL5GuuSs4OZUsaOvjwMHB/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":446749},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"a983913bfc281528b9cee16b6548e7511a2710fc","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, quality selection, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.4.0_1773542040153_0.84010581474834","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"react-helios","version":"2.5.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.5.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"3af75e532746f49a908a8160f9ca474cf19a0eaa","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.5.0.tgz","fileCount":11,"integrity":"sha512-JfjCc3p5EhQCC8clRCx5/Br1Jh5FdLBu45/zgoLlWInA/6xugrXfy8jTKEGGG62KoYAeMUxRwwqKlPCNx/cUPQ==","signatures":[{"sig":"MEQCIAu+Dv3wN92vgp1EoycCcUNMX8EljM7zKqozJPq2fAonAiBbHSfv8OiEf3FtzfTyBlpziSnt/8Um7BqFqG0+buqIKg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444509},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"3ee0e6a3d74abbbbf2dec94d6c5ed206f478e40f","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.5.0_1773721588077_0.9504180515131488","host":"s3://npm-registry-packages-npm-production"}},"2.7.0":{"name":"react-helios","version":"2.7.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.7.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"d65bd5b1475111452349576c5f2969c8de6336d7","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.7.0.tgz","fileCount":11,"integrity":"sha512-lGAkISjleiJkd4bD/zyVmfO76pH9v6yKN+lXfUd4WnbIFhOIdGgn7JsLuDXprOb1eY/q6nDJ0X12oaLv8xuSdw==","signatures":[{"sig":"MEYCIQCqptRSl0KywNH21bmaWoHvTQYYAIB+h2oyl+ra1HeP8gIhAK08a5K9wL3eGFJVbpAdY50t/GFmRIEH1gcEpnWInwAf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":494376},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"b44d2b1b4a8a5ff607d0e3dca784b6a86b68adc6","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.7.0_1773727474246_0.1758749487016491","host":"s3://npm-registry-packages-npm-production"}},"2.7.1":{"name":"react-helios","version":"2.7.1","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.7.1","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"970a52be27d99bb02b83e4cbd55c3d8611e7b7bc","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.7.1.tgz","fileCount":11,"integrity":"sha512-0bL3FSIDpJmaBku8SvjEZFBeRLqpELgeAouCEs0Xj5dJUCj5DGGdRQ/txnpmppTnTATp1BDv7iT3HSQ7VDPHWg==","signatures":[{"sig":"MEUCIAvLCVX/pVuA4pMvUA3+k/T/f5oNW0OLxz2519GzdAOwAiEApRxEdafjvWQQGxwg4RgsyNGug59fOa0oF3Zkm55Dd9U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":503495},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"5c9e7540431f5df63a7a729a6fbd5028d7a11e7d","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.7.1_1774362802272_0.3761096323015025","host":"s3://npm-registry-packages-npm-production"}},"2.7.2":{"name":"react-helios","version":"2.7.2","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.7.2","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"2e641e44af24832c94878052eb3f1bbd9dd1306c","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.7.2.tgz","fileCount":11,"integrity":"sha512-8mxbfFvXhFua/YghG08lOlVWbl/jfskkUJDekSZaoV7hJu6FSuzfsTCVnyGb6NvXYpOi+Mdy1PYqPiYVIhPiwg==","signatures":[{"sig":"MEUCIQCrqTYzwseXbd7/tsaDuMJibEeX+gPReCRrqFvFGWL2wAIgDje0QhTSoHZ5w1Pi2ieZR3aosyoZxRT5EN/7PZYMMuM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":503875},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"7e7c30cb70a24212e2a1e8d5f7400da842e8ebe0","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.7.2_1774423470523_0.8231601983459391","host":"s3://npm-registry-packages-npm-production"}},"2.7.3":{"name":"react-helios","version":"2.7.3","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.7.3","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"10b41257940825d8bc8e669a0ea0c26d6a43dd93","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.7.3.tgz","fileCount":11,"integrity":"sha512-qd2o7fVpIQF0a6XTfmJzWHbGtY62T7UCYrrzLd/rDAWV2IMPu7OblR5xUt8XWslMKHKLMchb6Ph7rmDrP0Je1g==","signatures":[{"sig":"MEQCIH9upvB5DyznLw7YViOuv8sBF5PEkaM0RDhG2zMNab7gAiB2MAeBrs3YLeoxcgWbdkgHc3+VrWLp04PdntKJ8T5i9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":504129},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"e23f1a37d8c3980979aad9d3a38f23387d66c280","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.7.3_1774431650115_0.362475215799845","host":"s3://npm-registry-packages-npm-production"}},"2.7.4":{"name":"react-helios","version":"2.7.4","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.7.4","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"cb79a015b3aa64c511b73b214a666cad0580425f","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.7.4.tgz","fileCount":11,"integrity":"sha512-y74zLMi4ZgzdJ6TIETeQHu5e+TyJpWc1tS0CjREOXDSO6GIQO6BHr8jMCKPdTs02hvo641sYS5uLVqWVeyYTUg==","signatures":[{"sig":"MEYCIQCxDyyL7Ibx6A59DUasZKtO/RzFijALy1mC8yjS3PaLIgIhAMff55YW/C83i7FuZxPM19WjRBoxRDYtTOhEKM7mJ3Oe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":506634},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"59b5b431b42aa9bfad7eccb4592ec13c20d08b9e","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.7.4_1774455021304_0.9540846762615236","host":"s3://npm-registry-packages-npm-production"}},"2.7.5":{"name":"react-helios","version":"2.7.5","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.7.5","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"fd396a34842566ad473ef253a86b788a5b82879e","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.7.5.tgz","fileCount":11,"integrity":"sha512-pJEJRe3P2YjHy1VlC1tudWp6KAVX3GSog+OU//i/R8FBiRd6YqJf57JccYjQwHCjoveJ9M2/7ysI1hpDuqfzCA==","signatures":[{"sig":"MEQCIEUR79TPIMhfw67af/c0lT3JQ/Gg06+QLZ9yOkH0nQQ1AiBz0GVk91OZEpyh26Lusg1aa0CBVn+m3D9yECu/uv3vHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":508190},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"04be54b2dd385545b9faff04dfc0078cd191011a","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.7.5_1774498264154_0.4675310164606885","host":"s3://npm-registry-packages-npm-production"}},"2.8.0":{"name":"react-helios","version":"2.8.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.8.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"5718ec71d508383307b3370da9f624193c7a8b51","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.8.0.tgz","fileCount":11,"integrity":"sha512-CTh8MWvv2HfaTDKBTyKkkH34HzHhnQTv4lOy30nL8qE+UFujZ9ncWEZTW83z1gOjyjvoPdrZa3VTYMUr/5QLDQ==","signatures":[{"sig":"MEQCIGOXjWFMwA5eGbM8pRrDEvvkawbueXbo9N0lF6jWUi39AiA+iT2wAXCkD4GwxrkAPw74D2OUvuNH/VNfwMHPK+3yYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":529741},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"04be54b2dd385545b9faff04dfc0078cd191011a","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.8.0_1774507002639_0.26891764307497024","host":"s3://npm-registry-packages-npm-production"}},"2.9.1":{"name":"react-helios","version":"2.9.1","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.9.1","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"0b14b3c7eb98a7bad689c50b9b942e1e2b5dfd18","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.9.1.tgz","fileCount":11,"integrity":"sha512-o2ue34k8UhXVkHbwhTHORka3OAGZlvoz7PCcIlp7sjgdPWRvjl91FsqeIdJlzPZvTKBWXn9PaIyjHdIJgrmSxg==","signatures":[{"sig":"MEQCIEkBXxgG6mF31wMHqJzNma+IhAjnkHWmg/ZVksIptXC9AiBvXzcAPhRtHz1YZxSq4PMbfuDwZzs3MairZltQ3kdJug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":566741},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"04be54b2dd385545b9faff04dfc0078cd191011a","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.9.1_1774511686428_0.4788703371922354","host":"s3://npm-registry-packages-npm-production"}},"2.9.2":{"name":"react-helios","version":"2.9.2","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.9.2","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"35d849e239b5b70ec556f383064761ff4d976472","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.9.2.tgz","fileCount":11,"integrity":"sha512-eV269wT+7UpuLKcWvcTgQ1bzIa2ycfi02YkMOxSnYluAYyqfU7EnR4AKO2qyNYblC+StclE71KdbV3Z1jNGh4g==","signatures":[{"sig":"MEUCIGD9JqWmqiUcOL81DRAcARq6KzpsjT5Mph7xiLTQMomzAiEAyDV3UH5jsRwzdz4RTbcXtm0b0LfLEkSHPEkFLHjjslo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":571981},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"04be54b2dd385545b9faff04dfc0078cd191011a","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.9.2_1774512230793_0.7478421400251065","host":"s3://npm-registry-packages-npm-production"}},"2.9.3":{"name":"react-helios","version":"2.9.3","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.9.3","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"94d75ece2831568402ba8bc230258c347a07428a","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.9.3.tgz","fileCount":11,"integrity":"sha512-+fFwnQxyQ0yZeJCqsBgRZwSPDxzyrsPMIW2j7/JzrW0M90qMvLspzljTkmtIrAaYfQkguU4PF28qLRYt94zdhg==","signatures":[{"sig":"MEQCIGpheB0dNtdVvHypPjGgVvxfFUW5pld0+CBfP5VFknKPAiAcEW255VMdjpnUVs3cUJi6YmQFDnFFzbKrIaTyQhuaZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":580211},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"04be54b2dd385545b9faff04dfc0078cd191011a","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.9.3_1774519202784_0.9501297852911081","host":"s3://npm-registry-packages-npm-production"}},"2.9.4":{"name":"react-helios","version":"2.9.4","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.9.4","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"fd60ee05ae1d153d22e0ec110a193275c4b12193","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.9.4.tgz","fileCount":11,"integrity":"sha512-5X3HMuZwKv2/w3T+7iRYyiqueUczjRB0smD4aep5QbDkcq0wYtHj2enaECfX5kwDK62VAOcCNc6s9CwYJoBnag==","signatures":[{"sig":"MEUCIQCbi1Rk4DsHwtgRnBp0AzB7BleEMGgzi8bzt8HX+WfPnQIgJYe/guoRV2zMET4C3lBdld33wA4Sz1P64nFagEgxPek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":579851},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"04be54b2dd385545b9faff04dfc0078cd191011a","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.9.4_1775488968678_0.7162073092939878","host":"s3://npm-registry-packages-npm-production"}},"2.9.5":{"name":"react-helios","version":"2.9.5","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.9.5","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"e567157fcd331989e7388450ed3a4b69f01b0957","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.9.5.tgz","fileCount":11,"integrity":"sha512-gTFyUsT+o24nZNmVLLLAWnhYOntkcJYaprOoM9mo/n4I9LRFGkLg/BXU0APHpf+a4XUry5lw06RT3UuXh9WbaQ==","signatures":[{"sig":"MEUCIQDxiq7xYICpLsmokEL/Zb9zmnu/vTIDUJ8ecaXiywLxjwIgIImYovuYRhCxI9VcSJYs88R3awU0Mt/BGsabKemMCjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":582427},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"04be54b2dd385545b9faff04dfc0078cd191011a","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, and VTT sprite thumbnail preview","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.9.5_1775537846841_0.20216367603840046","host":"s3://npm-registry-packages-npm-production"}},"2.10.0":{"name":"react-helios","version":"2.10.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.10.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"910e6dc764a6c7e5e42d3c2b1d9154dcbebbaf2f","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.10.0.tgz","fileCount":11,"integrity":"sha512-0c3x3fAH36XX0CbcEmFpU8AQ1c2f0y7s1O6q7Bnxf7HwF6QI1Lf1kJCwhJrGr8rLjeDRABOLpVmRPrNl/FWe2Q==","signatures":[{"sig":"MEQCIAnl+ckMGV53ldkBv+ThgfI7bSel3OJtfHSc1xSV1C93AiBwhj+x8RmPrBAx/loTGcgMCfNR3bmnQLIeJQh7HU8XSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":620538},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"ad1a23ba48740543ca66076ef2c71de4bf1df39c","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, VTT sprite thumbnail preview, skip buttons, and mobile-responsive controls","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.10.0_1775665201419_0.8040271268461683","host":"s3://npm-registry-packages-npm-production"}},"2.11.0":{"name":"react-helios","version":"2.11.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.11.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"41009c7a62ffdef6f0214012414bd22fe752b58e","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.11.0.tgz","fileCount":11,"integrity":"sha512-LhWbUl2xaiCAh++F3qHXskmZHlAn56SghSqA5rbaw/KJI8Ij8eEr+dGj2anbDE8GZeIhg/+s0NkmJXkGUJfc8A==","signatures":[{"sig":"MEYCIQDdui4Kp6LOQqNZS3ie989dvv7pMpuA+fP3nSywqoa6FAIhAKD/ZmxvIKuYRrisza6R2iIvRpmg4P4tbWuWot94Xr5o","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":635163},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"ad1a23ba48740543ca66076ef2c71de4bf1df39c","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, zero-cost audio mode, adaptive quality, live streams, subtitles, VTT sprite thumbnail preview, skip buttons, and mobile-responsive controls","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.11.0_1776933051201_0.7644695435632287","host":"s3://npm-registry-packages-npm-production"}},"2.12.0":{"name":"react-helios","version":"2.12.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player","playlist","up-next"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.12.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"99b13fa73cf211a8eaa7c7cbc5a6b0c11adfe6b8","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.12.0.tgz","fileCount":11,"integrity":"sha512-LFyYkmCcm6rzNA9DR1B55my63So83B7N9My/8fpdn8uymCGRDDw201lZ7TE5075D437IUqF0umKbzpBGyrt6eA==","signatures":[{"sig":"MEUCIHHHAIkF8VssIHXO9Zj19rreKWre+NhMStrwqsSk3AvPAiEA9YlzFZiyJvf8EKMPMdTwLDcR/a0nCq0YFWztqIDKSM4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":695853},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"e27b7cd07a7f8abade12eaad934f27ca7cb7f556","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, playlist support, Up Next overlay, zero-cost audio mode, adaptive quality, live streams, subtitles, VTT sprite thumbnail preview, skip buttons, and mobile-responsive controls","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.12.0_1778766990662_0.984235498628784","host":"s3://npm-registry-packages-npm-production"}},"2.13.0":{"name":"react-helios","version":"2.13.0","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player","playlist","up-next"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.13.0","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"00da787e44e51484c166dc8357d15c9b8ff0a596","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.13.0.tgz","fileCount":11,"integrity":"sha512-7HJp4qI5JSeyd9htHk3cyiOtE8dodaWux61dKGBj1dpvBPY/3h+L6Pzh0/b89z98SDjWTiyvDzrfQss46+2M7A==","signatures":[{"sig":"MEUCIBT+SjqN4NHdCU/LsQvh69gCYUE92hkm7h/h/L1ICyraAiEA0Lim1spZy1l0EnIjHyu5AZiw0MyQlctn2g3qdSQqUB4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":712682},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"e27b7cd07a7f8abade12eaad934f27ca7cb7f556","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, playlist support, Up Next overlay, zero-cost audio mode, adaptive quality, live streams, subtitles, VTT sprite thumbnail preview, skip buttons, and mobile-responsive controls","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.13.0_1778771898884_0.9185530370086494","host":"s3://npm-registry-packages-npm-production"}},"2.13.1":{"name":"react-helios","version":"2.13.1","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player","playlist","up-next"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","_id":"react-helios@2.13.1","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"dist":{"shasum":"78cfac32fc6fb864885ad4599e303448b7605b00","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.13.1.tgz","fileCount":11,"integrity":"sha512-UpEGHMsRlvz3g8Gg9SX2TRdjqKaVbMjrWtd4Bn92xsfVFr6Z0WBlyLlBdLybG0Dkenc2yZS6sTBdQOYcKP24Pw==","signatures":[{"sig":"MEUCIQCyqrttpmfH3T2+ozd4RDPwAgNE3/vBdSV2rP4xvZCPmgIgIi3WFzVylRjie+l76AiAkwdbkCGXKQEpriE4lThvzlI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":713068},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"gitHead":"e27b7cd07a7f8abade12eaad934f27ca7cb7f556","scripts":{"dev":"tsup --watch","build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"repository":{"url":"git+https://github.com/sanishmdhr96/react-video-player.git","type":"git"},"_npmVersion":"11.8.0","description":"Production-grade React video player with HLS, playlist support, Up Next overlay, zero-cost audio mode, adaptive quality, live streams, subtitles, VTT sprite thumbnail preview, skip buttons, and mobile-responsive controls","directories":{},"_nodeVersion":"24.13.1","dependencies":{"hls.js":"^1.6.15"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-helios_2.13.1_1778773532832_0.9370662176769151","host":"s3://npm-registry-packages-npm-production"}},"2.14.0":{"name":"react-helios","version":"2.14.0","description":"Production-grade React video player with HLS, playlist support, Up Next overlay, zero-cost audio mode, adaptive quality, live streams, subtitles, VTT sprite thumbnail preview, skip buttons, mobile-responsive controls, and a standalone HLS-capable AudioPla","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./styles":{"types":"./dist/styles.d.ts","default":"./dist/styles.css"}},"scripts":{"build":"tsup && node -e \"require('fs').writeFileSync('dist/styles.d.ts', 'export {};\\n');\"","dev":"tsup --watch","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player","playlist","up-next"],"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/sanishmdhr96/react-video-player.git"},"bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"homepage":"https://github.com/sanishmdhr96/react-video-player#readme","peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"dependencies":{"hls.js":"^1.6.15"},"devDependencies":{"@types/node":"^25.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","typescript":"^5.0.0","tsup":"^8.0.0"},"gitHead":"41d20d1d5287bbc0e3aca6aa9cccc529da5c557f","_id":"react-helios@2.14.0","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-bU0c/0Gfa+vSuln0hRctOOUu8JQAf3OLV7vVaEj6UV3YXrvzMh87xWsYHeCpvB/PsDYM9E+ZdCbpUWsq8pLeSA==","shasum":"1f1556fa3a93afab6cf4fc4f378ec526bbe49e28","tarball":"https://registry.npmjs.org/react-helios/-/react-helios-2.14.0.tgz","fileCount":11,"unpackedSize":843640,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDecknssRG6S3rirBDuhe8QGmPTHoJJRQQzHDGSH7/v0AIgfP+n40fvC+9W41cnOGYklT6YRwvjgp3k9hzV2JGKkh8="}]},"_npmUser":{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"},"directories":{},"maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-helios_2.14.0_1784089029829_0.3100883703846069"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-21T08:46:03.662Z","modified":"2026-07-15T04:17:10.103Z","1.0.0":"2024-02-21T11:15:29.562Z","2.0.0":"2026-02-21T08:46:03.828Z","2.0.1":"2026-02-21T08:48:50.868Z","2.1.0":"2026-02-21T12:39:16.942Z","2.1.1":"2026-02-21T13:22:58.497Z","2.2.0":"2026-02-21T13:43:29.573Z","2.3.1":"2026-02-21T13:57:15.358Z","2.3.2":"2026-02-21T18:05:19.548Z","2.3.3":"2026-02-22T01:44:02.848Z","2.4.0":"2026-03-15T02:34:00.374Z","2.5.0":"2026-03-17T04:26:28.234Z","2.7.0":"2026-03-17T06:04:34.415Z","2.7.1":"2026-03-24T14:33:22.421Z","2.7.2":"2026-03-25T07:24:30.730Z","2.7.3":"2026-03-25T09:40:50.292Z","2.7.4":"2026-03-25T16:10:21.481Z","2.7.5":"2026-03-26T04:11:04.362Z","2.8.0":"2026-03-26T06:36:42.784Z","2.9.1":"2026-03-26T07:54:46.610Z","2.9.2":"2026-03-26T08:03:50.971Z","2.9.3":"2026-03-26T10:00:02.952Z","2.9.4":"2026-04-06T15:22:48.916Z","2.9.5":"2026-04-07T04:57:27.046Z","2.10.0":"2026-04-08T16:20:01.624Z","2.11.0":"2026-04-23T08:30:51.458Z","2.12.0":"2026-05-14T13:56:30.883Z","2.13.0":"2026-05-14T15:18:19.078Z","2.13.1":"2026-05-14T15:45:33.016Z","2.14.0":"2026-07-15T04:17:09.985Z"},"bugs":{"url":"https://github.com/sanishmdhr96/react-video-player/issues"},"author":{"name":"Sanish Manandhar","email":"mail.sanishmanandhar@gmail.com"},"license":"MIT","homepage":"https://github.com/sanishmdhr96/react-video-player#readme","keywords":["react","video","player","video-player","hls","hls.js","live-stream","thumbnail","preview","quality","subtitles","captions","typescript","nextjs","picture-in-picture","vtt","sprite-sheet","thumbnail-preview","audio-mode","audio-player","playlist","up-next"],"repository":{"type":"git","url":"git+https://github.com/sanishmdhr96/react-video-player.git"},"description":"Production-grade React video player with HLS, playlist support, Up Next overlay, zero-cost audio mode, adaptive quality, live streams, subtitles, VTT sprite thumbnail preview, skip buttons, mobile-responsive controls, and a standalone HLS-capable AudioPla","maintainers":[{"name":"sanishmdhr","email":"mail.sanishmanandhar@gmail.com"}],"readme":"# react-helios\n\nProduction-grade React video player with HLS streaming, **playlist support with Up Next countdown**, zero-cost audio mode, adaptive quality selection, manual quality switching, live stream support, subtitle tracks, VTT sprite sheet thumbnail preview, waveform audio progress bar, Picture-in-Picture, configurable skip-back / skip-forward buttons, mobile-responsive controls, and full keyboard control. Also ships a standalone **`AudioPlayer`** for HLS / direct audio sources when you don't need a video element at all.\n\n## Installation\n\n```bash\nnpm install react-helios\n```\n\n**Peer dependencies** — install if not already in your project:\n\n```bash\nnpm install react react-dom\n```\n\n## Quick Start\n\n```tsx\nimport { VideoPlayer } from \"react-helios\";\nimport \"react-helios/styles\";\n\nexport default function App() {\n  return (\n    <VideoPlayer\n      src=\"https://example.com/video.mp4\"\n      poster=\"https://example.com/poster.jpg\"\n      controls\n      options={{\n        autoplay: false,\n        loop: false,\n        thumbnailVtt: \"https://example.com/thumbs/storyboard.vtt\",\n      }}\n    />\n  );\n}\n```\n\n> **Next.js** — import the styles in your root `layout.tsx` and mark the component as `\"use client\"` or wrap it in a client component.\n\n## HLS Streaming\n\nPass any `.m3u8` URL — HLS.js is initialised automatically:\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/stream.m3u8\"\n  controls\n  options={{\n    enableHLS: true,         // default: true\n    hlsConfig: {\n      maxBufferLength: 60,\n      capLevelToPlayerSize: true,\n    },\n  }}\n/>\n```\n\nOn Safari the browser's native HLS engine is used. A **LIVE** badge and **GO LIVE** button appear automatically for live streams.\n\n## Audio Player\n\nA separate, plain audio-only component — no video element, no fullscreen/theater/PiP. Use it when the content genuinely is audio (podcasts, music, audio-only streams) rather than a video you sometimes hide. For a video that *switches* between video and audio playback, see [Audio Mode](#audio-mode) below instead.\n\n```tsx\nimport { AudioPlayer } from \"react-helios\";\nimport \"react-helios/styles\";\n\n<AudioPlayer\n  src=\"https://example.com/audio/stream.m3u8\"  // HLS .m3u8 or a direct file (MP3, AAC, OGG, …)\n  title=\"Episode 12 — Deep Dive\"\n  artist=\"My Podcast\"\n  poster=\"https://example.com/cover.jpg\"\n  controls\n  options={{\n    autoplay: false,\n    skipSeconds: 15,          // 0 hides the skip buttons\n    progressBarVariant: \"bar\", // \"bar\" (default, simple linear) | \"waveform\"\n  }}\n/>\n```\n\nHLS `.m3u8` sources are handled by the same hls.js engine as `VideoPlayer` (with automatic network/media-error retry); anything else is played as a direct `<audio>` source.\n\n### Title / artist / artwork\n\n`poster`, `title`, and `artist` are all optional — only the ones you pass are rendered, and nothing renders at all if none are set. Set `options.showMeta: false` to keep the props (e.g. for your own UI elsewhere) without rendering the built-in meta row:\n\n```tsx\n<AudioPlayer src=\"...\" title=\"Episode 12\" options={{ showMeta: false }} />\n```\n\n### Theming\n\nColours are CSS custom properties on the `.rvp-audio-player` root, so you can override them per-instance via `options.theme` (no CSS file needed) or globally via your own stylesheet:\n\n```tsx\n<AudioPlayer\n  src=\"...\"\n  options={{\n    theme: {\n      background: \"#0f0f0f\",\n      accentColor: \"#22c55e\",   // progress fill, buttons\n      textColor: \"#ffffff\",\n      secondaryTextColor: \"rgba(255,255,255,0.6)\",\n      trackColor: \"rgba(255,255,255,0.2)\",\n      iconColor: \"#ffffff\",\n    },\n  }}\n/>\n```\n\nFor layout-level changes (padding, border-radius, max-width, etc.) pass `className` or `style` — both land on the same `.rvp-audio-player` root, after the theme variables, so `style` can also override them directly.\n\n### `AudioPlayer` props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `src` | `string` | — | Audio URL — HLS `.m3u8` or a direct file (MP3, AAC, OGG, …) |\n| `poster` | `string` | — | Artwork shown next to the title/artist |\n| `title` | `string` | — | Track title |\n| `artist` | `string` | — | Artist / subtitle text |\n| `controls` | `boolean` | `true` | Show the built-in controls |\n| `className` | `string` | — | Extra class appended to the player root |\n| `style` | `CSSProperties` | — | Inline styles on the player root (applied after `theme`) |\n| `options` | `AudioPlayerOptions` | `{}` | All configuration (see below) |\n\n### `AudioPlayerOptions`\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `autoplay` | `boolean` | `false` | Start playback on mount |\n| `muted` | `boolean` | `false` | Start muted |\n| `loop` | `boolean` | `false` | Loop the track |\n| `preload` | `\"none\" \\| \"metadata\" \\| \"auto\"` | `\"metadata\"` | Native `preload` attribute |\n| `enableHLS` | `boolean` | `true` | Enable HLS.js for `.m3u8` sources |\n| `hlsConfig` | `Partial<HlsConfig>` | — | Override any [hls.js config](https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning) option |\n| `crossOrigin` | `\"anonymous\" \\| \"use-credentials\"` | — | CORS attribute for the audio element |\n| `skipSeconds` | `number` | `15` | Seconds to jump on skip-back / skip-forward. `0` hides the buttons |\n| `progressBarVariant` | `\"bar\" \\| \"waveform\"` | `\"bar\"` | `\"bar\"` — simple linear progress. `\"waveform\"` — animated bar-style waveform (same look as VideoPlayer's audio mode) |\n| `showMeta` | `boolean` | `true` | Show the poster/title/artist row when any of them are provided |\n| `theme` | `{ background?, textColor?, secondaryTextColor?, accentColor?, trackColor?, iconColor? }` | — | Colour overrides — each maps to a CSS custom property (see [Theming](#theming)) |\n| `onPlay` / `onPause` / `onEnded` | `() => void` | — | Playback lifecycle events |\n| `onError` | `(error: VideoError) => void` | — | Fired on playback or stream errors |\n| `onTimeUpdate` | `(time: number) => void` | — | Fired during playback |\n| `onDurationChange` | `(duration: number) => void` | — | Fired when duration becomes known |\n| `onBuffering` | `(isBuffering: boolean) => void` | — | Fired when buffering starts / stops |\n\n### `AudioPlayerRef` methods\n\n```tsx\nimport { useRef } from \"react\";\nimport { AudioPlayer } from \"react-helios\";\nimport type { AudioPlayerRef } from \"react-helios\";\n\nconst audioRef = useRef<AudioPlayerRef>(null);\n\n<AudioPlayer ref={audioRef} src=\"...\" />\n<button onClick={() => audioRef.current?.play()}>Play</button>\n```\n\n| Method | Signature | Description |\n|--------|-----------|-------------|\n| `play` | `() => Promise<void>` | Start playback |\n| `pause` | `() => void` | Pause playback |\n| `seek` | `(time: number) => void` | Seek to a time in seconds |\n| `setVolume` | `(volume: number) => void` | Set volume `0–1` |\n| `toggleMute` | `() => void` | Toggle mute, restoring the pre-mute volume |\n| `setPlaybackRate` | `(rate: PlaybackRate) => void` | Set playback speed |\n| `getState` | `() => AudioPlayerState` | Snapshot of current player state |\n| `getAudioElement` | `() => HTMLAudioElement \\| null` | Access the underlying `<audio>` element |\n\n### Audio Player keyboard shortcuts\n\nActivate when the player has focus (click it or tab to it):\n\n| Key | Action |\n|-----|--------|\n| `Space` / `K` | Play / Pause |\n| `←` / `→` | Seek −5 s / +5 s |\n| `↑` / `↓` | Volume +10% / −10% |\n| `M` | Toggle mute |\n\n## Audio Mode\n\n`VideoPlayer`'s audio mode pauses the video element completely (stopping all video decoding), shows the poster artwork, and hands playback off to a lightweight `<audio>` element — so the player uses roughly the same CPU/GPU as a music app instead of a playing video. This is different from the standalone `AudioPlayer` above: it's a runtime toggle on a video, not a dedicated audio component.\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/stream.m3u8\"\n  poster=\"https://example.com/artwork.jpg\"\n  controls\n  options={{\n    audioSrc: \"https://example.com/audio-only.m3u8\",\n    audioPoster: \"https://example.com/audio-artwork.jpg\",\n    audioModeLabel: \"Switch to Audio\",\n    videoModeLabel: \"Switch to Video\",\n    defaultAudioMode: false,\n    onAudioModeChange: (isAudio) => console.log(\"audio mode:\", isAudio),\n  }}\n/>\n```\n\nThe audio toggle button only appears in the control bar when `audioSrc` is provided. Custom icons can be passed via `audioModeIcon` / `videoModeIcon`.\n\nWhen switching between modes, position, volume, and playback rate are synced automatically — the listener hears no gap.\n\n### Audio mode poster\n\nUse `audioPoster` to show a different image in audio mode than the video `poster`. If neither `audioPoster` nor `poster` is provided, the `audioModeFallback` content is shown instead:\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/stream.m3u8\"\n  poster=\"https://example.com/video-thumb.jpg\"\n  options={{\n    audioSrc: \"https://example.com/audio-only.m3u8\",\n    // Show a dedicated artwork image in audio mode\n    audioPoster: \"https://example.com/audio-artwork.jpg\",\n  }}\n/>\n```\n\nPriority order: `audioPoster` → `poster` (if `audioModeFallback` is not set) → `audioModeFallback` → `logo`.\n\nUse `audioModeFallback` when you want to render arbitrary React content (e.g. an animated logo or custom component) instead of a static image:\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/stream.m3u8\"\n  options={{\n    audioSrc: \"https://example.com/audio-only.m3u8\",\n    audioModeFallback: <MyAnimatedArtwork />,\n  }}\n/>\n```\n\n### Waveform progress bar\n\nIn audio mode the normal video progress bar is replaced by a **waveform-style bar graph** — 200 pseudo-random bars that reveal left-to-right as the audio plays. Buffered/preloaded content is shown in a lighter shade behind the played bars. No configuration is needed; the waveform appears automatically whenever audio mode is active.\n\n### Automatic switching\n\nThe player uses two independent signals to detect poor conditions and switch to audio mode automatically. Either one firing is enough.\n\n**Bandwidth-based** — measures the actual download speed of each HLS fragment and switches when the rolling average drops below a threshold:\n\n```tsx\nimport { AUDIO_BANDWIDTH_THRESHOLDS } from \"react-helios\";\n\n<VideoPlayer\n  src=\"https://example.com/stream.m3u8\"\n  options={{\n    audioBandwidthThreshold: AUDIO_BANDWIDTH_THRESHOLDS.FAIR, // recommended\n    // audioBandwidthThreshold: 0,  // disable bandwidth-based switching\n  }}\n/>\n```\n\n| Preset | Kbps | Typical connection |\n|--------|------|--------------------|\n| `EXTREME` | 100 | 2G / Edge |\n| `POOR` | 300 | Slow 3G |\n| `FAIR` | 800 | Marginal 3G ← **recommended** |\n| `GOOD` | 1500 | Weak 4G / congested Wi-Fi |\n\n**Level-based** — switches when HLS.js drops to a specific quality level (its own ABR algorithm already does the hard work):\n\n```tsx\nimport { AUDIO_SWITCH_LEVELS } from \"react-helios\";\n\n<VideoPlayer\n  src=\"https://example.com/stream.m3u8\"\n  options={{\n    audioModeSwitchLevel: AUDIO_SWITCH_LEVELS.LOWEST, // switch at lowest quality level\n  }}\n/>\n```\n\n| Preset | Value | Meaning |\n|--------|-------|---------|\n| `LOWEST` | 0 | Switch when HLS.js is at the lowest available quality |\n| `SECOND_LOWEST` | 1 | Switch one level above the lowest |\n| `DISABLED` | -1 | Disable level-based switching |\n\nUsing **both together** is the most reliable approach:\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/stream.m3u8\"\n  options={{\n    audioSrc: \"https://example.com/audio-only.m3u8\",\n    audioBandwidthThreshold: AUDIO_BANDWIDTH_THRESHOLDS.FAIR,\n    audioModeSwitchLevel: AUDIO_SWITCH_LEVELS.LOWEST,\n  }}\n/>\n```\n\nAfter the user manually toggles audio mode a 60-second cooldown suppresses automatic switching. The player also probes for bandwidth recovery every 30 seconds while in auto-switched audio mode (configurable via `audioModeRecoveryInterval`).\n\n## Thumbnail Preview\n\nHover over the progress bar to see a time tooltip. For rich sprite-sheet thumbnails, pass a `thumbnailVtt` URL pointing to a [WebVTT thumbnail file](https://developer.bitmovin.com/playback/docs/webvtt-based-thumbnails).\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/video.mp4\"\n  options={{\n    thumbnailVtt: \"https://example.com/thumbs/storyboard.vtt\",\n  }}\n/>\n```\n\nIf the image paths inside the VTT file are relative, supply `thumbnailVttBaseUrl` so the player can resolve them:\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/video.mp4\"\n  options={{\n    thumbnailVtt: \"/thumbs/storyboard.vtt\",\n    thumbnailVttBaseUrl: \"https://example.com\",\n  }}\n/>\n```\n\n### VTT format\n\nEach cue in the `.vtt` file maps a time range to a rectangular region inside a sprite image using the `#xywh=x,y,w,h` fragment:\n\n```\nWEBVTT\n\n00:00:00.000 --> 00:00:05.000\nhttps://example.com/thumbs/sprite.jpg#xywh=0,0,160,90\n\n00:00:05.000 --> 00:00:10.000\nhttps://example.com/thumbs/sprite.jpg#xywh=160,0,160,90\n\n00:00:10.000 --> 00:00:15.000\nhttps://example.com/thumbs/sprite.jpg#xywh=320,0,160,90\n```\n\nThe player fetches the VTT file once, parses all cues, and uses CSS `background-position` to display the correct sprite cell during hover — **no additional network requests per hover**.\n\nTo disable the preview entirely:\n\n```tsx\n<VideoPlayer src=\"...\" options={{ enablePreview: false }} />\n```\n\n## Props\n\n### Top-level props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `src` | `string` | — | Video URL (MP4, WebM, HLS `.m3u8`, …). Ignored when `playlist` is provided |\n| `playlist` | `PlaylistItem[]` | — | Array of videos to play in sequence. When provided, `src` is ignored |\n| `poster` | `string` | — | Poster image shown before playback and in audio mode |\n| `controls` | `boolean` | `true` | Show the built-in control bar |\n| `className` | `string` | — | CSS class on the player container |\n| `options` | `VideoPlayerOptions` | `{}` | All configuration (see below) |\n\n### `options` — Playback\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `autoplay` | `boolean` | `false` | Start playback on mount |\n| `muted` | `boolean` | `false` | Start muted |\n| `loop` | `boolean` | `false` | Loop the video |\n| `preload` | `\"none\" \\| \"metadata\" \\| \"auto\"` | `\"metadata\"` | Native `preload` attribute |\n| `playbackRates` | `PlaybackRate[]` | `[0.25 … 2]` | Available speed options |\n| `crossOrigin` | `\"anonymous\" \\| \"use-credentials\"` | — | CORS attribute for the video element |\n| `subtitles` | `SubtitleTrack[]` | — | Subtitle / caption tracks |\n\n### `options` — HLS\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enableHLS` | `boolean` | `true` | Enable HLS.js for `.m3u8` sources |\n| `hlsConfig` | `Partial<HlsConfig>` | — | Override any [hls.js config](https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning) option |\n\n### `options` — Preview\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `enablePreview` | `boolean` | `true` | Show thumbnail / time tooltip on progress bar hover |\n| `thumbnailVtt` | `string` | — | URL to a WebVTT sprite sheet file for rich thumbnail preview |\n| `thumbnailVttBaseUrl` | `string` | — | Base URL prepended to relative image paths inside the VTT file |\n\n### `options` — UI\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `autoHideControls` | `boolean` | `true` | Hide control bar on mouse leave when playing (video mode only) |\n| `skipSeconds` | `number` | `15` | Seconds to jump when the rewind / skip-forward buttons are clicked. Set to `0` to hide the buttons. Buttons are always hidden on mobile screens (≤ 480 px) to save space, matching YouTube's mobile layout |\n| `showReplayOverlay` | `boolean` | `true` | Show a dim backdrop with a centered \"Replay\" button when playback ends. Works in both video and audio mode. Click the button (or seek backward) to dismiss. Set to `false` to disable |\n\n### `options` — Audio mode\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `audioSrc` | `string` | — | Audio-only stream URL; the audio toggle button only shows when this is set |\n| `showAudioButton` | `boolean` | `!!audioSrc` | Force-show or hide the audio toggle button |\n| `defaultAudioMode` | `boolean` | `false` | Start in audio mode |\n| `audioPoster` | `string` | — | Image shown in audio mode (takes priority over `poster`) |\n| `audioModeLabel` | `string` | `\"Audio\"` | Label on the toggle button when in video mode |\n| `videoModeLabel` | `string` | `\"Video\"` | Label on the toggle button when in audio mode |\n| `audioModeIcon` | `ReactNode` | built-in headphones icon | Icon shown when in video mode (click → audio) |\n| `videoModeIcon` | `ReactNode` | built-in video icon | Icon shown when in audio mode (click → video) |\n| `audioModeFallback` | `ReactNode` | — | Custom React content shown in audio mode when neither `audioPoster` nor `poster` is set |\n| `logo` | `string \\| ReactNode` | — | Logo shown in audio mode when no poster or fallback is set |\n| `audioBandwidthThreshold` | `number` | `300` | Kbps — switch when per-fragment bandwidth average drops below this. `0` = disabled (HLS only) |\n| `audioModeSwitchLevel` | `number` | — | HLS quality level index — switch when HLS.js drops to this level or below. `0` = lowest. `-1` = disabled |\n| `audioModeRecoveryInterval` | `number` | `30000` | Ms between recovery probes while in auto-switched audio mode |\n\n### `options` — Playlist\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `loopPlaylist` | `boolean` | `false` | Loop back to the first item after the last one ends |\n| `upNextDelay` | `number` | `5` | Seconds for the Up Next countdown. `0` = advance immediately. Applies to both `playlist` and `nextVideo` modes |\n| `nextVideo` | `{ src?: string; poster?: string; title?: string }` | — | Show the Up Next overlay at the end of a single (non-playlist) video. The player does not load this source — handle navigation in `onUpNextComplete` |\n| `onUpNextComplete` | `() => void` | — | Fired when the Up Next countdown completes (or the user clicks the thumbnail) in `nextVideo` mode. Use it to navigate to the next page |\n| `showPlaylistControls` | `boolean` | auto | Force-show (`true`) or force-hide (`false`) the Prev / Next buttons. By default they appear when a `playlist` is provided or `onPrevClick` / `onNextClick` are set |\n| `onPrevClick` | `() => void` | — | Custom handler for the Prev button click. Replaces built-in playlist `goPrev()`. Button appears automatically when this is set |\n| `onNextClick` | `() => void` | — | Custom handler for the Next button click. Replaces built-in playlist `goNext()`. Button appears automatically when this is set |\n| `prevEnabled` | `boolean` | `true` | Whether the Prev button is active (not dimmed). Only relevant when `onPrevClick` is provided |\n| `nextEnabled` | `boolean` | `true` | Whether the Next button is active (not dimmed). Only relevant when `onNextClick` is provided |\n| `onPlaylistIndexChange` | `(index: number, item: PlaylistItem) => void` | — | Fired when the active track changes (auto-advance or manual prev/next/goToIndex) |\n| `onPlaylistEnded` | `() => void` | — | Fired when the last item ends and `loopPlaylist` is `false` |\n\n### `options` — Callbacks\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `onPlay` | `() => void` | Fired when playback starts |\n| `onPause` | `() => void` | Fired when playback pauses |\n| `onEnded` | `() => void` | Fired when the current item ends (after playlist auto-advance logic runs) |\n| `onError` | `(error: VideoError) => void` | Fired on playback or stream errors |\n| `onTimeUpdate` | `(time: number) => void` | Fired every ~250 ms during playback |\n| `onDurationChange` | `(duration: number) => void` | Fired when video duration becomes known |\n| `onBuffering` | `(isBuffering: boolean) => void` | Fired when buffering starts / stops |\n| `onTheaterModeChange` | `(isTheater: boolean) => void` | Fired when theater mode is toggled |\n| `onAudioModeChange` | `(isAudio: boolean) => void` | Fired when audio mode is toggled (manual or automatic) |\n\n### `options` — Custom controls\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `contextMenuItems` | `ContextMenuItem[]` | Extra items appended to the right-click context menu |\n| `controlBarItems` | `ControlBarItem[]` | Extra icon buttons appended to the right side of the control bar |\n\n## Playlist\n\nPass an array of `PlaylistItem` objects as the `playlist` prop. The player auto-advances through them when each video ends and shows a YouTube-style **Up Next** countdown overlay before switching.\n\n```tsx\nimport { VideoPlayer } from \"react-helios\";\nimport type { PlaylistItem } from \"react-helios\";\n\nconst playlist: PlaylistItem[] = [\n  {\n    src: \"https://example.com/episode-1.m3u8\",\n    title: \"Episode 1 — Pilot\",\n    poster: \"https://example.com/ep1-thumb.jpg\",\n  },\n  {\n    src: \"https://example.com/episode-2.m3u8\",\n    title: \"Episode 2 — The Journey\",\n    poster: \"https://example.com/ep2-thumb.jpg\",\n  },\n  {\n    src: \"https://example.com/episode-3.m3u8\",\n    title: \"Episode 3 — Finale\",\n  },\n];\n\n<VideoPlayer\n  playlist={playlist}\n  controls\n  options={{\n    autoplay: false,      // first item respects autoplay; subsequent items always autoplay\n    loopPlaylist: false,  // stop after the last item\n    upNextDelay: 5,       // 5-second countdown; set to 0 to advance immediately\n    onPlaylistIndexChange: (index, item) => {\n      console.log(`Now playing track ${index + 1}:`, item.title);\n    },\n    onPlaylistEnded: () => {\n      console.log(\"Playlist finished\");\n    },\n  }}\n/>\n```\n\n### PlaylistItem\n\n```ts\ninterface PlaylistItem {\n  src: string;       // Video URL (MP4, HLS, etc.)\n  poster?: string;   // Poster / thumbnail shown for this item and in the Up Next overlay\n  title?: string;    // Display name shown in the Up Next overlay\n  audioSrc?: string; // Per-item audio-only source (overrides the global audioSrc option)\n}\n```\n\n### Up Next overlay\n\nWhen a video ends and a next item exists, the player shows a countdown overlay — the next item's thumbnail, title, and a circular ring that depletes over `upNextDelay` seconds.\n\n- **Click the thumbnail or the backdrop** → plays the next video immediately\n- **Click Cancel** → dismisses the overlay; the normal replay screen appears instead\n- Set `upNextDelay: 0` to skip the overlay and advance without any pause\n\n### Control bar buttons\n\nWhen a `playlist` is provided, **⏮ Prev** and **⏭ Next** buttons appear automatically in the control bar. Prev is dimmed on the first track; Next is dimmed on the last.\n\n### Manual navigation\n\nNavigate programmatically via the ref or use the `N` / `B` keyboard shortcuts:\n\n```tsx\nconst playerRef = useRef<VideoPlayerRef>(null);\n\nplayerRef.current?.goNext();               // advance to next track\nplayerRef.current?.goPrev();               // go back to previous track\nplayerRef.current?.goToIndex(2);           // jump to a specific track (zero-indexed)\nplayerRef.current?.currentPlaylistIndex(); // returns the current index\n```\n\n### Per-item poster and audio source\n\nEach `PlaylistItem` can override the poster and audio source for that specific track:\n\n```tsx\nconst playlist: PlaylistItem[] = [\n  {\n    src: \"https://example.com/ep1.m3u8\",\n    poster: \"https://example.com/ep1-thumb.jpg\",\n    audioSrc: \"https://example.com/ep1-audio-only.m3u8\",\n  },\n  {\n    src: \"https://example.com/ep2.m3u8\",\n    // no poster — player shows black background\n  },\n];\n```\n\n### Single video with Up Next teaser\n\nYou don't need a full playlist to use the Up Next overlay. Pass a `nextVideo` object and the player shows the countdown at the end of the current video. The player does **not** load `nextVideo.src` — it only uses the thumbnail and title for the overlay. Handle navigation in `onUpNextComplete`.\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/lesson-1.m3u8\"\n  options={{\n    nextVideo: {\n      src: \"https://example.com/lesson-2.m3u8\",   // display only, not loaded\n      title: \"Lesson 2 — Core Concepts\",\n      poster: \"https://example.com/lesson-2/thumb.jpg\",\n    },\n    upNextDelay: 5,\n    onUpNextComplete: () => {\n      // Navigate however suits your app — router.push, window.location, etc.\n      router.push(\"/course/lesson-2\");\n    },\n  }}\n/>\n```\n\n### Custom Prev / Next handlers\n\nPass `onPrevClick` and `onNextClick` to take full control of what happens when those buttons are clicked. The buttons appear automatically when these callbacks are provided — no need to set `showPlaylistControls: true`. Use `prevEnabled` / `nextEnabled` to control whether each button is dimmed.\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/lesson-3.m3u8\"\n  options={{\n    onPrevClick: () => router.push(\"/course/lesson-2\"),\n    onNextClick: () => router.push(\"/course/lesson-4\"),\n    prevEnabled: true,   // Prev button is active\n    nextEnabled: false,  // Next button is dimmed — e.g. last lesson\n  }}\n/>\n```\n\nThese work with both single videos and playlists. When `onPrevClick` / `onNextClick` are set they replace the built-in `goPrev()` / `goNext()` calls.\n\n## Quality Selection\n\n### HLS adaptive quality\n\nFor HLS streams (`.m3u8`) the player automatically parses the available quality levels from the manifest. Once levels are available, the **Settings (⚙)** button in the control bar grows a **Speed / Quality** tab bar:\n\n- **Speed tab** — always visible, lets you change playback rate.\n- **Quality tab** — appears for HLS streams. Lists all levels sorted by bitrate (e.g. 1080p, 720p, 480p) plus an **Auto** option that enables ABR (adaptive bitrate). The current auto-selected level is shown in parentheses next to \"Auto\".\n\nYou can also switch quality programmatically via the ref:\n\n```tsx\nplayerRef.current?.setQualityLevel(0);   // pin to highest level\nplayerRef.current?.setQualityLevel(-1);  // back to ABR auto\n```\n\n### Manual quality selection\n\nFor non-HLS sources (or when you want to control quality URLs yourself), pass a `manualQualityLevels` array. Each item has a human-readable `label` and the `src` URL to load when the user selects it.\n\n```tsx\nimport { VideoPlayer } from \"react-helios\";\nimport type { ManualQualityLevel } from \"react-helios\";\n\nconst qualityLevels: ManualQualityLevel[] = [\n  { label: \"1080p\",  src: \"https://example.com/video-1080p.mp4\" },\n  { label: \"720p\",   src: \"https://example.com/video-720p.mp4\" },\n  { label: \"480p\",   src: \"https://example.com/video-480p.mp4\" },\n  { label: \"360p\",   src: \"https://example.com/video-360p.mp4\" },\n];\n\n<VideoPlayer\n  src=\"https://example.com/video-720p.mp4\"\n  controls\n  options={{\n    manualQualityLevels: qualityLevels,\n  }}\n/>\n```\n\nWhen `manualQualityLevels` is provided, the **Quality tab** appears automatically in the Settings menu. Selecting an option swaps the player `src` and resumes playback at the same position.\n\nUse `showQualityMenu: true` to force the Quality tab open even when no quality levels have been detected yet (useful during the initial HLS manifest load):\n\n```tsx\noptions={{ showQualityMenu: true }}\n```\n\nBoth manual and HLS quality levels can coexist in the same Quality tab — manual levels appear at the top, HLS ABR levels below a divider.\n\n### `options` — Quality\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `manualQualityLevels` | `ManualQualityLevel[]` | — | Src-based quality options shown in the Settings → Quality tab |\n| `showQualityMenu` | `boolean` | `false` | Force-show the Quality tab in Settings even before HLS levels are detected |\n\n## Custom Control Bar Buttons\n\nInject your own icon buttons into the right side of the control bar using `controlBarItems`:\n\n```tsx\nimport { VideoPlayer } from \"react-helios\";\nimport type { ControlBarItem } from \"react-helios\";\n\nconst items: ControlBarItem[] = [\n  {\n    key: \"bookmark\",\n    label: \"Bookmark\",\n    title: \"Save current position\",\n    icon: <BookmarkIcon />,\n    onClick: () => saveBookmark(playerRef.current?.getState().currentTime ?? 0),\n  },\n];\n\n<VideoPlayer src=\"...\" options={{ controlBarItems: items }} />\n```\n\n## Context Menu\n\nRight-clicking the player shows a built-in menu (Play/Pause, Loop, Copy URL, Picture-in-Picture). Append your own items via `contextMenuItems`:\n\n```tsx\nimport { VideoPlayer } from \"react-helios\";\nimport type { ContextMenuItem } from \"react-helios\";\n\nconst items: ContextMenuItem[] = [\n  { label: \"Add to Watchlist\", onClick: () => addToWatchlist() },\n  { label: \"Share\", onClick: () => openShareDialog() },\n];\n\n<VideoPlayer src=\"...\" options={{ contextMenuItems: items }} />\n```\n\n## Imperative API (Ref)\n\nUse a `ref` to control the player programmatically:\n\n```tsx\nimport { useRef } from \"react\";\nimport { VideoPlayer, VideoPlayerRef } from \"react-helios\";\n\nexport default function App() {\n  const playerRef = useRef<VideoPlayerRef>(null);\n\n  return (\n    <>\n      <VideoPlayer ref={playerRef} src=\"...\" controls />\n      <button onClick={() => playerRef.current?.play()}>Play</button>\n      <button onClick={() => playerRef.current?.pause()}>Pause</button>\n      <button onClick={() => playerRef.current?.seek(30)}>Jump to 30s</button>\n      <button onClick={() => playerRef.current?.setVolume(0.5)}>50% volume</button>\n      <button onClick={() => playerRef.current?.toggleAudioMode()}>Toggle Audio</button>\n    </>\n  );\n}\n```\n\n### `VideoPlayerRef` methods\n\n| Method | Signature | Description |\n|--------|-----------|-------------|\n| `play` | `() => Promise<void>` | Start playback |\n| `pause` | `() => void` | Pause playback |\n| `seek` | `(time: number) => void` | Seek to a time in seconds |\n| `setVolume` | `(volume: number) => void` | Set volume `0–1` |\n| `toggleMute` | `() => void` | Toggle mute, restoring the pre-mute volume |\n| `setPlaybackRate` | `(rate: PlaybackRate) => void` | Set playback speed |\n| `setQualityLevel` | `(level: number) => void` | Set HLS quality level; `-1` = auto ABR |\n| `seekToLive` | `() => void` | Jump to the live edge (HLS live streams) |\n| `toggleFullscreen` | `() => Promise<void>` | Toggle fullscreen |\n| `togglePictureInPicture` | `() => Promise<void>` | Toggle Picture-in-Picture |\n| `toggleTheaterMode` | `() => void` | Toggle theater (wide) mode |\n| `toggleAudioMode` | `() => void` | Toggle audio-only mode |\n| `getState` | `() => PlayerState` | Snapshot of current player state |\n| `getVideoElement` | `() => HTMLVideoElement \\| null` | Access the underlying `<video>` element |\n| `goNext` | `() => void` | Advance to the next playlist item. No-op when no playlist is provided |\n| `goPrev` | `() => void` | Go back to the previous playlist item. No-op when no playlist is provided |\n| `goToIndex` | `(index: number) => void` | Jump to a specific playlist index (zero-based). No-op when no playlist is provided |\n| `currentPlaylistIndex` | `() => number` | Returns the current playlist index, or `0` when no playlist is provided |\n\n## Theater Mode\n\nThe player fires `onTheaterModeChange` when theater mode is toggled. Wire it to your layout state to widen your container:\n\n```tsx\n\"use client\";\n\nimport { useState } from \"react\";\nimport { VideoPlayer } from \"react-helios\";\n\nexport default function Page() {\n  const [isTheater, setIsTheater] = useState(false);\n\n  return (\n    <main\n      style={{ maxWidth: isTheater ? \"1600px\" : \"1200px\" }}\n      className=\"mx-auto px-6 transition-[max-width] duration-300\"\n    >\n      <VideoPlayer\n        src=\"https://example.com/stream.m3u8\"\n        controls\n        options={{\n          onTheaterModeChange: (t) => setIsTheater(t),\n        }}\n      />\n    </main>\n  );\n}\n```\n\n## Subtitles\n\n```tsx\n<VideoPlayer\n  src=\"https://example.com/video.mp4\"\n  options={{\n    subtitles: [\n      { id: \"en\", src: \"/subs/en.vtt\", label: \"English\", srclang: \"en\", default: true },\n      { id: \"es\", src: \"/subs/es.vtt\", label: \"Español\", srclang: \"es\" },\n    ],\n  }}\n/>\n```\n\nSubtitle files must be served with `Access-Control-Allow-Origin` if hosted on a different origin than the page.\n\n## Keyboard Shortcuts\n\nShortcuts activate when the player has focus (click the player or tab to it).\n\n| Key | Action |\n|-----|--------|\n| `Space` / `K` | Play / Pause |\n| `←` / `→` | Seek −5 s / +5 s |\n| `↑` / `↓` | Volume +10% / −10% |\n| `M` | Toggle mute (restores previous volume) |\n| `F` | Toggle fullscreen |\n| `T` | Toggle theater mode |\n| `P` | Toggle Picture-in-Picture |\n| `L` | Seek to live edge (live streams only) |\n| `N` | Next playlist item (playlist mode only) |\n| `B` | Previous playlist item (playlist mode only) |\n| `0`–`9` | Jump to 0%–90% of duration |\n\nProgress bar keyboard (when the progress bar has focus):\n\n| Key | Action |\n|-----|--------|\n| `←` / `→` | Seek −5 s / +5 s |\n| `Shift + ←` / `Shift + →` | Seek −10 s / +10 s |\n| `Home` | Jump to start |\n| `End` | Jump to end |\n\n## TypeScript\n\nAll types are exported from the package:\n\n```ts\nimport type {\n  VideoPlayerProps,\n  VideoPlayerOptions,\n  VideoPlayerRef,\n  PlayerState,\n  PlaybackRate,\n  HLSQualityLevel,\n  ManualQualityLevel,\n  SubtitleTrack,\n  BufferedRange,\n  VideoError,\n  VideoErrorCode,\n  ContextMenuItem,\n  ControlBarItem,\n  PlaylistItem,\n  AudioPlayerProps,\n  AudioPlayerOptions,\n  AudioPlayerRef,\n  AudioPlayerState,\n} from \"react-helios\";\n\nimport { AUDIO_BANDWIDTH_THRESHOLDS, AUDIO_SWITCH_LEVELS } from \"react-helios\";\n\n// VTT utilities (useful for server-side pre-parsing or custom UIs)\nimport { parseThumbnailVtt, findThumbnailCue } from \"react-helios\";\nimport type { ThumbnailCue } from \"react-helios\";\n```\n\n### `PlayerState`\n\n```ts\ninterface PlayerState {\n  isPlaying: boolean;\n  currentTime: number;\n  duration: number;\n  volume: number;\n  isMuted: boolean;\n  playbackRate: number;\n  bufferedRanges: BufferedRange[];\n  isBuffering: boolean;\n  error: VideoError | null;\n  isFullscreen: boolean;\n  isPictureInPicture: boolean;\n  isTheaterMode: boolean;\n  isAudioMode: boolean;\n  isLive: boolean;\n  qualityLevels: HLSQualityLevel[];\n  currentQualityLevel: number; // -1 = ABR auto\n}\n```\n\n### `VideoError`\n\n```ts\ntype VideoErrorCode =\n  | \"MEDIA_ERR_ABORTED\"\n  | \"MEDIA_ERR_NETWORK\"\n  | \"MEDIA_ERR_DECODE\"\n  | \"MEDIA_ERR_SRC_NOT_SUPPORTED\"\n  | \"HLS_NETWORK_ERROR\"\n  | \"HLS_FATAL_ERROR\"\n  | \"UNKNOWN\";\n\ninterface VideoError {\n  code: VideoErrorCode;\n  message: string;\n}\n```\n\n### `ControlBarItem`\n\n```ts\ninterface ControlBarItem {\n  key: string;       // React reconciliation key\n  icon: ReactNode;   // SVG, img, or any React node\n  label: string;     // aria-label\n  title?: string;    // tooltip (falls back to label)\n  onClick: () => void;\n}\n```\n\n### `ContextMenuItem`\n\n```ts\ninterface ContextMenuItem {\n  label: string;\n  onClick: () => void;\n}\n```\n\n### `ManualQualityLevel`\n\n```ts\ninterface ManualQualityLevel {\n  label: string; // Display name shown in the Settings menu (e.g. \"1080p\", \"HD\", \"Low\")\n  src: string;   // URL to load when this quality level is selected\n}\n```\n\n### `ThumbnailCue`\n\n```ts\ninterface ThumbnailCue {\n  start: number; // seconds\n  end: number;   // seconds\n  url: string;   // absolute URL to the sprite image\n  x: number;     // pixel offset within sprite\n  y: number;\n  w: number;     // cell width in pixels\n  h: number;     // cell height in pixels\n}\n```\n\n## Utility Functions\n\n```ts\nimport { formatTime, isHLSUrl, getMimeType } from \"react-helios\";\n\nformatTime(90);        // \"1:30\"\nformatTime(3661);      // \"1:01:01\"\n\nisHLSUrl(\"stream.m3u8\");   // true\nisHLSUrl(\"video.mp4\");     // false\n\ngetMimeType(\"video.mp4\");  // \"video/mp4\"\ngetMimeType(\"video.webm\"); // \"video/webm\"\n```\n\nFor VTT parsing in custom UIs or server-side pre-processing:\n\n```ts\nimport { parseThumbnailVtt, findThumbnailCue } from \"react-helios\";\nimport type { ThumbnailCue } from \"react-helios\";\n\nconst cues: ThumbnailCue[] = parseThumbnailVtt(vttText, baseUrl);\n\n// Binary search — O(log n)\nconst cue = findThumbnailCue(cues, currentTime);\nif (cue) {\n  // cue.url, cue.x, cue.y, cue.w, cue.h\n}\n```\n\n## Performance\n\nThe player is architected to produce **zero React re-renders during playback**:\n\n- `timeupdate` and `progress` events are handled by direct DOM mutation (refs), not React state.\n- `ProgressBar` and `TimeDisplay` self-subscribe to the active media element — the parent tree never re-renders on seek or time change.\n- `Controls` and `AudioModeOverlay` are wrapped in `React.memo` — they only re-render when their own props change, not when unrelated state (buffering, errors) updates.\n- VTT sprite thumbnails are looked up via binary search (O(log n)) and rendered via CSS `background-position` — no hidden `<video>` element, no canvas, no network requests per hover.\n- Buffered ranges are the only state that triggers a re-render (fires every few seconds during buffering, not 60× per second).\n- In audio mode the `<video>` element is **paused** — the browser stops decoding frames entirely. A lightweight `<audio>` element takes over with `preload=\"none\"` (no network cost at startup). The `<audio>` element only loads its source the first time the user switches to audio mode.\n\n## Project Structure\n\n```\nreact-helios/\n├── src/                    # Library source\n│   ├── components/         # VideoPlayer, AudioPlayer, Controls, AudioModeOverlay, control elements\n│   ├── hooks/              # useVideoPlayer, useAudioPlayer (state + HLS init)\n│   ├── lib/                # Types, HLS utilities, VTT parser, format helpers\n│   └── styles/             # CSS\n├── examples/\n│   └── nextjs-demo/        # Standalone Next.js demo app\n├── dist/                   # Build output (ESM + CJS + DTS)\n├── package.json\n├── tsconfig.json\n└── tsup.config.ts\n```\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build the library\nnpm run build\n\n# Watch mode (rebuild on changes)\nnpm run dev\n\n# Type-check only\nnpm run typecheck\n```\n\nTo run the demo app against your local build:\n\n```bash\ncd examples/nextjs-demo\nnpm install\nnpm run dev\n```\n\n## Publishing\n\n`prepublishOnly` runs the build automatically:\n\n```bash\nnpm publish\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}