{"_id":"@cabraule/chameleon-ui","_rev":"10-c0874deb4cc037195fe5aeb0a9645dca","name":"@cabraule/chameleon-ui","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@cabraule/chameleon-ui","version":"0.1.0","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.1.0","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"891eb350ef7a52e4a1407f524b39a53b33ded363","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.1.0.tgz","fileCount":21,"integrity":"sha512-mAH8S+dexSUBRU8z6EUb1gN+vdMh+ytOy99CyRke54VChAbd/6dQZ2JcvtegDfre/dyTuwPMEt/XzkiaXem4og==","signatures":[{"sig":"MEUCIFHj58KsTdr8mxWn3IneGCIHIZJb28OEGZN5HXfaTDqTAiEA9dSj9cQfvKXbwE5AFRnaXWOHuvjh57ipIf6lpdQE1Ro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95631},"main":"src/chameleon/index.js","type":"module","scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.1.0_1774619622117_0.9132184229972857","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cabraule/chameleon-ui","version":"0.1.1","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.1.1","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"728ec38bfcd4519161de64e32ea6fb09aced8acd","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.1.1.tgz","fileCount":21,"integrity":"sha512-zuuLFphKrgyHmV5gC3vu1dk4qiMLkXGFSZX3SzzA12q3qMbcXkPNZOsWMHSocc/tMuKoBf28U4OkwOesNUNNgg==","signatures":[{"sig":"MEQCID5jGEiB4o3wjubgOdUUgjyIGg19tUk1ut1ddbPc1VpeAiBDxaprLSxXMIyYtABuqlI/ttS7GUQ3f1FdCliIbGZBtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99343},"main":"src/chameleon/index.js","type":"module","scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.1.1_1774620156579_0.29916996798360085","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@cabraule/chameleon-ui","version":"0.1.2","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.1.2","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"d7545ab1421aa5e3d2874993865a6fce4597b6b7","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.1.2.tgz","fileCount":22,"integrity":"sha512-4vSOy4aVR128fDWk/1/TkBHAUkKmYORMSCMedu/Jnw1o3vvhBOOpd/HDWu8aTXWGUGCetqerM21EVU1ChglxJg==","signatures":[{"sig":"MEUCIQC65V8RNh1b0lW7R9ICj6AjVdD/787fU5Z5bsy2OnEVUgIgVErlU6PMaDuvR/z4W1cJNTvKlXRJZOR6xCFetZBdygU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100327},"main":"src/chameleon/index.js","type":"module","types":"index.d.ts","scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.1.2_1774621679456_0.6479569740706319","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@cabraule/chameleon-ui","version":"0.1.3","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.1.3","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"bf5540a741711f668da151ed16adb38ae32bff08","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.1.3.tgz","fileCount":24,"integrity":"sha512-nMGKwOdfD8VBKlA7oKsXJBD5ASiz9bpF0i1CgHNr7fL3UD0q1U3oi+fPKLGK70Ykt1gDXj5eowySZOxr/wGCaQ==","signatures":[{"sig":"MEUCIGfVhZaU89Ep4UCOAvLToO7VQ+bNo2T9MEvueuI+xVr9AiEA4u2PnIOmAexQwpK7ooui9TpkeHEetfGVQZEaLxcNZFE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104259},"main":"src/chameleon/index.js","type":"module","types":"index.d.ts","scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.1.3_1774623383930_0.46281215967985156","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@cabraule/chameleon-ui","version":"0.1.4","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.1.4","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"f8c2c1d34e270679986d518b4944ef0a5b3a30d9","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.1.4.tgz","fileCount":7,"integrity":"sha512-UQuvSR0hMAehiCuoODuHW6mIuZWRUhLUWpBcYx4toMpfv47Ajlx6WHKJY6JHfO+6R3hG+LEWognFtkjJkrtfaw==","signatures":[{"sig":"MEYCIQDHQZ4YXFYC64NGItglPaF7rfSB6T3QpuY6xJNHJpxozwIhAOGwr7ZsfvA4nVaPTZJ9qVWsfcSODb3gtI8aONq0uaes","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92727},"main":"dist/chameleon-ui.cjs.js","type":"module","types":"dist/chameleon-ui.d.ts","module":"dist/chameleon-ui.es.js","exports":{".":{"types":"./dist/chameleon-ui.d.ts","import":"./dist/chameleon-ui.es.js","require":"./dist/chameleon-ui.cjs.js"}},"scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.1.4_1775130227095_0.3416054404705291","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@cabraule/chameleon-ui","version":"0.1.5","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.1.5","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"2d627315704b329722882799978798e33b9ac95a","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.1.5.tgz","fileCount":7,"integrity":"sha512-uu5SBpNjWFOnHXcMPMPHTakhxe7FTjO0WjaznqRqTcw9PVQ7ckcP5iXDuvhuHviXgUCGKqVc/Db2OKezYMo90w==","signatures":[{"sig":"MEUCIQCjilVZig4BsGoVTlBCcpW2qTRn9Lqn+E7i6XL8oojT/QIgblXk2TUV2v0wPPfeINieJIoV3KSUWOWvD9DiVXI3UMY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92727},"main":"dist/chameleon-ui.cjs.js","type":"module","types":"dist/chameleon-ui.d.ts","module":"dist/chameleon-ui.es.js","exports":{".":{"types":"./dist/chameleon-ui.d.ts","import":"./dist/chameleon-ui.es.js","require":"./dist/chameleon-ui.cjs.js"}},"scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.1.5_1775139618220_0.45322875956552244","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@cabraule/chameleon-ui","version":"0.1.6","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.1.6","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"831da464e5dded678855f658ee747c09175c6e5e","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.1.6.tgz","fileCount":7,"integrity":"sha512-9Wyy+1QCyPx7dOXWZLSDztDcrwxL0IFFfsKXygskkLWNlf1BoldTAKio1PI7NbwiXpl181FZn5lKWjBCf8X8KA==","signatures":[{"sig":"MEUCIQClKDBE/xXw7DKailN3WtI0k7DTt6E8fLMb9kP0vOtwXQIgA4+F31nYmF4QYDGRqDLfVWaw+Efwfbq3ai4xIxAHw2Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72856},"main":"dist/chameleon-ui.cjs.js","type":"module","types":"dist/chameleon-ui.d.ts","module":"dist/chameleon-ui.es.js","exports":{".":{"types":"./dist/chameleon-ui.d.ts","import":"./dist/chameleon-ui.es.js","require":"./dist/chameleon-ui.cjs.js"}},"scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.1.6_1775140321726_0.6300723318285375","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@cabraule/chameleon-ui","version":"0.1.7","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.1.7","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"6d087ca13fa8f9c0ab51706ad85796dc24527ca1","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.1.7.tgz","fileCount":7,"integrity":"sha512-oP0Wb2r4v6MbvMgvAQtrM4KiCh6MA7AaKm4gdARo5HagdbVZfY4wk/pF2fksSsOzDjDytsKpRbdDE2FOZdqfpQ==","signatures":[{"sig":"MEYCIQDJ3ZMj9D+mMiOLpaayLYdtOBjVAJ64g8r2ZLJ7gWF6wQIhAN0qd3JmZFV166iD1OmddkJyiOcV34UmrUL0TuAG5OVq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72856},"main":"dist/chameleon-ui.cjs.js","type":"module","types":"dist/chameleon-ui.d.ts","module":"dist/chameleon-ui.es.js","exports":{".":{"types":"./dist/chameleon-ui.d.ts","import":"./dist/chameleon-ui.es.js","require":"./dist/chameleon-ui.cjs.js"}},"scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.1.7_1775141624901_0.21437860080657867","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@cabraule/chameleon-ui","version":"0.2.0","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","_id":"@cabraule/chameleon-ui@0.2.0","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"dist":{"shasum":"c5e9e3f648bf5f86e971f4e6467fed71f0336570","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.2.0.tgz","fileCount":7,"integrity":"sha512-P+J0nrRMtVWCaCQfp0WWvFAmjZKE7rWwqKGNLxWQQH3gaDT7wl8Yz7+1fr80XMtdNH19l8eHTqRhilUlHdzvTA==","signatures":[{"sig":"MEUCIG6hbban+rYHdUuKn9vqXli6OcLjrm6n598Zxs9HB6SkAiEAk4+//ZcWL/GLpCFCdwBKV3XnCnLcglzMiR8K+gbd0v4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185826},"main":"dist/chameleon-ui.cjs.js","type":"module","types":"dist/chameleon-ui.d.ts","module":"dist/chameleon-ui.es.js","exports":{".":{"types":"./dist/chameleon-ui.d.ts","import":"./dist/chameleon-ui.es.js","require":"./dist/chameleon-ui.cjs.js"}},"gitHead":"765c44d6c39d1f0cfaaea95efa001ec36b98e8bb","scripts":{"dev":"vite","lint":"eslint .","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"_npmVersion":"11.8.0","description":"Automatic UI adaptation SDK for React","directories":{},"_nodeVersion":"25.6.0","dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.0.1","eslint":"^9.39.4","globals":"^17.4.0","@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/chameleon-ui_0.2.0_1775314352873_0.22390288084020238","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@cabraule/chameleon-ui","version":"0.2.1","description":"Automatic UI adaptation SDK for React","type":"module","main":"dist/chameleon-ui.cjs.js","module":"dist/chameleon-ui.es.js","exports":{".":{"types":"./dist/chameleon-ui.d.ts","import":"./dist/chameleon-ui.es.js","require":"./dist/chameleon-ui.cjs.js"}},"types":"dist/chameleon-ui.d.ts","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"license":"MIT","scripts":{"dev":"vite","build":"vite build","lint":"eslint .","preview":"vite preview"},"peerDependencies":{"react":">=18.0.0"},"dependencies":{"react":"^19.2.4","react-dom":"^19.2.4"},"devDependencies":{"@eslint/js":"^9.39.4","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1","eslint":"^9.39.4","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2","globals":"^17.4.0","vite":"^8.0.1"},"gitHead":"765c44d6c39d1f0cfaaea95efa001ec36b98e8bb","_id":"@cabraule/chameleon-ui@0.2.1","_nodeVersion":"25.6.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-VZm/yA7aa5SK9/kQyt4dzkrEPm+ts+vhaPcZxiA7LbAh2XFFBSYNCI//RtflPbke7DptK/3AROJOR+oaGLDUIg==","shasum":"c073fbde6e68174cb3b45d7adfd4829f2fe662eb","tarball":"https://registry.npmjs.org/@cabraule/chameleon-ui/-/chameleon-ui-0.2.1.tgz","fileCount":7,"unpackedSize":186218,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA5z0QJaxxns1MYBrqIPIC2TS7pwpnwa54xdSwZwuP3xAiEA8Cy0fnW2AKgYbNJyGfURG2HCAFOUtWF2BQ1ig8KfOWw="}]},"_npmUser":{"name":"cabraule","email":"cabrauleketchanga@gmail.com"},"directories":{},"maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chameleon-ui_0.2.1_1775319643417_0.8179536921186843"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-27T13:53:42.008Z","modified":"2026-04-04T16:20:43.673Z","0.1.0":"2026-03-27T13:53:42.256Z","0.1.1":"2026-03-27T14:02:36.780Z","0.1.2":"2026-03-27T14:27:59.617Z","0.1.3":"2026-03-27T14:56:24.117Z","0.1.4":"2026-04-02T11:43:47.237Z","0.1.5":"2026-04-02T14:20:18.448Z","0.1.6":"2026-04-02T14:32:01.865Z","0.1.7":"2026-04-02T14:53:45.051Z","0.2.0":"2026-04-04T14:52:33.037Z","0.2.1":"2026-04-04T16:20:43.563Z"},"license":"MIT","keywords":["react","theme","accessibility","adaptive-ui","dark-mode"],"description":"Automatic UI adaptation SDK for React","maintainers":[{"name":"cabraule","email":"cabrauleketchanga@gmail.com"}],"readme":"# 🦎 Chameleon UI\n\n> **Automatic UI adaptation for React** — Respects your users' preferences without a single line of theme code.\n\n[![npm version](https://img.shields.io/npm/v/@cabraule/chameleon-ui?color=blue)](https://www.npmjs.com/package/@cabraule/chameleon-ui)\n[![license](https://img.shields.io/npm/l/@cabraule/chameleon-ui)](https://github.com/cabraule/chameleon-ui/blob/main/LICENSE)\n[![React](https://img.shields.io/badge/React-18%2B-blue?logo=react)](https://reactjs.org/)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/cabraule/chameleon-ui/pulls)\n\n---\n\n### ✨ One component. Zero config. Perfect adaptation.\n\n```jsx\n<ChameleonProvider licenseKey=\"cha-free-demo\">\n  <App />\n</ChameleonProvider>\n```\n\n**That's it.** Your app now adapts to:\n- 🌙 Dark / light mode based on system preference and time of day\n- 👁️ High contrast mode\n- 🎨 Color blindness friendly palette\n- ⚡ Reduced motion\n- 🌍 User language detection\n\n---\n\n## The problem\n\nEvery time you build an app, your designer creates multiple mockups — light theme, dark theme, high contrast variants. Your developer hardcodes every condition. And your user still gets a generic interface that doesn't match their real context.\n\n**That's a lot of work for a bad result.**\n\n---\n\n## The solution\n\nChameleon detects your app's existing theme, reads your styles, and automatically generates the right adaptation — without breaking what you already built.\n\nSame app. Different users. Right interface every time.\n\n---\n\n## Install\n\n```bash\nnpm install @cabraule/chameleon-ui\n```\n\n---\n\n## Quick start\n\n```jsx\nimport { ChameleonProvider } from '@cabraule/chameleon-ui'\n\nexport default function App() {\n  return (\n    <ChameleonProvider licenseKey=\"cha-free-demo\">\n      <YourApp />\n    </ChameleonProvider>\n  )\n}\n```\n\n**Without a license key**, Chameleon works using native browser detection only — no AI analysis:\n\n```jsx\n<ChameleonProvider>\n  <App />\n</ChameleonProvider>\n```\n\n---\n\n## How adaptation works\n\nChameleon follows this logic automatically:\n\n| App theme | Time of day | System preference | Action |\n|---|---|---|---|\n| Light | Day | None | ✅ Nothing — stay light |\n| Light | Night | None | 🌙 Switch to dark |\n| Dark | Day | None | ☀️ Switch to light |\n| Dark | Night | None | ✅ Nothing — stay dark |\n| Any | Any | Dark (manual) | 🌙 Always dark |\n| Any | Any | Light (manual) | ☀️ Always light |\n\n**System preference always wins.** Time-based logic only applies when the user hasn't manually set a preference on their device.\n\n---\n\n## Setup by Framework\n\n### 🎨 With Tailwind CSS\n\n**1. Configure Tailwind dark mode**\n\n```js\n// tailwind.config.js\nmodule.exports = {\n  darkMode: 'class', // Required\n  content: [\n    './pages/**/*.{js,ts,jsx,tsx,mdx}',\n    './components/**/*.{js,ts,jsx,tsx,mdx}',\n    './app/**/*.{js,ts,jsx,tsx,mdx}',\n  ],\n}\n```\n\n**2. Use Chameleon variables as fallbacks (optional)**\n\n```css\n/* globals.css */\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n:root {\n  --background: var(--chameleon-bg, #ffffff);\n  --foreground: var(--chameleon-text-primary, #171717);\n  --card: var(--chameleon-card-bg, #ffffff);\n  --border: var(--chameleon-border, #e5e5e5);\n}\n\nbody {\n  background: var(--background);\n  color: var(--foreground);\n}\n```\n\n**3. Wrap your app**\n\n```jsx\nimport { ChameleonProvider } from '@cabraule/chameleon-ui'\n\nexport default function App() {\n  return (\n    <ChameleonProvider licenseKey=\"cha-free-demo\">\n      <YourApp />\n    </ChameleonProvider>\n  )\n}\n```\n\nChameleon automatically toggles the `.dark` class on `<html>` — all your `dark:` Tailwind classes work instantly.\n\n---\n\n### 🎨 With CSS Variables\n\n```css\n/* styles.css */\n:root {\n  --background: #ffffff;\n  --foreground: #171717;\n  --primary: #2563eb;\n  --card: #f5f5f5;\n  --border: #e5e5e5;\n}\n\nbody {\n  background: var(--chameleon-bg, var(--background));\n  color: var(--chameleon-text-primary, var(--foreground));\n}\n\n.card {\n  background: var(--chameleon-card-bg, var(--card));\n  border: 1px solid var(--chameleon-border, var(--border));\n}\n\nbutton {\n  background: var(--chameleon-primary, var(--primary));\n  color: var(--chameleon-primary-text, #ffffff);\n}\n```\n\nChameleon reads your existing variables and generates adapted versions automatically.\n\n---\n\n### 🎨 With plain CSS / SCSS\n\nChameleon reads the computed styles of your DOM elements and injects style overrides. For best results, define your colors as CSS variables on `:root`.\n\n```scss\n// styles.scss\n:root {\n  --color-bg: #ffffff;\n  --color-text: #171717;\n  --color-primary: #2563eb;\n}\n\nbody {\n  background: var(--chameleon-bg, var(--color-bg));\n  color: var(--chameleon-text-primary, var(--color-text));\n}\n```\n\n> ⚠️ **Note:** Apps using only hardcoded CSS colors (no CSS variables) will get partial adaptation. For full accuracy, migrate your key colors to CSS variables.\n\n---\n\n## Read the state anywhere\n\n```jsx\nimport { useChameleon } from '@cabraule/chameleon-ui'\n\nfunction MyComponent() {\n  const {\n    theme,\n    highContrast,\n    colorBlindMode,\n    language,\n    prefersReducedMotion,\n    adaptation,    // 'none' | 'darken' | 'lighten'\n    appBrightness, // original theme of your app\n  } = useChameleon()\n\n  return (\n    <div>\n      <p>Theme: {theme}</p>\n      <p>Adaptation: {adaptation}</p>\n      <p>Language: {language}</p>\n    </div>\n  )\n}\n```\n\n---\n\n## Hooks\n\n### `useTheme()`\n\n```jsx\nimport { useTheme } from '@cabraule/chameleon-ui'\n\nconst { theme, prefersReducedMotion } = useTheme()\n// theme → 'light' | 'dark'\n// prefersReducedMotion → true | false\n```\n\n### `useAccessibility()`\n\n```jsx\nimport { useAccessibility } from '@cabraule/chameleon-ui'\n\nconst { highContrast, forcedColors, colorBlindMode } = useAccessibility()\n// highContrast → 'normal' | 'high'\n// forcedColors → true | false\n// colorBlindMode → null | 'deuteranopia' | 'protanopia' | 'tritanopia'\n```\n\n---\n\n## CSS Variables Reference\n\n| Variable | Description |\n|---|---|\n| `--chameleon-bg` | Main background |\n| `--chameleon-card-bg` | Card / surface background |\n| `--chameleon-text-primary` | Primary text |\n| `--chameleon-text-secondary` | Secondary / muted text |\n| `--chameleon-primary` | Brand / accent color |\n| `--chameleon-primary-text` | Text on primary color |\n| `--chameleon-border` | Border color |\n| `--chameleon-surface` | Alternative surface |\n| `--chameleon-font-scale` | Font boost in high contrast (`0px` default, `2px` HC) |\n| `--chameleon-motion` | Motion multiplier (`1` default, `0` reduced motion) |\n\n---\n\n## Best Practices for Developers\n\nFollow these guidelines to get the best theme adaptation from Chameleon.\n\n### Use CSS variables for your key colors\n\n```css\n/* Best — Chameleon reads and adapts these automatically */\n:root {\n  --background: #ffffff;\n  --foreground: #171717;\n  --primary: #6366f1;\n  --card: #f5f5f5;\n}\nbody { background: var(--background); color: var(--foreground); }\n```\n\n### Use Tailwind semantic classes instead of arbitrary values\n\n```jsx\n{/* Good — Chameleon adapts standard Tailwind classes */}\n<div className=\"bg-white text-gray-900 border-gray-200\">\n\n{/* Works but harder to adapt — arbitrary hex values */}\n<div className=\"bg-[#f5f5f5] text-[#1c1c1e] border-[#dadce0]\">\n```\n\n### Give explicit backgrounds to containers\n\n```jsx\n{/* Good — Chameleon knows this div has a white background */}\n<div className=\"bg-white rounded-lg p-6\">\n  <p className=\"text-gray-700\">Content</p>\n</div>\n\n{/* Bad — div inherits background, Chameleon can't distinguish it */}\n<div className=\"rounded-lg p-6\">\n  <p className=\"text-gray-700\">Content</p>\n</div>\n```\n\n### Avoid `!important` on colors\n\n```css\n/* Bad — blocks Chameleon */\n.my-card { background-color: #fff !important; }\n\n/* Good — Chameleon can override it */\n.my-card { background-color: #fff; }\n```\n\n### Prefer CSS classes over inline styles for colors\n\n```jsx\n{/* Bad — inline styles are harder to override */}\n<div style={{ background: '#ffffff', color: '#000000' }}>\n\n{/* Good — classes are easy to override */}\n<div className=\"bg-white text-gray-900\">\n```\n\n### Use `data-chameleon-skip` for content areas\n\n```jsx\n{/* PDF viewers, canvas, code editors — don't adapt these */}\n<div data-chameleon-skip>\n  <PDFViewer document={doc} />\n</div>\n\n{/* Canvas and video are automatically excluded */}\n<canvas /> {/* Never touched by Chameleon */}\n```\n\n### Keep gradients on the element, not a parent wrapper\n\n```jsx\n{/* Good — Chameleon detects and adapts the gradient */}\n<section className=\"bg-linear-to-br from-indigo-50 via-white to-blue-50\">\n\n{/* Bad — gradient on a wrapper div without explicit class */}\n<div style={{ background: 'linear-gradient(...)' }}>\n```\n\n### For Ant Design / MUI / Chakra — let the framework handle structure\n\nChameleon automatically detects and adapts Ant Design, MUI, and Chakra UI components. No special config needed. Just wrap your app:\n\n```jsx\n<ChameleonProvider licenseKey=\"cha-free-demo\">\n  <ConfigProvider> {/* antd */}\n    <App />\n  </ConfigProvider>\n</ChameleonProvider>\n```\n\n---\n\n## Troubleshooting\n\n### Dark mode not activating on Tailwind\n\nMake sure you have `darkMode: 'class'` in `tailwind.config.js` — this is required.\n\n---\n\n### Colors not adapting at all\n\n**1. ChameleonProvider not at root level**\n\n```jsx\n// ❌ Wrong\nfunction Page() {\n  return <ChameleonProvider><Content /></ChameleonProvider>\n}\n\n// ✅ Correct — wrap at the very top\nfunction App() {\n  return <ChameleonProvider><Page /></ChameleonProvider>\n}\n```\n\n**2. Colors hardcoded with `!important`**\n\n```css\n/* ❌ Blocks Chameleon */\n.my-class { color: #000 !important; }\n\n/* ✅ Use CSS variables */\n.my-class { color: var(--chameleon-text-primary); }\n```\n\n**3. Inline styles**\n\n```jsx\n{/* ❌ Can't be overridden */}\n<div style={{ color: '#000' }}>Text</div>\n\n{/* ✅ Use CSS classes */}\n<div className=\"text-foreground\">Text</div>\n```\n\n---\n\n### Next.js App Router setup\n\nChameleonProvider uses React hooks — it must be in a Client Component:\n\n```tsx\n// app/providers.tsx\n'use client';\nimport { ChameleonProvider } from '@cabraule/chameleon-ui';\n\nexport function Providers({ children }: { children: React.ReactNode }) {\n  return (\n    <ChameleonProvider licenseKey=\"cha-free-demo\">\n      {children}\n    </ChameleonProvider>\n  );\n}\n```\n\n```tsx\n// app/layout.tsx\nimport { Providers } from './providers';\n\nexport default function RootLayout({ children }) {\n  return (\n    <html lang=\"en\" suppressHydrationWarning>\n      <body>\n        <Providers>{children}</Providers>\n      </body>\n    </html>\n  )\n}\n```\n\nFor Vite / CRA, add this in `index.html` before React loads:\n\n```html\n<script>\n  if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n    document.documentElement.classList.add('dark');\n  }\n</script>\n```\n\n---\n\n### Text unreadable after adaptation\n\nChameleon includes an automatic contrast fixer that checks every text element against its real background. If issues persist:\n\n- Make sure elements have explicit backgrounds (not transparent)\n- Update to the latest version: `npm update @cabraule/chameleon-ui`\n\n---\n\n## Framework support\n\n| Framework | Status |\n|---|---|\n| React 18+ | ✅ Supported |\n| Next.js 13+ App Router | ✅ Supported |\n| Next.js 12 Pages Router | ✅ Supported |\n| Vite + React | ✅ Supported |\n| Tailwind CSS v3 / v4 | ✅ Supported |\n| shadcn/ui | ✅ Supported |\n| Ant Design v5+ | ✅ Supported |\n| Material UI (MUI) v5+ | ✅ Supported |\n| Chakra UI v3 | ✅ Supported |\n| CSS / CSS Variables | ✅ Supported |\n| SCSS / SASS | ✅ Supported (best with CSS variables) |\n| Plain CSS | ✅ Supported |\n| Vue.js | 🔜 Coming in V2 |\n| React Native | 🔜 Coming in V2 |\n\n---\n\n## Browser support\n\n| Browser | Minimum version |\n|---|---|\n| Chrome | 76+ |\n| Edge | 79+ |\n| Firefox | 67+ |\n| Safari | 12.1+ |\n\n---\n\n## Roadmap\n\n### ✅ MVP (current)\n- [x] Automatic light / dark theme detection\n- [x] Time-based adaptation (day / night)\n- [x] System preference — always takes priority\n- [x] High contrast mode\n- [x] Color blindness mode\n- [x] Reduced motion support\n- [x] Language detection\n- [x] Tailwind CSS v3 / v4 support\n- [x] shadcn/ui support\n- [x] Ant Design support\n- [x] Material UI (MUI) support\n- [x] Chakra UI v3 support\n- [x] CSS / CSS Variables / SCSS support\n- [x] AI-powered theme generation (Claude Sonnet)\n- [x] Automatic WCAG contrast fixes\n- [x] Gradient adaptation (from-*, via-*, to-*)\n- [x] Inline style adaptation\n- [x] Portal / modal / dropdown detection\n- [x] Canvas / PDF / video exclusion\n- [x] Supabase persistent cache\n\n### 🔜 V1\n\n- [ ] Font size scaling\n- [ ] Color palette editor (Pro)\n- [ ] Theme preview panel\n\n### 🔜 V2\n\n- [ ] Vue.js support\n- [ ] React Native support\n- [ ] Analytics dashboard (Pro)\n\n---\n\n## Contributing\n\n```bash\ngit clone https://github.com/cabraule/chameleon-ui\ncd chameleon-ui\nnpm install\nnpm run dev\n```\n\nOpen an issue before submitting a pull request for major changes.\n\n---\n\n## License\n\nMIT © [Cabraule](https://github.com/cabraule)\n\n---\n\n<p align=\"center\">\n  Built with ❤️ — Because every user deserves an interface made for them.\n</p>","readmeFilename":"README.md"}