{"_id":"wovvmap-webview-bridge","_rev":"38-d25322b03c5530877ba36b74d4a3dbc9","name":"wovvmap-webview-bridge","dist-tags":{"latest":"1.1.7"},"versions":{"1.0.0":{"name":"wovvmap-webview-bridge","version":"1.0.0","_id":"wovvmap-webview-bridge@1.0.0","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"f62d21d7f62a0c24782d42977cb8078ee406ca2b","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.0.tgz","fileCount":10,"integrity":"sha512-NF1GBUOv6KKau7cYVZUoWuyTEHVoIM9PXvRMe7iG7otM/3L7zLfT/azl7FU9BgEaG3tZArD/cYUT3iX4+UZW4Q==","signatures":[{"sig":"MEQCIFSKwGcC3/n/gGKdLZQcycMSayaKjWWS+R/Ynd5ONgRYAiBm+a4OhXrcfbWrlwPuSua1ZJcM0MZRY+lVMDKDHnanpw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8078},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc "},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.0_1753254488406_0.16947962843474107","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"wovvmap-webview-bridge","version":"1.0.1","_id":"wovvmap-webview-bridge@1.0.1","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"a68de706084afc0a248aa0e57703154d04a1f780","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.1.tgz","fileCount":10,"integrity":"sha512-Fp4y4yvGGuRqhDlM3MU43kcGJEnYxpSHAZF472o9YJ1D0LYOipMc2NiV/i+Z6/by0tgipDfIOr1KCSe34n0ZJA==","signatures":[{"sig":"MEYCIQCQM40rBz+aeDcZ5YfOEybHDGecS8kG51rQOVQmR3GfywIhAMYAGM2rdDIjMHbHYLxEJe4uBn9L3bKnzCpq/Q16TnqS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10671},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc "},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"This guide explains how to use the `wovvmap-webview-bridge` package **from the React Native side**. This package helps you send data to a WebView and listen for data coming from the WebView.","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.1_1753254978683_0.6961249534203575","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"wovvmap-webview-bridge","version":"1.0.2","_id":"wovvmap-webview-bridge@1.0.2","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"5ae74fcd415a6955de3ee49bf0cfc0d4fab7f772","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.2.tgz","fileCount":10,"integrity":"sha512-GSj4XC25q69CVFm0QLNR1qivHIveG5HKK/NOKIq34rEdHVY7oK9G3n6B7ITU05usxWXr+GTpRLnejGE/37iJxw==","signatures":[{"sig":"MEUCIQCnN+EsAzf4b5eUOer1QIGlm9X/liuPEib4XDSxjIliUQIgAyNyxdU3AjMJN2Vlux1inUTyQM7+HJFdfi0k8niI/bg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12750},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc "},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"This guide explains how to use the `wovvmap-webview-bridge` package **from the React Native side**. This package helps you send data to a WebView and listen for data coming from the WebView.","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.2_1753255192028_0.5367082277410331","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"wovvmap-webview-bridge","version":"1.0.3","_id":"wovvmap-webview-bridge@1.0.3","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"d8a678db5b91f38f4f533863aa3ee5c92832b223","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.3.tgz","fileCount":10,"integrity":"sha512-Rfz9jWzaaINhcRhy5iNkEYkrwyNllD32VOuBnpgfStfaX4IFcnnZVzPzKiDL/+k+oUtqOoaWID2u61V4X3w/LQ==","signatures":[{"sig":"MEQCIGkr3uYlSw+sTti9gdxB+UqQSPndy8qelWweXj6ss+MJAiBKvuGdbzoxf45dAWx7vMN1IBp4IPnxWiASLgLFr8h/PQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12710},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"bb7de8946452a4bb8cfb8147df73f58f19f97409","scripts":{"build":"tsc "},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"This guide explains how to use the `wovvmap-webview-bridge` package **from the React Native side**. This package helps you send data to a WebView and listen for data coming from the WebView.","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.3_1753279892782_0.3673764617873696","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"wovvmap-webview-bridge","version":"1.0.4","_id":"wovvmap-webview-bridge@1.0.4","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"95007f536fa5b947f6bf69c849d506351b369693","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.4.tgz","fileCount":16,"integrity":"sha512-3T2gvlKYw1lGpi4Mu7gPJTo3poiK9MNFZBGmDEchsMklSsnw8a87REBnUB9xCLrBEnNtWNEchlzXgF5RtF7GPA==","signatures":[{"sig":"MEUCIQDc6rAPRP4/0Qcl5TwcfI6ipiLjs0iuTT0W04h+by04MAIgefjuRPX3D3Zy1MAQbrRiOZz0yBLIN5PlIrXW8bQgEN8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12984},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"665d167896d76897c44c96aeb8cc8ddf1fe65f7a","scripts":{"build":"tsc "},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"This guide explains how to use the `wovvmap-webview-bridge` package **from the React Native side**. This package helps you send data to a WebView and listen for data coming from the WebView.","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.4_1753280378031_0.15691890431368827","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"wovvmap-webview-bridge","version":"1.0.5","_id":"wovvmap-webview-bridge@1.0.5","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"121e205f902037ca576a58f141dea643e2b4a579","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.5.tgz","fileCount":16,"integrity":"sha512-L9ThbVdMShYX22qT4LFVvKXmc0qzjvXqw9xeBsFIKS6gSSTOQ7U8paQnMvQ66SBfWLugFTawbqgqZmlIK2ZYtg==","signatures":[{"sig":"MEUCIQD6KhUxHzqHJt5XsGm4uEhTh6Juxso6iXCPa0lk65PntAIgQD+1ia7xDGC7iG1Ceu2DuLndhJro+78Q0z59UfVN7kg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15850},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"f8adf77bb4c6329a2df1096428ab7e0c09107f9a","scripts":{"build":"tsc "},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"This guide explains how to use the `wovvmap-webview-bridge` package **from the React Native side**. This package helps you send data to a WebView and listen for data coming from the WebView.","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","koshin":"^1.0.5","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.5_1755076198971_0.6965373626761253","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"wovvmap-webview-bridge","version":"1.0.6","_id":"wovvmap-webview-bridge@1.0.6","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"abfeac48ca2ecd76ac53846b1b05b9bcf84e7472","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.6.tgz","fileCount":16,"integrity":"sha512-k7y33Eu+A9Zryomd2wPS5AFhOPtTK4Sruw3ymvMC4HZ0npmB9RMTBCMVj4W2rL8hXIOjb5FWcaIpk17Zz8plsQ==","signatures":[{"sig":"MEUCIBLpj95zHQSNm9DnnX3JzvbXyLUuQ//BSah81IYkgffeAiEA4sRtNw+eNpkLYBWi3lDRsOuW4PrGSxQg4MDio0g57g4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18700},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"987801d3e17560cce8bc5dd5aee5d6d9f34f08e6","scripts":{"build":"tsc "},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A tiny bridge layer to communicate between a React Native app (using `react-native-webview`) and a web page. It provides:","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","koshin":"^1.0.5","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.6_1755078133381_0.12056120058241149","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"wovvmap-webview-bridge","version":"1.0.7","_id":"wovvmap-webview-bridge@1.0.7","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"e45d3ff95dab6c5dbc96f75561d346c16454fb1d","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.7.tgz","fileCount":16,"integrity":"sha512-KapaLVNQPGGudceDD99LLm4ZpYXKzqd+z3GP8gAUPWNBdpNcs1xLNChHHK8fFYy/sYwk2DmVp6BnKgEBpblO5g==","signatures":[{"sig":"MEUCIEE5a4vFpW/dn0rqPBi7eCG9jw/KHDoJ+7A0cIk6ueA5AiEAk5OWBkNJ1znPLReljozvtUyS4MGsHyAVLir9VLV+3ls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18706},"main":"dist/index.js","types":"dist/types/index.d.ts","gitHead":"913be4062557055ad7f44912bc57da19c2da4c26","scripts":{"build":"tsc "},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A tiny bridge layer to communicate between a React Native app (using `react-native-webview`) and a web page. It provides:","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","koshin":"^1.0.5","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.7_1755079058376_0.8950928587194253","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"wovvmap-webview-bridge","version":"1.0.8","_id":"wovvmap-webview-bridge@1.0.8","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"1c47350cf71fe7ab705a98d725299779fb15a3d0","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.8.tgz","fileCount":23,"integrity":"sha512-sNP5RPxS3Iu9354DEhCPMESAtxPLE8/vIN1XQoHtDcgYgrprw6gSW64EtHrLxZCV3Yq6n+BbrhumOGMXoT3x5w==","signatures":[{"sig":"MEUCIQDW1QB8kwtLwfgebR6sPmw71inAfkAs+B/wgnRv2OcvBQIgT0EmydnAmkugofUvTtehKZqMnIehQZiv3oFUlg0Wurs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26197},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"913be4062557055ad7f44912bc57da19c2da4c26","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A tiny bridge layer to communicate between a React Native app (using `react-native-webview`) and a web page. It provides:","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","koshin":"^1.0.5","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.8_1755079699550_0.3850266006923255","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"wovvmap-webview-bridge","version":"1.0.9","_id":"wovvmap-webview-bridge@1.0.9","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"e3b0bdf212d78c3b3379a7fa079834e29220bdd7","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.9.tgz","fileCount":29,"integrity":"sha512-+sjAHwOqTSmLOnCKR3cVZaCm4m1HTrHdZy0GP7pl1Ls84QnKquE22UzkkFltLKxplanQqRwxXl0YgQoIfHA90g==","signatures":[{"sig":"MEQCICflNdp5HDFOEzLZDjYma/HqM+iqHvuEtF9IvbTC0aTXAiBBu1S6sP3Z9qmJjtLltSwQTbGgthHv7Icosj5aUNMqww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35225},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"e3bb1a130316c2691b4093fdf92fab1ff29e737d","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.9_1759142198829_0.707613112469814","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"wovvmap-webview-bridge","version":"1.0.10","_id":"wovvmap-webview-bridge@1.0.10","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"f7f8894caa20e6cb77dedc7b279fa49286667846","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.10.tgz","fileCount":29,"integrity":"sha512-M9KW5FKkQqFAEBQiPYzzXYF+Ix8AUzg0lwGXH8Ct32X2yZKIol5WQNeUgcxj5iRE3pO7iG7yDZfTcgW5S1uymA==","signatures":[{"sig":"MEQCIEXsnkmu0d2d22XFaPOUR9YK/ta1fd5v3cU1H9EayHoBAiBOAoMczVxajzg8uHPUckcIAJ/dOUu9ug9v+xMl9/9z9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35169},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"d7c3166c13800dcdf98f11300b79aae722cafe7f","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"zustand":"^5.0.8","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.10_1759150288796_0.4850239134025809","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"wovvmap-webview-bridge","version":"1.0.11","_id":"wovvmap-webview-bridge@1.0.11","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"1764b17d80a2e9f2bdf143c4fc8da68b60e6b14e","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.11.tgz","fileCount":29,"integrity":"sha512-Yk9vAG7gol5EJQX6kX9LQonBLt2soDfJj+U92hnSZ6VGHC2Bs3LWo1s2hLyK7TT9c+02lfX+Iwze5olPYUGX4w==","signatures":[{"sig":"MEUCIEaKklyiPXRqcqmRmXvOpQP3445wZ3gvBxh88rTvgTH5AiEA47vWpwQKOUtxXjtJpNqglCztsda7fknVLHYsJtmxVxs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35278},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"d7c3166c13800dcdf98f11300b79aae722cafe7f","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.11_1759152821051_0.934161808413364","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"wovvmap-webview-bridge","version":"1.0.12","_id":"wovvmap-webview-bridge@1.0.12","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"a84f4c5132db8afa1389a54429803b8c34d64725","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.12.tgz","fileCount":23,"integrity":"sha512-cZIdA93RWNPY+teZ9SSZvMbrvZ/wOmsH6EiwUofcGntP4qHmMac/0tIC8Q8QSdndrV79TUEZ/yRFHxXBN0oacw==","signatures":[{"sig":"MEYCIQCTism92RrJ+j/oLNO8Rj9Mn6TAEze85eRP1ZeVv75ILwIhAPndKcy70sVSAE6MHdGtRnKawOgnjRsAMUVzx9VFcoWT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33400},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"28ef8da51d020fc9f98dc30e702eed5c2dcc4ac9","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.12_1761732661898_0.4074864282957993","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"wovvmap-webview-bridge","version":"1.0.13","_id":"wovvmap-webview-bridge@1.0.13","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"34ba8d725ff80f3c5dd17461411ad650e2eafa70","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.13.tgz","fileCount":23,"integrity":"sha512-6wD7qp/JREnKxHHF+dAeF1YlBY61yuQj7F+WZ0JMIBqd92PPhkR/XCb5Ife01k7619EnQvxx5fdiOdgwPbHgzA==","signatures":[{"sig":"MEUCIQCN/iAX7nrdVkfFYQ9apJGl3aanaXX7S77NXtfGYhvE4AIgMdhw31T7pviF5CS/sb3W2QmKdSicTOFC6//XqhXpaek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33498},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"28ef8da51d020fc9f98dc30e702eed5c2dcc4ac9","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.13_1761733481167_0.49760809355478597","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"wovvmap-webview-bridge","version":"1.0.14","_id":"wovvmap-webview-bridge@1.0.14","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"453a7e7e568ba9f503c35e4413e7fcc468dedb76","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.14.tgz","fileCount":23,"integrity":"sha512-gG5FWw0RYXP1lrH2GmgrD0PVarb4Ok8MhFO+d5ai8McTEnOvXNM2+LoHlkaBm4EMtF47PCFZbVb9WLg/vvuqcg==","signatures":[{"sig":"MEQCIHi9eMKKpiDCvJQ9yL4dZC3k9T5rR5uPeRpRSAIsLSnnAiAiMLwb9Lypa+d62i/zJh6fM+fNIh6Gr5yls5zHsyGinQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33564},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"6cfd83202e4fca9f0e3f99791bdfa99486151629","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.14_1761738553533_0.07497417528180428","host":"s3://npm-registry-packages-npm-production"}},"1.0.15":{"name":"wovvmap-webview-bridge","version":"1.0.15","_id":"wovvmap-webview-bridge@1.0.15","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"7adef47c31065f589cd646b016aa4a538599cc3e","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.15.tgz","fileCount":23,"integrity":"sha512-ZIgSVZHK84FwgXrpLvR2udcs1XJ4n5ogdkbeQSzs+sQ7W2XZhwncV0tW4ozy7kWF3NS2GW4+VjKdYZpEFvsHrg==","signatures":[{"sig":"MEUCIQCSgBZCD6FJ6knnURm2A2avYgh66Smgjdcf01L2iycCAgIgdU8zeY9qBvWEkk+7LWnByCYJGKGhlF5a1TuMFxAVycA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33669},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"6cfd83202e4fca9f0e3f99791bdfa99486151629","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.15_1761742547348_0.9219673694997099","host":"s3://npm-registry-packages-npm-production"}},"1.0.16":{"name":"wovvmap-webview-bridge","version":"1.0.16","_id":"wovvmap-webview-bridge@1.0.16","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"db2df8702a70dcefab4b305bf14ce6aad3134203","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.16.tgz","fileCount":23,"integrity":"sha512-Al/7z81S7s/0R36w6oAaIgyIYqp4PcEcjWEF1H1tpisbgFihbEvZ8Jw4xYE+/6qgmTOeLmyMgRvZA5mxKMQWhg==","signatures":[{"sig":"MEUCIQD8WFm80/FDhceaJtjgmNC/f2g5wW6SauxgYVZblAJO5wIgBRwAl3zQlIhxX0vzLMScYxfNk+x5r6oG40QNf/teUjc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34472},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"126501f45f96fe5b903fa305c13fadd07096ae1d","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.15.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.16_1763970008201_0.6227160222949839","host":"s3://npm-registry-packages-npm-production"}},"1.0.17":{"name":"wovvmap-webview-bridge","version":"1.0.17","_id":"wovvmap-webview-bridge@1.0.17","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"770439c8301c4124b09cbbda4e7175bd75199fa0","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.17.tgz","fileCount":23,"integrity":"sha512-hjuoW/XmeK5rKh8wXV+HSacP0+Tg26y5ojAGhNOUmDWdcHOF5hXumw3GUeEGYg8Zg1DeGb0apwZ0oJ7CzZGNEw==","signatures":[{"sig":"MEQCIEhsVLRurcaGKbTYLau4trV9J0il4+Pu6F6UcWYgGtv0AiAQ+qwIaqTR3lSlKU3NR7Ekk3P0o+Sw/pTXv/U9sNaKdw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34593},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"b1eec253c682c4f44895f9d293984c3130b7d9cb","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A lightweight and strongly typed bridge for **React Native + WebView** communication.  \r It provides an out-of-the-box `<WebViewScreen />`, helpers for sending events, a global store with Zustand, and strongly typed message contracts.","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.17_1763972978260_0.6139168671081656","host":"s3://npm-registry-packages-npm-production"}},"1.0.18":{"name":"wovvmap-webview-bridge","version":"1.0.18","_id":"wovvmap-webview-bridge@1.0.18","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"f4963f665fa51173c5e446dc738e1ff981edf7fb","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.18.tgz","fileCount":23,"integrity":"sha512-7YiSaORv2IBRHFKHV/+UISo2XdDjPYpcGv6/SVSS5pcXa/T1+VZ5LNIch6R+K6fXE0M5aNoNYznodpmbqHoYig==","signatures":[{"sig":"MEYCIQDt74NDXdBCHwp+8V1HmR01M5ZoWCxztCwaTMXzEt+PyAIhAJ4Js3WX6Vx8phrT3I9GcfwUWL/nbHQaMRTd9B7k2B1R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43751},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"9883a0fe51f7767355fd8441e4ad9482e663c666","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides: - WebViewScreen wrapper for React Native WebView - BridgeService helpers to send events to the WebView - Zustand store (useBridgeStorage) that keeps incoming state in sync - ","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.18_1767789491907_0.2778988322885809","host":"s3://npm-registry-packages-npm-production"}},"1.0.19":{"name":"wovvmap-webview-bridge","version":"1.0.19","_id":"wovvmap-webview-bridge@1.0.19","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"794267ced4b63c9041b44e17cf1557f095c411ab","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.19.tgz","fileCount":23,"integrity":"sha512-yIKwFxlLhcjo+Crn4VBYNAGeAbEzbWBLHz6qFpSfhbViDmRRktTj+yyapvk/zD6Sx9036GFJwVGNBY20WzvN1A==","signatures":[{"sig":"MEQCIAdRTL6eJvxiPY+QgeFlL7cak0gXOszr2n2xOoiCJaORAiBNL/P3wMlPlKgmqsxGnzm029rUR86DgINMPR4nmqJWQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44097},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"978f8b29df1dd44d4479741af15cf1a7034c63bb","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"10.8.2","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides:\r - WebViewScreen wrapper for React Native WebView\r - BridgeService helpers to send events to the WebView\r - Zustand store (useBridgeStorage) that keeps incoming state in sync","directories":{},"sideEffects":false,"_nodeVersion":"20.18.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.19_1767946965611_0.6613688678937775","host":"s3://npm-registry-packages-npm-production"}},"1.0.20":{"name":"wovvmap-webview-bridge","version":"1.0.20","_id":"wovvmap-webview-bridge@1.0.20","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"483bfd79f8a442e2a6d3cedfd32f51c074f53336","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.20.tgz","fileCount":23,"integrity":"sha512-UxjfhlEjU9uj0XRTSG3i2Ay/38bWwQ/M/wwwqF+htgPaNXQxFt82S0tiLfklj2GYpKEjjzPsJ8dluxIi/4HEng==","signatures":[{"sig":"MEUCIQCITCEwX9jTiPgHFLRufe7LSnlQIR+yF08uEy69fQ3AsgIgeao3swqqbDV2pNnPsSpGDAzGTFKH2IS5o8mUWLW/DBw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44097},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"4019c532fc12461f736096441d79c1a88eb25579","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"10.8.2","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides:\r - WebViewScreen wrapper for React Native WebView\r - BridgeService helpers to send events to the WebView\r - Zustand store (useBridgeStorage) that keeps incoming state in sync","directories":{},"sideEffects":false,"_nodeVersion":"20.18.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.20_1767956166696_0.5661969257365744","host":"s3://npm-registry-packages-npm-production"}},"1.0.21":{"name":"wovvmap-webview-bridge","version":"1.0.21","_id":"wovvmap-webview-bridge@1.0.21","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"bd1b017ad833813a340ecd56895516d3b7bb61b3","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.21.tgz","fileCount":23,"integrity":"sha512-qTlvewfXV+SfSkuZgxrv6BnRk2r+421nWlX6ljeOJVkFwPAmEMCZe6K+08ombTv9jRDoW2msTfR0uIwN4fgveA==","signatures":[{"sig":"MEYCIQCyqR4XpHIKtCgjPkl1/Mq2vd8ys5MQl6LGUFzXgSP9uQIhAMoaYIN/nF8A+kMTwt3JxXNr03LqZN9QhRyOIhxTHpJW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44113},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"4019c532fc12461f736096441d79c1a88eb25579","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"10.8.2","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides:\r - WebViewScreen wrapper for React Native WebView\r - BridgeService helpers to send events to the WebView\r - Zustand store (useBridgeStorage) that keeps incoming state in sync","directories":{},"sideEffects":false,"_nodeVersion":"20.18.2","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.21_1767956262130_0.2121753160780866","host":"s3://npm-registry-packages-npm-production"}},"1.0.22":{"name":"wovvmap-webview-bridge","version":"1.0.22","_id":"wovvmap-webview-bridge@1.0.22","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"5c1b9abb683a8bb86ad8cdac6eff94a366f08714","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.22.tgz","fileCount":23,"integrity":"sha512-TVox0Haypf4DxF30tP+XZJnALJtd2npJfAN/X3M1h4TA8BukF5fuTpleyjznxQFHNPduzCsqS3bAxuMC1sXnZQ==","signatures":[{"sig":"MEYCIQDx+vU2QZs6jYecDq7tTmoj64WblPAF+7FsaMuglUb39wIhAP/EGEdUsnWRkrHiQ7UPjsW6EqUvRl24xF7a6g1WZuhF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44135},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"fe7cc37ab3a96d9b128f39feb3b80a07529e3778","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides:\r - WebViewScreen wrapper for React Native WebView\r - BridgeService helpers to send events to the WebView\r - Zustand store (useBridgeStorage) that keeps incoming state in sync","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.22_1768283165977_0.08844798036892954","host":"s3://npm-registry-packages-npm-production"}},"1.0.24":{"name":"wovvmap-webview-bridge","version":"1.0.24","_id":"wovvmap-webview-bridge@1.0.24","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"3d8c534499c8f4a008f09570f2fe3a471eef5ba9","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.24.tgz","fileCount":23,"integrity":"sha512-OHIF4DxeIkqUM09s3QOmdljCPxh/7tCvTfKw7fbcbfFkFhWl4Rvf+FYdzAXeSKvyDsFMRzBNJlCfXUgsmSf/NA==","signatures":[{"sig":"MEUCIG+cHG07PzMSEnOXC+qCkJ0zGSiW/Ed/haJuyB3iUfqqAiEAklCH3vSIO8FmPtKWLlaFx+pta/MqPSxy1zT/FHCVTPg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45811},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"9545c23af237f9817cb21c224bd88897c3f85b54","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides:\r - WebViewScreen wrapper for React Native WebView\r - BridgeService helpers to send events to the WebView\r - Zustand store (useBridgeStorage) that keeps incoming state in sync","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.24_1768521042585_0.6173926495258515","host":"s3://npm-registry-packages-npm-production"}},"1.0.25":{"name":"wovvmap-webview-bridge","version":"1.0.25","_id":"wovvmap-webview-bridge@1.0.25","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"101adcfe7d9537354e09a0e2c5aad2fdf56bbcc5","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.25.tgz","fileCount":23,"integrity":"sha512-ls/9Rl1ZhBvSWLOX71cjOJ0MvJ9c5c2vVLaQ3fAKxNxTsSEdr8bisLKFcfEhqXb7wNqI6B0IYELZpsjNqS9Hxg==","signatures":[{"sig":"MEUCIA+J34GVucKWsE1ddvy9R9MNpHEQmOFsnYPBZY6wuZxoAiEA5DHkHsFfzR7WAC076diCunfsOJeufGniZShYWEwPxMQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45837},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"46e945dd9906a842299bd4121c68a930fc85f7c9","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides:\r - WebViewScreen wrapper for React Native WebView\r - BridgeService helpers to send events to the WebView\r - Zustand store (useBridgeStorage) that keeps incoming state in sync","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.25_1768796644419_0.9140141391801428","host":"s3://npm-registry-packages-npm-production"}},"1.0.26":{"name":"wovvmap-webview-bridge","version":"1.0.26","_id":"wovvmap-webview-bridge@1.0.26","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"f43b532d3c1fdfa23e95ff71101497b5135f8a06","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.26.tgz","fileCount":32,"integrity":"sha512-K83JKiSQv9U7qVC01TokdzFkfVkwqaZMsF7pNWOCMCIiStp4jtfu1bJxFCNDYGqMFkO963vvKxTLgzRzV3jN2Q==","signatures":[{"sig":"MEUCIQDOSlZk1QI6dQq+O31P40sntzhExeW420MXHviVjZjQzwIgfNKlYUZ2dmjaS9bbcq2fIBJd+TNkcphBe5sx155bGmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54578},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"df426d9dce2c5b1d94b4daaba243a5b1a4b2d8df","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.3.0","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides:\r - WebViewScreen wrapper for React Native WebView\r - BridgeService helpers to send events to the WebView\r - Zustand store (useBridgeStorage) that keeps incoming state in sync","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.26_1768805179764_0.17979782556671076","host":"s3://npm-registry-packages-npm-production"}},"1.0.27":{"name":"wovvmap-webview-bridge","version":"1.0.27","_id":"wovvmap-webview-bridge@1.0.27","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"936efd7cd1aa32b26d5344ce473d97e13cd978e8","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.27.tgz","fileCount":32,"integrity":"sha512-wpa7bajVYS8gJNQcELXxL9TE4+iDU/Zhkh6hHTCA1Y9XI3d6Cv0gnUL8eEZijR3Z9cy9LHSi9wTJxrKotxpVAg==","signatures":[{"sig":"MEYCIQD/bzqgdMYUnreoiCAGlvFLBPsHxe4hEJjhcEVGEcAHLAIhAL+z00Gnti8c/Vtc8vFuyqKVqUNq53mgAoWNjJfprZLx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54407},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"0d0d87779e43c0d570e620e3dc60eae347f10095","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"10.8.2","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides: - WebViewScreen wrapper for React Native WebView - BridgeService helpers to send events to the WebView - Zustand store (useBridgeStorage) that keeps incoming state in sync - ","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.27_1768816666823_0.8089841873639521","host":"s3://npm-registry-packages-npm-production"}},"1.0.28":{"name":"wovvmap-webview-bridge","version":"1.0.28","_id":"wovvmap-webview-bridge@1.0.28","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"28949d5b817330d7be9892dc8dbab5eb40cf9cf2","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.28.tgz","fileCount":32,"integrity":"sha512-rIrt8N+nl+th8/GEGxHZaHdJ+4U0FcjmE9tyymdVPXJ5R75ocSycD24Zk1nzLUCVI1bMhD2lFXtIAiLt7XwLlw==","signatures":[{"sig":"MEYCIQDb7eSLEtq59D/12LmZbSE82ykdAe+6A4ClwxekeixQYwIhAPGO8+NklCfOcmvQNNi1IX+YcFkZ1gZzYrVvnrcscs8S","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54494},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"1b8d62fb57a8ef168ab45b34316e61548724536a","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"10.8.2","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides: - WebViewScreen wrapper for React Native WebView - BridgeService helpers to send events to the WebView - Zustand store (useBridgeStorage) that keeps incoming state in sync - ","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.28_1770097698601_0.8929075771301076","host":"s3://npm-registry-packages-npm-production"}},"1.0.29":{"name":"wovvmap-webview-bridge","version":"1.0.29","_id":"wovvmap-webview-bridge@1.0.29","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"14db2dec0a797b1df6d94b7e89611ca8645caa55","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.29.tgz","fileCount":32,"integrity":"sha512-syo2QF2Hr0jPBZ2pAJ2K/VNnUPFZ+GFl+RtDvlfwg1yEvVCh/5WVKMtS7j8CIhKyzGFp0CQGhhH1xXA+EPatyA==","signatures":[{"sig":"MEUCIQDLiMef8YxAyJv9XHv01vnBUdVbwNpeiEvknKDEVARCWgIgaKY5j3lRvpVKu/bUPjvip++x4wDR7gDEBW67bX0m2dA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56972},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"0e5fe6ff18f1a6333660bbbc072a1bac96e06984","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"A typed bridge between React Native and a WebView for Wovvmap maps. It provides: - WebViewScreen wrapper for React Native WebView - BridgeService helpers to send events to the WebView - Zustand store (useBridgeStorage) that keeps incoming state in sync - ","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.29_1775459118268_0.2677687126069417","host":"s3://npm-registry-packages-npm-production"}},"1.0.39":{"name":"wovvmap-webview-bridge","version":"1.0.39","_id":"wovvmap-webview-bridge@1.0.39","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"6dcadc7d9cb57a28b4a119cbc3995614a0af8dd6","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.0.39.tgz","fileCount":86,"integrity":"sha512-HQ8YKo5fXTqyJ+INH3HOHJnHIEe6awkyYr5ei797dcEEdKgg4AkOaw9BWmeHhObSmz0iXM5OBpN5VdbRbdK98A==","signatures":[{"sig":"MEYCIQCb/U4UEsk+A9rYYd73xd9zjoMkpECpn/dzEaHJI92XYQIhANnJuFAtDC5MFwWYkcO4sEojCLWODnSxBG+Ir2K4J22X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147328},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"0a0cdc84115a2158c6a7c0c0adcf75dbb52e5ab8","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.0.39_1781166515462_0.5832799441104382","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"wovvmap-webview-bridge","version":"1.1.0","_id":"wovvmap-webview-bridge@1.1.0","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"9453ed213b0d0cee3319b5946a02da7fa67de6d3","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.1.0.tgz","fileCount":86,"integrity":"sha512-bmZ/hZASxx5LoNDGHPttPH0uhxAEGiAa8S6esDc8jNMebf6HJwNXxE7wrsFEdL7whJMhcj1CBTy6LJudQCj8zw==","signatures":[{"sig":"MEYCIQC38y5gEf109oStYHi8dfXNsshR2qbCcIu0ND8BELH1wQIhAPWHbrx+ZnnCn15LUP6btDAXWuIvrwTdhJqISVNCj5iN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150745},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"c474a823030935484c75f62965d17266c44d6398","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.1.0_1782109150537_0.5280356851635843","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"wovvmap-webview-bridge","version":"1.1.1","_id":"wovvmap-webview-bridge@1.1.1","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"f908c41df7b9cd9ee6817f4c7580b2e1718fc328","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.1.1.tgz","fileCount":86,"integrity":"sha512-R6IFEbZ82MN+1ydx79eujsi3OlaBAD7wZQlZ78eJy/sLw86XtHnbO59Vt9sTGRkCjioX77WiOTlsOhdcs6+XRA==","signatures":[{"sig":"MEUCIQDewCwKmSGQK0iZIvHYuLwSdJHv3FrI5qXOfZgxPCh6NAIgS+mBA/qJdLv+wCLndXQcJhUUDWomgvGWdBd8PZaYwlM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157899},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"35bb763c1d413a13af9ecf746e224fefc449ba40","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.1.1_1782195131728_0.8320454923229545","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"wovvmap-webview-bridge","version":"1.1.2","_id":"wovvmap-webview-bridge@1.1.2","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"57b2f3620cf3fd015220ee429721d6dfdb919054","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.1.2.tgz","fileCount":92,"integrity":"sha512-LggoJrkvbj12MTomGRL6FcqtPYX7mKfiB9ARVbsqpiUNVBWav+bt2PpAYoJGiAeFYznyOCIWsHvyU/ZQ/J/WeA==","signatures":[{"sig":"MEUCIQDkfWjsdoD/ZLUfFKdW6sanKNGFk78nkOlya9lUhufrVQIgXpjgRwBE+zSqi5VAk9OTqoUe+fy70c9dmXGfLoVEKTc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171139},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"5bb20ba3359948abadb404dceef3593694a63782","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.1.2_1782816109726_0.6562776196763263","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"wovvmap-webview-bridge","version":"1.1.3","_id":"wovvmap-webview-bridge@1.1.3","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"71f70c675b4a0e958719e21d834236cb9424fe9e","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.1.3.tgz","fileCount":95,"integrity":"sha512-QRz75zxKu0nD1dJjD4bbHXYTdr0BujBzetVJBQXmZpQu7opGwxZXAYUhl+/Spyhjv5ur7ruU8xX7y3qHZZBgFg==","signatures":[{"sig":"MEYCIQDnZHx1fxQA6R3LhCkA9U6c+dA2oB4Ui0/HQo5flj11rAIhAIY0RHzGwUhODETz1p+EGTweESuZxzwYVX+ZA26fGiM2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179488},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"66af8b456899b75fcc8f77a6d11d74fb14a3a12f","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.1.3_1783680093250_0.25462531810461786","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"wovvmap-webview-bridge","version":"1.1.4","_id":"wovvmap-webview-bridge@1.1.4","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"5a49a4780ac0f17e084d62ff8c0a380839912460","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.1.4.tgz","fileCount":95,"integrity":"sha512-duP0E6pQeyo1HLWk29Ws+evs4XZB82rMysnw6Wf1PS4jSswWstdtF2tb85B/EeVbm2skGpoPmH+rF70RYPpBjw==","signatures":[{"sig":"MEUCIBIo1a25dyTczSgPBC9D90f4e4cbwgrlWyBlNuiu8Q5/AiEApRLFVx0A1Ug4IYoRFe52S8rXzj8EODi9IGMaUAJ93l4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":180379},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"6ea9de355cd2e1e375f4648fc295e3c8fbc3ad93","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.1.4_1784202769108_0.30456073206474743","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"wovvmap-webview-bridge","version":"1.1.5","_id":"wovvmap-webview-bridge@1.1.5","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"76615c6002a5d7050a4a3c4c0df2e3c0053b8723","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.1.5.tgz","fileCount":95,"integrity":"sha512-Cb7nTP4kEQLwWc322ZdVg1A2NBR0ZURGUQGciH7P5/A3hQfx9vNRCDLoBIB1GnTjbMHczKkV29rth/XmHr5k9g==","signatures":[{"sig":"MEUCIQCYW5xvGXimkz69pCHU/dI/Zu1CkSMR1yJQoheQu4CBGwIgd7rJShXfjZQGCPdFJqdOj1tdrZhUgTfGHy7Pv0LuOuw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181364},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"6ea9de355cd2e1e375f4648fc295e3c8fbc3ad93","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.1.5_1784490316789_0.41896236164959255","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"wovvmap-webview-bridge","version":"1.1.6","_id":"wovvmap-webview-bridge@1.1.6","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"dist":{"shasum":"0f77144b2300c73f767b60bfaa1c63c7eb7a94ed","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.1.6.tgz","fileCount":95,"integrity":"sha512-T4W/5TS0A6psYvQiFnyfJZX1xEOcom3KkngZiUuT7W8Bv/VDb6RDv6PMfdNg/OWvpk1ZUwMDyGNlxc0GFLTlxw==","signatures":[{"sig":"MEQCIGG9ZUq1uHxsLM5ryugWBPUlsPDRaD0mUR3MR+hWGAAlAiBkbsykBY92zqEzm4P0etYzl5inirF8+HKsGEeCD9A9OA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":180980},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"gitHead":"bf8a248c0e0dfa7f32027efd40af69eb011d6c2f","scripts":{"build":"tsc -p tsconfig.json"},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"_npmVersion":"11.12.1","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/react":"^19.1.8"},"peerDependencies":{"react":"^19.1.0","zustand":"^5.0.8","react-native":"^0.80.1","react-native-webview":"^13.16.0"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wovvmap-webview-bridge_1.1.6_1784492746969_0.32996193346163327","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"wovvmap-webview-bridge","version":"1.1.7","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","browser":"./dist/web.js","default":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","default":"./dist/web.js"}},"sideEffects":false,"scripts":{"build":"tsc -p tsconfig.json"},"peerDependencies":{"react":"^19.1.0","react-native":"^0.80.1","react-native-webview":"^13.16.0","zustand":"^5.0.8"},"peerDependenciesMeta":{"react-native":{"optional":true},"react-native-webview":{"optional":true}},"devDependencies":{"@types/react":"^19.1.8","typescript":"^5.5.0"},"gitHead":"f1cb26f50484844a9237807a1c50dd4fcbcf6d41","_id":"wovvmap-webview-bridge@1.1.7","description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","_nodeVersion":"20.20.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-BYSGBCM+opZCYSUs5VOKn/e3vj54aIhf8iQQjKoQtlYB1QC3JLNwMwE2tAC7GPxej/CHTuSLaNn58VnaSwwXcA==","shasum":"de8893d8d11edc6524a97c1a06957ecc1e041d99","tarball":"https://registry.npmjs.org/wovvmap-webview-bridge/-/wovvmap-webview-bridge-1.1.7.tgz","fileCount":95,"unpackedSize":181946,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCmm0daqtGWRjy7X2NbZ3FTrOkF4MJAr3EIeRRVJZZ/lQIhAISNZBw41K6nIXJxqcF2fw3CYIxOzV+QVc/u8WArsWIS"}]},"_npmUser":{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"},"directories":{},"maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wovvmap-webview-bridge_1.1.7_1785089965385_0.4536586479490545"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-23T07:08:08.318Z","modified":"2026-07-26T18:19:25.675Z","1.0.0":"2025-07-23T07:08:08.587Z","1.0.1":"2025-07-23T07:16:18.869Z","1.0.2":"2025-07-23T07:19:52.209Z","1.0.3":"2025-07-23T14:11:32.972Z","1.0.4":"2025-07-23T14:19:38.221Z","1.0.5":"2025-08-13T09:09:59.129Z","1.0.6":"2025-08-13T09:42:13.563Z","1.0.7":"2025-08-13T09:57:38.571Z","1.0.8":"2025-08-13T10:08:19.737Z","1.0.9":"2025-09-29T10:36:39.005Z","1.0.10":"2025-09-29T12:51:28.979Z","1.0.11":"2025-09-29T13:33:41.229Z","1.0.12":"2025-10-29T10:11:02.075Z","1.0.13":"2025-10-29T10:24:41.352Z","1.0.14":"2025-10-29T11:49:13.721Z","1.0.15":"2025-10-29T12:55:47.542Z","1.0.16":"2025-11-24T07:40:08.425Z","1.0.17":"2025-11-24T08:29:38.426Z","1.0.18":"2026-01-07T12:38:12.073Z","1.0.19":"2026-01-09T08:22:45.762Z","1.0.20":"2026-01-09T10:56:06.845Z","1.0.21":"2026-01-09T10:57:42.276Z","1.0.22":"2026-01-13T05:46:06.126Z","1.0.24":"2026-01-15T23:50:42.729Z","1.0.25":"2026-01-19T04:24:04.562Z","1.0.26":"2026-01-19T06:46:19.902Z","1.0.27":"2026-01-19T09:57:46.965Z","1.0.28":"2026-02-03T05:48:18.787Z","1.0.29":"2026-04-06T07:05:18.385Z","1.0.39":"2026-06-11T08:28:35.630Z","1.1.0":"2026-06-22T06:19:10.693Z","1.1.1":"2026-06-23T06:12:11.862Z","1.1.2":"2026-06-30T10:41:49.894Z","1.1.3":"2026-07-10T10:41:33.396Z","1.1.4":"2026-07-16T11:52:49.260Z","1.1.5":"2026-07-19T19:45:16.975Z","1.1.6":"2026-07-19T20:25:47.113Z","1.1.7":"2026-07-26T18:19:25.532Z"},"description":"`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.","maintainers":[{"name":"krishnakantv1","email":"krushnkantv1@gmail.com"}],"readme":"# wovvmap-webview-bridge\n\n`wovvmap-webview-bridge` is the host-side SDK for embedding a WovvMap viewer inside a web iframe or a React Native WebView.\n\nIt gives the host app:\n\n- iframe/WebView components\n- typed bridge command services\n- synced Zustand stores for viewer data\n- event handlers for viewer interactions\n- TypeScript types for categories, stores, directions, floors, navigation, and viewer configuration\n\nThe package is designed so a host developer does not need to create bridge command services manually. UI code should call the exported `*BridgeService` classes and read state from the exported stores.\n\n## Entry Points\n\nUse the web entry point in React web apps:\n\n```ts\nimport {\n  WebIframeScreen,\n  DirectionBridgeService,\n  useCategoryStore,\n} from \"wovvmap-webview-bridge/web\";\n```\n\nUse the root entry point in React Native apps:\n\n```ts\nimport {\n  WebViewScreen,\n  DirectionBridgeService,\n  useCategoryStore,\n} from \"wovvmap-webview-bridge\";\n```\n\n## Installation\n\nFor web iframe hosts:\n\n```bash\nnpm install wovvmap-webview-bridge zustand\n```\n\nFor React Native hosts:\n\n```bash\nnpm install wovvmap-webview-bridge zustand react-native-webview\n```\n\n## Basic Web Iframe Setup\n\nThe host app owns the map id. The package does not store `mapId` because each host decides which map to open.\nThe embedded viewer URL must use `template=embedded`. If the host app has its own URL state, keep the host template separate, for example `/websdk?template=kiosk`, and pass `template=embedded` only to the iframe/WebView URL.\n\n```tsx\nimport { WebIframeScreen } from \"wovvmap-webview-bridge/web\";\n\nexport function MapHost({ mapId }: { mapId: string | null }) {\n  if (!mapId) {\n    return null;\n  }\n\n  return (\n    <WebIframeScreen\n      url={`https://viewer.example.com/viewer/${mapId}?v=v2&template=embedded`}\n      origin=\"https://viewer.example.com\"\n      onload={() => console.log(\"Viewer iframe loaded\")}\n      style={{ width: \"100%\", height: \"100%\", border: \"none\" }}\n    />\n  );\n}\n```\n\nFor local development this can look like:\n\n```tsx\n<WebIframeScreen\n  url={`http://localhost:5174/viewer/${mapId}?v=v2&template=embedded`}\n  origin=\"http://localhost:5174\"\n  style={{ width: \"100%\", height: \"100%\", border: \"none\" }}\n/>\n```\n\n## Recommended Ready Gate\n\nFor kiosk demos and production embeds, keep the host chrome hidden until the embedded viewer has sent enough state to render the real mall UI. This avoids showing placeholder titles such as \"Web SDK Demo\" before the mall name arrives.\n\n```tsx\nimport {\n  WebIframeScreen,\n  useBridgeStorage,\n  useFloorStore,\n  useNodePointStore,\n  useViewerStore,\n} from \"wovvmap-webview-bridge/web\";\n\nexport function KioskHost({ mapId }: { mapId: string }) {\n  const mallName = useViewerStore((s) => s.mallName);\n  const isMapParsed = useViewerStore((s) => s.isMapParsed);\n  const isLoading = useViewerStore((s) => s.isLoading);\n  const isBridgeLoaded = useBridgeStorage((s) => s.isBridgeLoaded);\n  const isMapLoaded = useBridgeStorage((s) => s.isMapLoaded);\n  const floorCount = useFloorStore((s) => s.floors.length);\n  const nodeCount = useNodePointStore((s) => s.searchableNodePointMap.length);\n\n  const isReady =\n    Boolean(mallName) &&\n    isBridgeLoaded &&\n    isMapLoaded &&\n    isMapParsed &&\n    !isLoading &&\n    floorCount > 0 &&\n    nodeCount > 0;\n\n  return (\n    <div className=\"host-shell\">\n      {isReady && <Header title={`Welcome to ${mallName}`} />}\n\n      <WebIframeScreen\n        url={`https://viewer.example.com/viewer/${mapId}?v=v2&template=embedded`}\n        origin=\"https://viewer.example.com\"\n      />\n\n      {isReady && <Footer />}\n      {!isReady && <LoadingOverlay />}\n    </div>\n  );\n}\n```\n\n## Demo Recording Mode\n\nThe sample web host can expose a demo URL such as:\n\n```txt\nhttp://localhost:5173/websdk?demo=1&resetDefault=1\n```\n\nRecommended demo parameters:\n\n- `demo=1`: shows labeled walkthrough cards and runs a guided feature sequence.\n- `resetDefault=1`: clears the saved default location so the default-location selection flow can be demonstrated.\n- `mapId=<id>`: optionally chooses the mall map to open.\n- `template=kiosk`: host template for the SDK wrapper.\n\nThe embedded viewer URL generated by the host must still use `template=embedded`; this parameter belongs only inside the iframe/WebView URL.\n\nSuggested video sequence:\n\n1. Web SDK channel URL and embedded viewer load.\n2. Mall-name header after real map data is ready.\n3. Default location selection.\n4. Search store results.\n5. Store detail card.\n6. Category and subcategory browsing.\n7. Amenities and offers.\n8. Origin/destination directions.\n9. `pathVisible=true` active route.\n10. Step-by-step guidance.\n11. Reverse directions / swap endpoints.\n12. Floor navigation.\n13. Zoom, 2D/3D, street/top view, and text controls.\n\n## Basic React Native Setup\n\nFor a complete beginner-friendly React Native integration walkthrough, see\n[docs/REACT_NATIVE_INTEGRATION_GUIDE.md](docs/REACT_NATIVE_INTEGRATION_GUIDE.md).\n\n```tsx\nimport { WebViewScreen } from \"wovvmap-webview-bridge\";\n\nexport function MapWebView({ mapId }: { mapId: string }) {\n  return (\n    <WebViewScreen\n      url={`https://viewer.example.com/viewer/${mapId}?v=v2&template=embedded`}\n      onload={() => console.log(\"Viewer loaded\")}\n    />\n  );\n}\n```\n\n## Optional Manual Iframe Setup\n\nUse `attachIframeBridge` when you already render your own iframe.\n\n```tsx\nimport { useEffect, useRef } from \"react\";\nimport { attachIframeBridge } from \"wovvmap-webview-bridge/web\";\n\nexport function CustomIframe({ url }: { url: string }) {\n  const iframeRef = useRef<HTMLIFrameElement>(null);\n\n  useEffect(() => {\n    if (!iframeRef.current) return;\n\n    return attachIframeBridge({\n      iframe: iframeRef.current,\n      origin: \"https://viewer.example.com\",\n      onLoad: () => console.log(\"loaded\"),\n    });\n  }, []);\n\n  return <iframe ref={iframeRef} src={url} title=\"Wovv Map\" />;\n}\n```\n\n## Recommended Import Surface\n\nMost apps should import only from `\"wovvmap-webview-bridge/web\"` or `\"wovvmap-webview-bridge\"`.\n\n```ts\nimport {\n  WebIframeScreen,\n  DirectionBridgeService,\n  SelectionBridgeService,\n  FloorBridgeService,\n  StepNavigationBridgeService,\n  ZoomBridgeService,\n  ViewerBridgeService,\n  useBridgeStorage,\n  useViewerStore,\n  useCategoryStore,\n  useSubCategoryStore,\n  useAmenityStore,\n  useNodePointStore,\n  useSelectionStore,\n  useDirectionStore,\n  useFloorStore,\n  useNavigationStore,\n  useDirectionsRouteRequestStore,\n  registerBridgeHandler,\n} from \"wovvmap-webview-bridge/web\";\n```\n\n## Exported Components\n\n### `WebIframeScreen`\n\nWeb-only component for embedding the WovvMap viewer in an iframe.\n\nProps:\n\n```ts\ntype WebIframeScreenProps = {\n  url: string;\n  origin?: string;\n  onload?: () => void;\n  title?: string;\n  style?: React.CSSProperties;\n};\n```\n\nUse this in React web apps.\n\n### `WebViewScreen`\n\nReact Native component for embedding the WovvMap viewer in `react-native-webview`.\n\nProps:\n\n```ts\ntype WebViewScreenProps = {\n  url: string;\n  onload?: () => void;\n};\n```\n\nUse this in React Native apps.\n\n### `attachIframeBridge`\n\nManual bridge attachment for custom iframe implementations.\n\n```ts\nattachIframeBridge({\n  iframe,\n  origin,\n  onLoad,\n});\n```\n\n## Command Services\n\nUse these services from host UI. They update host-side package stores when needed and send the correct bridge event to the embedded viewer.\n\n### `DirectionBridgeService`\n\nControls origin, destination, route generation, path clearing, and origin/destination swap.\n\nMethods:\n\n```ts\nDirectionBridgeService.configure(config);\nDirectionBridgeService.setDestination(nodeId, cameraAnimate, clearSelection);\nDirectionBridgeService.setOrigin(nodeId, cameraAnimate, clearSelection);\nDirectionBridgeService.clearDestination(clearQuery);\nDirectionBridgeService.clearOrigin();\nDirectionBridgeService.swapOriginDestination();\nDirectionBridgeService.generateDirectionsRoute(callbacks);\nDirectionBridgeService.clearActivePath();\n```\n\nParameters:\n\n- `nodeId`: a node key string. Multiple store locations can be joined with `\"<->\"`, for example `\"2105,1601,3<->3166,1570,3\"`.\n- `cameraAnimate`: when `true`, viewer camera animates to the point.\n- `clearSelection`: when `true`, viewer clears active category/subcategory/amenity selection.\n- `clearQuery`: when `true`, your host input adapter clears the visible input text.\n\nBasic destination example:\n\n```ts\nDirectionBridgeService.setDestination(\"2105,1601,3\", true, false);\n```\n\nBasic origin example:\n\n```ts\nDirectionBridgeService.setOrigin(\"4360,2330,5\", true, true);\n```\n\nClear destination:\n\n```ts\nDirectionBridgeService.clearDestination(true);\n```\n\nGenerate route:\n\n```ts\nDirectionBridgeService.generateDirectionsRoute({\n  onSuccess: (result) => {\n    console.log(\"Route ready\", result.navigationResult);\n  },\n  onError: (result) => {\n    console.log(\"Route failed\", result.error);\n  },\n});\n```\n\nSwap from/to:\n\n```ts\nDirectionBridgeService.swapOriginDestination();\n```\n\nClear drawn path:\n\n```ts\nDirectionBridgeService.clearActivePath();\n```\n\n#### Direction Input Adapter\n\nThe package does not own your input UI state. If your app has local \"From\" and \"To\" input text, connect it once with `configure`.\n\n```ts\nimport {\n  DirectionBridgeService,\n  SelectionBridgeService,\n  useNodePointStore,\n} from \"wovvmap-webview-bridge/web\";\nimport { useDirectionInputStore } from \"./store/useDirectionInputStore\";\n\nDirectionBridgeService.configure({\n  directionInputAdapter: {\n    setDestinationState: (query, selectedId) => {\n      useDirectionInputStore.getState().setDestinationState(query, selectedId);\n    },\n    setOriginState: (query, selectedId) => {\n      useDirectionInputStore.getState().setOriginState(query, selectedId);\n    },\n    clearDestinationState: (clearQuery) => {\n      useDirectionInputStore.getState().clearDestinationState(clearQuery);\n    },\n    clearOriginState: () => {\n      useDirectionInputStore.getState().clearOriginState();\n    },\n    setActiveDirectionField: (field) => {\n      useDirectionInputStore.getState().setActiveDirectionField(field);\n    },\n    getOriginQuery: () => useDirectionInputStore.getState().originQuery,\n    getDestinationQuery: () => useDirectionInputStore.getState().destinationQuery,\n  },\n  resolveLocationName: (nodeId) => {\n    const nodeKey = nodeId.split(\"<->\")[0];\n    const node = useNodePointStore.getState().getNodePointByKey(nodeKey);\n    return node?.assets?.locationName?.text || nodeKey;\n  },\n  onClearSelection: () => {\n    SelectionBridgeService.clearSelection();\n  },\n});\n```\n\nWhy this exists:\n\n- different companies can build different input UIs\n- the SDK still updates local input text when `setOrigin`, `setDestination`, or `swapOriginDestination` is called\n- SDK code does not import app-specific stores\n\nIf you do not configure an adapter, direction commands still work. Only local input text will not auto-update.\n\n### `SelectionBridgeService`\n\nControls category, subcategory, amenity, offers, and clear selection.\n\nMethods:\n\n```ts\nSelectionBridgeService.selectCategory(category);\nSelectionBridgeService.selectSubCategory(subCategory);\nSelectionBridgeService.selectAmenity(amenity);\nSelectionBridgeService.toggleOffers();\nSelectionBridgeService.clearSelection();\nSelectionBridgeService.syncHighlightsWithState();\n```\n\nCategory example:\n\n```tsx\nimport { SelectionBridgeService, useCategoryStore } from \"wovvmap-webview-bridge/web\";\n\nfunction CategoryButton({ code }: { code: string }) {\n  const category = useCategoryStore((s) => s.categories[code]);\n  const activeSelection = useSelectionStore((s) => s.activeSelection);\n\n  if (!category) return null;\n\n  const isActive =\n    activeSelection.type === \"Category\" &&\n    activeSelection.id === category.code.toString();\n\n  return (\n    <button\n      className={isActive ? \"active\" : \"\"}\n      onClick={() => SelectionBridgeService.selectCategory(category)}\n    >\n      {category.name}\n    </button>\n  );\n}\n```\n\nSubcategory example:\n\n```tsx\nSelectionBridgeService.selectSubCategory(subCategory);\n```\n\nAmenity example:\n\n```tsx\nSelectionBridgeService.selectAmenity(amenity);\n```\n\nAmenity selection also sets the destination with the amenity node keys:\n\n```ts\nDirectionBridgeService.setDestination(amenity.nodePointsKey.join(\"<->\"), true, false);\n```\n\nOffers button example:\n\n```tsx\nimport { SelectionBridgeService, useNodePointStore, useSelectionStore } from \"wovvmap-webview-bridge/web\";\n\nexport function OffersButton() {\n  const offersNodeMap = useNodePointStore((s) => s.offersNodeMap);\n  const isOfferSelected = useSelectionStore((s) => s.isOfferSelected);\n  const hasOffers = (offersNodeMap.all_offers?.nodePointsKey?.length ?? 0) > 0;\n\n  if (!hasOffers) return null;\n\n  return (\n    <button\n      className={isOfferSelected ? \"active\" : \"\"}\n      onClick={() => SelectionBridgeService.toggleOffers()}\n    >\n      Offers\n    </button>\n  );\n}\n```\n\nImportant selection states:\n\n- Category active: `useSelectionStore((s) => s.activeSelection.type === \"Category\")`\n- Selected category id: `useSelectionStore((s) => s.activeSelection.id)`\n- Active category object: `useSelectionStore((s) => s.activeCategory)`\n- Subcategory active: `activeSelection.type === \"SubCategory\"`\n- Amenity active: `activeSelection.type === \"Amenity\"`\n- Offers active: `useSelectionStore((s) => s.isOfferSelected)`\n\n### `FloorBridgeService`\n\nControls active floor.\n\n```ts\nFloorBridgeService.changeFloor(floorIndex, animateCamera);\n```\n\nFloor selector example:\n\n```tsx\nimport { FloorBridgeService, useFloorStore } from \"wovvmap-webview-bridge/web\";\n\nexport function FloorSelector() {\n  const floors = useFloorStore((s) => s.floors);\n  const activeFloor = useFloorStore((s) => s.activeFloor);\n\n  return (\n    <select\n      value={activeFloor ?? \"\"}\n      onChange={(event) => FloorBridgeService.changeFloor(Number(event.target.value), true)}\n    >\n      {floors.map((floor) => (\n        <option key={floor.index ?? floor.FloorNumber} value={floor.index}>\n          {floor.FloorName}\n        </option>\n      ))}\n    </select>\n  );\n}\n```\n\n### `StepNavigationBridgeService`\n\nControls current step in step-by-step navigation.\n\n```ts\nStepNavigationBridgeService.goToStep(index);\nStepNavigationBridgeService.nextStep();\nStepNavigationBridgeService.prevStep();\nStepNavigationBridgeService.finishStep();\n```\n\nStep list example:\n\n```tsx\nimport { StepNavigationBridgeService, useNavigationStore } from \"wovvmap-webview-bridge/web\";\n\nexport function StepList() {\n  const result = useNavigationStore((s) => s.navigationResult);\n  const currentStepIndex = useNavigationStore((s) => s.currentStepIndex);\n\n  if (!result) return null;\n\n  return (\n    <div>\n      {result.steps.map((step, index) => (\n        <button\n          key={step.id}\n          className={currentStepIndex === index ? \"active\" : \"\"}\n          onClick={() => StepNavigationBridgeService.goToStep(index)}\n        >\n          {step.instruction}\n        </button>\n      ))}\n    </div>\n  );\n}\n```\n\nNext/previous example:\n\n```tsx\n<button onClick={() => StepNavigationBridgeService.prevStep()}>Previous</button>\n<button onClick={() => StepNavigationBridgeService.nextStep()}>Next</button>\n<button onClick={() => StepNavigationBridgeService.finishStep()}>Finish</button>\n```\n\n### `ZoomBridgeService`\n\nControls viewer zoom.\n\n```ts\nZoomBridgeService.zoomIn();\nZoomBridgeService.zoomOut();\n```\n\nExample:\n\n```tsx\n<button onClick={() => ZoomBridgeService.zoomOut()}>Zoom Out</button>\n<button onClick={() => ZoomBridgeService.zoomIn()}>Zoom In</button>\n```\n\n### `ViewerBridgeService`\n\nControls viewer mode, camera view, and text rendering.\n\n```ts\nViewerBridgeService.setViewMode(\"2D\", true);\nViewerBridgeService.setViewMode(\"3D\", true);\nViewerBridgeService.setCameraView(\"street\");\nViewerBridgeService.setCameraView(\"sky\");\nViewerBridgeService.setTextType(\"2D\");\nViewerBridgeService.setTextType(\"3D\");\nViewerBridgeService.setShow2DIcon(true);\nViewerBridgeService.setShow2DIcon(false);\n```\n\nToolbar example:\n\n```tsx\nimport { ViewerBridgeService, useViewerStore } from \"wovvmap-webview-bridge/web\";\n\nexport function ViewerToolbar() {\n  const viewMode = useViewerStore((s) => s.viewMode);\n  const cameraView = useViewerStore((s) => s.cameraView);\n  const textType = useViewerStore((s) => s.textType);\n  const show2DIcon = useViewerStore((s) => s.show2DIcon);\n\n  return (\n    <div>\n      <button\n        className={viewMode === \"2D\" ? \"active\" : \"\"}\n        onClick={() => ViewerBridgeService.setViewMode(\"2D\", true)}\n      >\n        2D View\n      </button>\n      <button\n        className={viewMode === \"3D\" ? \"active\" : \"\"}\n        onClick={() => ViewerBridgeService.setViewMode(\"3D\", true)}\n      >\n        3D View\n      </button>\n      <button\n        className={cameraView === \"street\" ? \"active\" : \"\"}\n        onClick={() => ViewerBridgeService.setCameraView(\"street\")}\n      >\n        Street\n      </button>\n      <button\n        className={cameraView === \"sky\" ? \"active\" : \"\"}\n        onClick={() => ViewerBridgeService.setCameraView(\"sky\")}\n      >\n        Sky\n      </button>\n      <button\n        className={textType === \"2D\" ? \"active\" : \"\"}\n        onClick={() => ViewerBridgeService.setTextType(\"2D\")}\n      >\n        2D Text\n      </button>\n      <button\n        className={textType === \"3D\" ? \"active\" : \"\"}\n        onClick={() => ViewerBridgeService.setTextType(\"3D\")}\n      >\n        3D Text\n      </button>\n      <button\n        className={show2DIcon ? \"active\" : \"\"}\n        onClick={() => ViewerBridgeService.setShow2DIcon(!show2DIcon)}\n      >\n        2D Icon\n      </button>\n    </div>\n  );\n}\n```\n\n### `BridgeService`\n\nLow-level event sender. Use command services above for normal UI code.\n\nAvailable low-level methods:\n\n```ts\nBridgeService.setViewerConfig(config);\nBridgeService.setDestination(nodeId, cameraAnimate, clearSelection);\nBridgeService.clearDestination();\nBridgeService.setOrigin(nodeId, cameraAnimate, clearSelection);\nBridgeService.clearOrigin();\nBridgeService.swapOriginDestination();\nBridgeService.setActiveSelection(type, code);\nBridgeService.clearActiveSelection();\nBridgeService.setOfferSelected(isSelected);\nBridgeService.generateDirectionsRoute(callbacks);\nBridgeService.clearActivePath();\nBridgeService.changeFloor(floorIndex, animateCamera);\nBridgeService.goToStep(index);\nBridgeService.nextStep();\nBridgeService.prevStep();\nBridgeService.finishStep();\nBridgeService.zoomIn();\nBridgeService.zoomOut();\nBridgeService.setViewMode(viewMode, animate);\nBridgeService.setCameraView(cameraView);\nBridgeService.setTextType(textType);\nBridgeService.setShow2DIcon(show2DIcon);\n```\n\n## Synced Stores\n\nAll stores are Zustand stores. Use them directly in React components.\n\n### `useBridgeStorage`\n\nBridge and tenant state.\n\nFields:\n\n- `isMapLoaded`: viewer sent map loaded state\n- `isBridgeLoaded`: bridge connection event received\n- `imageBaseUrl`: base URL for category, subcategory, amenity, and store images\n\nExample:\n\n```tsx\nconst isReady = useBridgeStorage((s) => s.isBridgeLoaded && s.isMapLoaded);\nconst imageBaseUrl = useBridgeStorage((s) => s.imageBaseUrl);\n```\n\n### `useViewerStore`\n\nViewer configuration and loading state.\n\nFields:\n\n- `mallName`: mall name from the embedded viewer, or `null` before map data is ready\n- `apiVersion`: viewer API version, for example `\"v2\"`\n- `viewMode`: `\"2D\"` or `\"3D\"`\n- `cameraView`: `\"street\"` or `\"sky\"`\n- `textType`: `\"2D\"` or `\"3D\"`\n- `show2DIcon`: boolean\n- `isMapParsed`: true after viewer parsed map data\n- `isLoading`: viewer loading flag\n\nExample:\n\n```tsx\nconst mallName = useViewerStore((s) => s.mallName);\nconst viewMode = useViewerStore((s) => s.viewMode);\nconst cameraView = useViewerStore((s) => s.cameraView);\n```\n\n### `useCategoryStore`\n\nCategory catalog.\n\nFields:\n\n- `categories`: `Record<string, Category>`\n\nExample:\n\n```tsx\nconst categories = useCategoryStore((s) => Object.values(s.categories));\n```\n\nCategory active state:\n\n```tsx\nconst activeSelection = useSelectionStore((s) => s.activeSelection);\nconst isActiveCategory =\n  activeSelection.type === \"Category\" &&\n  activeSelection.id === category.code.toString();\n```\n\n### `useSubCategoryStore`\n\nSubcategory catalog.\n\nFields:\n\n- `subCategories`: `Record<string, SubCategory>`\n\nExample:\n\n```tsx\nconst subCategories = useSubCategoryStore((s) => Object.values(s.subCategories));\n```\n\nSubcategory active state:\n\n```tsx\nconst isActiveSubCategory =\n  activeSelection.type === \"SubCategory\" &&\n  activeSelection.id === subCategory.code.toString();\n```\n\n### `useAmenityStore`\n\nAmenity catalog.\n\nFields:\n\n- `amenities`: `Record<string, Amenity>`\n\nExample:\n\n```tsx\nconst amenities = useAmenityStore((s) => Object.values(s.amenities));\n```\n\nAmenity active state:\n\n```tsx\nconst isActiveAmenity =\n  activeSelection.type === \"Amenity\" &&\n  activeSelection.id === amenity.id.toString();\n```\n\n### `useNodePointStore`\n\nSearchable stores/locations and node maps.\n\nFields:\n\n- `searchableNodePointMap`: `NodePoint[]`\n- `locationGroupedNodeMap`: `Record<string, string[]>`\n- `keyNodeMap`: `Record<string, NodePoint>`\n- `offersNodeMap`: `OffersNodeMap`\n\nActions/helpers:\n\n- `getNodePointByKey(key)`\n- `clearSearchableNodePoints()`\n\nExample: search source data:\n\n```tsx\nconst nodePoints = useNodePointStore((s) => s.searchableNodePointMap);\n```\n\nExample: get store name:\n\n```ts\nconst node = useNodePointStore.getState().getNodePointByKey(nodeKey);\nconst name = node?.assets?.locationName?.text || node?.key || \"\";\n```\n\nExample: group multi-location store:\n\n```ts\nconst groupKeys = useNodePointStore.getState().locationGroupedNodeMap[\"Aldo\"] || [];\nDirectionBridgeService.setDestination(groupKeys.join(\"<->\"), true, false);\n```\n\nExample: offers data:\n\n```tsx\nconst allOffers = useNodePointStore((s) => s.offersNodeMap.all_offers);\nconst hasOffers = (allOffers?.nodePointsKey?.length ?? 0) > 0;\n```\n\nExample: get currently filtered stores for category, subcategory, amenity, or offers:\n\n```tsx\nimport { templateFilterService } from \"wovvmap-webview-bridge/web\";\n\nconst { title, nodePoints, nodePointsKey } = templateFilterService.getFilteredStores();\n```\n\nUse this helper for generic store panels so each host app does not need to recreate category/subcategory/amenity/offers filtering logic.\n\n### `useSelectionStore`\n\nActive category/subcategory/amenity and offers state.\n\nFields:\n\n- `activeSelection`: `{ type: \"Category\" | \"SubCategory\" | \"Amenity\" | null; id: string | null }`\n- `activeCategory`: `Category | null`\n- `isOfferSelected`: boolean\n\nExamples:\n\n```tsx\nconst activeSelection = useSelectionStore((s) => s.activeSelection);\nconst activeCategory = useSelectionStore((s) => s.activeCategory);\nconst isOfferSelected = useSelectionStore((s) => s.isOfferSelected);\n```\n\nOffer button active:\n\n```tsx\nconst isActive = useSelectionStore((s) => s.isOfferSelected);\n```\n\nCategory tab active:\n\n```tsx\nconst isActive =\n  activeSelection.type === \"Category\" &&\n  activeSelection.id === category.code.toString();\n```\n\nSubcategory tab active:\n\n```tsx\nconst isActive =\n  activeSelection.type === \"SubCategory\" &&\n  activeSelection.id === subCategory.code.toString();\n```\n\nAmenity active:\n\n```tsx\nconst isActive =\n  activeSelection.type === \"Amenity\" &&\n  activeSelection.id === amenity.id.toString();\n```\n\n### `useDirectionStore`\n\nOrigin/destination and pathfinding state mirrored from the viewer.\n\nFields:\n\n- `selectedOriginPointId`: selected start node id or joined node ids\n- `selectedDestinationPointId`: selected end node id or joined node ids\n- `pathfindingError`: route error string or `null`\n- `routingPreferences`: `{ elevator?: boolean; escalator?: boolean; stair?: boolean }`\n\nExamples:\n\n```tsx\nconst origin = useDirectionStore((s) => s.selectedOriginPointId);\nconst destination = useDirectionStore((s) => s.selectedDestinationPointId);\nconst pathfindingError = useDirectionStore((s) => s.pathfindingError);\nconst routingPreferences = useDirectionStore((s) => s.routingPreferences);\n```\n\nShow route error:\n\n```tsx\n{pathfindingError && <div>No Routes Available: {pathfindingError}</div>}\n```\n\nEnable get directions button:\n\n```tsx\nconst canGenerateRoute = Boolean(origin && destination);\n```\n\nUpdate routing preference from host:\n\n```tsx\nuseDirectionStore.getState().setRoutingPreferences({\n  elevator: true,\n  escalator: false,\n});\n```\n\n### `useDirectionsRouteRequestStore`\n\nRequest state for `DirectionBridgeService.generateDirectionsRoute`.\n\nFields:\n\n- `status`: `\"idle\" | \"loading\" | \"success\" | \"error\"`\n- `result`: `DirectionsRouteResult | null`\n- `error`: string or `null`\n- `isLoading`: boolean\n\nExample:\n\n```tsx\nconst routeRequest = useDirectionsRouteRequestStore();\n\nif (routeRequest.isLoading) {\n  return <div>Generating route...</div>;\n}\n\nif (routeRequest.status === \"error\") {\n  return <div>{routeRequest.error}</div>;\n}\n```\n\nGenerate a route and optionally auto-start route playback after the viewer centers the path:\n\n```tsx\nDirectionBridgeService.generateDirectionsRoute({\n  autoStartSimulation: true,\n  onSuccess: () => {\n    // Keep the directions panel open and show route playback controls.\n  },\n  onError: (result) => {\n    console.log(result.error);\n  },\n});\n```\n\n### `useFloorStore`\n\nFloor list and current floor.\n\nFields:\n\n- `floors`: `FloorImage[]`\n- `activeFloor`: number or `null`\n\nExample:\n\n```tsx\nconst floors = useFloorStore((s) => s.floors);\nconst activeFloor = useFloorStore((s) => s.activeFloor);\n```\n\n### `useNavigationStore`\n\nStep-by-step navigation state.\n\nFields:\n\n- `activePath`: `NodePoint[] | null`\n- `navigationResult`: `NavigationResult | null`\n- `simulationMode`: `\"none\" | \"full\" | \"current\"`\n- `simulationSpeed`: number\n- `simulationProgress`: number from `0` to `1`\n- `simulationCompleted`: boolean\n- `autoSimulationEnabled`: boolean\n- `autoSimulationCountdown`: number or `null`\n- `currentStepIndex`: number\n\nExample:\n\n```tsx\nconst navigationResult = useNavigationStore((s) => s.navigationResult);\nconst simulationProgress = useNavigationStore((s) => s.simulationProgress);\nconst autoSimulationCountdown = useNavigationStore((s) => s.autoSimulationCountdown);\nconst currentStepIndex = useNavigationStore((s) => s.currentStepIndex);\n```\n\nPlayback controls:\n\n```tsx\nDirectionBridgeService.setSimulationMode(\"full\"); // play\nDirectionBridgeService.setSimulationMode(\"none\"); // stop/pause\nDirectionBridgeService.setSimulationSpeed(2);\nDirectionBridgeService.setAutoSimulationEnabled(false);\n```\n\n### Route QR / Deep Link URL\n\nThe SDK does not hardcode a QR target URL. It exposes route state and a helper to build the final URL from the host application's URL rules.\n\n```tsx\nimport { RouteQrService } from \"wovvmap-webview-bridge/web\";\n\nconst qrUrl = RouteQrService.buildRouteQrUrl({\n  baseUrl: \"https://map-wovvmapkiosk.wovvtech.site\",\n  mapId: \"87954445085211\",\n  template: \"mobile\",\n  extraParams: {\n    source: \"kiosk\",\n  },\n});\n```\n\nThe generated URL includes current route state when available:\n\n- `v`\n- `mode`\n- `template`\n- `origin`\n- `destination`\n- `pathVisible=true`\n- `floor`\n\nFor another client or native app, keep the same SDK state but change the URL builder:\n\n```tsx\nconst routeState = RouteQrService.getRouteQrState({ mapId });\nconst deepLink = clientBuildDeepLink(routeState);\n```\n\nQR rendering is intentionally not bundled into the core SDK. Use the host app's QR library/design for web or native. This keeps the SDK lightweight and avoids CSS/Tailwind/version coupling.\n\nStep data:\n\n```tsx\nnavigationResult?.steps.map((step) => (\n  <div key={step.id}>\n    {step.instruction} - {step.distanceText}\n  </div>\n));\n```\n\n## Viewer Click Events\n\nUse `registerBridgeHandler` for viewer interaction events that should trigger host UI behavior.\n\nCurrently supported handler:\n\n- `isShapeClick`: fires when a map shape/store is clicked in the viewer. Value is the clicked node id.\n\nExample:\n\n```tsx\nimport { registerBridgeHandler } from \"wovvmap-webview-bridge/web\";\n\nuseEffect(() => {\n  registerBridgeHandler(\"isShapeClick\", (message) => {\n    console.log(\"Clicked node id\", message.value);\n    openStoreDetail(message.value);\n  });\n}, []);\n```\n\n## Full Kiosk Host Example\n\nThis example shows the main pieces together.\n\n```tsx\nimport { useEffect, useRef } from \"react\";\nimport {\n  WebIframeScreen,\n  DirectionBridgeService,\n  SelectionBridgeService,\n  ViewerBridgeService,\n  ZoomBridgeService,\n  useCategoryStore,\n  useDirectionStore,\n  useNodePointStore,\n  registerBridgeHandler,\n} from \"wovvmap-webview-bridge/web\";\nimport { useDirectionInputStore } from \"./useDirectionInputStore\";\n\nexport function KioskMap({ mapId }: { mapId: string | null }) {\n  const categories = useCategoryStore((s) => Object.values(s.categories));\n  const origin = useDirectionStore((s) => s.selectedOriginPointId);\n  const destination = useDirectionStore((s) => s.selectedDestinationPointId);\n  const configuredRef = useRef(false);\n\n  useEffect(() => {\n    if (configuredRef.current) return;\n    configuredRef.current = true;\n\n    DirectionBridgeService.configure({\n      directionInputAdapter: {\n        setDestinationState: (query, selectedId) =>\n          useDirectionInputStore.getState().setDestinationState(query, selectedId),\n        setOriginState: (query, selectedId) =>\n          useDirectionInputStore.getState().setOriginState(query, selectedId),\n        clearDestinationState: (clearQuery) =>\n          useDirectionInputStore.getState().clearDestinationState(clearQuery),\n        clearOriginState: () =>\n          useDirectionInputStore.getState().clearOriginState(),\n        setActiveDirectionField: (field) =>\n          useDirectionInputStore.getState().setActiveDirectionField(field),\n        getOriginQuery: () => useDirectionInputStore.getState().originQuery,\n        getDestinationQuery: () => useDirectionInputStore.getState().destinationQuery,\n      },\n      resolveLocationName: (nodeId) => {\n        const nodeKey = nodeId.split(\"<->\")[0];\n        const node = useNodePointStore.getState().getNodePointByKey(nodeKey);\n        return node?.assets?.locationName?.text || nodeKey;\n      },\n      onClearSelection: () => SelectionBridgeService.clearSelection(),\n    });\n  }, []);\n\n  useEffect(() => {\n    registerBridgeHandler(\"isShapeClick\", (message) => {\n      DirectionBridgeService.setDestination(message.value, true, false);\n    });\n  }, []);\n\n  if (!mapId) return null;\n\n  return (\n    <div>\n      <WebIframeScreen\n        url={`https://viewer.example.com/viewer/${mapId}?v=v2&template=embedded`}\n        origin=\"https://viewer.example.com\"\n      />\n\n      <div>\n        {categories.map((category) => (\n          <button\n            key={category.code}\n            onClick={() => SelectionBridgeService.selectCategory(category)}\n          >\n            {category.name}\n          </button>\n        ))}\n      </div>\n\n      <button onClick={() => ViewerBridgeService.setViewMode(\"2D\", true)}>\n        2D View\n      </button>\n      <button onClick={() => ViewerBridgeService.setViewMode(\"3D\", true)}>\n        3D View\n      </button>\n      <button onClick={() => ZoomBridgeService.zoomOut()}>Zoom Out</button>\n      <button onClick={() => ZoomBridgeService.zoomIn()}>Zoom In</button>\n\n      <button\n        disabled={!origin || !destination}\n        onClick={() =>\n          DirectionBridgeService.generateDirectionsRoute({\n            onSuccess: () => console.log(\"route ready\"),\n          })\n        }\n      >\n        Get Directions\n      </button>\n    </div>\n  );\n}\n```\n\n## Data Flow\n\n1. Host renders `WebIframeScreen` or `WebViewScreen`.\n2. Viewer initializes and sends grouped state events.\n3. Package handlers apply those events into Zustand stores.\n4. Host UI reads stores and renders categories, amenities, floors, offers, directions, and navigation.\n5. Host UI calls `*BridgeService` methods.\n6. Package sends typed bridge event to viewer.\n7. Viewer updates its internal state/scene and sends fresh grouped state back.\n\n## Incoming Viewer Events\n\nThese are sent by the viewer to the host package and applied into stores automatically.\n\n| Key | Store updated | Value |\n| --- | --- | --- |\n| `bridgeState` | `useBridgeStorage.isMapLoaded` | `{ isMapLoaded: boolean }` |\n| `isConnection` | `useBridgeStorage.isBridgeLoaded` | `boolean` |\n| `tenantState` | `useBridgeStorage.imageBaseUrl` | `{ imageBaseUrl }` |\n| `viewerState` | `useViewerStore` | mallName, API version, view mode, camera/text settings, parsed/loading state |\n| `catalogState` | `useCategoryStore`, `useSubCategoryStore`, `useAmenityStore` | categories, subCategories, amenities |\n| `floorState` | `useFloorStore` | activeFloor, floors |\n| `nodePointState` | `useNodePointStore` | searchableNodePointMap, locationGroupedNodeMap, keyNodeMap, offersNodeMap |\n| `selectionState` | `useSelectionStore` | activeSelection, activeCategory, isOfferSelected |\n| `directionState` | `useDirectionStore` | selectedOriginPointId, selectedDestinationPointId, pathfindingError, routingPreferences |\n| `navigationState` | `useNavigationStore` | activePath, navigationResult, simulationMode, simulationSpeed, simulationProgress, simulationCompleted, autoSimulationEnabled, autoSimulationCountdown, currentStepIndex |\n| `directionsRouteResult` | `useDirectionsRouteRequestStore` | status, navigationResult, error |\n| `isShapeClick` | event handler | clicked node id |\n\n## Outgoing Host Commands\n\nThese are sent by command services to the viewer.\n\n| Service | Message key |\n| --- | --- |\n| `DirectionBridgeService.setDestination` | `setDestination` |\n| `DirectionBridgeService.clearDestination` | `clearDestination` |\n| `DirectionBridgeService.setOrigin` | `setOrigin` |\n| `DirectionBridgeService.clearOrigin` | `clearOrigin` |\n| `DirectionBridgeService.swapOriginDestination` | `swapOriginDestination` |\n| `DirectionBridgeService.generateDirectionsRoute` | `generateDirectionsRoute` |\n| `DirectionBridgeService.clearActivePath` | `clearActivePath` |\n| `DirectionBridgeService.setSimulationMode` | `setSimulationMode` |\n| `DirectionBridgeService.setSimulationSpeed` | `setSimulationSpeed` |\n| `DirectionBridgeService.setAutoSimulationEnabled` | `setAutoSimulationEnabled` |\n| `RouteQrService.buildRouteQrUrl` | local helper, no bridge message |\n| `SelectionBridgeService.selectCategory` | `setActiveSelection` |\n| `SelectionBridgeService.selectSubCategory` | `setActiveSelection` |\n| `SelectionBridgeService.selectAmenity` | `setActiveSelection` plus destination |\n| `SelectionBridgeService.toggleOffers` | `setOfferSelected` |\n| `SelectionBridgeService.clearSelection` | `clearActiveSelection` and `setOfferSelected(false)` |\n| `FloorBridgeService.changeFloor` | `changeFloor` |\n| `StepNavigationBridgeService.goToStep` | `goToStep` |\n| `StepNavigationBridgeService.nextStep` | `nextStep` |\n| `StepNavigationBridgeService.prevStep` | `prevStep` |\n| `StepNavigationBridgeService.finishStep` | `finishStep` |\n| `ZoomBridgeService.zoomIn` | `zoomIn` |\n| `ZoomBridgeService.zoomOut` | `zoomOut` |\n| `ViewerBridgeService.setViewMode` | `setViewMode` |\n| `ViewerBridgeService.setCameraView` | `setCameraView` |\n| `ViewerBridgeService.setTextType` | `setTextType` |\n| `ViewerBridgeService.setShow2DIcon` | `setShow2DIcon` |\n\n## Type Exports\n\nThe package exports these core types:\n\n```ts\ntype IncomingMessage;\ntype OutgoingMessage;\ntype NodePoint;\ntype FloorImage;\ntype Amenity;\ntype Category;\ntype SubCategory;\ntype ViewerBridgeState;\ntype ViewMode;\ntype CameraView;\ntype TextType;\ntype NavigationBridgeState;\ntype DirectionsRouteResult;\ntype NavigationResult;\ntype NavigationStep;\ntype NavigationSummary;\ntype SimulationMode;\ntype DirectionBridgeServiceConfig;\ntype DirectionInputAdapter;\ntype ViewerConfig;\n```\n\n## Important Type Shapes\n\n### `Category`\n\n```ts\ntype Category = {\n  code: string | number;\n  name: string;\n  image?: string;\n  subCategoryCodes: string[] | number[];\n  nodePointsKey?: string[];\n  nodePoints?: NodePoint[];\n};\n```\n\n### `SubCategory`\n\n```ts\ntype SubCategory = {\n  code: string | number;\n  name: string;\n  image?: string;\n  description?: string;\n  categoryCode: string | number;\n  nodePointsKey?: string[];\n  nodePoints?: NodePoint[];\n};\n```\n\n### `Amenity`\n\n```ts\ntype Amenity = {\n  id: string | number;\n  status: number;\n  fieldCode: string | number;\n  name: string;\n  image: string;\n  wayfinding_id?: string | number | null;\n  nodePointsKey?: string[];\n  nodePoints?: NodePoint[];\n};\n```\n\n### `NodePoint`\n\nImportant fields:\n\n```ts\ntype NodePoint = {\n  key: string;\n  floorIndex: number;\n  floorName: string;\n  assets: {\n    locationName: { text: string } | null;\n    pointImages: unknown | null;\n    logo: string | null;\n    brandLogo: string | null;\n    brandImages: string[];\n  };\n  categoryCode?: string | number;\n  subCategoryCode?: string | number;\n  offers: NodePointOffer[];\n  up: boolean;\n  down: boolean;\n};\n```\n\n### `DirectionsRouteResult`\n\n```ts\ntype DirectionsRouteResult = {\n  status: \"success\" | \"error\";\n  navigationResult: NavigationResult | null;\n  error: string | null;\n};\n```\n\n### `NavigationStep`\n\n```ts\ntype NavigationStep = {\n  id: string;\n  instruction: string;\n  action:\n    | \"straight\"\n    | \"turn_left\"\n    | \"turn_right\"\n    | \"take_elevator\"\n    | \"take_escalator\"\n    | \"take_elevator_up\"\n    | \"take_elevator_down\"\n    | \"take_escalator_up\"\n    | \"take_escalator_down\"\n    | \"exit_elevator\"\n    | \"exit_escalator\"\n    | \"start\"\n    | \"arrive\";\n  distanceText: string;\n  timeText: string;\n  floorIndex: number;\n};\n```\n\n## Common UI Recipes\n\n### Category Footer\n\n```tsx\nconst categories = useCategoryStore((s) => Object.values(s.categories));\nconst activeSelection = useSelectionStore((s) => s.activeSelection);\n\nreturn categories.map((category) => {\n  const active =\n    activeSelection.type === \"Category\" &&\n    activeSelection.id === category.code.toString();\n\n  return (\n    <button\n      key={category.code}\n      className={active ? \"active\" : \"\"}\n      onClick={() => SelectionBridgeService.selectCategory(category)}\n    >\n      {category.name}\n    </button>\n  );\n});\n```\n\n### Subcategory Footer\n\n```tsx\nconst subCategories = useSubCategoryStore((s) => Object.values(s.subCategories));\nconst activeCategory = useSelectionStore((s) => s.activeCategory);\nconst activeSelection = useSelectionStore((s) => s.activeSelection);\n\nconst visibleSubCategories = subCategories.filter((subCategory) =>\n  activeCategory?.subCategoryCodes.includes(subCategory.code)\n);\n\nreturn visibleSubCategories.map((subCategory) => {\n  const active =\n    activeSelection.type === \"SubCategory\" &&\n    activeSelection.id === subCategory.code.toString();\n\n  return (\n    <button\n      key={subCategory.code}\n      className={active ? \"active\" : \"\"}\n      onClick={() => SelectionBridgeService.selectSubCategory(subCategory)}\n    >\n      {subCategory.name}\n    </button>\n  );\n});\n```\n\n### Amenity List\n\n```tsx\nconst amenities = useAmenityStore((s) => Object.values(s.amenities));\nconst activeSelection = useSelectionStore((s) => s.activeSelection);\n\nreturn amenities.map((amenity) => {\n  const active =\n    activeSelection.type === \"Amenity\" &&\n    activeSelection.id === amenity.id.toString();\n\n  return (\n    <button\n      key={amenity.id}\n      className={active ? \"active\" : \"\"}\n      onClick={() => SelectionBridgeService.selectAmenity(amenity)}\n    >\n      {amenity.name}\n    </button>\n  );\n});\n```\n\n### Filtered Category, Amenity, and Offers Store Panel\n\nUse `templateFilterService` when the UI needs the current list of stores for the active selection.\n\n```tsx\nimport { templateFilterService } from \"wovvmap-webview-bridge/web\";\n\nconst { title, nodePoints, nodePointsKey } = templateFilterService.getFilteredStores();\n```\n\nIt handles:\n\n- selected category\n- selected subcategory\n- selected amenity\n- all offers\n- category with offers enabled\n- subcategory with offers enabled\n\nFor React Native, import from the root package:\n\n```tsx\nimport { templateFilterService } from \"wovvmap-webview-bridge\";\n```\n\n### Store Search Selection\n\n```tsx\nfunction selectStore(nodeKey: string, field: \"from\" | \"to\") {\n  const group = useNodePointStore.getState().locationGroupedNodeMap[nodeKey] || [nodeKey];\n  const joinedNodeIds = group.join(\"<->\");\n\n  if (field === \"from\") {\n    DirectionBridgeService.setOrigin(joinedNodeIds, true, false);\n  } else {\n    DirectionBridgeService.setDestination(joinedNodeIds, true, false);\n  }\n}\n```\n\n### Default Location\n\nDefault location should stay in the host app because only the host knows the map id and user preference.\n\n```tsx\nconst defaultLocationKey = getDefaultLocationForMap(mapId);\n\nif (defaultLocationKey) {\n  DirectionBridgeService.setOrigin(defaultLocationKey, false, false);\n}\n```\n\nTo show default location badge:\n\n```tsx\nconst isDefaultLocation = selectedOriginPointId === defaultLocationKey;\n```\n\n### Get Directions Button\n\n```tsx\nconst origin = useDirectionStore((s) => s.selectedOriginPointId);\nconst destination = useDirectionStore((s) => s.selectedDestinationPointId);\nconst isLoading = useDirectionsRouteRequestStore((s) => s.isLoading);\n\nreturn (\n  <button\n    disabled={!origin || !destination || isLoading}\n    onClick={() =>\n      DirectionBridgeService.generateDirectionsRoute({\n        onSuccess: () => navigateToStepByStep(),\n      })\n    }\n  >\n    {isLoading ? \"Loading...\" : \"Get Directions\"}\n  </button>\n);\n```\n\n### Pathfinding Error\n\n```tsx\nconst pathfindingError = useDirectionStore((s) => s.pathfindingError);\n\nreturn pathfindingError ? (\n  <div>\n    <strong>No Routes Available</strong>\n    <span>{pathfindingError}</span>\n  </div>\n) : null;\n```\n\n### Step-by-Step Panel\n\n```tsx\nconst navigationResult = useNavigationStore((s) => s.navigationResult);\n\nif (!navigationResult) return null;\n\nreturn (\n  <div>\n    <h3>Total Distance {navigationResult.summary.totalDistance}</h3>\n    <p>Arrive in {navigationResult.summary.totalApproxTime}</p>\n    {navigationResult.steps.map((step, index) => (\n      <button key={step.id} onClick={() => StepNavigationBridgeService.goToStep(index)}>\n        {step.instruction}\n      </button>\n    ))}\n  </div>\n);\n```\n\n## Image URLs\n\nImage base URL comes from tenant state:\n\n```tsx\nconst imageBaseUrl = useBridgeStorage((s) => s.imageBaseUrl);\n```\n\nCategory image:\n\n```tsx\nconst src = category.image && imageBaseUrl ? `${imageBaseUrl}${category.image}` : \"\";\n```\n\nAmenity image:\n\n```tsx\nconst src = amenity.image && imageBaseUrl ? `${imageBaseUrl}${amenity.image}` : \"\";\n```\n\n## What Should Stay In Host App\n\nKeep these in the host app:\n\n- `mapId`\n- default location per map id\n- local direction input query store if your UI has text inputs\n- host-specific flow history\n- custom UI layout\n- business-specific filtering that is not part of bridge protocol\n\nUse the package for:\n\n- iframe/WebView bridge setup\n- reading viewer-synced stores\n- sending viewer commands\n- route result lifecycle\n- selection/offers/floor/zoom/viewer controls\n\n## Troubleshooting\n\n### Stores are empty after refresh\n\nCheck:\n\n- iframe/WebView URL is correct\n- viewer is using embedded template and initializes bridge after map parse\n- `useBridgeStorage((s) => s.isBridgeLoaded)` becomes `true`\n- `useBridgeStorage((s) => s.isMapLoaded)` becomes `true`\n- host is not rendering UI before `mapId` exists\n\n### Category or amenity images do not show\n\nUse `imageBaseUrl` from `useBridgeStorage`.\n\nCorrect:\n\n```tsx\nconst src = imageBaseUrl && item.image ? `${imageBaseUrl}${item.image}` : \"\";\n```\n\nWrong:\n\n```tsx\nconst src = imageBaseUrl || \"\" + item.image;\n```\n\nThe wrong version returns only `imageBaseUrl` when it exists.\n\n### Direction input text is not updating\n\nCall `DirectionBridgeService.configure` and provide `directionInputAdapter`.\n\nWithout adapter:\n\n- bridge command still works\n- viewer origin/destination still changes\n- local input text does not change automatically\n\n### Route success needs UI navigation\n\nUse `generateDirectionsRoute` callbacks or `useDirectionsRouteRequestStore`.\n\n```ts\nDirectionBridgeService.generateDirectionsRoute({\n  onSuccess: () => navigateToStepByStep(),\n  onError: (result) => showError(result.error),\n});\n```\n\n### Offers button active state\n\nUse:\n\n```tsx\nconst isOfferSelected = useSelectionStore((s) => s.isOfferSelected);\n```\n\nDo not infer offer active state from category/subcategory.\n\n### Category active state\n\nUse:\n\n```tsx\nconst activeSelection = useSelectionStore((s) => s.activeSelection);\nconst isActive =\n  activeSelection.type === \"Category\" &&\n  activeSelection.id === category.code.toString();\n```\n\n### Subcategory unselect should keep category visible\n\nKeep `activeCategory` from `useSelectionStore`.\n\n```tsx\nconst activeCategory = useSelectionStore((s) => s.activeCategory);\n```\n\nUse `activeCategory` to render subcategory list, not only `activeSelection`.\n\n### Text/view controls click but do not change\n\nMake sure your control overlay is above iframe/canvas layers.\n\n```tsx\n<div className=\"absolute z-[1000] pointer-events-auto\">\n  ...\n</div>\n```\n\n### Do not duplicate bridge services in host app\n\nDo not recreate old local services like:\n\n- `TemplateDirectionService`\n- `TemplateSelectionService`\n- `TemplateFloorService`\n- `TemplateStepNavigationService`\n- `TemplateZoomService`\n- `TemplateViewerService`\n\nUse package exports instead:\n\n```ts\nimport {\n  DirectionBridgeService,\n  SelectionBridgeService,\n  FloorBridgeService,\n  StepNavigationBridgeService,\n  ZoomBridgeService,\n  ViewerBridgeService,\n} from \"wovvmap-webview-bridge/web\";\n```\n\n## Export Checklist\n\n### Components\n\n- `WebIframeScreen`\n- `WebViewScreen`\n- `attachIframeBridge`\n\n### Services\n\n- `BridgeService`\n- `DirectionBridgeService`\n- `SelectionBridgeService`\n- `FloorBridgeService`\n- `StepNavigationBridgeService`\n- `ZoomBridgeService`\n- `ViewerBridgeService`\n\n### Stores\n\n- `useBridgeStorage`\n- `useViewerStore`\n- `useCategoryStore`\n- `useSubCategoryStore`\n- `useAmenityStore`\n- `useNodePointStore`\n- `useSelectionStore`\n- `useDirectionStore`\n- `useFloorStore`\n- `useNavigationStore`\n- `useDirectionsRouteRequestStore`\n\n### Handlers\n\n- `registerBridgeHandler`\n\n### Types\n\n- `IncomingMessage`\n- `OutgoingMessage`\n- `NodePoint`\n- `FloorImage`\n- `Amenity`\n- `Category`\n- `SubCategory`\n- `ViewerBridgeState`\n- `ViewMode`\n- `CameraView`\n- `TextType`\n- `NavigationBridgeState`\n- `DirectionsRouteResult`\n- `NavigationResult`\n- `NavigationStep`\n- `NavigationSummary`\n- `SimulationMode`\n- `DirectionBridgeServiceConfig`\n- `DirectionInputAdapter`\n- `ViewerConfig`\n","readmeFilename":"README.md"}