{"_id":"@ddedic/expo-fancy-ota-updates","_rev":"10-cbbf8cb64fcd68f447188953f299018a","name":"@ddedic/expo-fancy-ota-updates","dist-tags":{"latest":"1.5.0"},"versions":{"1.0.0":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.0.0","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.0.0","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"dist":{"shasum":"2b046e5edfda7db48713f2e85484ef4141aef8c1","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.0.0.tgz","fileCount":18,"integrity":"sha512-0aykyI5dWLyWhg0U0/dSakHlM7la77z9GKyrrHFGlbJleMrvxnW90YRnvq2YFrGijJLHEwlkaR1JqoUWID2jdw==","signatures":[{"sig":"MEYCIQDuKCYk80HYixWGhpx07l+LB3o99Ki6mz5yiP0a0t3PigIhAJjGuxFK6l09ycaISKnMUh6npdIuiiEmJRVDHZf4gskT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":314196},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"da88b1c1db19f923139db0ae41d008c13fb54353","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"~5.7.2","@types/react":"~19.1.10"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.0.0_1765031184703_0.5587267390311426","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.0.1","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.0.1","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"dist":{"shasum":"1e0705a93df7814ac61212d9943d14841b8e3d6b","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.0.1.tgz","fileCount":18,"integrity":"sha512-d1CJlO6aYdRDeofsEuG91zoUMF13pLT3DcC+thCmJoaMGMnF5JyUe6N0XrdDRjbXHncgmv5GI9IHwDaJnByQoQ==","signatures":[{"sig":"MEUCICqbl5fr07X2xvXqj2Z04c43pqAMZetanFurEPw08HtUAiEAs2e8EaC9Db9NKv4hPr/mNKsnMxpZCHAzuxdqmjSiJUs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":314196},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"5e1222d23abe931ec76600dda8ea72aac5ed12eb","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"~5.7.2","@types/react":"~19.1.10"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.0.1_1765031506403_0.7787912195324393","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.1.0","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.1.0","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"dist":{"shasum":"cd0853ef5f7e09866f5abb5f69d1a6a98e4684b7","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.1.0.tgz","fileCount":33,"integrity":"sha512-BcjWwrvY+SpMYfssREmQ/4Fpau3Go4IYdvkXnUvrj2hIRo5ap3hF5pW3Id1otUm6wFbSzwDsLlxP9nKMrD7HZg==","signatures":[{"sig":"MEUCIQCUMCwadlIA02qFTng7qmEKsMG9izSjL9oOGo2WQrW7yAIgJL6TYzQskpBV/7gQPlAiHh0cSwh2SqeCZN7ASmDu7ug=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4665960},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"5d40a4bb08f1bedc9a5a8bc6e56c30695308694c","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","dependencies":{"ora":"^9.0.0","zod":"^4.1.13","chalk":"^5.6.2","execa":"^9.6.1","prompts":"^2.4.2","commander":"^14.0.2","cosmiconfig":"^9.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"~5.7.2","@types/react":"~19.1.10","@types/prompts":"^2.4.9"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.1.0_1765114697573_0.34170827735666376","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.1.2","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.1.2","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"dist":{"shasum":"5a0c1a4e4a988b9ee95959dab4787cc93e89863f","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.1.2.tgz","fileCount":33,"integrity":"sha512-cfYaeEkARdKiwDxCmVr1HRg8iFmDxEFSnfoDC4bPDEmIc4Ra1L5DAa9Asik9j50HI1aJ+JgPrB8r/Qc8sIf1fw==","signatures":[{"sig":"MEUCIHEQeS9QC+g/+goWWXxdoJsqG+V6cXgci6FvPYMrnLT0AiEA8pO8bZiKmaX/UNout8CyT3RncdMSVVbzfZdvEQxqMPQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4666498},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"6bab768442da50466eeb045bf68267b48eaaac12","scripts":{"dev":"tsup --watch","build":"tsup","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","dependencies":{"ora":"^9.0.0","zod":"^4.1.13","chalk":"^5.6.2","execa":"^9.6.1","prompts":"^2.4.2","commander":"^14.0.2","cosmiconfig":"^9.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.25","tsup":"^8.5.1","vitepress":"^1.6.4","typescript":"~5.7.2","@types/react":"~19.1.10","@types/prompts":"^2.4.9"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.1.2_1765116522980_0.7835531497103598","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.1.3","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.1.3","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"dist":{"shasum":"125e3d918ebca9acf1d91054e1951ec79171eca5","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.1.3.tgz","fileCount":33,"integrity":"sha512-FHOOOBGT5FPBy0HDJDf487GHoYe4MvP9vRs4TfD7CiLbhHmu8cWuNmuXfloAnTE9E+G9F8Vip1YppTR5wqyi2A==","signatures":[{"sig":"MEYCIQCa3ZUaDFmrDoCWlZG/KeVo43mdsVAK9FSC7BY4noq3GAIhANcWN/GltVSUxgFnbmXe9pB4UpQgYHppVzrB/JchaC8u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4667279},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"736ab015abbe8ae319ffd37af61cc9a497d89ae6","scripts":{"dev":"tsup --watch","build":"tsup","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","dependencies":{"ora":"^9.0.0","zod":"^4.1.13","chalk":"^5.6.2","execa":"^9.6.1","prompts":"^2.4.2","commander":"^14.0.2","cosmiconfig":"^9.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.25","tsup":"^8.5.1","vitepress":"^1.6.4","typescript":"~5.7.2","@types/react":"~19.1.10","@types/prompts":"^2.4.9"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.1.3_1765116622232_0.381529776721532","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.1.4","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.1.4","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"bin":{"ota-publish":"bin/ota-publish.js"},"dist":{"shasum":"98a882ff51544993fefc35f9705e50b13f5edbad","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.1.4.tgz","fileCount":33,"integrity":"sha512-T8pvZD0TLs+hZnxk4NVrUn5Thx2Uz8EgAVgim5dKiur1qAfHcSPpO1p6rqM4DwvCo0A4KQ411PfG3x7Cu+dnlQ==","signatures":[{"sig":"MEYCIQD5VttDU7zpjTnnakGLWywzhyfSKXIi2bngjQJ4V7H0qQIhAJ0QdLqNtHOHDLWPa9I+w6zxEttP6exjvc3aETGo1leG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4667337},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"344a63c2972ea33828c31d9d772b8e0673da7b64","scripts":{"dev":"tsup --watch","build":"tsup","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","dependencies":{"ora":"^9.0.0","zod":"^4.1.13","chalk":"^5.6.2","execa":"^9.6.1","prompts":"^2.4.2","commander":"^14.0.2","cosmiconfig":"^9.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.25","tsup":"^8.5.1","vitepress":"^1.6.4","typescript":"~5.7.2","@types/react":"~19.1.10","@types/prompts":"^2.4.9"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.1.4_1765122472319_0.05254020959938632","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.1.5","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.1.5","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"bin":{"ota-publish":"bin/ota-publish.js"},"dist":{"shasum":"e191ea64e87f77af94590b304c488af17d88ef78","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.1.5.tgz","fileCount":33,"integrity":"sha512-h1GWo3tdOFcPkyesQdBYTLhBbUQDvDUEhSb64uevmeUNF/FirCXxDYtwKUjkO9+9dLxNiDtRbEWby++Vwq6oKA==","signatures":[{"sig":"MEYCIQD5BzfMFvhYimmwshKfS8JY3QLmshJZNjvthKONnpvneQIhAMYwDVMyiLJo2XEGPH4OxPql77aP6qk01hu+eArVSXqQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4667615},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"e1926e69653b1a730b0a7ae643c95694c162211a","scripts":{"dev":"tsup --watch","build":"tsup","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","dependencies":{"ora":"^9.0.0","zod":"^4.1.13","chalk":"^5.6.2","execa":"^9.6.1","prompts":"^2.4.2","commander":"^14.0.2","cosmiconfig":"^9.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.25","tsup":"^8.5.1","vitepress":"^1.6.4","typescript":"~5.7.2","@types/react":"~19.1.10","@types/prompts":"^2.4.9"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.1.5_1765142153620_0.16077529270457402","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.2.0","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.2.0","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"bin":{"ota-publish":"bin/ota-publish.js"},"dist":{"shasum":"3c2074f200d2db56a46ce09779f3e174a2e7f326","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.2.0.tgz","fileCount":34,"integrity":"sha512-mxSFxXA/QVkB2zcUvH7aoaVlCCVPzyOAOVxqzSjhjunw6i8GmVYxHpLEiXVL80wUEGRjW3Jobx7t6rygDpliyQ==","signatures":[{"sig":"MEYCIQCY8dovKXMLm2m3HdyZ4nAwGNXOE1bVM9UVBESYJCVzZgIhAPQ2ddUgPX6FhCvefhd1bufGgReJMf+Os7zoA+ynXh9b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5139444},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"a44e4181aaaedc3049127a250072b3f5773e9977","scripts":{"dev":"tsup --watch","build":"tsup","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","dependencies":{"ora":"^9.0.0","zod":"^4.1.13","chalk":"^5.6.2","execa":"^9.6.1","prompts":"^2.4.2","commander":"^14.0.2","cosmiconfig":"^9.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.25","tsup":"^8.5.1","vitepress":"^1.6.4","typescript":"~5.7.2","@types/react":"~19.1.10","@types/prompts":"^2.4.9"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.2.0_1765196679971_0.7650436896985187","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.2.1","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","_id":"@ddedic/expo-fancy-ota-updates@1.2.1","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"homepage":"https://github.com/ddedic/expo-fancy-ota-updates","bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"bin":{"ota-publish":"bin/ota-publish.js"},"dist":{"shasum":"87dfefaab17e61f224c67f16be769874b30032a2","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.2.1.tgz","fileCount":41,"integrity":"sha512-1/XAfUboljHchs7uT2ByyglPAybxd/uRL8Y4my7Wi0lzcaoZrhpgHRMz94ukkyIdYB5OiGosKY/AXvskJMoCDw==","signatures":[{"sig":"MEUCIFpxFzM5MoOJHdWy77+yzoaRiXCBLR4fzu6IqxFi9xwBAiEA6AGWFhIzClOt2MzW22wi8yl8GP7KudRsp/VCTHNZM6w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5156023},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"9201d00506d793bd104449177de575750f2d5b27","scripts":{"dev":"tsup --watch","build":"tsup","docs:dev":"vitepress dev docs","typecheck":"tsc --noEmit","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs","prepublishOnly":"bun run build"},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"repository":{"url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git","type":"git"},"_npmVersion":"10.8.2","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.4","dependencies":{"ora":"^9.0.0","zod":"^4.1.13","chalk":"^5.6.2","execa":"^9.6.1","prompts":"^2.4.2","commander":"^14.0.2","cosmiconfig":"^9.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.25","tsup":"^8.5.1","vitepress":"^1.6.4","typescript":"~5.7.2","@types/react":"~19.1.10","@types/prompts":"^2.4.9"},"peerDependencies":{"expo":">=54.0.0","react":">=18.0.0","expo-device":"*","expo-updates":"*","react-native":"*","react-native-svg":"*","lucide-react-native":">=0.300.0","expo-linear-gradient":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*"},"peerDependenciesMeta":{"react-native-svg":{"optional":true},"lucide-react-native":{"optional":true},"expo-linear-gradient":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-fancy-ota-updates_1.2.1_1765198259961_0.825194367870502","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@ddedic/expo-fancy-ota-updates","version":"1.5.0","description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","homepage":"https://github.com/ddedic/expo-fancy-ota-updates","repository":{"type":"git","url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git"},"bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"bin":{"ota-publish":"bin/ota-publish.js"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"sideEffects":false,"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","prepublishOnly":"bun run build","example":"pnpm --dir examples/demo start --clear","docs:dev":"vitepress dev docs","docs:build":"vitepress build docs","docs:preview":"vitepress preview docs"},"keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"peerDependencies":{"expo":">=54.0.0","expo-device":"*","expo-linear-gradient":"*","expo-updates":"*","lucide-react-native":">=0.300.0","react":">=18.0.0","react-native":"*","react-native-reanimated":">=3.0.0","react-native-safe-area-context":"*","react-native-svg":"*"},"peerDependenciesMeta":{"expo-linear-gradient":{"optional":true},"lucide-react-native":{"optional":true},"react-native-svg":{"optional":true}},"devDependencies":{"@types/prompts":"^2.4.9","@types/react":"~19.1.10","tsup":"^8.5.1","typescript":"~5.7.2","vitepress":"^1.6.4","vue":"^3.5.25"},"publishConfig":{"access":"public"},"dependencies":{"chalk":"^5.6.2","commander":"^14.0.2","cosmiconfig":"^9.0.0","execa":"^9.6.1","ora":"^9.0.0","prompts":"^2.4.2","zod":"^4.1.13"},"private":false,"packageManager":"pnpm@9.12.3","_id":"@ddedic/expo-fancy-ota-updates@1.5.0","gitHead":"b9dcd9254f2b888dfb18da13e976a82579469700","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-/sVfWfozrilHI2Svif1dpjTwaHepMJG1UPAfiS9IYP5VE5L84t2usivR8YrnIgnUxEM5LuDYew9fsDzB02j3Ww==","shasum":"1e06af9912d32b5c629307ea5bd189d5b3eff453","tarball":"https://registry.npmjs.org/@ddedic/expo-fancy-ota-updates/-/expo-fancy-ota-updates-1.5.0.tgz","fileCount":40,"unpackedSize":555247,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCID8Yho9Cq8cljJI3zKqHwWzs8CikmMpKU2cW27dIwiBfAiEAptp8VwXP5xbBSLeOuQ8t+4Xxy7xkqPun5AILbiu8d88="}]},"_npmUser":{"name":"ddedic","email":"dedic.d@gmail.com"},"directories":{},"maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expo-fancy-ota-updates_1.5.0_1770803708789_0.7791985990019517"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-06T14:26:24.530Z","modified":"2026-02-11T09:55:09.085Z","1.0.0":"2025-12-06T14:26:24.878Z","1.0.1":"2025-12-06T14:31:46.572Z","1.1.0":"2025-12-07T13:38:17.856Z","1.1.2":"2025-12-07T14:08:43.326Z","1.1.3":"2025-12-07T14:10:22.517Z","1.1.4":"2025-12-07T15:47:52.624Z","1.1.5":"2025-12-07T21:15:53.903Z","1.2.0":"2025-12-08T12:24:40.283Z","1.2.1":"2025-12-08T12:51:00.291Z","1.5.0":"2026-02-11T09:55:08.962Z"},"bugs":{"url":"https://github.com/ddedic/expo-fancy-ota-updates/issues"},"author":{"name":"Danijel Dedic","email":"dedic.d@gmail.com"},"license":"MIT","homepage":"https://github.com/ddedic/expo-fancy-ota-updates","keywords":["expo","ota","updates","react-native","expo-updates","banner","over-the-air","customizable","theming","i18n"],"repository":{"type":"git","url":"git+https://github.com/ddedic/expo-fancy-ota-updates.git"},"description":"Highly customizable OTA update UI components for Expo apps. Includes animated banners, info screens, and full theming support.","maintainers":[{"name":"ddedic","email":"dedic.d@gmail.com"}],"readme":"# @ddedic/expo-fancy-ota-updates\n\nA highly customizable OTA (Over-The-Air) update UI package for Expo apps. Includes animated banners, info screens, and full theming support.\n\n\n[![npm version](https://img.shields.io/npm/v/@ddedic/expo-fancy-ota-updates.svg)](https://www.npmjs.com/package/@ddedic/expo-fancy-ota-updates)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Documentation](https://img.shields.io/badge/docs-vitepress-blue.svg)](https://ddedic.github.io/expo-fancy-ota-updates/)\n\n**[📚 Full Documentation](https://ddedic.github.io/expo-fancy-ota-updates/)** | **[📦 npm Package](https://www.npmjs.com/package/@ddedic/expo-fancy-ota-updates)** | **[💻 GitHub](https://github.com/ddedic/expo-fancy-ota-updates)**\n\n\n---\n\n<div align=\"center\">\n\n<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tr>\n<td align=\"center\" style=\"border: 1px solid #30363d; border-radius: 12px; padding: 20px; background-color: #0d1117; color: #c9d1d9;\">\n\n<br/>\n<h3 style=\"margin-bottom: 10px; border: none; color: #c9d1d9;\">🏆 Proudly Used In</h3>\n\n<a href=\"https://www.photo-trim.com\">\n<img src=\"./assets/photo-trim-icon.png\" alt=\"Photo Trim\" width=\"90\" style=\"border-radius: 20px;\" />\n</a>\n\n<h2 style=\"margin-top: 15px; margin-bottom: 5px; border: none;\">\n<a href=\"https://www.photo-trim.com\" style=\"text-decoration: none; color: #58a6ff;\">Photo Trim — Smart Photo Library Cleaner</a>\n</h2>\n\n<p style=\"font-size: 16px; margin: 10px 0; color: #8b949e; font-style: italic;\">\nSee exactly what's eating your storage — and fix it in seconds\n</p>\n\n<p width=\"85%\" style=\"color: #8b949e; max-width: 600px; margin: 15px auto; line-height: 1.5;\">\n<strong>Photo Trim</strong> gives you complete visibility into your photo library clutter. Discover large files, old media, and forgotten videos buried in both your device and iCloud. Smart grouping and powerful filters make it effortless to identify and delete unnecessary photos and videos — reclaiming gigabytes of storage with just a few taps.\n</p>\n\n<br/>\n\n<table border=\"0\" align=\"center\" width=\"100%\" style=\"margin: 0 auto; max-width: 700px; border-collapse: separate; border-spacing: 10px;\">\n<tr>\n<td align=\"center\" width=\"33%\" style=\"padding: 10px; border: 1px solid #30363d; border-radius: 8px;\">📊<br/><b style=\"color: #c9d1d9;\">Storage Insights</b><br/><sub style=\"color: #8b949e;\">See what's cluttering device & iCloud</sub></td>\n<td align=\"center\" width=\"33%\" style=\"padding: 10px; border: 1px solid #30363d; border-radius: 8px;\">🔍<br/><b style=\"color: #c9d1d9;\">Sort by Size</b><br/><sub style=\"color: #8b949e;\">Find large photos & videos instantly</sub></td>\n<td align=\"center\" width=\"33%\" style=\"padding: 10px; border: 1px solid #30363d; border-radius: 8px;\">☁️<br/><b style=\"color: #c9d1d9;\">iCloud vs Device</b><br/><sub style=\"color: #8b949e;\">Clear visibility of where files live</sub></td>\n</tr>\n<tr>\n<td align=\"center\" width=\"33%\" style=\"padding: 10px; border: 1px solid #30363d; border-radius: 8px;\">📅<br/><b style=\"color: #c9d1d9;\">Filter by Date</b><br/><sub style=\"color: #8b949e;\">Target old, forgotten media</sub></td>\n<td align=\"center\" width=\"33%\" style=\"padding: 10px; border: 1px solid #30363d; border-radius: 8px;\">🗑️<br/><b style=\"color: #c9d1d9;\">Batch Delete</b><br/><sub style=\"color: #8b949e;\">Clean up hundreds in one tap</sub></td>\n<td align=\"center\" width=\"33%\" style=\"padding: 10px; border: 1px solid #30363d; border-radius: 8px;\">🔒<br/><b style=\"color: #c9d1d9;\">Privacy First</b><br/><sub style=\"color: #8b949e;\">All analysis stays on your device</sub></td>\n</tr>\n</table>\n\n<br/>\n\n<a href=\"https://www.photo-trim.com\" style=\"text-decoration: none; font-weight: bold; font-size: 16px;\">🌐 Visit photo-trim.com</a>\n&nbsp;&nbsp;·&nbsp;&nbsp;\n<a href=\"https://apps.apple.com/app/id6755884114\" style=\"text-decoration: none; font-weight: bold; font-size: 16px;\">📱 Download on App Store</a>\n\n<br/><br/>\n\n</td>\n</tr>\n</table>\n\n</div>\n\n---\n\n## ✨ Features\n\n### UI Components\n\n- 🎨 **Fully Customizable** — Theme colors, gradients, border radius, and animations\n- 🌍 **i18n Ready** — Pass your own translations or use English defaults\n- ✨ **Animated Banner** — Beautiful gradient banner with pulse animation\n- 🧱 **Gradient Fallback** — Uses solid background automatically when `expo-linear-gradient` is not installed\n- 📱 **Info Screen** — Full debug/info screen with changelog display\n- 🔌 **Drop-in Ready** — Works out of the box with sensible defaults\n- 🎯 **Render Props** — Override any component with your own implementation\n- 🎨 **Icon Support** — Uses lucide-react-native with text fallbacks\n- 📡 **Channel Surfing** — Switch update channels at runtime (Expo SDK 54+)\n\n### CLI Publishing Tool\n\n- 🚀 **Easy Publishing** — Simple `ota-publish` command to publish OTA updates\n- ⚙️ **Configurable** — Customize via `ota-updates.config.js`\n- 📊 **Multiple Version Strategies** — Semver, build number, or date-based\n- 📝 **Smart Changelog** — Auto-generate from git, manual input, file, or custom hook\n- 🧩 **Per-Channel Templates** — Channel-specific version/message formats\n- ✂️ **Short Channel Aliases** — Use `{channelAlias}` for compact versions like `1.1.6-p42`\n- 🎯 **Interactive Mode** — Guided prompts for easy publishing\n- 🔍 **Dry Run** — Preview changes before publishing\n- 🪝 **Hooks System** — Run custom logic and override changelog/message/version\n- 📦 **Multi-Channel** — Support for dev, preview, production channels\n- ↩️ **Revert Command** — Safely republish a previous update to roll back a channel\n- ⇄ **Promote Command** — Copy an update group from one channel to another\n\n---\n\n## 📸 Screenshots\n\n<div align=\"center\">\n\n### UI Components in Action\n\n<table>\n<tr>\n<td width=\"33%\" align=\"center\">\n  <img src=\"./assets/screenshots/screenshot-1.PNG\" alt=\"Update Banner\" width=\"100%\" />\n  <br/>\n  <sub><b>Animated Update Banner</b></sub>\n  <br/>\n  <sub>Beautiful gradient with pulse animation</sub>\n</td>\n<td width=\"33%\" align=\"center\">\n  <img src=\"./assets/screenshots/screenshot-2.PNG\" alt=\"Download Progress\" width=\"100%\" />\n  <br/>\n  <sub><b>Download Progress</b></sub>\n  <br/>\n  <sub>Real-time download status</sub>\n</td>\n<td width=\"33%\" align=\"center\">\n  <img src=\"./assets/screenshots/screenshot-3.PNG\" alt=\"OTA Info Screen\" width=\"100%\" />\n  <br/>\n  <sub><b>OTA Info Screen</b></sub>\n  <br/>\n  <sub>Full debug & version details</sub>\n</td>\n</tr>\n</table>\n\n### CLI Publishing Tool\n\n<img src=\"./assets/screenshots/cli-screenshot.png\" alt=\"CLI Tool\" width=\"80%\" />\n\n<sub><b>Interactive CLI</b> — Publish OTA updates with guided prompts, version tracking, and changelog generation</sub>\n\n</div>\n\n---\n\n## 📦 Installation\n\n```bash\n# Using pnpm\npnpm add @ddedic/expo-fancy-ota-updates\n\n# Using npm\nnpm install @ddedic/expo-fancy-ota-updates\n\n# Using yarn\nyarn add @ddedic/expo-fancy-ota-updates\n```\n\n### Peer Dependencies\n\nThe following dependencies are required:\n\n```bash\npnpm add expo expo-updates expo-device react react-native react-native-reanimated react-native-safe-area-context\n```\n\nOptional dependencies for enhanced visuals:\n\n```bash\n# For gradient banners (optional; falls back to solid View if missing)\npnpm add expo-linear-gradient\n\n# For beautiful icons (recommended)\npnpm add lucide-react-native react-native-svg\n```\n\n---\n\n## 🚀 Quick Start\n\n### 1. Create Version File\n\nCreate an `ota-version.json` file in your project root (this gets updated by your OTA publishing workflow):\n\n```json\n{\n  \"version\": \"1.0.0\",\n  \"buildNumber\": 1,\n  \"releaseDate\": \"2026-01-01T00:00:00.000Z\",\n  \"changelog\": [\"Initial release\"]\n}\n```\n\n### 2. Wrap Your App\n\n```tsx\n// App.tsx or _layout.tsx\nimport { \n  OTAUpdatesProvider, \n  UpdateBanner \n} from '@ddedic/expo-fancy-ota-updates';\nimport versionData from './ota-version.json';\n\nexport default function App() {\n  return (\n    <OTAUpdatesProvider config={{ versionData }}>\n      {/* Banner auto-shows when update is available */}\n      <UpdateBanner />\n      \n      {/* Your app content */}\n      <YourApp />\n    </OTAUpdatesProvider>\n  );\n}\n```\n\nThat's it! The banner will automatically appear when an OTA update is detected.\n\n---\n\n## 📚 Documentation\n\n**[📖 View Full Documentation →](https://ddedic.github.io/expo-fancy-ota-updates/)**\n\nComprehensive documentation with guides, examples, and API reference:\n\n- **[Getting Started](https://ddedic.github.io/expo-fancy-ota-updates/getting-started)** — Quick setup guide\n- **[UI Components](https://ddedic.github.io/expo-fancy-ota-updates/ui-components/provider)** — Provider, Banner, Info Screen, Hook\n- **[CLI Tool](https://ddedic.github.io/expo-fancy-ota-updates/cli/overview)** — Publishing commands and configuration\n- **[Guides](https://ddedic.github.io/expo-fancy-ota-updates/guides/theming)** — Theming, i18n, Hooks\n- **[Expo Showcase Demo](https://ddedic.github.io/expo-fancy-ota-updates/examples/expo-showcase)** — Full interactive Expo app preview\n- **[Examples](https://ddedic.github.io/expo-fancy-ota-updates/examples/workflow)** — Complete workflows and custom UI\n\n---\n\n## 🧪 Expo Showcase Demo\n\nWant to feel the package before integrating it?\n\nRun the full demo app from this repo:\n\n```bash\npnpm install\npnpm --dir examples/demo start\n```\n\nIt demonstrates:\n- dynamic provider controls (`minCheckIntervalMs`, `recordSkippedChecks`, foreground checks)\n- runtime channel switching (\"channel surfing\") with interactive UI\n- default and custom banner renderers\n- `OTAInfoScreen` in modal mode\n- `OTAInfoScreen` in tab mode with native-header coordination\n- iOS native-tabs compatibility fallback strategy\n- live telemetry via `useOTAUpdates()`\n\n<div align=\"center\">\n<table>\n<tr>\n<td width=\"33%\" align=\"center\">\n  <img src=\"./assets/expo-example/example-1-live-demo.png\" alt=\"Live Demo\" width=\"100%\" />\n  <br/>\n  <sub><b>Live Demo</b></sub>\n  <br/>\n  <sub>Update banner, status, and lifecycle controls</sub>\n</td>\n<td width=\"33%\" align=\"center\">\n  <img src=\"./assets/expo-example/example-2-info-screen.png\" alt=\"Info Screen\" width=\"100%\" />\n  <br/>\n  <sub><b>Info Screen</b></sub>\n  <br/>\n  <sub>Version details, changelog, and update actions</sub>\n</td>\n<td width=\"33%\" align=\"center\">\n  <img src=\"./assets/expo-example/example-3-settings.png\" alt=\"Settings\" width=\"100%\" />\n  <br/>\n  <sub><b>Settings</b></sub>\n  <br/>\n  <sub>Customization, mode toggle, and channel surfing</sub>\n</td>\n</tr>\n</table>\n</div>\n\n**📖 Demo Docs:** [Expo Showcase Demo](https://ddedic.github.io/expo-fancy-ota-updates/examples/expo-showcase)\n\n---\n\n## 📡 Channel Surfing\n\nSwitch the update channel your app pulls from at runtime — perfect for letting QA/stakeholders preview updates from staging or preview channels without rebuilding.\n\nRequires **Expo SDK 54+** (`Updates.setUpdateRequestHeadersOverride()`).\n\n```tsx\nimport { useOTAUpdates } from '@ddedic/expo-fancy-ota-updates';\n\nfunction ChannelPicker() {\n  const { channel, isSwitchingChannel, switchChannel } = useOTAUpdates();\n\n  const handleSwitch = async (name: string) => {\n    const result = await switchChannel(name);\n    if (result.isSkipped) {\n      console.log('Skipped:', result.reason);\n    } else if (result.success) {\n      console.log(`Switched from ${result.previousChannel} to ${result.newChannel}`);\n    }\n  };\n\n  return (\n    <View>\n      <Text>Current channel: {channel ?? 'N/A'}</Text>\n      {isSwitchingChannel && <ActivityIndicator />}\n      <Button title=\"Production\" onPress={() => handleSwitch('production')} />\n      <Button title=\"Staging\" onPress={() => handleSwitch('staging')} />\n      <Button title=\"Preview\" onPress={() => handleSwitch('preview')} />\n    </View>\n  );\n}\n```\n\nThe method follows the same guard pattern as `checkForUpdate` — it skips gracefully in DEV mode, simulators, and when updates are disabled, returning a `SwitchChannelResult` with the skip reason.\n\n---\n\n## 🚀 CLI Publishing Tool\n\nThis package includes a powerful CLI for publishing OTA updates with version tracking.\n\n### Quick Start\n\n**In your project (recommended):**\n```bash\n# When installed in your project, just use:\nnpx ota-publish --channel production\n```\n\n**Global usage:**\n```bash\n# If running outside a project, specify the package:\nnpx -p @ddedic/expo-fancy-ota-updates ota-publish --channel production\n\n# Or install globally:\npnpm add -g @ddedic/expo-fancy-ota-updates\nota-publish --channel production\n```\n\n### Using in Your App\n\n**After publishing to npm:**\n```bash\nnpx ota-publish --channel development\n```\n\n**For local development (before npm publish):**\n\nAdd to your `package.json`:\n```json\n{\n  \"scripts\": {\n    \"ota:dev\": \"node node_modules/@ddedic/expo-fancy-ota-updates/bin/ota-publish.js --channel development\",\n    \"ota:preview\": \"node node_modules/@ddedic/expo-fancy-ota-updates/bin/ota-publish.js --channel preview\",\n    \"ota:prod\": \"node node_modules/@ddedic/expo-fancy-ota-updates/bin/ota-publish.js --channel production\"\n  }\n}\n```\n\nThen run: `npm run ota:dev`, `npm run ota:preview`, or `npm run ota:prod`\n\n### Release Management Commands\n\n```bash\n# Revert a channel to a previous update group (interactive picker)\nnpx ota-publish revert --channel production\n\n# Promote from preview to production (interactive picker)\nnpx ota-publish promote --from preview --to production\n\n# Safe preview first\nnpx ota-publish revert --channel production --dry-run\nnpx ota-publish promote --from preview --to production --dry-run\n```\n\n### Shorter Production Version Example\n\nIf `1.1.6-production.1` is too long, use channel aliasing:\n\n```js\n// ota-updates.config.mjs\nexport default {\n  channelAliases: { production: 'p' },\n  versionFormatByChannel: {\n    production: '{major}.{minor}.{patch}-p{build}',\n  },\n};\n```\n\nOutput: `1.1.6-p1`\n\n**📖 [Full CLI Documentation →](./CLI.md)**\n\n---\n\n## 📖 API Reference\n\n### `<OTAUpdatesProvider>`\n\nThe main provider that enables OTA update functionality throughout your app.\n\n#### Props\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `children` | `ReactNode` | Your app content |\n| `theme` | `Partial<OTATheme>` | Custom theme (merged with defaults) |\n| `translations` | `Partial<OTATranslations>` | Custom translations (merged with defaults) |\n| `config` | `OTAConfig` | Provider behavior configuration |\n\n#### Config Options\n\n```typescript\ninterface OTAConfig {\n  checkOnMount?: boolean;      // Check for updates on mount (default: true)\n  checkOnForeground?: boolean; // Check when app comes to foreground (default: true)\n  minCheckIntervalMs?: number; // Throttle checks (default: 0)\n  recordSkippedChecks?: boolean; // Update lastCheck + reason for skipped checks (default: true)\n  autoDownload?: boolean;      // Auto-download when available (default: false)\n  autoReload?: boolean;        // Auto-reload after download (default: false)\n  versionData?: OTAVersionData; // Version info from ota-version.json\n  debug?: boolean;             // Enable debug logging (default: __DEV__)\n}\n```\n\n#### Full Example\n\n```tsx\n<OTAUpdatesProvider\n  theme={{\n    colors: {\n      primary: '#6366F1',\n      primaryLight: '#818CF8',\n      background: '#0B0B0F',\n      text: '#FFFFFF',\n    },\n    bannerGradient: ['#6366F1', '#818CF8'],\n    borderRadius: 16,\n  }}\n  translations={{\n    banner: {\n      updateAvailable: 'New Update Available!',\n      updateButton: 'Update Now',\n    },\n  }}\n  config={{\n    checkOnMount: true,\n    checkOnForeground: true,\n    minCheckIntervalMs: 30000,\n    recordSkippedChecks: true,\n    autoDownload: false,\n    versionData: require('./ota-version.json'),\n  }}\n>\n  {children}\n</OTAUpdatesProvider>\n```\n\n---\n\n### `useOTAUpdates()` Hook\n\nAccess OTA update state and actions from any component within the provider.\n\n```tsx\nimport { useOTAUpdates } from '@ddedic/expo-fancy-ota-updates';\n\nfunction MyComponent() {\n  const {\n    // State\n    isUpdateAvailable,  // boolean - Update is available to download\n    isDownloading,      // boolean - Currently downloading\n    isDownloaded,       // boolean - Download complete, ready to apply\n    status,             // 'idle' | 'checking' | 'available' | 'downloading' | 'downloaded' | 'error'\n    checkError,         // Error | null\n    downloadError,      // Error | null\n    lastCheck,          // Date | null\n    lastSkippedReason,  // string | null (DEV/simulator/throttled/disabled)\n    \n    // expo-updates Metadata\n    currentUpdateId,    // string | null\n    channel,            // string | null\n    runtimeVersion,     // string | null\n    isEmbeddedUpdate,   // boolean\n\n    // Channel Switching\n    isSwitchingChannel, // boolean - Channel switch in progress\n    switchChannel,      // (channel: string) => Promise<SwitchChannelResult>\n\n    // Version Data\n    otaVersion,         // string - e.g., \"1.0.0-production.29\"\n    otaBuildNumber,     // number\n    otaReleaseDate,     // string - ISO date\n    otaChangelog,       // string[]\n\n    // Actions\n    checkForUpdate,     // () => Promise<CheckResult>\n    downloadUpdate,     // () => Promise<void>\n    reloadApp,          // () => Promise<void>\n    simulateUpdate,     // () => void - For testing\n\n    // Theming\n    theme,              // OTATheme\n    translations,       // OTATranslations\n  } = useOTAUpdates();\n}\n```\n\n---\n\n### `<UpdateBanner>`\n\nAnimated banner that appears when updates are available.\n\n#### Props\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `style` | `object` | Custom container style |\n| `visible` | `boolean` | Controlled visibility mode |\n| `onDismiss` | `() => void` | Called when banner is dismissed |\n| `renderBanner` | `(props) => ReactNode` | Custom render function |\n\n#### Basic Usage\n\n```tsx\n// Auto-shows when update available\n<UpdateBanner />\n```\n\n#### Controlled Mode\n\n```tsx\nconst [showBanner, setShowBanner] = useState(false);\n\n<UpdateBanner \n  visible={showBanner} \n  onDismiss={() => setShowBanner(false)} \n/>\n```\n\n#### Custom Render\n\n```tsx\n<UpdateBanner\n  renderBanner={({ \n    isDownloaded, \n    isDownloading,\n    otaVersion,\n    onUpdate, \n    onRestart, \n    onDismiss,\n    theme \n  }) => (\n    <View style={{ backgroundColor: theme.colors.primary }}>\n      <Text>{isDownloaded ? 'Ready!' : `v${otaVersion} available`}</Text>\n      <Button \n        title={isDownloaded ? 'Restart' : 'Update'} \n        onPress={isDownloaded ? onRestart : onUpdate} \n      />\n      <Button title=\"Later\" onPress={onDismiss} />\n    </View>\n  )}\n/>\n```\n\n---\n\n### `<OTAInfoScreen>`\n\nFull debug/info screen for OTA updates. Great for settings or debug menus.\n\n#### Props\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `mode` | `'developer' \\| 'user'` | Screen mode (default: 'developer') |\n| `onBack` | `() => void` | Back navigation callback |\n| `renderHeader` | `(props) => ReactNode` | Custom header render |\n| `renderInfo` | `(props) => ReactNode` | Custom render for Info section |\n| `renderActions` | `(props) => ReactNode` | Custom render for Actions section |\n| `renderChangelog` | `(props) => ReactNode` | Custom render for Changelog section |\n| `showRuntimeVersion` | `boolean` | Toggle runtime version visibility |\n| `showOtaVersion` | `boolean` | Toggle OTA version visibility |\n| `showReleaseDate` | `boolean` | Toggle release date visibility |\n| `showUpdateId` | `boolean` | Toggle update ID visibility |\n| `showCheckButton` | `boolean` | Toggle \"Check for Updates\" button |\n| `showDownloadButton` | `boolean` | Toggle \"Download\" button |\n| `showReloadButton` | `boolean` | Toggle \"Reload\" button |\n| `showDebugSection` | `boolean` | Toggle debug actions section |\n| `style` | `object` | Custom container style |\n\n#### Usage\n\n```tsx\nimport { OTAInfoScreen } from '@ddedic/expo-fancy-ota-updates';\n\n// Simple usage\n<OTAInfoScreen \n  mode=\"user\"\n  onBack={() => navigation.goBack()} \n/>\n\n// Advanced usage with custom sections\n<OTAInfoScreen\n  renderInfo={({ theme }) => (\n    <View style={{ padding: 20 }}>\n      <Text style={{ color: theme.colors.text }}>My Custom Header</Text>\n    </View>\n  )}\n/>\n```\n\n#### Sub-Components\n\nYou can also import sub-components directly if you want to compose your own screen:\n\n```tsx\nimport { OTAUpdateInfo, OTAUpdateActions, OTAUpdateChangelog } from '@ddedic/expo-fancy-ota-updates';\n```\n\n---\n\n## 🎨 Theming\n\n### Theme Structure\n\n```typescript\ninterface OTATheme {\n  colors: {\n    primary: string;           // Main brand color\n    primaryLight: string;      // Lighter variant\n    background: string;        // Screen background\n    backgroundSecondary: string;\n    backgroundTertiary: string;\n    text: string;              // Primary text\n    textSecondary: string;\n    textTertiary: string;\n    border: string;\n    error: string;\n    success: string;\n    warning: string;\n  };\n  bannerGradient?: [string, string];  // Gradient start/end\n  borderRadius?: number;               // Card border radius\n  buttonBorderRadius?: number;         // Button border radius\n  animation?: {\n    duration?: number;       // Enter/exit animation (ms)\n    pulseDuration?: number;  // Pulse animation cycle (ms)\n  };\n}\n```\n\n### Using Built-in Themes\n\n```tsx\nimport { \n  OTAUpdatesProvider, \n  defaultTheme,  // Dark indigo theme\n  lightTheme,    // Light theme\n} from '@ddedic/expo-fancy-ota-updates';\n\n// Use light theme\n<OTAUpdatesProvider theme={lightTheme}>\n\n// Or customize from defaults\n<OTAUpdatesProvider theme={{\n  ...defaultTheme,\n  colors: {\n    ...defaultTheme.colors,\n    primary: '#10B981',\n  },\n}}>\n```\n\n---\n\n## 🌍 Translations\n\n### Translation Structure\n\n```typescript\ninterface OTATranslations {\n  banner: {\n    updateAvailable: string;\n    updateReady: string;\n    downloading: string;\n    versionAvailable: string;\n    restartToApply: string;\n    updateButton: string;\n    restartButton: string;\n  };\n  infoScreen: {\n    title: string;\n    statusTitle: string;\n    embeddedBuild: string;\n    otaUpdate: string;\n    runtimeVersion: string;\n    otaVersion: string;\n    releaseDate: string;\n    updateId: string;\n    channel: string;\n    whatsNew: string;\n    checkForUpdates: string;\n    downloadUpdate: string;\n    reloadApp: string;\n    debugTitle: string;\n    simulateUpdate: string;\n    devMode: string;\n    notAvailable: string;\n    none: string;\n  };\n}\n```\n\n### German Example\n\n```tsx\n<OTAUpdatesProvider\n  translations={{\n    banner: {\n      updateAvailable: 'Neue Version verfügbar',\n      updateReady: 'Update bereit',\n      downloading: 'Download läuft...',\n      versionAvailable: 'Eine neue Version ist verfügbar',\n      restartToApply: 'Neustart zum Anwenden',\n      updateButton: 'Aktualisieren',\n      restartButton: 'Neustart',\n    },\n    infoScreen: {\n      title: 'OTA Updates',\n      checkForUpdates: 'Nach Updates suchen',\n      // ... more translations\n    },\n  }}\n>\n```\n\n---\n\n## 🔧 Advanced Usage\n\n### With App Theme Integration\n\n```tsx\nimport { useTheme } from './your-theme-context';\n\nfunction AppProviders({ children }) {\n  const { colors, isDark } = useTheme();\n  \n  return (\n    <OTAUpdatesProvider\n      theme={{\n        colors: {\n          primary: colors.primary,\n          background: colors.background,\n          text: colors.text,\n          // Map your theme colors\n        },\n      }}\n    >\n      {children}\n    </OTAUpdatesProvider>\n  );\n}\n```\n\n### With i18n Library\n\n```tsx\nimport { useTranslation } from 'react-i18next';\n\nfunction AppProviders({ children }) {\n  const { t } = useTranslation('ota');\n  \n  return (\n    <OTAUpdatesProvider\n      translations={{\n        banner: {\n          updateAvailable: t('banner.updateAvailable'),\n          updateButton: t('banner.updateButton'),\n          // ...\n        },\n      }}\n    >\n      {children}\n    </OTAUpdatesProvider>\n  );\n}\n```\n\n---\n\n## 📄 License\n\nMIT License © 2025-2026 [Danijel Dedic](mailto:dedic.d@gmail.com), [Technabit e.U.](https://technabit.at)\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n","readmeFilename":"README.md"}