{"_id":"@sauveurcadetorg/media-controls","_rev":"20-851f7a315fc4d74adfc35b837dd5e1a5","name":"@sauveurcadetorg/media-controls","dist-tags":{"latest":"1.6.2"},"versions":{"1.0.0":{"name":"@sauveurcadetorg/media-controls","version":"1.0.0","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"MIT","_id":"@sauveurcadetorg/media-controls@1.0.0","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"1a05f9f78dd8420a7c74efe00debafc9d24420d9","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.0.0.tgz","fileCount":11,"integrity":"sha512-feafwbBMqVAZbJorQ2+ZGM6XQoIc4zzLg0C7iWD1c7Nu59pYTueWWvOstCnVrc9McOTcs62t69tUdfGPdpqXIQ==","signatures":[{"sig":"MEUCIEZWqbinpHq7W7ZIRlpHtbXQwOitaNdfFLv4u0vKlN2KAiEAmMF5khhhLDqpulcads6SlZyvXx8XlFxKiCiQLyxiqjc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":239855},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.0.0_1789833897460_0.1836071015982208","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@sauveurcadetorg/media-controls","version":"1.0.1","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"MIT","_id":"@sauveurcadetorg/media-controls@1.0.1","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"2edec4cefef05bda1827e98bdd978586874b828d","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.0.1.tgz","fileCount":11,"integrity":"sha512-eJoBEfVwenwY6+xYqng+5EJTzw4RAsDviBWLgM2lcF0LepB8zCv1LL5BITLYHF/RwjcqZwOdyMtVvReqjVYyjA==","signatures":[{"sig":"MEQCIFecsfJTQU1fu73+pV6QwvrJ4m1lpilo0s7wFzYxIwByAiBSpx076wh9ghXufCXDJt9X/b684oIRrvAEE6cT7Cqnmw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDmgieUsGjgGM3DY9XQiv7CXcp+PyBqTwj9W3FhXclebQIhAIFUWMCvCMAAuaXPZ5xfY3gxTqeC77tXxf6W6aa7i6yx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":239855},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.0.1_1789834111428_0.8082075870234948","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@sauveurcadetorg/media-controls","version":"1.0.2","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.0.2","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"b8ce46c120d2e08ab4e08b28e634f2c7013b7def","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.0.2.tgz","fileCount":11,"integrity":"sha512-59ypD8ppyuzbqvr6+clFQDAcdyKEPMSS/lKLScx8YBZ/gDXCCLqnyYnZE9tkVtwNgIVn4DAO/WLcZ2zFa3pdnQ==","signatures":[{"sig":"MEQCIC0608hF+zY2HOiNI2jbbCF1dF5TqWMyBGInFIuTFiJTAiA5pZyAMbDc/KD9cRjliux4nRy/nQImzE7OTU7E3MmWvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHI4BaJYBBP0994c4zbLe4m+LEr3AFlk8msCHS0oV+qhAiEA9XPkFBPBySmsHnwEwhYGtnga02tfvMJUQlHpe9W3xME=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":658825},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.0.2_1789839623740_0.6844095492465125","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@sauveurcadetorg/media-controls","version":"1.1.0","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.1.0","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"0f76290765a8219fc1768468cfc524f26647ac8d","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.1.0.tgz","fileCount":11,"integrity":"sha512-eqfcJFzqnCv8tZeaaAg85RPUD2wRPzDgncpIWTresXgJgrYH5mBuoxU1OJdRqsanmNAjuMn7VVVM+jqAJBQqFw==","signatures":[{"sig":"MEYCIQDzzL97nnqVz4Wz53BkzpaL6morYqTBmlVcJKNWkbtgVgIhALEVjTuMdPFDwU94O97ZQJrX6vBY4P3Bed0kP1wMV2r+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHzpSokgCXKeBemg/0qF4F52ycxPboDDNXh8pE7M3DHCAiEAwjgDDIpeSNId6zTTwhpSDw8f8R/bhyL29471GeP+cGc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":507634},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.1.0_1789851738175_0.6753966945178387","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@sauveurcadetorg/media-controls","version":"1.1.1","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.1.1","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"e96026df658cbb672c002516e35bb12c91ce6036","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.1.1.tgz","fileCount":11,"integrity":"sha512-YL+CsxfNf+r4tsCNK4DHA9mRDGF71l7kL7y9j2FvJF+6Vx0m5plEw+QhPyk3J/haMYyc+J0xug0rpWvoh62Ycw==","signatures":[{"sig":"MEUCIEHOs3ttPyYzjdIJSJVMg/KEOtz75gHcZEm8ZjfknjY1AiEAvEBFa1x1a5/QfUFuTHa8y2CqhUh96KCDcx0mJmYTHaM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEBkmZDxKkSGmucpnIvnB0yV8i4hWaYpxzLumO3FSqUPAiBjjsa84AytY/GnWBlX3FsZ4LEFKz7CmLGiMtj44xfKsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":508825},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.1.1_1789852676091_0.49190314294881077","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@sauveurcadetorg/media-controls","version":"1.1.2","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.1.2","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"4564b69661a7b3dd62d6236fdb5c7caa6690ab7c","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.1.2.tgz","fileCount":11,"integrity":"sha512-0EUVtCBAjd6TrfJScHSZrXnlLMkqv6UCL8n+7zBmAlmw+hZIX6StmSqRYaVIErWO+MoUUCJVseEKkuy/c0chnw==","signatures":[{"sig":"MEQCIGlnYFGtxyFia5ykMIZM0v0a+qsXSYI5K221Yb4zct3TAiBKjTLoWA40GZPPNMBJaqzPzf7ehF6dpQMdUESLA66WeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCUV6PR+kx+OOWHfVyJ4z3RTtIJjP/QBcv/+uC43vc94gIhAJcjfaalUkIWXW6CGo6ybQU82EUA1wdva/4/l1OrVr/Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":524720},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.1.2_1789853060219_0.15778237194798228","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@sauveurcadetorg/media-controls","version":"1.1.3","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.1.3","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"3d2976f7093232343d7a227ed603728f99f0a558","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.1.3.tgz","fileCount":11,"integrity":"sha512-S6gQwRUaF3oMjYuGS2MSA4aGkR6oNKF0an0NT88alG47y7dhMxLmz94SW/AhWbRY7Lx//x6GAnfpXQZY6uV/oA==","signatures":[{"sig":"MEUCID06JfqpQ9Mpdn+O6ovnIKcIx1J8D73DztZMcK5dZOS7AiEA+fc3/T9bGpE1ZtTpXrkTSJHWm7AadqwDNxTUmy6mr5s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBzsWE1gOR1BIQOL0YIY53ingUkEebxING9zuc4hHc+tAiEAgodilr07iMiNrfk53OcfnprA7xQU6w7EQ4ELK8YHr2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":521607},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.1.3_1789853574978_0.19508006798469912","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@sauveurcadetorg/media-controls","version":"1.2.0","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.2.0","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"71efb63e61d69e8e68887162d706a7e2107111ba","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.2.0.tgz","fileCount":11,"integrity":"sha512-uefgrnpdeoHzQ7NeQRb76j4cClsIn1njqC6U4UtM3yQRGvYNcI7jDWSPvycB2tcHPrYc0PHDJ0cpMRZVE8rNXg==","signatures":[{"sig":"MEYCIQDt41lyHapkgPO/NxL0UFRMZxV0bMv6+sSaWh+2fW3OIgIhAICscOTmosNr2nzDKOLWx7TpL+Q1HeOljR9p8EWSHmk3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFECP3YwleHAhfR4ZsBPN/ZbmASaBFELU6KolLtYBYvLAiBSN1X10yvX/Q5RIjvtNlEapMFlhr33z8wsNEk06JncOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":478633},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.2.0_1789853911569_0.12006382115970293","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@sauveurcadetorg/media-controls","version":"1.2.1","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.2.1","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"a29c6da608661617800cdd2650eba31da35a8c5a","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.2.1.tgz","fileCount":11,"integrity":"sha512-NvW1PICcTEdr8stXW14aBd5qgODxc1ExWh2NzChksQ2dnQU9GODOWx0m7sAGdj48GGXhOeVynRgDJzSHf8v/yQ==","signatures":[{"sig":"MEUCIA4J3LU28uJiS7Sn8xW9PCa8qYA9OSCoOcnPFndAKZSyAiEA0jBVwcOgP3L8NC6LKa+16KhpOUbttKns++YXRXZzBvM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFSXrOGCk83zQJh2kXhmHOT396kDXuF6HWRh4N9QHtwvAiB7XVsJiFarneAf5sSHCK/wb6QVBT9vOws0h94S/V/+yQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":462645},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.2.1_1789854069256_0.2279635966783189","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@sauveurcadetorg/media-controls","version":"1.3.0","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.3.0","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"77d41d97176d007c7931173b5369b47491d8f4ca","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.3.0.tgz","fileCount":11,"integrity":"sha512-E6XC9DlGijXMphze3LtE53sD2y9GExbGGVtahP1sw3Tcg6o9GNMRGCbYBEM/65DACPdLCWPU+bVqnyHAPC85mA==","signatures":[{"sig":"MEQCICboj8ghhyURAOygezyiCFnlLQZwUQoLbBtLzQpISAqzAiBKPCcBXI6NCVSnsscwr9kxCiu03tapEvqGohUls2/5lg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDVHOsY+A8ODSTeqQgimRbYTK+ZQ7sg+ZmS0Iezc+wVtgIhAOV0mULCa6fz9lmjnXiZtTjLdhbh/AEwDy0vM+tqLpBF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":481602},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.3.0_1789854779922_0.5920305028184201","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@sauveurcadetorg/media-controls","version":"1.4.0","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.4.0","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"cb522ad7c48dda996505215d5edfdf6b20df9943","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.4.0.tgz","fileCount":11,"integrity":"sha512-+6TA7OFfli8gKHJE+mwLQqxf0CR8tCfWHYbXfRvJzGgZvsxyWQ+N62bOz0Mlz21aonHSv8jOGmv6+uQFu3122g==","signatures":[{"sig":"MEUCIQDTevLifEHdSkYEvksDCYfd6pan3j2gQN9sW6b+aKBcIAIgYgzV9CELGvLzMdktD1eOthFD+kg0rnG7vWcEJnueAQ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDUrTMdb1mJGBNBO/d0fCNxzY5jBPhYCpfmFqFoVkjDHgIhALEZZBHVWJ9c7IINCJvE/TTA1f9QKG4ruhu1aNgHOYe0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":526274},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.4.0_1790012695887_0.4652512459285083","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@sauveurcadetorg/media-controls","version":"1.5.0","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.5.0","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"6eb5ed33ea6b38742f3ab0d3b888d40f9f6fa544","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.5.0.tgz","fileCount":11,"integrity":"sha512-FDoHGQtqVE+zd3jJC1KiCUNJBmNROljvB0KYo869PbVImIIUEJRF67LDR119Vq52WwstttDq0fYJOkt7a1Q8ug==","signatures":[{"sig":"MEUCIQDbfBN5xehq1ym8uW3GpRRz2g27l8W08LAUvEJf5+/+2AIgcxULNYr3zo3gsJnKMmCdfet5LkC1DSH9qzQ852N28Qc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCntIwmmipAKWuLhOGzvs+lM5UVruMopremZfN3WRhflQIgVYMO6Wjec2JS3fV0+w1PumtJBEBTMWKBVKD8q8nGZVo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":521866},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.5.0_1790014164607_0.6243444749763611","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@sauveurcadetorg/media-controls","version":"1.5.1","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.5.1","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"849012b7c6e63d947314b5e964600ce694462e37","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.5.1.tgz","fileCount":11,"integrity":"sha512-2iY9zu8DHyD2ajGG8rf6TCPmU+V5ttDlLUcylNJFwhcXNJJ7OknEZELc6z7eksg92y4ECm0FAFzB9ZTgkcD+LA==","signatures":[{"sig":"MEUCIQDEJ4II4ggm85Zxo6cdmSMUUCd0Fo0EGoqg3GHPGaxktAIgErv1ymaQ0ktYrRz1UZBqUo+YaAY4Hk/jUmSdG3BDdLk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHHsrBATR5UB5ovfgPIa1cgDwQMdScBKFZbsVlHoUZGEAiEAj6AKyo4fviQr2hdYlasrXZ0Y4LdsiwHS6fM3kyVE3Fc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":532937},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.5.1_1790016662154_0.3638413885322078","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"@sauveurcadetorg/media-controls","version":"1.5.2","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.5.2","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"93e5f0ddf6f6e225278e2198be4bf99d8c3c0b87","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.5.2.tgz","fileCount":11,"integrity":"sha512-k+6vqo3Q1+YGEK772VQNcLIUdRNp16cd8n1Hco+UscbWOcDUHRfc8MTDl0bapwmXyhQ/mePr0GA1EwDEtC0/Ug==","signatures":[{"sig":"MEYCIQDQJxhNVk4tP76/gxcHYazVIKh2Yh5HPl/BmccDQjppQgIhAOMtRnd4nYmeL3AnKqLLDYz41NFppLxAc6kLr3Jg74/6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDKyS7p4e1chzMAreXadA5/Sk1aU4bJttzUrs6lmwlAegIgZS3YqbNekOPFV6EIZYP3ltsO7DsLPOKyXUahE8A7ZQc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":568783},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.5.2_1790018239547_0.11435412404997969","host":"s3://npm-registry-packages-npm-production"}},"1.5.3":{"name":"@sauveurcadetorg/media-controls","version":"1.5.3","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.5.3","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"homepage":"https://github.com/sauveurcadetorg/media-controls#readme","bugs":{"url":"https://github.com/sauveurcadetorg/media-controls/issues"},"dist":{"shasum":"43d158876b7e05d5059f179da5db58897952c406","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.5.3.tgz","fileCount":11,"integrity":"sha512-d0rfrvQO0a3f6H1I0VTeT3Qq/5faU+q/LsLEc+LgIEwlwqwXurJd2D6WFX6z8S1OlscNuVLg3QcjBTDRyY8kvA==","signatures":[{"sig":"MEYCIQDZ7kQQ8TyBGzFeomRExYUWBT25BefxEDYEi4tzm/3CCwIhAKHLDLv369UIcrQPHXADgWdAb/+0kfAKjPZep2rXJeJD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCJ6oTycaiNIukrtHh9MidJcQ2kM0UYO0IFXFcq/LQI6gIgN25dwR+QLiRBN3FGIwoNhYMzk92SVxNdqM6dZQfRv3I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":564173},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"repository":{"url":"git+https://github.com/sauveurcadetorg/media-controls.git","type":"git"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.5.3_1790018694876_0.7378506658348103","host":"s3://npm-registry-packages-npm-production"}},"1.5.4":{"name":"@sauveurcadetorg/media-controls","version":"1.5.4","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.5.4","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"bugs":{"url":"https://formcarry.com/s/rF1mjDYnmZQ"},"dist":{"shasum":"b3c7dfc96b6bfd5aff887975de5a16d3e4d8169f","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.5.4.tgz","fileCount":11,"integrity":"sha512-/oeoVOXEisdsgr+NVmhc76tlcoRQ3Q2iUXibCvdazd6xOC3wUjkgmQAwQMWF7eRW7FIBFYwckQMYPlGWTbqsGg==","signatures":[{"sig":"MEUCIFGPC63XGmerjnUt29jpsem5X/0B5sJZ9LD+rLrZ8goxAiEA/+Wa26eixcMzBAMVxJ9AAM+Cxn7Jig8Uu6gtLNeZiYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIERUhDGNjLzU8IipqQSZ/vgPP+fjv+78Ogqq5F2a64kfAiBA8uxu99U0+Q6ROmmwnG/ps61jZLtbBSfoAmAk6iFA0w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":582815},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.5.4_1790193218291_0.8375758825436648","host":"s3://npm-registry-packages-npm-production"}},"1.5.5":{"name":"@sauveurcadetorg/media-controls","version":"1.5.5","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.5.5","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"bugs":{"url":"https://formcarry.com/s/rF1mjDYnmZQ"},"dist":{"shasum":"8f9a0e9d3c4165d6c09c1bd5b23349a8f29c3aae","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.5.5.tgz","fileCount":11,"integrity":"sha512-FI9kP7rjGu1Jfj71Qpn2fqaSoV/u+ZUacvKYXSAx4/yeq+w9MPLoO8I8Lm1LkX2xBDBuHlK08ZYhaV54HjBS3w==","signatures":[{"sig":"MEUCICpoNzSw1a3SSoQcotzEHC3jWgy01tecaYdiCEKymUfYAiEAoWNm/aBGXuM5K/feL/wzaQf/CFRI+C/MkbtF+PNSUTk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCEItHyG5QzOS1SjlZOIusEfm/8VKd+iWofLgQoArGgkQIgJggu09kTf7QimWIpscyCLd4EIzmq7M+Mpi33Ky5D5cU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":633378},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.5.5_1790194527671_0.6645175987495671","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@sauveurcadetorg/media-controls","version":"1.6.0","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.6.0","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"bugs":{"url":"https://formcarry.com/s/rF1mjDYnmZQ"},"dist":{"shasum":"077a5513a4e36f112ec3fc0b0fa78e57573db6f8","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.6.0.tgz","fileCount":11,"integrity":"sha512-V3QLzG3ekerWo4YhwJQGrFAtcTCJNkqlmSTllEIKfXZ/5YnprTjxrJAA/B/Bbb6kSUJ0bLZ/IzSHrWkNOE+ZyQ==","signatures":[{"sig":"MEUCIQCC/m+jOeMbgMWvHO6No8QPctsllYpWvM/j6TJYmM9xhwIgBBGfpaV7tHvYGZrlSlA/NUtIP+TjkvEMzwvn66ntMac=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCLlZ7W5bHw8IRZN7ZjdvsISWSERiJqinqPI5BjESqhfQIgb/0AcRSZ+i4ceYE/tLNGB9jMKcd9uW07GXCyblIfzfY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":714703},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.6.0_1790195329204_0.13951160318033606","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"@sauveurcadetorg/media-controls","version":"1.6.1","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"license":"Apache-2.0","_id":"@sauveurcadetorg/media-controls@1.6.1","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"bugs":{"url":"https://formcarry.com/s/rF1mjDYnmZQ"},"dist":{"shasum":"85720ffaf8a927afcd33c1e7b40eedaccd568b45","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.6.1.tgz","fileCount":11,"integrity":"sha512-JsjLK2YhzeQpwaN5TzYQjS35HAeFp5rUl9c8wuKSogecbkBi/DLABjuEgwpI+ruxWw3MjhOmVMYkdlZYDEHxew==","signatures":[{"sig":"MEUCIQDCzyvmZOcvG8JAXsMBDsQOozSGTp4WW8srD+eQePRcDgIgeaTDCWGijjG8ho9bPRyKDcMnrbT6PY/rFLp8+HfeNO4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQClp8Tfbc+mLJVbGqU0De97iHYnFXOyhZWbKTtJkS5oDwIhAN2Agq3nZc8fr5ACpOxrOCZAUaz/WqEa9ot7LY+A4FOA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":633378},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/media-controls_1.6.1_1790196226131_0.41521276357697556","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"_id":"@sauveurcadetorg/media-controls@1.6.2","bugs":{"url":"https://formcarry.com/s/rF1mjDYnmZQ"},"dist":{"shasum":"ec040f58de53f578380ae719a6d0e2ed92c0c6f3","tarball":"https://registry.npmjs.org/@sauveurcadetorg/media-controls/-/media-controls-1.6.2.tgz","fileCount":11,"integrity":"sha512-N66mqoNa54lFv94Th+pFzigvwpc9N7l2ty9NbucQ6xcqJDSROzoCYB3nJwTsVL/y0XkttCoJV4VMXpfcgGFGiw==","signatures":[{"sig":"MEUCIEAMZGFsZqPFyHRDqad5USQ2osPAzWp6Ipt0iktB30jWAiEA7+QHfgtVlexun6sllrcGO8029jKnw0x8LuGVebaVZmQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDdmbbla3okJaXtlaMCLW2kK6De3q4nl1NclYLY8VYqnAIhAIEfU5S/pwJ1bRCHTihanuEkXv/8wtCUjpicnB7BhivJ"}],"unpackedSize":635759},"main":"./dist/index.cjs","name":"@sauveurcadetorg/media-controls","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./styles.css":"./dist/styles.css"},"license":"Apache-2.0","scripts":{"dev":"vite --config examples/dev/vite.config.ts","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"version":"1.6.2","_npmUser":{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"},"keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"_npmVersion":"11.17.0","description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","directories":{},"maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"sideEffects":["*.css"],"_nodeVersion":"26.4.0","dependencies":{"motion":"^12.43.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vite":"^8.3.0","jsdom":"^30.1.0","react":"^19.3.0","vitest":"^5.0.1","react-dom":"^19.3.0","typescript":"^5.9.3","@types/react":"^19.3.0","@types/react-dom":"^19.3.0","@vitejs/plugin-react":"^6.1.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/media-controls_1.6.2_1790196804382_0.8906334335956372"}}},"time":{"created":"2026-09-19T16:04:57.242Z","modified":"2026-09-23T20:53:24.630Z","1.0.0":"2026-09-19T16:04:57.633Z","1.0.1":"2026-09-19T16:08:31.544Z","1.0.2":"2026-09-19T17:40:23.879Z","1.1.0":"2026-09-19T21:02:18.258Z","1.1.1":"2026-09-19T21:17:56.222Z","1.1.2":"2026-09-19T21:24:20.378Z","1.1.3":"2026-09-19T21:32:55.064Z","1.2.0":"2026-09-19T21:38:31.665Z","1.2.1":"2026-09-19T21:41:09.359Z","1.3.0":"2026-09-19T21:53:00.007Z","1.4.0":"2026-09-21T17:44:56.023Z","1.5.0":"2026-09-21T18:09:24.713Z","1.5.1":"2026-09-21T18:51:02.247Z","1.5.2":"2026-09-21T19:17:19.683Z","1.5.3":"2026-09-21T19:24:54.962Z","1.5.4":"2026-09-23T19:53:38.395Z","1.5.5":"2026-09-23T20:15:27.754Z","1.6.0":"2026-09-23T20:28:49.351Z","1.6.1":"2026-09-23T20:43:46.292Z","1.6.2":"2026-09-23T20:53:24.479Z"},"bugs":{"url":"https://formcarry.com/s/rF1mjDYnmZQ"},"license":"Apache-2.0","keywords":["react","media","video","player","controls","scrubber","timeline","seek","preview","volume","slider","speed","sheet","apple","ios","music"],"description":"Apple-style media playback controls for React: a scrubber with video seek preview, a rubber-banding volume slider, and a speed sheet. ESM + CJS, tree-shakeable, SSR-safe, themeable via CSS variables.","maintainers":[{"name":"sauveurcadetorg","email":"sauveurcadet@icloud.com"}],"readme":"# @sauveurcadetorg/media-controls\n\nApple-style media controls for React: a **scrubber**, a **volume slider**, a\n**speed sheet**, plus the playback **building blocks** (video surface,\nauto-hiding overlay, transport buttons, buffering, title marquee, progress,\nfullscreen/PiP) and a **headless engine** with lock-screen support. Designed to\ndrop into your own video/audio UI, or compose a full player from blocks.\n\n- Zero-opinion markup, plain CSS that you own — import one stylesheet.\n- Motion is powered by [`motion`](https://motion.dev) and animates to the OS default.\n- Themed with a small set of `--bx-*` variables; auto light/dark via\n  `prefers-color-scheme`, per-usage override supported.\n- SSR-safe: nothing touches `window`/`document` at module scope.\n- Tree-shakeable ESM + CJS with type declarations.\n\n## Feedback & issues\n\nFound a bug or have an improvement idea? [Send it through this form](https://formcarry.com/s/rF1mjDYnmZQ) —\nno account needed, everything lands in the inbox. The same link is wired into\nnpm's metadata, so the package page's issue link points at the same form.\n\n## Install\n\n```bash\nnpm install @sauveurcadetorg/media-controls\n```\n\n`react` and `react-dom` (18+) are peer dependencies; `motion` is bundled as a\nruntime dependency automatically.\n\nImport the stylesheet **once**:\n\n```ts\nimport \"@sauveurcadetorg/media-controls/styles.css\";\n```\n\n## Quick start\n\nA complete minimal player that plays an mp4 in ~15 lines:\n\n```tsx\nimport \"@sauveurcadetorg/media-controls/styles.css\";\nimport {\n  useMediaController,\n  VideoSurface,\n  ControlsOverlay,\n  PlayPauseButton,\n  Scrubber,\n  MediaIcons,\n} from \"@sauveurcadetorg/media-controls\";\n\nfunction Player() {\n  const c = useMediaController({ source: \"show.mp4\", autoPlay: true, muted: true });\n  return (\n    <MediaIcons icons={{ play: <PlayFill />, pause: <PauseFill /> }}>\n      <VideoSurface src=\"show.mp4\" videoRef={c.mediaRef} aspectRatio=\"16 / 9\">\n        <ControlsOverlay playing={c.state.playing}>\n          <PlayPauseButton playing={c.state.playing} onToggle={c.toggle} />\n        </ControlsOverlay>\n        <Scrubber\n          duration={c.state.duration}\n          currentTime={c.state.currentTime}\n          onSeek={c.seek}\n        />\n      </VideoSurface>\n    </MediaIcons>\n  );\n}\n```\n\n`<PlayFill />` / `<PauseFill />` are your own icons (e.g. Phosphor) — glyphs\naren't bundled, see the icon registry. The rest of the README documents every\nblock and prop.\n\n## Components\n\n### Scrubber\n\nA `role=\"slider\"` seek bar with keyboard support (arrows step 5s,\n`Home`/`End` jump to ends), tap/drag seeking, and a halftone `--bx-accent` fill.\nIts hit target is a tall transparent bar (≈44px), the pill grows around its own\ncenter and the fill turns solid on touch, drags rubber-band at the ends, and dragging\n**downward while scrubbing** drops you into 1/2 → 1/4 → \"Fine\" slow-scrub\nmodes (with an on-screen label + `aria-valuetext`) for frame-level seeking.\n\n```tsx\nimport { Scrubber } from \"@sauveurcadetorg/media-controls\";\n\n<Scrubber\n  duration={92}\n  currentTime={31}\n  onSeek={setTime}\n  onSeekEnd={() => video.currentTime = pending}\n  ariaLabel=\"Seek\"\n/>;\n```\n\n| Prop | Type | Notes |\n| --- | --- | --- |\n| `duration` | `number` | Total seconds. |\n| `currentTime` | `number` | Current position in seconds. |\n| `onSeek` | `(t: number) => void` | Fires on any seek intent (throttled to animation frames). |\n| `onSeekEnd` | `(t: number) => void` | Fires when the user releases/commits a seek. |\n| `onScrubbingChange` | `(scrubbing: boolean) => void` | Drag start/end — wire to `ControlsOverlay` to pin controls. |\n| `showTime` | `boolean` | Built-in `0:00 / -0:00` readout under the bar (default `true`). Set `false` when you pair it with `ProgressTracker` so the times aren't shown twice. |\n| `fineTune` | `boolean` | Downward drag slows scrubbing (1/2 → 1/4 → Fine) with a mode label (default `true`). Set `false` to keep 1:1 always. |\n| `ariaLabel` | `string` | Fallback `aria-label` (defaults to an English label). |\n| `style`/`className` | CSS props | Styled via `--bx-*` vars, so plain `style` works. |\n\n### VolumeSlider\n\nVolume control with a springy, Apple-style feel (measured clone of the iOS\nplayback UI): the pill and fill are animated via `transform`, the whole row\ngently scales up (~1.03) on touch, the fill goes solid (`--bx-fill-active`)\nwhile the track stays put, the icons keep a steady dim and only nudge 1.1× on\ntouch, the track rubber-bands at either end (values always **commit clamped** to\n`0..1`), and the hit target is ≈44px. Horizontal and vertical layouts.\n\n```tsx\nimport { VolumeSlider } from \"@sauveurcadetorg/media-controls\";\nimport { SpeakerLow, SpeakerHigh } from \"./my-svg-icons\";\n\n<VolumeSlider value={0.62} onValueChange={setVolume} onCommit={setVolume} icons={{ low: <SpeakerLow />, high: <SpeakerHigh /> }} />;\n<VolumeSlider orientation=\"vertical\" verticalLength={140} value={v} onValueChange={setV} />;\n```\n\n| Prop | Type | Notes |\n| --- | --- | --- |\n| `value` | `number` | 0..1. |\n| `onValueChange` | `(v: number) => void` | Live while dragging. |\n| `onCommit` | `(v: number) => void` | Fires on release. |\n| `orientation` | `\"horizontal\" \\| \"vertical\"` | Default `horizontal`. |\n| `verticalLength` | `number` | px height in vertical mode. |\n| `icons` | `{ low?: ReactNode; high?: ReactNode }` | Speaker glyphs: low = speaker with no waves, high = speaker with waves (Apple style — waves don't track level). |\n| `icon` | `ReactNode` | Shorthand for `icons.low` (legacy single slot). |\n\n### SpeedSheet\n\nPlayback-rate picker. A popover that opens **upward** from the trigger —\nflipping below when it doesn't fit — so it stays on screen even on mobile or at\nthe top of a viewport. Controlled or uncontrolled, with `Escape` and\ntap-outside dismiss built in.\n\n```tsx\nimport { SpeedSheet, DEFAULT_RATES } from \"@sauveurcadetorg/media-controls\";\n\n<SpeedSheet\n  value={rate}\n  onChange={setRate}\n  rates={DEFAULT_RATES}          // [0.5, 0.75, 1, 1.25, 1.5, 2]\n  trigger={({ open, rate }) => <span className=\"pill\">{rate}x</span>} // render-prop, or a ReactNode\n/>;\n```\n\n| Prop | Type | Notes |\n| --- | --- | --- |\n| `value` | `number` | Current rate (auto-added to the list when missing). |\n| `onChange` | `(r: number) => void` | Called with the picked rate. |\n| `rates` | `number[]` | Defaults to `DEFAULT_RATES`. |\n| `trigger` | `ReactNode \\| ({ open, rate }) => ReactNode` | The button that opens the sheet. |\n\n> `formatRate(r)` and `formatTime(s)` are exported from the package root, too.\n\n## Playback building blocks\n\nEverything below is a self-contained block: wire it to your own state or to\n`useMediaController`. They share the `bx-` class system and the `--bx-*` tokens,\nso they theme and stack together.\n\n### useMediaController (headless engine)\n\nNo DOM of its own — returns a `mediaRef` to attach to your `<video>`/`<audio>` (or\n`VideoSurface.videoRef`) plus state and actions. Handles native mp4/webm, and lazy-loads\n`hls.js` / `dashjs` when the source says `type: \"hls\"` / `\"dash\"` (install those\npackages yourself; errors surface in `state.error`).\n\n```tsx\nimport { useMediaController } from \"@sauveurcadetorg/media-controls\";\n\nconst c = useMediaController({ source: \"movie.mp4\", autoPlay: true, muted: true });\n// mediaRef, state.{playing,currentTime,duration,buffering,volume,rate,...},\n// play/pause/toggle/seek/skip/setVolume/setRate/requestFullscreen/togglePictureInPicture\n```\n\n`useMediaSession(controller, meta)` (or the `<MediaSession>` block) syncs\n`navigator.mediaSession` — metadata, artwork, play/pause/skip + previous/next\nhandlers (±10s defaults), and `setPositionState`. No-ops where unsupported.\nNote: if you render the engine's `mediaRef` on a bare `<video>` you need to cast\nthe ref; the idiomatic attach point is `VideoSurface.videoRef`.\n\n### VideoSurface\n\nLetterboxed `<video>` container (`fit=\"contain\"` by default, poster, `aspectRatio`,\n`--bx-letterbox` background). Children — the overlay, buffering spinner — slot above\nit.\n\n```tsx\n<VideoSurface src={url} videoRef={c.mediaRef} aspectRatio=\"16 / 9\">\n  <ControlsOverlay playing={c.state.playing}>…</ControlsOverlay>\n</VideoSurface>\n```\n\n### ControlsOverlay\n\nAuto-hiding controls layer: while playing it fades out after `idleDelay` (3000ms);\na tap (also a pointer move) brings it back; it pins open while `scrubbing` or paused.\nInteractive children keep `pointer-events: auto`; empty-space taps never hit buttons.\n\n```tsx\n<ControlsOverlay playing={playing} scrubbing={scrubbing} idleDelay={2500}>\n  <BufferingIndicator buffering={buffering} />\n  <div className=\"bx-overlay__item\">{buttons…}</div>\n</ControlsOverlay>\n```\n\n### Buttons\n\n| Block | Props | Notes |\n| --- | --- | --- |\n| `PlayPauseButton` | `playing`, `onToggle`, `onPlay`, `onPause`, `size` | Round glass play/pause. |\n| `SkipButton` / `SkipButtons` | `direction`/`backSeconds`/`forwardSeconds`, `onSkip(delta)` | SF-style 10s skips; the number is drawn into the glyph. |\n| `FullscreenButton` | `videoRef`, `active`, `onActiveChange` | Renders nothing where unsupported. Fullscreens the video's **wrapper** (its parent element), so the browser keeps our overlay and never attaches its native fullscreen media UI. On iPhone/iOS Safari — where arbitrary elements can't be fullscreened — it falls back to the video element's native `webkitEnterFullscreen` path instead. |\n| `PictureInPictureButton` | `videoRef`, `active`, `onActiveChange` | Same, for PiP. |\n\n```tsx\n<SkipButtons onSkip={c.skip} />\n<PlayPauseButton playing={c.state.playing} onToggle={c.toggle} />\n<FullscreenButton videoRef={c.mediaRef} />\n<PictureInPictureButton videoRef={c.mediaRef} />\n```\n\n### BufferingIndicator · TitleBlock · ProgressTracker\n\n```tsx\n<BufferingIndicator buffering={c.state.buffering} />      {/* role=\"status\" spinner */}\n<TitleBlock title=\"Please Please Please\" subtitle=\"Sabrina Carpenter\" />\n<ProgressTracker currentTime={c.state.currentTime} duration={c.state.duration} />\n```\n\n`TitleBlock` scrolls its title (Apple-Music style, pauses on hover) only when the\ntext overflows — pass `forceMarquee` to always scroll. `ProgressTracker` shows\n`1:23 – 4:37` (elapsed / remaining; `mode=\"elapsed-total\"` available).\n\nWhen you pair `ProgressTracker` with a `Scrubber`, hide the Scrubber's own readout\nso the times aren't duplicated:\n\n```tsx\n<ProgressTracker currentTime={t} duration={d} />\n<Scrubber currentTime={t} duration={d} onSeek={seek} showTime={false} />\n```\n\n### UpNext\n\nApple TV-style \"Up next\" card: a frosted squircle that suggests the next item and\ncounts it down, so auto-advance announces itself before the current piece ends.\n\n```tsx\n<UpNext\n  next={{ title: \"Episode 2\", subtitle: \"S1E2 · 42 min\", artwork: posterUrl }}\n  countdown={8}                                  // default 8s\n  currentTime={c.state.currentTime}\n  duration={c.state.duration}\n  showAtRemaining={45}                           // auto-show during the last 45s\n  paused={scrubbing}                             // freeze while scrubbing / overlay\n  onPlayNow={() => play(tracks[1])}\n  onCountdownEnd={() => play(tracks[1])}         // ring reached 0 → load next\n  onCancel={() => keepPlaying()}\n/>\n```\n\n- Shows **automatically** once `duration − currentTime ≤ showAtRemaining`, or via\n  **controlled `visible`** (which wins). Sits bottom-right over the video;\n  override with `style` or `--bx-upnext-inset-x/-bottom/-width`.\n- The ring is a live countdown (`--bx-accent` color). At zero it fires\n  `onCountdownEnd` and dismisses; Play now fires `onPlayNow`. Both dismiss the\n  card — you remain in full control of the engine (the kit is single-track), so\n  wire either callback to load the next source.\n- Freezes while `paused` or the tab is hidden. `Esc` or the X dismisses via\n  `onCancel`. No autofocus — `Space` still toggles playback.\n- Card is squircle-radiused like the speed sheet; Play now + X stay round.\n- After the countdown ends (or a dismiss), the card re-arms: it shows again on\n  the next cycle (looping track, or once you feed it fresh `currentTime` /\n  `duration` for the following item).\n\n### MediaIcons — icon registry\n\nEvery control reads its glyph from a `MediaIcons` provider (optional slots,\nmerged down the tree) — there are **no baked-in SVGs**, so controls render as\nplain glass circles until you supply icons. Wire your own set (e.g. Phosphor):\n\n```tsx\n<MediaIcons\n  icons={{\n    play: <MyPlay />,\n    pause: <MyPause />,\n    skipBack: ({ seconds }) => <MyBack n={seconds} />,\n    fullscreen: <FS />,\n    fullscreenExit: <FSX />,\n    pictureInPicture: <Pip />,\n    pictureInPictureExit: <PipX />,\n  }}\n>\n  {blocks}\n</MediaIcons>\n```\n\n| Provider slot | Used by | Shape |\n| --- | --- | --- |\n| `play` | PlayPauseButton while paused | `ReactNode` |\n| `pause` | PlayPauseButton while playing | `ReactNode` |\n| `skipBack` | SkipButtons | `({ seconds }) => ReactNode` — draw the number yourself |\n| `skipForward` | SkipButtons | `({ seconds }) => ReactNode` — draw the number yourself |\n| `fullscreen` | FullscreenButton, entering | `ReactNode` |\n| `fullscreenExit` | FullscreenButton, active | `ReactNode` |\n| `pictureInPicture` | PictureInPictureButton, entering | `ReactNode` |\n| `pictureInPictureExit` | PictureInPictureButton, active | `ReactNode` |\n\nThree controls take icons as **props** instead of (or on top of) the provider:\n\n| Prop slot | Component | Shape |\n| --- | --- | --- |\n| `icons.low` / `icons.high` (`icon` as the legacy single slot) | VolumeSlider | speaker glyphs at each end of the track |\n| `icons.enter` / `icons.exit` | FullscreenButton, PictureInPictureButton | local overrides of the provider slots |\n\n> Everything ships as an empty glass circle until a slot is filled — a\n> `VolumeSlider` without `icons` and a tree without `MediaIcons` render bare.\n> There's no default glyph set by design: you bring the icon library and the\n> optical sizing.\n\n### Putting it together\n\n```tsx\nfunction Player() {\n  const c = useMediaController({ source: \"show.mp4\" });\n  const [scrubbing, setScrubbing] = useState(false);\n  return (\n    <VideoSurface src=\"show.mp4\" videoRef={c.mediaRef} aspectRatio=\"16 / 9\">\n      <BufferingIndicator buffering={c.state.buffering} />\n      <ControlsOverlay playing={c.state.playing} scrubbing={scrubbing}>\n        <div className=\"bx-overlay__item\">\n          <SkipButtons onSkip={c.skip} />\n          <PlayPauseButton playing={c.state.playing} onToggle={c.toggle} />\n          <SkipButtons onSkip={c.skip} />\n        </div>\n      </ControlsOverlay>\n      <Scrubber\n        duration={c.state.duration}\n        currentTime={c.state.currentTime}\n        onSeek={c.seek}\n        onScrubbingChange={setScrubbing}\n      />\n      <div className=\"bx-overlay__item\">\n        <FullscreenButton videoRef={c.mediaRef} />\n        <PictureInPictureButton videoRef={c.mediaRef} />\n      </div>\n    </VideoSurface>\n  );\n}\n```\n\n## Styling\n\nImport the single stylesheet, then theme with CSS variables scoped to `.bx-root`:\n\n```css\n.bx-root {\n  --bx-accent: #0a84ff;                /* primary; focus rings */\n  --bx-text: #1c1c1e;                  /* labels / times */\n  --bx-text-secondary: rgba(60, 60, 67, .6);\n  --bx-text-dim: rgba(60, 60, 67, .5); /* scrubbing time labels at rest */\n  --bx-track: rgba(0, 0, 0, .18);      /* slider / popover track */\n  --bx-fill: rgba(0, 0, 0, .55);       /* slider fill at rest */\n  --bx-fill-active: #fff;              /* slider fill while engaged (dark); light uses text color */\n  --bx-glass: rgba(248, 248, 250, .86);/* popover / sheet chrome */\n  --bx-button-glass: rgba(22, 22, 26, .34);  /* video overlay buttons */\n  --bx-button-glass-hover: rgba(255, 255, 255, .22);\n  --bx-overlay-scrim: linear-gradient(180deg, rgba(0,0,0,.42), transparent 32%, transparent 60%, rgba(0,0,0,.55));\n  --bx-buffering-fg: #fff;\n  --bx-letterbox: transparent;         /* video surface surround */\n  --bx-marquee-gap: 48px;              /* title marquee spacing */\n```\n\nDark/light adapt automatically. Force a scheme on an element with\n`data-bx-theme=\"dark\"` or `data-bx-theme=\"light\"` (see the dev example).\n\nThe speed sheet surface and its rows use Apple's continuous superellipse corners on\nevery platform: Chromium 139+ draws them natively via `corner-shape:\nsuperellipse(2)`, and Safari/Firefox get an identical pixel-perfect SVG `clip-path`\n(generated in `src/utils/squircle.ts` with a `ResizeObserver`). The slider tracks,\nspeed trigger, fine-tune badge and transport buttons deliberately stay genuine\nround capsules instead — at `border-radius = height/2` an exponent-4 superellipse\nmakes capsule ends look pointy and squared, while Apple's player capsules are\nround. Squircle corners read smaller than circular arcs at the same radius, so\nthe sheet radii are compensated (~1.84×) to keep the intended apparent rounding.\n\n## Accessibility\n\n- Scrubber is a proper `role=\"slider\"` with `aria-valuemin/max/now` and a live\n  `aria-valuetext` (`\"1:23 of 3:05\"`); full keyboard support.\n- VolumeSlider likewise `role=\"slider\"`, arrows adjust by 0.05.\n- SpeedSheet is a `role=\"listbox\"` popover that honors `Escape`, closes on\n  tap-outside, and marks the current rate.\n- PlayPauseButton / SkipButton / Fullscreen / PiP are real buttons with dynamic\n  `aria-label`s (`\"Forward 10 Seconds\"`); Fullscreen/PiP report `aria-pressed`.\n- BufferingIndicator is `role=\"status\"` (`aria-live=\"polite\"`), so it is announced\n  but never steals focus.\n\n## Server-side rendering\n\nAll browser APIs live in effects, so every component renders safely via\n`renderToString`. Style side effects are limited to the stylesheet import.\n\n## Troubleshooting\n\n**\"My buttons are empty glass circles / the slider reads nothing.\"**\nYou haven't supplied icons. Every glyph comes from the `MediaIcons` registry or\nthe per-component `icons` props — the kit ships **no glyphs at all**, so controls\nstay blank until you fill the slots. See the icon registry above.\n\n**\"HLS (or DASH) playback fails — `state.error` is set.\"**\nThe engine lazy-loads `hls.js` / `dashjs` at runtime; they are **not** bundled.\nInstall them in your app (`npm i hls.js` and/or `npm i dashjs`) and pass a source\nlike `{ src, type: \"hls\" }`. A missing package is reported explicitly in\n`state.error` with the exact install command.\n\n**\"Lock-screen media controls / PiP don't engage.\"**\nChromium requires a secure context — `navigator.mediaSession` and PiP work only\nover HTTPS (or `localhost`). PiP is offered on `<video>` elements only, so use a\n`<video>` for audio-with-video tracks if you want PiP.\n\n**\"The slider stays enlarged after I release it.\"** *(fixed in 1.5.4)*\nGrowth-on-hover is gated to `(hover: hover)` pointers, a gesture's release point\nis bounds-checked against the control, and a just-released gesture suppresses\ngrowth until the pointer moves again — a click or drag now returns the slider to\nits resting size on touch and mouse alike.\n\n## Development\n\n```bash\nnpm install\nnpm test        # vitest (behavior + SSR smoke)\nnpm run dev     # interactive playground at examples/dev\nnpm run build   # tsup -> dist (ESM/CJS/d.ts + styles.css)\n```\n\nThe dev playground maps the package name to the local source via Vite aliases, so\nyou're always editing against real code.\n\n## Feedback\n\nFound something off, or have an improvement idea? [Send it through\nthis form](https://formcarry.com/s/rF1mjDYnmZQ) — it lands straight in the\ninbox, no account needed.\n\n## License\n\nApache License 2.0 — free for personal and commercial use, modify and redistribute freely. Keep the original copyright/attribution notices; don't imply the project endorses you or pass the work off as your own. See the LICENSE file for the full text.","readmeFilename":"README.md"}