{"_id":"@asafarim/country-language-selector","_rev":"9-53ba7d437ad3bdf6c920fb9b0f3279cf","name":"@asafarim/country-language-selector","dist-tags":{"latest":"0.5.2"},"versions":{"0.1.0":{"name":"@asafarim/country-language-selector","version":"0.1.0","license":"MIT","_id":"@asafarim/country-language-selector@0.1.0","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"dist":{"shasum":"468ef241a01529140dac5869951deb375970511f","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.1.0.tgz","fileCount":9,"integrity":"sha512-v7d1Ip9XURgrTaQq1hE6UGibqgVUwfZeFb7iTJIT0RevKhUIHDYft6O6ymmzBkSaRm39awSXt2SLn/Aofj8NCg==","signatures":[{"sig":"MEUCIFYP2cdynDMHF3YDxWAvRORi03VXdtwrE4fUmilcPst7AiEA2fQYDLzPSrrUohhDeOmM1C9HbS+CsGrk58fzC9yhi9g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215040},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"062a4105768bf9935d61d44f38e342e54d2523e5","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"_npmVersion":"11.6.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.6.3","@types/react":"^18.3.12","@types/react-dom":"^18.3.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/country-language-selector_0.1.0_1776787737561_0.6939147197343938","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@asafarim/country-language-selector","version":"0.2.1","author":{"name":"Asaf Arieli","email":"asafarim@gmail.com"},"license":"MIT","_id":"@asafarim/country-language-selector@0.2.1","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"homepage":"https://alisafari-it.github.io/country-language-switch/","bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"dist":{"shasum":"6a0649d84f06a0bf53b4aa711f569ac3b95705f1","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.2.1.tgz","fileCount":9,"integrity":"sha512-FnR3FVcSRQdvgCbm44gEl/Yi81KAc5k9KnBGfjVK3goFeVUV3rmxc+hsQ64ht75/+9i4Li9ONUCPpfbrRpiWUA==","signatures":[{"sig":"MEUCICFJqN0yNJIodnkbiA/Iktf6UXayWublGEs/kQuzkwcsAiEAj4yx0KLzOPiv3AaWXU3eY2VOTf3GN9BLVzIanjAlIyI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215407},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"693b690d1a4df4039c4a317c40cc2b6f485c07fd","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"repository":{"url":"git+https://github.com/alisafari-it/country-language-switch.git","type":"git","directory":"packages/country-language-selector"},"_npmVersion":"11.6.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.6.3","@types/react":"^18.3.12","@types/react-dom":"^18.3.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/country-language-selector_0.2.1_1776789168199_0.32874462080624434","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@asafarim/country-language-selector","version":"0.2.2","author":{"name":"Asaf Arieli","email":"asafarim@gmail.com"},"license":"MIT","_id":"@asafarim/country-language-selector@0.2.2","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"homepage":"https://alisafari-it.github.io/country-language-switch/","bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"dist":{"shasum":"3eaeac4dd9b0d705773821addcd10ed92c40fa1d","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.2.2.tgz","fileCount":9,"integrity":"sha512-LoCeQ5Qvl8SqIYo8O8mLNnhuHNOd2eZzLRdSeOaY2krItHAjLs/cZYYVCl7Rt5s4LbdtAfgAMihi0dvxsHr5aA==","signatures":[{"sig":"MEQCIA204B2J+bPzuj/XZP04sFriRJOmAZakMLEDyJDc4+VtAiATapCkl94Quqldf6yvQqxat/ztf+tXdCEwTAfnMsA+Sg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215544},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"21c152e58f6460eed6a2fe0a0be9c5ad4849e2b9","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"repository":{"url":"git+https://github.com/alisafari-it/country-language-switch.git","type":"git","directory":"packages/country-language-selector"},"_npmVersion":"11.6.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.6.3","@types/react":"^18.3.12","@types/react-dom":"^18.3.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/country-language-selector_0.2.2_1776947059517_0.2140180140845247","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@asafarim/country-language-selector","version":"0.2.3","author":{"name":"Asaf Arieli","email":"asafarim@gmail.com"},"license":"MIT","_id":"@asafarim/country-language-selector@0.2.3","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"homepage":"https://alisafari-it.github.io/country-language-switch/","bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"dist":{"shasum":"d4be461edc8f86bdf4f7760a7a33a29e2532d364","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.2.3.tgz","fileCount":9,"integrity":"sha512-CYqexacll7aKV6K2nPrObHoMcsBCoNX2xS0QKDLYElCptD5F7sv/WJIQ9rv+21lUgBF42xvAO2eADXC02JHtjw==","signatures":[{"sig":"MEQCIB7zyfl4DE8X6HahMWMUyn/xIWtMo53106/Up6MvpjBEAiAEcNxWaBwXMm49f/89KircjVWVJ9Zu5Sp7ppRHYVh8OQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215553},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"gitHead":"1b1c0b9028e235d87a2ef72c7328e5fd8d6fd320","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"repository":{"url":"git+https://github.com/alisafari-it/country-language-switch.git","type":"git","directory":"packages/country-language-selector"},"_npmVersion":"11.6.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.6.3","@types/react":"^18.3.12","@types/react-dom":"^18.3.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/country-language-selector_0.2.3_1776947144063_0.5950437356371552","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@asafarim/country-language-selector","version":"0.3.0","author":{"name":"Asaf Arieli","email":"asafarim@gmail.com"},"license":"MIT","_id":"@asafarim/country-language-selector@0.3.0","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"homepage":"https://alisafari-it.github.io/country-language-switch/","bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"dist":{"shasum":"52a7e8c2dc442359c4d62259d5bcfc9658f47b79","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.3.0.tgz","fileCount":9,"integrity":"sha512-plzSHXDIXllHYvzW4k1xCiXTy08qG7c9/GGgI7L0nZjrD40L8ke9vrisfk+NJq3/eHyXVZdx3LkkNtFqH9XN7g==","signatures":[{"sig":"MEUCIQCzcOjXKfjFQVJFG2Q1x/Vs97NKKj08Stf+3USVLMJIWAIgOICKmKPay2meQiCDz2dMTJwBereDxa0tySTpl8iiwUc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242432},"main":"./dist/index.cjs","type":"module","_from":"file:asafarim-country-language-selector-0.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"_resolved":"C:\\Users\\saal\\AppData\\Local\\Temp\\e3ff39773d5a97f2c9814c7924fdeef3\\asafarim-country-language-selector-0.3.0.tgz","_integrity":"sha512-plzSHXDIXllHYvzW4k1xCiXTy08qG7c9/GGgI7L0nZjrD40L8ke9vrisfk+NJq3/eHyXVZdx3LkkNtFqH9XN7g==","repository":{"url":"git+https://github.com/alisafari-it/country-language-switch.git","type":"git","directory":"packages/country-language-selector"},"_npmVersion":"11.6.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.6.3","@types/react":"^18.3.12","@types/react-dom":"^18.3.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/country-language-selector_0.3.0_1777377777856_0.6044065230272346","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@asafarim/country-language-selector","version":"0.4.0","author":{"name":"Ali Safari","email":"asafarim@gmail.com"},"license":"MIT","_id":"@asafarim/country-language-selector@0.4.0","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"homepage":"https://alisafari-it.github.io/country-language-switch/","bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"dist":{"shasum":"8a91d9c0f6648fbde43ff4bca1b8f7d0da81b205","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.4.0.tgz","fileCount":9,"integrity":"sha512-42I1de47y/PZbhHHjLFchNkdqSUJUrA+nDL/F1Q7I6dwf3nQKCfPdCsR2VzgItQzdxvrblokeTcgFZRSxQ+deg==","signatures":[{"sig":"MEUCIFq9nf7iJH6eXk9Tw4pmnZOdsPNr9v6sJSSWrB6pTD0hAiEA1hCx47o6cHypF+/H1P1ZtkSqmDm4EksAo4N5Ly313zM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":243751},"main":"./dist/index.cjs","type":"module","_from":"file:asafarim-country-language-selector-0.4.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"_resolved":"/tmp/a48746963c2d9da6c43deefccec563cf/asafarim-country-language-selector-0.4.0.tgz","_integrity":"sha512-42I1de47y/PZbhHHjLFchNkdqSUJUrA+nDL/F1Q7I6dwf3nQKCfPdCsR2VzgItQzdxvrblokeTcgFZRSxQ+deg==","repository":{"url":"git+https://github.com/alisafari-it/country-language-switch.git","type":"git","directory":"packages/country-language-selector"},"_npmVersion":"10.8.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.6.3","@types/react":"^18.3.12","@types/react-dom":"^18.3.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/country-language-selector_0.4.0_1777455973719_0.8187156707159873","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@asafarim/country-language-selector","version":"0.4.1","keywords":["language","country","selector","navbar","react","nextjs","typescript","asafarim"],"author":{"name":"Ali Safari","email":"asafarim@gmail.com"},"license":"MIT","_id":"@asafarim/country-language-selector@0.4.1","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"homepage":"https://alisafari-it.github.io/country-language-switch/","bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"dist":{"shasum":"2bf3b80a462e5f08513cb23af222bb4bbae73dec","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.4.1.tgz","fileCount":9,"integrity":"sha512-Wg0KDpdXltrheix8wTmicb4CfsuI2hlGXY7cMYF6acD5C5F080wrcowP8bFQfOxfcFMo0LPo0HAMotvumizJPg==","signatures":[{"sig":"MEQCIGVQ0MNB0UOkR9+MHGP9D84UGfm6HgPUt4uxbaticJNOAiBlGZC4oOoDDx14jfS8RkEZZEfY/wwUh58HKJNp1SqANw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":243893},"main":"./dist/index.cjs","type":"module","_from":"file:asafarim-country-language-selector-0.4.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"_resolved":"/tmp/d7f801bed40aaa2f947aa1237b8868ec/asafarim-country-language-selector-0.4.1.tgz","_integrity":"sha512-Wg0KDpdXltrheix8wTmicb4CfsuI2hlGXY7cMYF6acD5C5F080wrcowP8bFQfOxfcFMo0LPo0HAMotvumizJPg==","repository":{"url":"git+https://github.com/alisafari-it/country-language-switch.git","type":"git","directory":"packages/country-language-selector"},"_npmVersion":"10.8.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","react":"^18.3.1","react-dom":"^18.3.1","typescript":"^5.6.3","@types/react":"^18.3.12","@types/react-dom":"^18.3.1"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/country-language-selector_0.4.1_1777458653564_0.4373056510558573","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@asafarim/country-language-selector","version":"0.5.1","keywords":["language","country","selector","navbar","react","nextjs","typescript","asafarim"],"author":{"name":"Ali Safari","email":"asafarim@gmail.com"},"license":"MIT","_id":"@asafarim/country-language-selector@0.5.1","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"homepage":"https://alisafari-it.github.io/country-language-switch/","bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"dist":{"shasum":"3f43065266b291d1f73d1fd1bd89e237298b2a6e","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.5.1.tgz","fileCount":10,"integrity":"sha512-caFSzrlgTTCfa8IoAVpyc+exwQuiCaa8qmLEuZcjk+9gwpzKJxh0Tk33V1vIqfOBYmVQs4CfWlFeq8BwF0uWlQ==","signatures":[{"sig":"MEUCIQCLi3grjp25QZyuoVFbSn1iwrhC1L1TfKRsoDa68oPzlwIgIet8HSJ8XwnvxHgjcfHYyxG51RtcYPeleg9Xx6zo/jY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248891},"main":"./dist/index.cjs","type":"module","_from":"file:asafarim-country-language-selector-0.5.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"_resolved":"/tmp/f26140150f7d6074ddbe95c4aedc7eee/asafarim-country-language-selector-0.5.1.tgz","_integrity":"sha512-caFSzrlgTTCfa8IoAVpyc+exwQuiCaa8qmLEuZcjk+9gwpzKJxh0Tk33V1vIqfOBYmVQs4CfWlFeq8BwF0uWlQ==","repository":{"url":"git+https://github.com/alisafari-it/country-language-switch.git","type":"git","directory":"packages/country-language-selector"},"_npmVersion":"10.8.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","jsdom":"^25.0.1","react":"^18.3.1","vitest":"^2.1.8","react-dom":"^18.3.1","typescript":"^5.6.3","@types/react":"^18.3.12","@types/react-dom":"^18.3.1","@testing-library/dom":"^10.4.0","@vitejs/plugin-react":"^4.3.3","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","@testing-library/user-event":"^14.5.2"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/country-language-selector_0.5.1_1783287229614_0.20347994784728884","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@asafarim/country-language-selector","version":"0.5.2","description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","license":"MIT","sideEffects":["**/*.css"],"type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/styles.css","./package.json":"./package.json"},"peerDependencies":{"react":">=18","react-dom":">=18"},"devDependencies":{"@testing-library/dom":"^10.4.0","@testing-library/jest-dom":"^6.6.3","@testing-library/react":"^16.1.0","@testing-library/user-event":"^14.5.2","@types/react":"^18.3.12","@types/react-dom":"^18.3.1","@vitejs/plugin-react":"^4.3.3","jsdom":"^25.0.1","react":"^18.3.1","react-dom":"^18.3.1","tsup":"^8.3.5","typescript":"^5.6.3","vitest":"^2.1.8"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/alisafari-it/country-language-switch.git","directory":"packages/country-language-selector"},"author":{"name":"Ali Safari","email":"asafarim@gmail.com"},"homepage":"https://alisafari-it.github.io/country-language-switch/","bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"keywords":["language","country","selector","navbar","react","nextjs","typescript","asafarim"],"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest"},"_id":"@asafarim/country-language-selector@0.5.2","_integrity":"sha512-jTa6Z5MjNT4hHIe/PspBYqsPV2+rnHahwdQa9fhSA790Lbly962XmD0clDeQAMBcLPR5LN5ce7d8mZjFsg/ASg==","_resolved":"/tmp/b3d3d797965319350d230c25dfbb0ae7/asafarim-country-language-selector-0.5.2.tgz","_from":"file:asafarim-country-language-selector-0.5.2.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-jTa6Z5MjNT4hHIe/PspBYqsPV2+rnHahwdQa9fhSA790Lbly962XmD0clDeQAMBcLPR5LN5ce7d8mZjFsg/ASg==","shasum":"62cd25eb6a1b6a317a6346be6582e9de223e6c74","tarball":"https://registry.npmjs.org/@asafarim/country-language-selector/-/country-language-selector-0.5.2.tgz","fileCount":10,"unpackedSize":249919,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDf8JXqXnSzeLwruIEKCKqy/0JaFLB8fm3bReLeE8nIKwIgdJ4ez25pZBHchCrK8Fj3fa/kCS2OWJbHktII+4gH/Aw="}]},"_npmUser":{"name":"asafarim.be","email":"asafarim.it@gmail.com"},"directories":{},"maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/country-language-selector_0.5.2_1783287523900_0.06622916093599751"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-21T16:08:57.432Z","modified":"2026-07-05T21:38:44.185Z","0.1.0":"2026-04-21T16:08:57.712Z","0.2.1":"2026-04-21T16:32:48.329Z","0.2.2":"2026-04-23T12:24:19.677Z","0.2.3":"2026-04-23T12:25:44.206Z","0.3.0":"2026-04-28T12:02:58.020Z","0.4.0":"2026-04-29T09:46:13.861Z","0.4.1":"2026-04-29T10:30:53.711Z","0.5.1":"2026-07-05T21:33:49.758Z","0.5.2":"2026-07-05T21:38:44.054Z"},"bugs":{"url":"https://github.com/alisafari-it/country-language-switch/issues"},"author":{"name":"Ali Safari","email":"asafarim@gmail.com"},"license":"MIT","homepage":"https://alisafari-it.github.io/country-language-switch/","keywords":["language","country","selector","navbar","react","nextjs","typescript","asafarim"],"repository":{"type":"git","url":"git+https://github.com/alisafari-it/country-language-switch.git","directory":"packages/country-language-selector"},"description":"A modern, accessible, reusable React + TypeScript country & language selector for navbars.","maintainers":[{"name":"asafarim.be","email":"asafarim.it@gmail.com"}],"readme":"# Country & language selector: @asafarim/country-language-selector\n\nA modern, accessible, reusable React + TypeScript country & language selector built for navbars. First-class support for multi-language countries (Belgium, Switzerland, Canada, …).\n\n## Demo\n\nCheck out the live demo here supporting multiple languages in the selector with locale-aware routing in Benelux (Belgium, Luxembourg and Netherlands) and English as universal fallback:\n\n[Country & language selector](https://alisafari-it.github.io/country-language-switch/)\n\n## Install\n\nInside this monorepo it's already wired up. To publish or consume externally:\n\n```bash\npnpm add @asafarim/country-language-selector\n```\n\nImport the stylesheet once at your app root:\n\n```ts\nimport \"@asafarim/country-language-selector/styles.css\";\n```\n\n## Usage\n\n### Uncontrolled\n\n```tsx\nimport { CountryLanguageSelector } from \"@asafarim/country-language-selector\";\n\nexport function Navbar() {\n  return (\n    <CountryLanguageSelector\n      defaultValue={{ country: \"BE\", language: \"nl\" }}\n      persistKey=\"site-locale\"\n      onChange={(locale, meta) => console.log(locale, meta.reason)}\n    />\n  );\n}\n```\n\n### Controlled\n\n```tsx\nconst [locale, setLocale] = useState<Locale>({ country: \"FR\", language: \"fr\" });\n\n<CountryLanguageSelector\n  value={locale}\n  onChange={(next) => setLocale(next)}\n/>;\n```\n\n### Custom country list\n\n```tsx\nimport { CountryLanguageSelector, type Country } from \"@asafarim/country-language-selector\";\n\nconst countries: Country[] = [\n  { code: \"BE\", name: \"Belgium\", flag: \"🇧🇪\",\n    languages: [\n      { code: \"nl\", label: \"Dutch\", nativeLabel: \"Nederlands\" },\n      { code: \"fr\", label: \"French\", nativeLabel: \"Français\" },\n    ],\n  },\n  // …\n];\n\n<CountryLanguageSelector countries={countries} defaultValue={{ country: \"BE\", language: \"nl\" }} />;\n```\n\n### Custom trigger\n\n```tsx\n<CountryLanguageSelector\n  renderTrigger={({ country, language }) => (\n    <>\n      <span>{country.flag}</span>\n      <span>{country.name} · {language.label}</span>\n    </>\n  )}\n/>\n```\n\n### Locale-aware routing\n\nPair the selector with [`@asafarim/shared-i18n`](https://www.npmjs.com/package/@asafarim/shared-i18n)\nto drive locale-prefixed URLs (e.g. `/be-nl/get-started`, `/lu-lb/get-started`,\n`/en/get-started` as the universal fallback). The demo app in this repo shows a\nworking setup:\n\n```tsx\n// On selector change → push a new URL\nimport { useNavigate } from \"react-router-dom\";\n\nconst navigate = useNavigate();\n\n<CountryLanguageSelector\n  countries={beneluxCountries}\n  value={locale}\n  onChange={(next) => {\n    const slug =\n      next.country === \"UN\"\n        ? next.language.toLowerCase()\n        : `${next.country.toLowerCase()}-${next.language.toLowerCase()}`;\n    navigate(`/${slug}${currentSubPath}`);\n  }}\n/>;\n```\n\nThe full implementation, including the `LocaleLayout` route, slug parser, and\nBenelux translation JSON files, lives in\n[`apps/demo/src/i18n`](https://github.com/AliSafari-IT/country-language-switch/tree/main/apps/demo/src/i18n)\nand [`apps/demo/src/components/LocaleLayout.tsx`](https://github.com/AliSafari-IT/country-language-switch/blob/main/apps/demo/src/components/LocaleLayout.tsx).\n\n### Flag rendering\n\nWindows browsers don't ship regional-indicator emoji glyphs, so flags like `🇧🇪` render as plain text (`BE`). Use `flagMode=\"image\"` to load real SVG flags from `flagcdn.com` instead:\n\n```tsx\n<CountryLanguageSelector\n  defaultValue={{ country: \"BE\", language: \"nl\" }}\n  flagMode=\"image\"\n/>\n```\n\nFor full control, use `renderFlag` to supply your own flag implementation (e.g., a local sprite, an icon library, or your own CDN):\n\n```tsx\n<CountryLanguageSelector\n  renderFlag={(country) => (\n    <img src={`/flags/${country.code}.png`} alt=\"\" />\n  )}\n/>\n```\n\n## Props\n\n| Prop | Type | Default | Notes |\n| --- | --- | --- | --- |\n| `countries` | `Country[]` | bundled set | Replace or extend to control the list. |\n| `value` | `Locale` | — | Enables controlled mode. |\n| `defaultValue` | `Locale` | first country | Uncontrolled seed. |\n| `onChange` | `(locale, meta) => void` | — | `meta.reason` is `\"country\" \\| \"language\" \\| \"init\" \\| \"reset\"`. |\n| `persistKey` | `string` | — | Persists uncontrolled state to localStorage. |\n| `triggerVariant` | `\"compact\" \\| \"full\" \\| \"flag\"` | `\"compact\"` | Trigger rendering. |\n| `flagMode` | `\"emoji\" \\| \"image\"` | `\"emoji\"` | How flags are rendered. |\n| `renderFlag` | `(country) => ReactNode` | — | Custom flag renderer; overrides `flagMode`. |\n| `align` | `\"start\" \\| \"end\"` | `\"end\"` | Popover alignment. |\n| `ariaLabel` | `string` | — | Accessible label on the trigger. |\n| `renderTrigger` | `(ctx) => ReactNode` | — | Override trigger content. |\n| `strings` | `Partial<SelectorStrings>` | — | Localise the selector's own UI. |\n| `disabled` | `boolean` | `false` | Disables the trigger. |\n| `className` / `popoverClassName` | `string` | — | Styling hooks. |\n\n## Behaviour\n\n- **Compact trigger** showing flag + country code + language code (`🇧🇪 BE · NL`).\n- **Combobox popover** with type-ahead search (diacritic-insensitive, ranked).\n- **Country → Language dependency**: picking a country with multiple supported\n  languages reveals a secondary language list. Single-language countries commit\n  immediately. Switching to a new country keeps the current language if that\n  country also supports it, otherwise falls back to the country's default.\n- **Mobile**: promotes to a bottom sheet with a backdrop on coarse-pointer / narrow viewports.\n- **Keyboard**:\n  - `Space` / `Enter` / `ArrowDown` on the trigger → open\n  - Typing filters the list; `↑ ↓` moves the active row; `Home` / `End` jump\n  - `Enter` commits the active row; `Escape` closes and returns focus to the trigger\n  - Advancing to the language step moves focus into the popover, and returning\n    to the country step restores focus to the search input, so keyboard\n    navigation and the focus trap keep working across both steps\n  - While in the language step, `Backspace` with empty search returns to the country list\n- **ARIA**: `role=\"dialog\"`, combobox + listbox semantics, `aria-activedescendant`, `aria-selected`, focus trap.\n\n## Framework notes\n\nThe package ships ESM + CJS + types. It injects a `\"use client\"` directive so\nNext.js App Router consumers can import it directly into server components'\ntrees. There is no Next.js-specific logic in the package itself — only React.\n\n## Development\n\nThis package lives in a pnpm workspace. From the repo root or this directory:\n\n```bash\npnpm build          # bundle ESM + CJS + types with tsup\npnpm dev            # tsup in watch mode\npnpm typecheck      # tsc --noEmit\npnpm test           # run the Vitest suite once\npnpm test:watch     # Vitest in watch mode\n```\n\nThe test suite (Vitest + Testing Library, jsdom) covers:\n\n- the diacritic-insensitive search ranking (`src/utils/search.ts`);\n- the `useCountryLanguage` state machine — controlled vs. uncontrolled,\n  `localStorage` persistence, and the country → language dependency rule;\n- the component's open/close, search, selection, keyboard navigation\n  (including the cross-step focus behaviour above), and customisation props.\n\nSee [`CHANGELOG.md`](./CHANGELOG.md) for release notes.\n","readmeFilename":"README.md"}