{"_id":"expo-media-viewer","_rev":"13-11ae89a6351f9571759680429ed5cc45","name":"expo-media-viewer","dist-tags":{"latest":"0.7.2"},"versions":{"0.1.0":{"name":"expo-media-viewer","version":"0.1.0","keywords":["expo","react-native","image-viewer","video-player","media","gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.1.0","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"a3d4817b4f0171d45fc958b56b42bb83fb4aa255","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.1.0.tgz","fileCount":101,"integrity":"sha512-GaULQi2Ny2UWWAAspvpCbXwmesP5TfvPJoC5Zsh8Kx4OqGQmPpjPDvmZZEjSLQpmVi7kEnxHd4iD6cuF/qR3yA==","signatures":[{"sig":"MEYCIQCVFSQuEqoZzujDWwRtI+8Nlqoxi32ZwQZVqdEXlGroPgIhAJ6h/HjBofja9PeAwprCDwn8rHje3iZABp6SrfejYrK7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390321},"main":"src/index.ts","types":"src/index.ts","gitHead":"47a171bc5fbdf4c97168766659c072fa9ce9372a","_npmUser":{"name":"juanrdbo","email":"juan@decaf.so"},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git"},"_npmVersion":"10.9.2","description":"Native fullscreen photo & video viewer for React Native (Expo Module). Pinch-to-zoom, swipe-to-dismiss, video playback.","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"peerDependencies":{"expo":">=52.0.0","react":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.1.0_1774066922016_0.2379323260882178","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"expo-media-viewer","version":"0.1.1","keywords":["expo","react-native","image-viewer","video-player","media","gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.1.1","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"be20a608e99ba8caa3c5055c1de76f4db2cc8e3f","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.1.1.tgz","fileCount":100,"integrity":"sha512-Ft0SJN26UFHbFYEu9M14qj04A0NH4cpHezS1pO7llUP4NoWe9n7GqFbQMM7Lp/Ve13ObsRfTNlFUZekcejZVjQ==","signatures":[{"sig":"MEUCIE1/BkxSZbm7/PNlYlMo+6PyLEwEW5tzjX/bqbbQxhxQAiEAqdKvIZzcdBiphkbtwrSJVLHPNK9d7Cc97bi78g9voN8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":411756},"main":"src/index.ts","types":"src/index.ts","gitHead":"5655ebb13a5dab7c34deea41488d26a32a500fc1","_npmUser":{"name":"juanrdbo","email":"juan@decaf.so"},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git"},"_npmVersion":"10.9.2","description":"Native fullscreen photo & video viewer for React Native (Expo Module). Pinch-to-zoom, swipe-to-dismiss, video playback.","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"@changesets/cli":"^2.30.0"},"peerDependencies":{"expo":">=52.0.0","react":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.1.1_1774146343646_0.2840595535045478","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"expo-media-viewer","version":"0.1.4","keywords":["expo","react-native","image-viewer","video-player","media","gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.1.4","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"a94a215073bc7aca6b0288f237ef11d6ac949523","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.1.4.tgz","fileCount":100,"integrity":"sha512-yisVRbv7C/LMxHM0lEZN4vKXMdOAARMsPqPSlEs1sxKuOJJaNv0Rev8yJLI2vcm4I9JJETDeKRG7ZMk0x4rVLA==","signatures":[{"sig":"MEUCIGutADNc+/nwTyI+5b0qsBbRjhnSLswB9bW7xTdvAt7QAiEAvWQxLghA5eInC+o8TZrYd9V/rF284k+UKXHL8Y7nyS4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":414027},"main":"src/index.ts","types":"src/index.ts","gitHead":"f9c7e694c05763faafd04be57b91cadb5b58b908","_npmUser":{"name":"juanrdbo","email":"juan@decaf.so"},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git"},"_npmVersion":"10.9.2","description":"Native fullscreen photo & video viewer for React Native (Expo Module). Pinch-to-zoom, swipe-to-dismiss, video playback.","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"@changesets/cli":"^2.30.0"},"peerDependencies":{"expo":">=52.0.0","react":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.1.4_1774955021028_0.15853084026949538","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"expo-media-viewer","version":"0.2.0","keywords":["expo","react-native","image-viewer","video-player","media","gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.2.0","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"f7a8f9b60efc81c13da52ba7e0ed138e6d8be7f1","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.2.0.tgz","fileCount":100,"integrity":"sha512-pbg9JdN6FuZzSvASn9LvH4J8gJb+mQXBjNI2ZoetPwGOpDf6j9MbuJSU4VO049fQ1nwHKEogTe5/wwDMBRG99w==","signatures":[{"sig":"MEYCIQDFucIsLjKH1RSRXpDElX1fc8s44EnYPzonHb2XhJ43AAIhAKvjaQuz16x3Ww1BpgebeDLcHdG2KdcARQKJ2xIMVle1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":418114},"main":"src/index.ts","types":"src/index.ts","gitHead":"39bde4ffc25ada7a092f1d24bb2256a6ee12be2e","_npmUser":{"name":"juanrdbo","email":"juan@decaf.so"},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git"},"_npmVersion":"10.9.2","description":"Native fullscreen photo & video viewer for React Native (Expo Module). Pinch-to-zoom, swipe-to-dismiss, video playback.","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"@changesets/cli":"^2.30.0"},"peerDependencies":{"expo":">=52.0.0","react":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.2.0_1775048834966_0.01889180307626681","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"expo-media-viewer","version":"0.3.0","keywords":["expo","react-native","image-viewer","video-player","media","gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.3.0","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"a307df3ee6193df5c5e22a2e10b0e1e81a4e5cc1","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.3.0.tgz","fileCount":105,"integrity":"sha512-TFT/99oQz2VFKqHzFIoQEVDyJ2xV66F534Uluj+jdp+34CQWoiri1rOAVzQUkmXkxmtpiM/4EiSDCqMMEm7e7w==","signatures":[{"sig":"MEYCIQDvf78WKoO3qdSmaAFqiALba4Emn4WzgI6dunYP+youZQIhAKVreCuIbrBEEQOQ52bF2NX8yRZ7nNdFy1v7Xx2fDJmB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":460385},"main":"src/index.ts","types":"src/index.ts","gitHead":"cd7506826f97dc483b74ff83d33dd2242854d0a5","_npmUser":{"name":"juanrdbo","email":"juan@decaf.so"},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git"},"_npmVersion":"11.12.1","description":"Native fullscreen photo & video viewer for React Native (Expo Module). Pinch-to-zoom, swipe-to-dismiss, video playback.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"expo":"~55.0.17","react":"19.2.0","typescript":"~5.9.2","@types/react":"~19.2.2","react-native":"0.83.6","expo-modules-core":"~55.0.23","expo-module-scripts":"~55.0.2","react-native-is-edge-to-edge":"1.3.1"},"peerDependencies":{"expo":">=52.0.0","react":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.3.0_1776954129754_0.2820280348273252","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"expo-media-viewer","version":"0.4.0","keywords":["expo","expo-module","react-native","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","expo-video","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.4.0","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"1a95ece96888c82c00ba745eb8ca16c6882799e9","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.4.0.tgz","fileCount":108,"integrity":"sha512-YxOLW6gnbeWggAy/M+vuV3n8WIu0FnB5My91NzqOm8nrEk+5brj/1tRjc+eF3cRZv1UHzuSEaaLA1UxqpideeA==","signatures":[{"sig":"MEUCIGtD1i3gmDFJJPwq6YVAeYdziQWxZuEiSMagFYidUfHtAiEA5XcOiJuFEUDofZnIE2w3K8/gMtAOvldOIkNKl7L4z0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-media-viewer@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":478622},"main":"src/index.ts","types":"src/index.ts","gitHead":"c97738cb3a9e7ef1fe480df06acf01357af02b71","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ddeff20-844b-49ec-bb59-fb961f197393"}},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git","directory":"packages/expo-media-viewer"},"_npmVersion":"11.11.0","description":"Native fullscreen image and video galleries for Expo apps. Thumbnails, shared transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"expo":"~55.0.17","react":"19.2.0","expo-image":"~55.0.9","expo-video":"~55.0.17","typescript":"~5.9.2","@types/react":"~19.2.2","react-native":"0.83.6","expo-modules-core":"~55.0.23","expo-module-scripts":"~55.0.2","react-native-is-edge-to-edge":"1.3.1"},"peerDependencies":{"expo":">=52.0.0","react":"*","expo-image":"*","expo-video":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.4.0_1778761652790_0.9062213222802953","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"expo-media-viewer","version":"0.4.1","keywords":["expo","expo-module","react-native","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","expo-video","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.4.1","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"da8227a2a81dfa010b22f8bd6c3f5eb2984a876a","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.4.1.tgz","fileCount":108,"integrity":"sha512-omdDIVPJ0XtUHFsqdzt4XIlx5VbiWbxVYpMxgEWftsOtj4Dexou8evvyx076EFzenJFgzLq3v1IRQ2Clav4VUQ==","signatures":[{"sig":"MEQCIGmaGxVJtB9E5ZPnzXIofDuQEG/oaI8RpRYVGrW1N1f/AiAMThZGjFZSJaJgHvJ5D7fsrno3HOiJB+m1nOyNTsHVzQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-media-viewer@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":481035},"main":"src/index.ts","types":"src/index.ts","gitHead":"b5454b453bcb42b1a9364497ff7b315f7528e9b1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ddeff20-844b-49ec-bb59-fb961f197393"}},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git","directory":"packages/expo-media-viewer"},"_npmVersion":"11.11.0","description":"Native fullscreen image and video galleries for Expo apps. Thumbnails, shared transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"expo":"~55.0.17","react":"19.2.0","expo-image":"~55.0.9","expo-video":"~55.0.17","typescript":"~5.9.2","@types/react":"~19.2.2","react-native":"0.83.6","expo-modules-core":"~55.0.23","expo-module-scripts":"~55.0.2","react-native-is-edge-to-edge":"1.3.1"},"peerDependencies":{"expo":">=52.0.0","react":"*","expo-image":"*","expo-video":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.4.1_1778800451133_0.2308139584836404","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"expo-media-viewer","version":"0.5.0","keywords":["expo","expo-module","react-native","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","expo-video","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.5.0","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"9b82cba34600df6cd2a926686cb687e853d91eb2","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.5.0.tgz","fileCount":108,"integrity":"sha512-vwMmvn+o8ag4DRdu1HKzLjxGu1GlTFnf+SRBfPlX1BYFO/XxWE3zYuW8aWEe0E7iOv386Ehj/mH3UdF+RtaICA==","signatures":[{"sig":"MEQCIGQVIzDb4OvzgDcDLA1YdaEOXw8z3xWEKgVbZqGalx7RAiBcH1JukKywpktMP1AiBdr0wThNulWD5VT89neZPlelgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-media-viewer@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":480969},"main":"src/index.ts","types":"src/index.ts","gitHead":"6b074c59b6953cd6d4115e17b9891fbecf700afb","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ddeff20-844b-49ec-bb59-fb961f197393"}},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git","directory":"packages/expo-media-viewer"},"_npmVersion":"11.11.0","description":"Native fullscreen image and video galleries for Expo apps. Thumbnails, shared transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"expo":"~55.0.17","react":"19.2.0","expo-image":"~55.0.9","expo-video":"~55.0.17","typescript":"~5.9.2","@types/react":"~19.2.2","react-native":"0.83.6","expo-modules-core":"~55.0.23","expo-module-scripts":"~55.0.2","react-native-is-edge-to-edge":"1.3.1"},"peerDependencies":{"expo":">=52.0.0","react":"*","expo-image":"*","expo-video":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.5.0_1778802533112_0.6994072048986406","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"expo-media-viewer","version":"0.5.1","keywords":["expo","expo-module","react-native","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.5.1","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"5cb87436c0791739a049ac19ebc2be10f646a63b","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.5.1.tgz","fileCount":114,"integrity":"sha512-EKfVUz5uKlgwLo2tDilZBGR/rV52H4pRi1eUEGdD2VLVwVSkefaYPeyCby1TO9ZiZvuElR3IPnlRABhdFE8ZPw==","signatures":[{"sig":"MEQCIDBfKV1SOCvwNYbhHb7Tj/zZPq3DAmlQjA29qyKNnqgEAiBFkYds1fB/WAWC/DBjCbFrN+PLn2dFkgYO2bGDakZ1GQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-media-viewer@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":541206},"main":"src/index.ts","types":"src/index.ts","gitHead":"ddc6e0fe3a0d369ccd72b478118d39977638daec","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ddeff20-844b-49ec-bb59-fb961f197393"}},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git","directory":"packages/expo-media-viewer"},"_npmVersion":"11.12.1","description":"Native fullscreen image and video galleries for Expo apps. Thumbnails, shared transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"expo":"~55.0.17","react":"19.2.0","expo-image":"~55.0.9","typescript":"~5.9.2","@types/react":"~19.2.2","react-native":"0.83.6","expo-modules-core":"~55.0.23","expo-module-scripts":"~55.0.2","react-native-is-edge-to-edge":"1.3.1"},"peerDependencies":{"expo":">=52.0.0","react":"*","expo-image":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.5.1_1779169087710_0.007621902786093981","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"expo-media-viewer","version":"0.6.0","keywords":["expo","expo-web","expo-module","react-native","react-native-web","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.6.0","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"346e14e0e4fa64e8d4d08105b709ba0d134d8459","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.6.0.tgz","fileCount":116,"integrity":"sha512-HvpyiHOuIFBd0L11dHwtidkBoa4cU31u9prCSyRZa2vUfaEcA0+02D+okEEjAWXDV4reinNCx9267rkDVx9NwQ==","signatures":[{"sig":"MEYCIQD37mNJ3PZo5yCiVCqlJ0fvKMNtvLXRb1QWecakm1ptewIhAIONs7LYC3W3UQGFAaj1fEN7/tMzxv4JsiQxGY2xg1WU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-media-viewer@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":584572},"main":"src/index.ts","types":"src/index.ts","gitHead":"92e124abba50b4302db3a3c11362dc3e55832887","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ddeff20-844b-49ec-bb59-fb961f197393"}},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git","directory":"packages/expo-media-viewer"},"_npmVersion":"11.12.1","description":"Fullscreen image and video galleries for Expo apps on iOS, Android, and web. Thumbnails, transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"expo":"~55.0.17","react":"19.2.0","react-dom":"19.2.0","expo-asset":"~55.0.16","expo-image":"~55.0.9","typescript":"~5.9.2","@types/react":"~19.2.2","react-native":"0.83.6","@types/react-dom":"~19.2.3","expo-modules-core":"~55.0.23","expo-module-scripts":"~55.0.2","react-native-is-edge-to-edge":"1.3.1"},"peerDependencies":{"expo":">=52.0.0","react":"*","react-dom":"*","expo-asset":"*","expo-image":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-dom":{"optional":true},"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.6.0_1779198185363_0.7417348545901723","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"expo-media-viewer","version":"0.7.0","keywords":["expo","expo-web","expo-module","react-native","react-native-web","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.7.0","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"dcfb5b6b48e4bf1d869ee983f954a831d756078e","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.7.0.tgz","fileCount":121,"integrity":"sha512-TNStz528+81hwIW2MqX8bv8mpiDMLO6rcJlYRvz9i5fN7L25Y8E3qT48OcDAWUM6SQlZF9p4QL+yxBCPn64RIg==","signatures":[{"sig":"MEYCIQDuDEmKDX7XJ252rocriJx8J18ctmKKNdIIeNHzDRP5sgIhALOfEijDaCwHeS3TzLuqDZHvW1jBVXfHCsa9aVgaV5Rx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-media-viewer@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":608906},"main":"src/index.ts","types":"src/index.ts","gitHead":"2d29552f08134fe9c0ffcfcdac7143627001d75b","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ddeff20-844b-49ec-bb59-fb961f197393"}},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git","directory":"packages/expo-media-viewer"},"_npmVersion":"11.12.1","description":"Fullscreen image and video galleries for Expo apps on iOS, Android, and web. Thumbnails, transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"expo":"~55.0.17","react":"19.2.0","react-dom":"19.2.0","expo-asset":"~55.0.16","expo-image":"~55.0.9","typescript":"~5.9.2","@types/react":"~19.2.2","react-native":"0.83.6","@types/react-dom":"~19.2.3","expo-modules-core":"~55.0.23","expo-module-scripts":"~55.0.2","react-native-is-edge-to-edge":"1.3.1"},"peerDependencies":{"expo":">=52.0.0","react":"*","react-dom":"*","expo-asset":"*","expo-image":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-dom":{"optional":true},"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.7.0_1779281716833_0.28138133939470955","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"expo-media-viewer","version":"0.7.1","keywords":["expo","expo-web","expo-module","react-native","react-native-web","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","pinch-to-zoom"],"author":{"name":"JuanRdBO"},"license":"MIT","_id":"expo-media-viewer@0.7.1","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"dist":{"shasum":"3d70ca3c92792002536d47c6c84a3e5d626dd6b1","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.7.1.tgz","fileCount":121,"integrity":"sha512-4tBTx5We4V80e6BYX22JvSPzxZoM77ubiKsgWFuaEUhssqQ4w39riCyeLKENtbmfBq29J9Faq5T+5wlgVJhThA==","signatures":[{"sig":"MEUCIQDr8UDDp8AwbInx6yU9z7kAvhxDBpqfuZhyX7EEtw+eDAIgLaEIApo7nLBW1M2XyzDlYHNSPudsi2QS3OICmO4c2sg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-media-viewer@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":608208},"main":"src/index.ts","types":"src/index.ts","gitHead":"bef6181096e86b6810e7f516865345fda9df799c","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ddeff20-844b-49ec-bb59-fb961f197393"}},"repository":{"url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","type":"git","directory":"packages/expo-media-viewer"},"_npmVersion":"11.12.1","description":"Fullscreen image and video galleries for Expo apps on iOS, Android, and web. Thumbnails, transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"expo":"~55.0.17","react":"19.2.0","react-dom":"19.2.0","expo-asset":"~55.0.16","expo-image":"~55.0.9","typescript":"~5.9.2","@types/react":"~19.2.2","react-native":"0.83.6","@types/react-dom":"~19.2.3","expo-modules-core":"~55.0.23","expo-module-scripts":"~55.0.2","react-native-is-edge-to-edge":"1.3.1"},"peerDependencies":{"expo":">=52.0.0","react":"*","react-dom":"*","expo-asset":"*","expo-image":"*","react-native":"*","expo-modules-core":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-dom":{"optional":true},"react-native-is-edge-to-edge":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-media-viewer_0.7.1_1779331333826_0.4135901492176097","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"expo-media-viewer","version":"0.7.2","description":"Fullscreen image and video galleries for Expo apps on iOS, Android, and web. Thumbnails, transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","main":"src/index.ts","types":"src/index.ts","repository":{"type":"git","url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","directory":"packages/expo-media-viewer"},"homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"author":{"name":"JuanRdBO"},"license":"MIT","keywords":["expo","expo-web","expo-module","react-native","react-native-web","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","pinch-to-zoom"],"devDependencies":{"@types/react":"~19.2.2","@types/react-dom":"~19.2.3","expo":"~55.0.17","expo-asset":"~55.0.16","expo-image":"~55.0.9","expo-module-scripts":"~55.0.2","expo-modules-core":"~55.0.23","react":"19.2.0","react-dom":"19.2.0","react-native":"0.83.6","react-native-is-edge-to-edge":"1.3.1","typescript":"~5.9.2"},"peerDependencies":{"expo":">=52.0.0","expo-asset":"*","expo-image":"*","expo-modules-core":"*","react":"*","react-dom":"*","react-native":"*","react-native-is-edge-to-edge":"*"},"peerDependenciesMeta":{"react-dom":{"optional":true},"react-native-is-edge-to-edge":{"optional":true}},"gitHead":"17524c30854f29a93b3a57e983ed78a1a7f3f3dc","_id":"expo-media-viewer@0.7.2","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-WR0E2k/zYThaX6say5VG3s84nw+IRLaONZvROCF/QiLcVMpPzhan/YwS5W0yOjAcmCPa1VLdeXWbJeBR9rooPg==","shasum":"fef2aa80db61784bcd451589eb9e7890fb9b8504","tarball":"https://registry.npmjs.org/expo-media-viewer/-/expo-media-viewer-0.7.2.tgz","fileCount":121,"unpackedSize":607790,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-media-viewer@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAcE9HmyvpuwSjyNwMKHYBVZ6QnAVqY5M9oTEnmGra0lAiBAg1Twb/suK0lqmEOY8UUCe5ECIDJBP6T6S5ojRg7YJg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4ddeff20-844b-49ec-bb59-fb961f197393"}},"directories":{},"maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expo-media-viewer_0.7.2_1779386663838_0.2893775047548026"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-21T04:22:01.936Z","modified":"2026-05-21T18:04:24.269Z","0.1.0":"2026-03-21T04:22:02.207Z","0.1.1":"2026-03-22T02:25:43.790Z","0.1.4":"2026-03-31T11:03:41.170Z","0.2.0":"2026-04-01T13:07:15.107Z","0.3.0":"2026-04-23T14:22:09.983Z","0.4.0":"2026-05-14T12:27:32.945Z","0.4.1":"2026-05-14T23:14:11.351Z","0.5.0":"2026-05-14T23:48:53.310Z","0.5.1":"2026-05-19T05:38:07.880Z","0.6.0":"2026-05-19T13:43:05.555Z","0.7.0":"2026-05-20T12:55:16.991Z","0.7.1":"2026-05-21T02:42:13.976Z","0.7.2":"2026-05-21T18:04:23.992Z"},"bugs":{"url":"https://github.com/JuanRdBO/expo-media-viewer/issues"},"author":{"name":"JuanRdBO"},"license":"MIT","homepage":"https://github.com/JuanRdBO/expo-media-viewer#readme","keywords":["expo","expo-web","expo-module","react-native","react-native-web","react-native-gallery","react-native-lightbox","image-viewer","photo-viewer","video-player","video-gallery","media-viewer","media","gallery","lightbox","fullscreen-viewer","fullscreen-gallery","pinch-to-zoom"],"repository":{"type":"git","url":"git+https://github.com/JuanRdBO/expo-media-viewer.git","directory":"packages/expo-media-viewer"},"description":"Fullscreen image and video galleries for Expo apps on iOS, Android, and web. Thumbnails, transitions, zoom, swipe-to-dismiss, video playback, and authenticated media URLs.","maintainers":[{"name":"juanrdbo","email":"juan@decaf.so"}],"readme":"<h1 align=\"center\">expo-media-viewer</h1>\n\n<p align=\"center\">\n  Fullscreen galleries for Expo apps with images, videos, thumbnails, transitions, zoom, and authenticated media URLs on iOS, Android, and web.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/JuanRdBO/expo-media-viewer/actions/workflows/validate.yml\"><img src=\"https://github.com/JuanRdBO/expo-media-viewer/actions/workflows/validate.yml/badge.svg\" alt=\"Validate\" /></a>\n  <a href=\"https://www.npmjs.com/package/expo-media-viewer\"><img src=\"https://img.shields.io/npm/v/expo-media-viewer\" alt=\"npm version\" /></a>\n  <a href=\"https://www.npmjs.com/package/expo-media-viewer\"><img src=\"https://img.shields.io/npm/dm/expo-media-viewer\" alt=\"npm downloads\" /></a>\n</p>\n\n<table align=\"center\">\n  <tr>\n    <td align=\"center\"><strong>iOS</strong></td>\n    <td align=\"center\"><strong>Android</strong></td>\n  </tr>\n  <tr>\n    <td><img src=\"https://raw.githubusercontent.com/JuanRdBO/expo-media-viewer/main/demo-ios.gif\" width=\"290\" alt=\"iOS fullscreen media viewer demo\" /></td>\n    <td><img src=\"https://raw.githubusercontent.com/JuanRdBO/expo-media-viewer/main/demo-android.gif\" width=\"290\" alt=\"Android fullscreen media viewer demo\" /></td>\n  </tr>\n</table>\n\nUse it when your app has a feed, chat, profile, memory timeline, marketplace listing, or gallery where a thumbnail should open into a polished fullscreen viewer. You pass the media model once, render whatever layout you want, and the package owns the hard parts: image zoom, video playback, open/close transitions, thumbnail rendering, swipe-to-dismiss, fullscreen chrome, and request headers.\n\nInspired by [@nandorojo/galeria](https://github.com/nandorojo/galeria), redesigned around mixed image/video collections.\n\n## Why It Feels Different\n\n| Built for | What you get |\n|---|---|\n| Mixed media | Images and videos share one `items` array instead of separate image-only props |\n| Real app layouts | Bring your own grid, feed, carousel, or masonry UI through `renderLayout` |\n| Package-owned thumbnails | Static images, posters, muted looping video previews, and video duration badges |\n| Cross-platform fullscreen UX | Native on iOS/Android, with a fluid web overlay for desktop and mobile browsers |\n| Live video previews | Muted looping thumbnails use native players on mobile and browser video on web |\n| Private media | Global request headers plus per-item and per-thumbnail overrides |\n\n## Highlights\n\n- **One source of truth** - define media, thumbnails, headers, chrome, and duration in `items`\n- **Any layout** - call `renderItem(index, options)` wherever a tappable thumbnail should appear\n- **Image and video support** - videos get native playback plus a built-in play indicator by default\n- **Live previews** - `loop-muted` video thumbnails play inline, pause offscreen, and open smoothly\n- **Transition matching** - thumbnail size and `borderRadius` are reused by the native open/close animation\n- **Blurhash placeholders** - keep package-owned thumbnails from flashing empty while images or video posters load\n- **Authenticated URLs** - attach headers globally or per item for private CDNs and signed media\n- **Local assets** - supports URI strings, `require(...)`, and `Image.resolveAssetSource(...)` style sources\n- **iOS, Android, and web** - native mobile viewers plus a browser viewer with keyboard, swipe, zoom, and video support\n- **Fabric and Classic support** - works with both React Native architectures\n\n## Installation\n\n```bash\nnpx expo install expo-media-viewer expo-image expo-asset\n```\n\nFor web builds, make sure the Expo web runtime packages are installed too:\n\n```bash\nnpx expo install react-dom react-native-web\n```\n\nThen rebuild your dev client for iOS or Android:\n\n```bash\nnpx expo prebuild --clean\nnpx expo run:ios   # or run:android\n```\n\nThis package includes native Swift and Kotlin code, so iOS and Android require a development build. Web works through the browser implementation.\n\n## Web Support\n\nThe same `MediaViewer` API works on web. The package resolves to a browser implementation that:\n\n- Opens media in a portal above your app and locks page scroll while fullscreen is active\n- Animates from the measured thumbnail frame into fullscreen, then back to the thumbnail on dismiss\n- Preserves thumbnail crop, `borderRadius`, and video playback time through the open and close transition\n- Supports desktop keyboard controls with `Escape`, left arrow, and right arrow\n- Supports mobile-first gestures: drag-to-dismiss with snap-back, swipe between items, and pinch or drag zoom for images\n- Pauses muted looping video thumbnails when they are offscreen\n\nNo web-specific props are required. Install `react-dom` and `react-native-web` for Expo web builds, then use the same `items`, `renderLayout`, and thumbnail options across iOS, Android, and web.\n\n## Usage\n\n```tsx\nimport { MediaViewer, type MediaViewerItem } from \"expo-media-viewer\";\nimport { View } from \"react-native\";\n\nconst items: MediaViewerItem[] = [\n  {\n    type: \"image\",\n    source: \"https://example.com/photo.jpg\",\n    blurhash: \"LEHV6nWB2yk8pyo0adR*.7kCMdnj\",\n    chrome: {\n      title: \"Beach sunset\",\n      subtitle: \"July 2025\",\n      footer: \"1 / 2\",\n    },\n  },\n  {\n    type: \"video\",\n    source: \"https://example.com/video.mp4\",\n    thumbnail: {\n      source: \"https://example.com/video-poster.jpg\",\n      mode: \"loop-muted\",\n      blurhash: \"LGF5]+Yk^6#M@-5c,1J5@[or[Q6.\",\n    },\n    duration: \"0:18\",\n    chrome: {\n      title: \"Drone footage\",\n      subtitle: \"September 2025\",\n      footer: \"2 / 2\",\n    },\n  },\n];\n\nexport function Gallery() {\n  return (\n    <MediaViewer\n      items={items}\n      config={{\n        theme: \"dark\",\n        thumbnail: { fit: \"cover\", mode: \"loop-muted\" },\n      }}\n      onIndexChange={(event) => {\n        console.log(\"Current index:\", event.nativeEvent.currentIndex);\n      }}\n      renderLayout={({ items, renderItem }) => (\n        <View style={{ flexDirection: \"row\", gap: 8 }}>\n          {items.map((_item, index) =>\n            renderItem(index, {\n              frame: { width: 120, height: 120, borderRadius: 12 },\n            }),\n          )}\n        </View>\n      )}\n    />\n  );\n}\n```\n\nVideo items automatically get a play indicator. If `duration` is present, it is shown inside that indicator.\n\n## Live Video Thumbnails\n\nSet a video thumbnail to `mode: \"loop-muted\"` when the thumbnail should be a live muted preview. The package owns the playback surface for that item:\n\n- iOS uses one `AVPlayer` session for the thumbnail and fullscreen viewer.\n- Android uses one Media3 `ExoPlayer` session and switches the target `PlayerView`.\n- Web uses browser video thumbnails, pauses them when they scroll offscreen, and opens fullscreen near the current playback time.\n- On iOS and Android, opening a live thumbnail keeps the same playback session instead of starting at `0:00`.\n- On web, opening fullscreen starts near the thumbnail's current playback time.\n- Dismissing fullscreen returns to the muted thumbnail preview.\n\nIf `thumbnail.source` is provided, it is used as the poster/fallback while the live video prepares. If it is omitted, the thumbnail falls back to `thumbnail.blurhash`, `blurhash`, or a neutral placeholder until the first video frame is ready.\n\nThumbnail mode precedence, from highest to lowest:\n\n- `renderItem(index, { thumbnail: { mode } })`\n- `item.thumbnail.mode`\n- `config.thumbnail.mode`\n- `config.thumbnail.videoMode`\n- `\"static\"`\n\n`config.thumbnail.videoMode` is kept as a compatibility alias for older callers. Prefer `config.thumbnail.mode` in new code. If both config fields are set, `mode` wins.\n\n## Request Headers\n\nUse `config.request.headers` for defaults, then override them on item-level `headers` or `thumbnail.headers`.\n\n```tsx\n<MediaViewer\n  items={[\n    {\n      type: \"video\",\n      source: \"https://media.example.com/private/video.mp4\",\n      headers: { \"X-Media-Scope\": \"original\" },\n      thumbnail: {\n        source: \"https://media.example.com/private/poster.jpg\",\n        headers: { \"X-Media-Scope\": \"thumbnail\" },\n        mode: \"loop-muted\",\n      },\n      duration: \"0:24\",\n    },\n  ]}\n  config={{\n    request: {\n      headers: { Authorization: `Bearer ${token}` },\n    },\n  }}\n  renderLayout={({ renderItem }) =>\n    renderItem(0, { frame: { width: 160, height: 160 } })\n  }\n/>\n```\n\nHeader precedence:\n\n- Media requests use `{ ...config.request.headers, ...item.headers }`\n- Thumbnail requests use `{ ...config.request.headers, ...(item.thumbnail?.headers ?? item.headers) }`\n\n## Asset Sources\n\n`source` and `thumbnail.source` accept URI strings or React Native image sources. Local assets are resolved with the package source resolver before they are passed to the native viewer.\n\n```tsx\nconst items: MediaViewerItem[] = [\n  {\n    type: \"image\",\n    source: require(\"./assets/photo.jpg\"),\n  },\n  {\n    type: \"video\",\n    source: \"https://example.com/video.mp4\",\n    thumbnail: { source: require(\"./assets/video-poster.jpg\") },\n  },\n];\n```\n\nIf custom UI outside `renderItem` needs the same URI normalization, use `resolveMediaViewerSource`:\n\n```tsx\nimport { resolveMediaViewerSource } from \"expo-media-viewer\";\n\nconst uri = resolveMediaViewerSource(item.thumbnail?.source ?? item.source);\n```\n\n## Blurhash Placeholders\n\nAdd `blurhash` for the default image thumbnail placeholder. Use `thumbnail.blurhash` when the thumbnail or video poster needs its own placeholder.\n\n```tsx\nconst items: MediaViewerItem[] = [\n  {\n    type: \"image\",\n    source: \"https://example.com/photo.jpg\",\n    blurhash: \"LEHV6nWB2yk8pyo0adR*.7kCMdnj\",\n  },\n  {\n    type: \"video\",\n    source: \"https://example.com/video.mp4\",\n    thumbnail: {\n      source: \"https://example.com/poster.jpg\",\n      blurhash: \"LGF5]+Yk^6#M@-5c,1J5@[or[Q6.\",\n      mode: \"loop-muted\",\n    },\n  },\n];\n```\n\nFor larger generated placeholders, pass dimensions:\n\n```tsx\nthumbnail: {\n  blurhash: {\n    hash: \"LEHV6nWB2yk8pyo0adR*.7kCMdnj\",\n    width: 32,\n    height: 32,\n  },\n}\n```\n\n## API\n\n### `<MediaViewer>`\n\n| Prop | Type | Default | Description |\n|---|---|---|---|\n| `items` | `MediaViewerItem[]` | required | Single source of truth for image/video data |\n| `renderLayout` | `(args: MediaViewerLayoutRenderArgs) => ReactNode` | required | Render your layout. Call `renderItem(index, options)` for each tappable media item |\n| `config` | `MediaViewerConfig` | - | Viewer theme, request defaults, thumbnail defaults, video indicator behavior, and native viewer options |\n| `onIndexChange` | `(event: MediaViewerIndexChangedEvent) => void` | - | Called when the fullscreen viewer changes pages |\n| `onVideoError` | `(event: MediaViewerVideoErrorEvent) => void` | - | Called when native video loading fails |\n\n### `MediaViewerItem`\n\n`MediaViewerItem` is the union of `MediaViewerImageItem | MediaViewerVideoItem`. Use the union for mixed galleries, or the narrower item types for helpers that only accept one media kind.\n\n| Prop | Type | Default | Description |\n|---|---|---|---|\n| `id` | `string` | generated | Stable key for the item |\n| `type` | `\"image\" \\| \"video\"` | required | Media type |\n| `source` | `string \\| ImageSourcePropType` | required | Fullscreen image or video source |\n| `headers` | `Record<string, string>` | - | Headers for the fullscreen media request |\n| `blurhash` | `string \\| { hash: string; width?: number; height?: number }` | - | Blurhash placeholder used by the default image thumbnail |\n| `thumbnail.source` | `string \\| ImageSourcePropType` | image: `source`, video: placeholder | Thumbnail or video poster source |\n| `thumbnail.headers` | `Record<string, string>` | `headers` | Headers for the thumbnail request |\n| `thumbnail.mode` | `\"static\" \\| \"loop-muted\"` | `\"static\"` | Per-item thumbnail behavior |\n| `thumbnail.blurhash` | `string \\| { hash: string; width?: number; height?: number }` | `blurhash` | Blurhash placeholder for the thumbnail or video poster |\n| `chrome.title` | `string` | - | Title shown in fullscreen viewer chrome |\n| `chrome.subtitle` | `string` | - | Subtitle shown in fullscreen viewer chrome |\n| `chrome.footer` | `string` | - | Bottom fullscreen text, often a counter or caption |\n| `duration` | `string` | - | Video item only. Optional text shown in the default video indicator |\n\n### `MediaViewerConfig`\n\n| Prop | Type | Default | Description |\n|---|---|---|---|\n| `theme` | `\"dark\" \\| \"light\"` | `\"dark\"` | Fullscreen viewer theme |\n| `request.headers` | `Record<string, string>` | - | Default headers for media and thumbnail requests |\n| `thumbnail.fit` | `\"cover\" \\| \"contain\"` | `\"cover\"` | Default thumbnail content fit |\n| `thumbnail.mode` | `\"static\" \\| \"loop-muted\"` | `\"static\"` | Default thumbnail mode for videos |\n| `thumbnail.videoMode` | `\"static\" \\| \"loop-muted\"` | `\"static\"` | Deprecated compatibility alias for `thumbnail.mode` |\n| `videoIndicator` | `boolean` | `true` | Show the built-in video indicator for video items |\n| `viewer.edgeToEdge` | `boolean` | platform default | Android edge-to-edge viewer dialog |\n| `viewer.hideBlurOverlay` | `boolean` | `false` | iOS blur overlay behind the viewer |\n| `viewer.hidePageIndicators` | `boolean` | `false` | Hide native page indicator dots |\n\n### `renderItem(index, options)`\n\n| Option | Type | Description |\n|---|---|---|\n| `frame.width` / `frame.height` | `number \\| \\`${number}%\\`` | Thumbnail frame dimensions |\n| `frame.aspectRatio` | `number` | Thumbnail frame aspect ratio |\n| `frame.flex` | `number` | Flex value for grid and row layouts |\n| `frame.borderRadius` | `number` | Thumbnail frame radius, also used by native transition matching |\n| `frame.backgroundColor` | `string` | Thumbnail frame background |\n| `thumbnail.fit` | `\"cover\" \\| \"contain\"` | Per-item fit override |\n| `thumbnail.mode` | `\"static\" \\| \"loop-muted\"` | Per-item thumbnail mode override |\n| `videoIndicator` | `boolean` | Per-item built-in video indicator override |\n| `overlay` | `ReactNode` | Non-interactive app overlay rendered above the package thumbnail and video indicator |\n\n## Android GPS Helper\n\n```ts\nimport { readGpsFromPhoto } from \"expo-media-viewer\";\n\nconst coords = await readGpsFromPhoto(assetId, fileName);\nif (coords) {\n  console.log(coords.latitude, coords.longitude);\n}\n```\n\nThis uses `MediaStore.setRequireOriginal()` to bypass Android 10+ scoped storage GPS stripping. It returns `null` on iOS or when no GPS data is found.\n\n## Requirements\n\n- Expo SDK 52+\n- React Native 0.76+\n- iOS 15.1+\n- Android minSdk 24\n\n## License\n\nMIT\n","readmeFilename":"README.md"}