{"_id":"@assassin1717/aifelib","_rev":"15-0d495b31e22e80f72c73330e3e7f53e2","name":"@assassin1717/aifelib","dist-tags":{"latest":"1.5.5"},"versions":{"1.0.0":{"name":"@assassin1717/aifelib","version":"1.0.0","_id":"@assassin1717/aifelib@1.0.0","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"c40b52c4933ddb6302b0b7b3f981d6eea20e58a6","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.0.0.tgz","fileCount":8,"integrity":"sha512-bbi3DVUybcGmzdbh3ePYmPK6EI9uOhIC599AQPyj9D71DZu3125Tfi1h+lv5B/Y/25197qZWQ5knSDOP2PIilA==","signatures":[{"sig":"MEYCIQDI/iTpBlQ2OQcneZMnV3TjGyyWoV+JZi3lLzv8uU+V5gIhAJRZyPpIfNp+updAMC9EQU2LFOK7Mqbntd7HXOzq7Mcd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":335305},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d7c563fa15ce238e1f4f448391358009bfa4b0ba","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.0.0_1776071394863_0.008054563938150183","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@assassin1717/aifelib","version":"1.0.1","_id":"@assassin1717/aifelib@1.0.1","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"7843e2ff896e0ef70e1cfdf5421209c979702094","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.0.1.tgz","fileCount":8,"integrity":"sha512-ZaQoCWGT5cx6qjdRgVx31VFPoJEpXvV8VJ2lasWn3b4sThJnrB5Vxd1ZeeQdMMuiPhe1XTMV0PGeY1GtMWCL8g==","signatures":[{"sig":"MEYCIQD45j06mOyGK1b+Jm6qiBMJmHeLvn0IsuYgSvE4Cqf4AwIhAKBZ0S1ztnXc6lkzcGN+kUTtw49vMK2WUfm8L9aJonaP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":335327},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"1e57b93390ac1d6ce8560967a8e8a7bbe6eedad5","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.0.1_1776073306824_0.6143546753077032","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@assassin1717/aifelib","version":"1.1.0","_id":"@assassin1717/aifelib@1.1.0","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"b66b3c38203a8aead0321b5eb9c4565cf3512a2a","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.1.0.tgz","fileCount":8,"integrity":"sha512-DyQ2FGZlSq9Sp85+eX+hcBK5IKmFduqOGkyWXuHdID2Hhplea77hLRNNl5RQmr5Y7i/iNupD4VQV+cuApvjPpw==","signatures":[{"sig":"MEQCIGmnXy0OVei8Y8oZfk0nLIpUxHKf3p7CMFIn7R6BmP03AiAi+9hdAQFO1BVW0EY3jkgDjooT1KTkFICZTxngn7jF8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":335355},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2659841326b92030a6c5faa6ee4fe50b6e3f6faa","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.1.0_1776075453907_0.41548859259333404","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@assassin1717/aifelib","version":"1.2.0","_id":"@assassin1717/aifelib@1.2.0","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"095fd00b75e7655d501ef50b26f91bf7daef89a3","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.2.0.tgz","fileCount":8,"integrity":"sha512-kaKFtMxgwM8CQvAsygu5IcauhtzGDTbUR/MzC4tzDXANXr9FA9+0svq1/qnaoelcb+kYg6NznW47ld3O6JmujA==","signatures":[{"sig":"MEUCIH+9M7HGhVC0IU6BXURPn+Ko/x+iHNMRFH3Bsh4L0h0kAiEAstim9fkYdni0dQjurBmIc/5JamqEGoSE6RuYj4Jxtmw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":335355},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"954f083617a97de7b5364e3d5d8d478b7b3e5456","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.2.0_1776086144906_0.9658495483710297","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@assassin1717/aifelib","version":"1.3.0","_id":"@assassin1717/aifelib@1.3.0","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"a417bfc2fee714fb4ef9e46afaf4b2a709e04d69","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.3.0.tgz","fileCount":8,"integrity":"sha512-OWlpyvRBCjylFBPd1OxO52Rsa10DaaSixjCHvQVC8oyS8bJH8mqruGcIwWx/xftfx0JDCvvMLNHJw9nwBN5ZGw==","signatures":[{"sig":"MEUCIB1B79LO5pzI7JAj+HiaX6gz5ThkqL/NwkrgZ+iX1fEgAiEA+KZzhIr/ON5+OVQjFxkR2k0GbTTw31Oi/Cz44v3rS1U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":377749},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"e2baa6dafbef097b2362f34226c14fd02723991d","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.3.0_1776157196317_0.9593783908422202","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@assassin1717/aifelib","version":"1.3.1","_id":"@assassin1717/aifelib@1.3.1","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"4c0c5c18f205e8b5e357e989baa8cfe33a868b26","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.3.1.tgz","fileCount":8,"integrity":"sha512-DuPAFFRHWrQR4Iu2AaSi+OI3gESWSUx64kS7SuEEgeLhqb3YzayJz8vv2f+gsuhOP8tP39utNT/38rs80VTAbQ==","signatures":[{"sig":"MEUCIQDY9ihc5Wk2jpFlA7jACC31mEqiAZpqfVscoXsyZAtA1gIgRH72dN66dWh3QmtRQ+e9GdbhGY6WHjdgHSoozLwQyzo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":379029},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"b4355a18cce986b554fa39781ce3c71dc505fd84","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.3.1_1776173960577_0.24274548268837703","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@assassin1717/aifelib","version":"1.3.2","_id":"@assassin1717/aifelib@1.3.2","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"37033f0ff65272c25d549c1a0cdb423b0148ad4b","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.3.2.tgz","fileCount":8,"integrity":"sha512-Pdiec6ggQl24G2XnwZKENb6vCouFpjBMXW36kPAy2SASrpmSDrPIcgYpk8yqyMFhn0azWMKvx7y3nV3EbE5UZg==","signatures":[{"sig":"MEUCIQDaua1qwxqQNTHu4Rf18qiOrvxlVwEf+9XRKO8LxZf7hQIgHOBGEeWqiCTBK4zXaXy7g1963OBtuF2oVEs8Re9teds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":378965},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"a5c5fb21fe904d873a5d2acd5b3ccb320ffa7f9a","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.3.2_1776245556935_0.7887055090857658","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@assassin1717/aifelib","version":"1.3.3","_id":"@assassin1717/aifelib@1.3.3","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"b6d68f71f2622fb429c2cdeb9fdd5c369184fd6d","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.3.3.tgz","fileCount":8,"integrity":"sha512-4XWzCol0JSUsUh6230NMb5NkdNiB1X2480/tmtv1vIVLcwmKuEbUZW17ZeBiwy9x+ns4OVKEiVeYAS2bo/NK/A==","signatures":[{"sig":"MEYCIQDG4BVl8R+n85vXvnrYnsVE56shFOURNCsarJK2LXNTjQIhANmrqJE9gkLcNArk81EIhmIFg19bNnPH8VUNEbQgLqvN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":378977},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"193cc438ee51ecb621bc8b17bfb05925925bc89e","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.3.3_1776450426775_0.24077398362598945","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@assassin1717/aifelib","version":"1.4.0","_id":"@assassin1717/aifelib@1.4.0","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"0838d11f8e3e81d35353d287299cf7aa7603bdc8","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.4.0.tgz","fileCount":8,"integrity":"sha512-iCom89v7W6hQkV5QVifiVT5rt80TYXpZuQI1tcMNYYNJHcFEAPuovfHNkqUlMcqwi/Rp7TtcNWfwwcfoXk2Y4Q==","signatures":[{"sig":"MEYCIQCLDtmW9PfC2vUH0W2B5lNzIHvgL+cNiULMkeDq5XYeQQIhALAOmW7+1o8QcwyE4yfyOFOFz1DBnGlXxQ4X5rjgizcJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420194},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"5d8eccfbb12f127fa85b71623bc9d4e9e6267051","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.4.0_1776611079506_0.5489375767485518","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@assassin1717/aifelib","version":"1.5.0","_id":"@assassin1717/aifelib@1.5.0","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"3441f436e688b98dbae80c7210152db5ab2613a8","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.5.0.tgz","fileCount":8,"integrity":"sha512-0PByT4ki4S+C/0XAZDyTX2LESYNrWYio4hM12g9DFVsF9BMdGK0PKil0dC7zCQgNghVY9Wwr6gsJrfys7AxQhg==","signatures":[{"sig":"MEUCIQD6n9vVVwQwubQ+Vh0RrlHeALQi1PBDPoK+VyFCbu510QIgTlOxnJXiIwKe33eD0Nhw+VMaCnFsNh2gitwwlYBqrNU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":442718},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"ed82cba510a19679364823c13afb3127744db211","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":"^3.0.0 || ^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.5.0_1777457624055_0.8714189944376511","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@assassin1717/aifelib","version":"1.5.1","_id":"@assassin1717/aifelib@1.5.1","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"3b25ee1c95d00a6974d69826c5291441f86dfd8e","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.5.1.tgz","fileCount":8,"integrity":"sha512-u5j2ZaxfYpeVc+z4orDQN+xsQQu8tAQOeOkSpndmTsjebWMFcUcGquqzgZhBBLU984p2Q/zZKtIuG7z74rauVQ==","signatures":[{"sig":"MEUCIASkVo3HR9b+uD72efpRquAEYkA6oOh1aRrR5HhHWFX3AiEAvyu8N8UpZadfbYh31ShA/P4+Fi1dWGoZTH/s5Q3BYCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":442944},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"0c76e8fe0820cb6e403592a76959819c3fb311df","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":"^3.0.0 || ^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.5.1_1779530826694_0.30871189139583","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"@assassin1717/aifelib","version":"1.5.2","_id":"@assassin1717/aifelib@1.5.2","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"d4e4ab9f867e0c8f7072dd29378a40891413312d","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.5.2.tgz","fileCount":422,"integrity":"sha512-YTZRDWGDkoDprQCUqAS19fGJNIdGZnDB8g2w+Hv7SzF7VDdGLv0ZSigww196hyJCyuXuxT/I4Bc1IZlWiNWlxQ==","signatures":[{"sig":"MEUCIBqGtq4xRVOzeocILxpzIzlvAWlVaPacduN290VqgnKOAiEA29XpO+PBurMbeF9SP1LiOFYAOZE1DoSeC3daYgwQ854=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":595309},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"6fb4d7dfc109ac05d6a3f9bd4960c8e2fb8a35c5","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup && tsc -p tsconfig.build.json","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":"^3.0.0 || ^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.5.2_1780249612704_0.5815533157497812","host":"s3://npm-registry-packages-npm-production"}},"1.5.3":{"name":"@assassin1717/aifelib","version":"1.5.3","_id":"@assassin1717/aifelib@1.5.3","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"3f3dc4af45f9fa2011bd7ba34c6449bd3e9fec79","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.5.3.tgz","fileCount":8,"integrity":"sha512-vVugSjR9pGqTktOmdtQ6Cpq3FGioSyQFklvAjRx/dEAo5Wwq7/HZADGy7VYG1jx3GzLrmxr7ou144dU8ZYDahQ==","signatures":[{"sig":"MEUCIFBeg5gFgHDL3VWwUthAE/mZHlQZ2YShD3CYEuEbw4t3AiEAqyak5eC4vTEfMzHYC29Af8gkyP9tox6Z65/nnRRFNqU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":443970},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"7f2534b9d6f4a1fc4ec54fdd622a6d996b05c7c7","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":"^3.0.0 || ^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.5.3_1780304252948_0.3107933683126942","host":"s3://npm-registry-packages-npm-production"}},"1.5.4":{"name":"@assassin1717/aifelib","version":"1.5.4","_id":"@assassin1717/aifelib@1.5.4","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"dist":{"shasum":"db0edf09aeb316a8472c9635214b6070d8d27ea4","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.5.4.tgz","fileCount":8,"integrity":"sha512-HsRjtDqjTbGKonLTDZcSjvJ9ZjiYXmM+nANWmqI7DRKiWfcZc4vBa95o1rJHOOmNHDaeTDPuXOb/lC09TrYHNA==","signatures":[{"sig":"MEYCIQDTJ5zR50/aoOYRsDVltnqlUXP5OaWG4U/g87le0wKIiwIhAJC2Jw5aM27YZmhKCvvLsqxs4MTOg62Rfk+KRzogou/5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444598},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"641ea5c6c5513edf3e3e0de95b6ec323d34731f0","release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]],"branches":["main"]},"scripts":{"dev":"storybook dev -p 6006","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","build-storybook":"storybook build"},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"_npmVersion":"10.9.8","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vite":"^5.0.0","jsdom":"^25.0.0","react":"^18.0.0","eslint":"^8.0.0","vitest":"^2.0.0","postcss":"^8.4.0","chromatic":"^16.2.0","react-dom":"^18.0.0","storybook":"^8.0.0","typescript":"^5.0.0","tailwindcss":"^3.4.0","@types/react":"^18.0.0","autoprefixer":"^10.4.0","@storybook/react":"^8.0.0","@types/react-dom":"^18.0.0","semantic-release":"^24.0.0","eslint-plugin-react":"^7.0.0","@vitejs/plugin-react":"^4.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^12.0.0","@storybook/react-vite":"^8.0.0","@testing-library/react":"^16.0.0","@testing-library/jest-dom":"^6.0.0","@typescript-eslint/parser":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","@storybook/addon-essentials":"^8.0.0","@testing-library/user-event":"^14.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/release-notes-generator":"^14.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":"^3.0.0 || ^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/aifelib_1.5.4_1780840620043_0.4926216961337504","host":"s3://npm-registry-packages-npm-production"}},"1.5.5":{"name":"@assassin1717/aifelib","version":"1.5.5","description":"Private UI component library — React + TypeScript + Tailwind + Lucide","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"sideEffects":false,"scripts":{"dev":"storybook dev -p 6006","build":"tsup","build-storybook":"storybook build","test":"vitest run","test:watch":"vitest","lint":"eslint src --ext .ts,.tsx","type-check":"tsc --noEmit"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","tailwindcss":"^3.0.0 || ^4.0.0"},"release":{"branches":["main"],"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm",["@semantic-release/git",{"assets":["package.json"],"message":"chore(release): ${nextRelease.version} [skip ci]"}]]},"devDependencies":{"@semantic-release/commit-analyzer":"^13.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^13.1.5","@semantic-release/release-notes-generator":"^14.0.0","@storybook/react":"^10.5.6","@storybook/react-vite":"^10.5.6","@testing-library/jest-dom":"^6.0.0","@testing-library/react":"^16.0.0","@testing-library/user-event":"^14.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@typescript-eslint/eslint-plugin":"^7.0.0","@typescript-eslint/parser":"^7.0.0","@vitejs/plugin-react":"^6.0.5","autoprefixer":"^10.4.0","chromatic":"^16.2.0","eslint":"^8.0.0","eslint-plugin-react":"^7.0.0","eslint-plugin-react-hooks":"^4.0.0","jsdom":"^25.0.0","postcss":"^8.4.0","react":"^18.0.0","react-dom":"^18.0.0","semantic-release":"^25.0.8","storybook":"^10.5.6","tailwindcss":"^3.4.0","tsup":"^8.0.0","typescript":"^5.0.0","vite":"^8.2.0","vitest":"^4.1.10"},"dependencies":{"clsx":"^2.1.0","lucide-react":"^0.400.0","tailwind-merge":"^2.3.0"},"engines":{"node":">=20"},"publishConfig":{"access":"public"},"gitHead":"59eea75bbd9db06966729b36388f2caee9ab76f0","_id":"@assassin1717/aifelib@1.5.5","_nodeVersion":"22.23.2","_npmVersion":"11.19.0","dist":{"integrity":"sha512-70mO4pGlabJG9I984XhkPbonaDeL1i7CI5Wnf95J67b67qzn5WfsgPNJuhRK/Zg9spJDCdXNsenrVtgXtHFFcQ==","shasum":"bdf05bb0b574b985ce4870e8491f232b0d901492","tarball":"https://registry.npmjs.org/@assassin1717/aifelib/-/aifelib-1.5.5.tgz","fileCount":8,"unpackedSize":444557,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCcNkG/u8n0ySgo/DbaBb5RlUNCSDZusfwXDvACbGL05AIgXUbHRGgQlTDhF4m54T29f5W7u8HowqvJrO1HqiblN8E="}]},"_npmUser":{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"},"directories":{},"maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/aifelib_1.5.5_1785931290237_0.9636301936817719"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-13T09:09:54.760Z","modified":"2026-08-05T12:01:30.548Z","1.0.0":"2026-04-13T09:09:55.012Z","1.0.1":"2026-04-13T09:41:46.979Z","1.1.0":"2026-04-13T10:17:34.073Z","1.2.0":"2026-04-13T13:15:45.111Z","1.3.0":"2026-04-14T08:59:56.446Z","1.3.1":"2026-04-14T13:39:20.728Z","1.3.2":"2026-04-15T09:32:37.107Z","1.3.3":"2026-04-17T18:27:06.976Z","1.4.0":"2026-04-19T15:04:39.748Z","1.5.0":"2026-04-29T10:13:44.192Z","1.5.1":"2026-05-23T10:07:06.858Z","1.5.2":"2026-05-31T17:46:52.846Z","1.5.3":"2026-06-01T08:57:33.099Z","1.5.4":"2026-06-07T13:57:00.219Z","1.5.5":"2026-08-05T12:01:30.385Z"},"description":"Private UI component library — React + TypeScript + Tailwind + Lucide","maintainers":[{"name":"assassin1717","email":"tiago.eugenio.andre@gmail.com"}],"readme":"# @assassin1717/aifelib\n\nPrivate UI component library — React + TypeScript + Tailwind CSS + Lucide Icons.\n\nBuilt to standardize frontend across all internal apps: consistent visuals, mobile-first, accessible, and easy for AI agents to use.\n\n---\n\n## Install\n\n```bash\nnpm install @assassin1717/aifelib\n```\n\nPeer dependencies (must be installed in the consuming app):\n\n```bash\nnpm install react react-dom\n```\n\nTailwind CSS must be configured in the consuming app. Add the library path to your `content` array so Tailwind scans its classes:\n\n```js\n// tailwind.config.js / tailwind.config.ts\ncontent: [\n  \"./src/**/*.{ts,tsx}\",\n  \"./node_modules/@assassin1717/aifelib/dist/**/*.js\",\n]\n```\n\n---\n\n## Setup\n\nWrap your app with `ToastProvider` (required for `useToast` to work):\n\n```tsx\nimport { ToastProvider } from \"@assassin1717/aifelib\";\n\nfunction App() {\n  return (\n    <ToastProvider>\n      <YourApp />\n    </ToastProvider>\n  );\n}\n```\n\n---\n\n## Dark Mode\n\nAll components support dark mode via Tailwind's `class` strategy. Add the `dark` class to your `<html>` element (or any wrapper) to activate it:\n\n```html\n<!-- entire app in dark mode -->\n<html class=\"dark\">\n```\n\n```tsx\n// controlled dark mode (e.g. with a toggle)\n<div className={isDark ? \"dark\" : \"\"}>\n  <YourApp />\n</div>\n```\n\nMake sure your Tailwind config also has `darkMode: \"class\"`:\n\n```ts\n// tailwind.config.ts\nexport default {\n  darkMode: \"class\",\n  content: [\n    \"./src/**/*.{ts,tsx}\",\n    \"./node_modules/@assassin1717/aifelib/dist/**/*.js\",\n  ],\n};\n```\n\n---\n\n## Server Components (RSC)\n\nThe library ships as a single bundle marked `\"use client\"`, so every component\nis a Client Component. You can still import and render any component **inside** a\nServer Component (Next.js App Router, etc.) without crashing — a Server Component\nis allowed to render Client Components.\n\n```tsx\n// app/products/page.tsx — a Server Component\nimport { Badge, PageHeader } from \"@assassin1717/aifelib\";\n\nexport default function ProductsPage() {\n  return (\n    <>\n      <PageHeader title=\"Products\" />\n      <Badge variant=\"success\">In stock</Badge>\n    </>\n  );\n}\n```\n\nThe component renders on the client; the surrounding page stays a Server\nComponent. Shipping a single bundle (rather than one module per component) keeps\nmodule resolution reliable across every consumer — Next.js/Turbopack, Vite, and\nstrict Node ESM (e.g. Vitest) all resolve it the same way.\n\n---\n\n## Components\n\n### Phase 1 — Form\n\n#### Button\n\n```tsx\nimport { Button } from \"@assassin1717/aifelib\";\n\n<Button>Save</Button>\n<Button variant=\"destructive\" size=\"lg\">Delete</Button>\n<Button loading>Saving…</Button>\n<Button fullWidth>Submit</Button>\n```\n\nProps:\n- `variant`: `\"primary\"` | `\"secondary\"` | `\"ghost\"` | `\"destructive\"` | `\"outline\"` — default `\"primary\"`\n- `size`: `\"sm\"` | `\"md\"` | `\"lg\"` — default `\"md\"`\n- `loading`: `boolean` — shows spinner, disables button\n- `fullWidth`: `boolean` — `w-full`\n- All native `<button>` props\n\n#### Input\n\n```tsx\nimport { Input } from \"@assassin1717/aifelib\";\nimport { Search } from \"lucide-react\";\n\n<Input placeholder=\"Email\" type=\"email\" />\n<Input error placeholder=\"Invalid value\" />\n<Input startIcon={<Search size={16} />} placeholder=\"Search…\" />\n```\n\nProps:\n- `error`: `boolean` — red border + `aria-invalid`\n- `startIcon`: `ReactNode` — icon on the left\n- `endIcon`: `ReactNode` — icon on the right\n- All native `<input>` props\n\n#### Textarea\n\n```tsx\nimport { Textarea } from \"@assassin1717/aifelib\";\n\n<Textarea placeholder=\"Description\" rows={4} />\n<Textarea error />\n```\n\nProps:\n- `error`: `boolean`\n- All native `<textarea>` props\n\n#### Select\n\n```tsx\nimport { Select } from \"@assassin1717/aifelib\";\n\n<Select\n  options={[\n    { value: \"admin\", label: \"Admin\" },\n    { value: \"user\", label: \"User\" },\n  ]}\n  placeholder=\"Choose role…\"\n/>\n```\n\nProps:\n- `options`: `{ value: string; label: string; disabled?: boolean }[]`\n- `placeholder`: `string` — disabled first option\n- `error`: `boolean`\n- All native `<select>` props\n\n#### Checkbox\n\n```tsx\nimport { Checkbox } from \"@assassin1717/aifelib\";\n\n<Checkbox label=\"Accept terms\" />\n<Checkbox label=\"Required\" error />\n```\n\nProps:\n- `label`: `string` — inline label (renders its own `<label>`)\n- `error`: `boolean`\n- All native `<input type=\"checkbox\">` props except `type`\n\n#### Label\n\n```tsx\nimport { Label } from \"@assassin1717/aifelib\";\n\n<Label htmlFor=\"email\" required>Email</Label>\n```\n\nProps:\n- `required`: `boolean` — appends a red `*`\n- All native `<label>` props\n\n#### FormField\n\nComposes Label + any input child. Automatically injects `id`, `error`, and `aria-describedby` into the child.\n\n```tsx\nimport { FormField, Input } from \"@assassin1717/aifelib\";\n\n<FormField label=\"Email\" htmlFor=\"email\" required error=\"Invalid email\">\n  <Input id=\"email\" type=\"email\" />\n</FormField>\n\n<FormField label=\"Bio\" htmlFor=\"bio\" hint=\"Max 200 characters\">\n  <Textarea id=\"bio\" />\n</FormField>\n```\n\nProps:\n- `label`: `string`\n- `htmlFor`: `string` — links label to input\n- `required`: `boolean`\n- `hint`: `string` — helper text shown below input (hidden when error is set)\n- `error`: `string` — error message shown below input with `role=\"alert\"`\n\n---\n\n### Phase 2 — Feedback & Overlays\n\n#### Spinner\n\n```tsx\nimport { Spinner } from \"@assassin1717/aifelib\";\n\n<Spinner />\n<Spinner size=\"lg\" label=\"Loading users…\" />\n```\n\nProps:\n- `size`: `\"sm\"` | `\"md\"` | `\"lg\"` — default `\"md\"`\n- `label`: `string` — aria-label for screen readers — default `\"Loading…\"`\n\n#### Badge\n\n```tsx\nimport { Badge } from \"@assassin1717/aifelib\";\n\n<Badge>Default</Badge>\n<Badge variant=\"success\">Active</Badge>\n<Badge variant=\"destructive\">Error</Badge>\n```\n\nProps:\n- `variant`: `\"default\"` | `\"success\"` | `\"warning\"` | `\"destructive\"` | `\"info\"` | `\"outline\"` — default `\"default\"`\n- All native `<span>` props\n\n#### Alert\n\n```tsx\nimport { Alert } from \"@assassin1717/aifelib\";\n\n<Alert variant=\"success\" title=\"Saved\" onDismiss={() => {}}>\n  Your changes have been saved.\n</Alert>\n```\n\nProps:\n- `variant`: `\"info\"` | `\"success\"` | `\"warning\"` | `\"destructive\"` — default `\"info\"`\n- `title`: `string`\n- `onDismiss`: `() => void` — shows dismiss button\n- `children`: message body\n\n#### Card\n\n```tsx\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from \"@assassin1717/aifelib\";\n\n<Card>\n  <CardHeader>\n    <CardTitle>Users</CardTitle>\n    <CardDescription>Manage your team members.</CardDescription>\n  </CardHeader>\n  <CardContent>Content here</CardContent>\n  <CardFooter>\n    <Button>Save</Button>\n  </CardFooter>\n</Card>\n```\n\n`Card` props:\n- `padding`: `\"none\"` | `\"sm\"` | `\"md\"` | `\"lg\"` — default `\"md\"`\n\n#### Modal\n\n```tsx\nimport { Modal, Button } from \"@assassin1717/aifelib\";\n\nconst [open, setOpen] = useState(false);\n\n<Modal\n  open={open}\n  onClose={() => setOpen(false)}\n  title=\"Edit user\"\n  description=\"Update the user details below.\"\n  size=\"md\"\n  footer={\n    <>\n      <Button variant=\"ghost\" onClick={() => setOpen(false)}>Cancel</Button>\n      <Button onClick={handleSave}>Save</Button>\n    </>\n  }\n>\n  <FormField label=\"Name\" htmlFor=\"name\">\n    <Input id=\"name\" />\n  </FormField>\n</Modal>\n```\n\nProps:\n- `open`: `boolean`\n- `onClose`: `() => void` — called on backdrop click and ESC key\n- `title`: `string`\n- `description`: `string`\n- `size`: `\"sm\"` | `\"md\"` | `\"lg\"` | `\"xl\"` | `\"full\"` — default `\"md\"`\n- `footer`: `ReactNode` — action buttons slot (rendered inside the modal)\n- `children`: modal body\n\nBehaviour: focus trap, ESC to close, body scroll lock, bottom sheet on mobile / centered dialog on `sm+`.\n\n#### ConfirmDialog\n\n```tsx\nimport { ConfirmDialog } from \"@assassin1717/aifelib\";\n\n<ConfirmDialog\n  open={open}\n  onClose={() => setOpen(false)}\n  onConfirm={handleDelete}\n  title=\"Delete user\"\n  description=\"This action cannot be undone.\"\n  variant=\"destructive\"\n  confirmLabel=\"Delete\"\n  loading={isDeleting}\n/>\n```\n\nProps:\n- `open`: `boolean`\n- `onClose`: `() => void`\n- `onConfirm`: `() => void`\n- `title`: `string`\n- `description`: `string`\n- `variant`: `\"primary\"` | `\"destructive\"` — default `\"primary\"`\n- `confirmLabel`: `string` — default `\"Confirm\"`\n- `cancelLabel`: `string` — default `\"Cancel\"`\n- `loading`: `boolean`\n\n#### ToastMessage\n\n```tsx\nimport { useToast } from \"@assassin1717/aifelib\";\n\nfunction MyComponent() {\n  const { addToast } = useToast();\n\n  return (\n    <Button onClick={() => addToast({ type: \"success\", title: \"Saved\", description: \"Changes saved.\" })}>\n      Save\n    </Button>\n  );\n}\n```\n\n`addToast` options:\n- `type`: `\"success\"` | `\"error\"` | `\"warning\"` | `\"info\"`\n- `title`: `string`\n- `description`: `string`\n- `duration`: `number` — ms before auto-dismiss, default `5000`. Pass `0` to disable auto-dismiss.\n\nRequires `<ToastProvider>` at the root of the app.\n\n---\n\n### Phase 3 — Data Display\n\n#### Table\n\nMobile: each row renders as a card with `label: value` pairs. Desktop: standard table with horizontal scroll.\n\n```tsx\nimport {\n  Table, TableHeader, TableBody, TableRow,\n  TableHead, TableCell, TableToolbar, TableEmptyState\n} from \"@assassin1717/aifelib\";\n\n<TableToolbar\n  filters={<Input placeholder=\"Search…\" />}\n  actions={<Button>Add user</Button>}\n/>\n\n<Table>\n  <TableHeader>\n    <TableRow>\n      <TableHead>Name</TableHead>\n      <TableHead>Status</TableHead>\n      <TableHead align=\"right\">Actions</TableHead>\n    </TableRow>\n  </TableHeader>\n  <TableBody>\n    {users.length === 0 ? (\n      <TableEmptyState colSpan={3} title=\"No users found\" description=\"Add your first user.\" />\n    ) : (\n      users.map(user => (\n        <TableRow key={user.id}>\n          <TableCell label=\"Name\">{user.name}</TableCell>\n          <TableCell label=\"Status\"><Badge variant=\"success\">Active</Badge></TableCell>\n          <TableCell label=\"Actions\" align=\"right\"><Button size=\"sm\">Edit</Button></TableCell>\n        </TableRow>\n      ))\n    )}\n  </TableBody>\n</Table>\n```\n\n**Important:** Always pass `label` to `TableCell` — it's the column header shown on mobile cards.\n\n`TableHead` / `TableCell` props:\n- `align`: `\"left\"` | `\"center\"` | `\"right\"` — default `\"left\"`\n\n`TableCell` extra props:\n- `label`: `string` — column name shown on mobile\n\n`TableEmptyState` props:\n- `colSpan`: `number` — must match number of columns\n- `title`: `string`\n- `description`: `string`\n- `icon`: `ReactNode`\n- `action`: `ReactNode` — action button\n\n`TableToolbar` props:\n- `filters`: `ReactNode` — left slot (search, selects)\n- `actions`: `ReactNode` — right slot (buttons)\n\n#### PageHeader\n\n```tsx\nimport { PageHeader, Button } from \"@assassin1717/aifelib\";\n\n<PageHeader\n  title=\"Users\"\n  description=\"Manage your team members.\"\n  actions={\n    <>\n      <Button variant=\"outline\">Export</Button>\n      <Button>Add user</Button>\n    </>\n  }\n/>\n```\n\nProps:\n- `title`: `string`\n- `description`: `string`\n- `prefix`: `ReactNode` — breadcrumb or back link\n- `actions`: `ReactNode` — right slot, stacks on mobile\n\n#### EmptyState\n\n```tsx\nimport { EmptyState, Button } from \"@assassin1717/aifelib\";\nimport { Users } from \"lucide-react\";\n\n<EmptyState\n  icon={<Users size={48} />}\n  title=\"No users yet\"\n  description=\"Add your first team member to get started.\"\n  action={<Button>Add user</Button>}\n  secondaryAction={<Button variant=\"ghost\">Learn more</Button>}\n/>\n```\n\nProps:\n- `icon`: `ReactNode`\n- `title`: `string`\n- `description`: `string`\n- `action`: `ReactNode` — primary button\n- `secondaryAction`: `ReactNode` — secondary button\n\n---\n\n### Phase 4 — Navigation & Extras\n\n#### Tabs\n\n```tsx\nimport { Tabs, TabPanel } from \"@assassin1717/aifelib\";\n\nconst [tab, setTab] = useState(\"overview\");\n\n<Tabs\n  tabs={[\n    { value: \"overview\", label: \"Overview\" },\n    { value: \"members\", label: \"Members\" },\n    { value: \"settings\", label: \"Settings\", disabled: true },\n  ]}\n  value={tab}\n  onChange={setTab}\n>\n  <TabPanel value=\"overview\" activeValue={tab}>Overview content</TabPanel>\n  <TabPanel value=\"members\" activeValue={tab}>Members content</TabPanel>\n</Tabs>\n```\n\n`Tabs` props:\n- `tabs`: `{ value: string; label: string; disabled?: boolean }[]`\n- `value`: `string` — controlled active tab\n- `onChange`: `(value: string) => void`\n\n`TabPanel` props:\n- `value`: `string` — this panel's tab value\n- `activeValue`: `string` — currently active tab value\n\nBehaviour: horizontal scroll when tabs overflow on mobile, arrow key navigation.\n\n#### DropdownMenu\n\n```tsx\nimport { DropdownMenu, Button } from \"@assassin1717/aifelib\";\nimport { Edit, Trash2, MoreHorizontal } from \"lucide-react\";\n\n<DropdownMenu\n  trigger={<Button variant=\"ghost\" size=\"sm\"><MoreHorizontal size={16} /></Button>}\n  align=\"right\"\n  items={[\n    { label: \"Edit\", icon: <Edit size={14} />, onClick: handleEdit },\n    { label: \"Delete\", icon: <Trash2 size={14} />, destructive: true, divider: true, onClick: handleDelete },\n  ]}\n/>\n```\n\nProps:\n- `trigger`: `ReactNode` — the button that opens the menu\n- `items`: `DropdownMenuItem[]`\n- `align`: `\"left\"` | `\"right\"` — default `\"right\"`\n\n`DropdownMenuItem`:\n- `label`: `string`\n- `onClick`: `() => void`\n- `icon`: `ReactNode`\n- `disabled`: `boolean`\n- `destructive`: `boolean` — red styling\n- `divider`: `boolean` — visual separator above item\n\nBehaviour: closes on outside click, ESC, or item selection. Focus returns to trigger on ESC.\n\n#### Pagination\n\n```tsx\nimport { Pagination } from \"@assassin1717/aifelib\";\n\nconst [page, setPage] = useState(1);\n\n<Pagination page={page} totalPages={20} onChange={setPage} />\n```\n\nProps:\n- `page`: `number`\n- `totalPages`: `number`\n- `onChange`: `(page: number) => void`\n- `siblingCount`: `number` — page buttons around current, default `1`\n\nMobile: shows `\"X / Y\"` compact label instead of page buttons. Returns `null` when `totalPages <= 1`.\n\n#### Drawer\n\n```tsx\nimport { Drawer, Button } from \"@assassin1717/aifelib\";\n\n<Drawer\n  open={open}\n  onClose={() => setOpen(false)}\n  title=\"Filters\"\n  side=\"right\"\n  footer={\n    <>\n      <Button variant=\"ghost\" onClick={() => setOpen(false)}>Cancel</Button>\n      <Button onClick={applyFilters}>Apply</Button>\n    </>\n  }\n>\n  <FormField label=\"Status\" htmlFor=\"status\">\n    <Select id=\"status\" options={statusOptions} />\n  </FormField>\n</Drawer>\n```\n\nProps:\n- `open`: `boolean`\n- `onClose`: `() => void`\n- `title`: `string`\n- `description`: `string`\n- `side`: `\"right\"` | `\"left\"` — default `\"right\"`\n- `widthClass`: `string` — Tailwind width class for desktop, default `\"sm:w-96\"`\n- `footer`: `ReactNode` — action buttons slot\n\nBehaviour: same as Modal (focus trap, ESC, scroll lock). Bottom sheet on mobile, side panel on `sm+`.\n\n#### Tooltip\n\n```tsx\nimport { Tooltip, Button } from \"@assassin1717/aifelib\";\n\n<Tooltip content=\"Save your changes\" side=\"top\">\n  <Button>Save</Button>\n</Tooltip>\n```\n\nProps:\n- `content`: `string`\n- `side`: `\"top\"` | `\"bottom\"` | `\"left\"` | `\"right\"` — default `\"top\"`\n- `children`: single `ReactElement` — must accept `onMouseEnter`, `onMouseLeave`, `onFocus`, `onBlur`\n\nBehaviour: visible on hover and keyboard focus.\n\n---\n\n### Phase 5 — App Shell\n\n#### AppShell\n\nFull-page layout with fixed sidebar (desktop) + Drawer sidebar (mobile).\n\n```tsx\nimport { AppShell } from \"@assassin1717/aifelib\";\nimport { LayoutDashboard, Users, Settings } from \"lucide-react\";\n\n<AppShell\n  sidebar={{\n    logo: <span className=\"font-bold text-blue-600\">MyApp</span>,\n    groups: [\n      {\n        items: [\n          { label: \"Dashboard\", href: \"/\", icon: <LayoutDashboard size={18} />, active: true },\n          { label: \"Users\", href: \"/users\", icon: <Users size={18} /> },\n        ],\n      },\n      {\n        title: \"Config\",\n        items: [\n          { label: \"Settings\", href: \"/settings\", icon: <Settings size={18} /> },\n        ],\n      },\n    ],\n    footer: <div className=\"text-sm text-gray-500\">v1.0.0</div>,\n  }}\n  topbar={{ title: \"Dashboard\" }}\n>\n  <PageHeader title=\"Dashboard\" />\n  {/* page content */}\n</AppShell>\n```\n\n`AppShell` props:\n- `sidebar`: `SidebarProps` — see Sidebar below\n- `topbar`: `TopbarProps` (without `onMenuOpen`) — omit to hide topbar entirely\n- `children`: page content rendered in the scrollable main area\n\n#### Sidebar\n\nCan be used standalone (e.g. inside a custom layout).\n\n```tsx\nimport { Sidebar } from \"@assassin1717/aifelib\";\n\n<Sidebar\n  logo={<img src=\"/logo.svg\" alt=\"MyApp\" className=\"h-8\" />}\n  groups={[\n    {\n      items: [\n        { label: \"Dashboard\", href: \"/\", active: true },\n        { label: \"Users\", href: \"/users\", badge: 3 },\n        { label: \"Archived\", href: \"/archived\", disabled: true },\n      ],\n    },\n  ]}\n  footer={<Button variant=\"ghost\" fullWidth>Logout</Button>}\n/>\n```\n\n`SidebarNavItem`:\n- `label`: `string`\n- `href`: `string` — renders as `<a>`, omit to render as `<button>`\n- `icon`: `ReactNode`\n- `active`: `boolean` — highlights item, sets `aria-current=\"page\"`\n- `disabled`: `boolean`\n- `onClick`: `() => void`\n- `badge`: `string | number` — shown on the right\n\n`SidebarNavGroup`:\n- `title`: `string` — optional group heading\n- `items`: `SidebarNavItem[]`\n\n#### Topbar\n\n```tsx\nimport { Topbar } from \"@assassin1717/aifelib\";\n\n<Topbar\n  onMenuOpen={() => setSidebarOpen(true)}\n  title=\"Users\"\n  actions={<Avatar name=\"Tiago\" />}\n/>\n```\n\nProps:\n- `onMenuOpen`: `() => void` — hamburger button handler (button hidden on `sm+`)\n- `title`: `ReactNode`\n- `actions`: `ReactNode` — right slot\n- `hideMenuButton`: `boolean` — hides the hamburger\n\n---\n\n### Phase 5 — Extras (continued)\n\n#### StatsCard\n\nMetric card with label, value and optional trend indicator.\n\n```tsx\nimport { StatsCard } from \"@assassin1717/aifelib\";\nimport { Users } from \"lucide-react\";\n\n<StatsCard\n  label=\"Total Users\"\n  value=\"1,284\"\n  trend={{ direction: \"up\", value: \"+12%\" }}\n  icon={<Users size={20} />}\n/>\n```\n\nProps:\n- `label`: `string`\n- `value`: `string | number`\n- `trend`: `{ direction: \"up\" | \"down\" | \"neutral\"; value: string }` — optional trend badge\n- `icon`: `ReactNode` — optional icon in the top-right corner\n- `size`: `\"sm\"` | `\"md\"` — default `\"md\"`\n\n#### Grid\n\nResponsive CSS grid wrapper.\n\n```tsx\nimport { Grid } from \"@assassin1717/aifelib\";\n\n<Grid cols={3} gap=\"md\">\n  <StatsCard label=\"Users\" value=\"1,284\" />\n  <StatsCard label=\"Revenue\" value=\"$42k\" />\n  <StatsCard label=\"Uptime\" value=\"99.9%\" />\n</Grid>\n```\n\nProps:\n- `cols`: `1` | `2` | `3` | `4` | `6` | `12` — default `1`\n- `gap`: `\"none\"` | `\"sm\"` | `\"md\"` | `\"lg\"` — default `\"md\"`\n- `responsive`: `{ sm?: GridCols; md?: GridCols; lg?: GridCols }` — breakpoint overrides\n\n---\n\n### New Components\n\n#### Skeleton\n\nPulsing placeholder for loading states. Prevents layout shift while content loads.\n\n```tsx\nimport { Skeleton, SkeletonCard } from \"@assassin1717/aifelib\";\n\n// custom shapes\n<Skeleton className=\"h-4 w-48\" />\n<Skeleton className=\"h-32 w-full\" />\n\n// pre-built card preset\n<SkeletonCard />\n<SkeletonCard className=\"w-80\" />\n```\n\n`Skeleton` props:\n- `className` — Tailwind width/height classes (required to give it dimensions)\n- `animate`: `boolean` — pulse animation, default `true`\n\n`SkeletonCard` props:\n- `className` — additional Tailwind classes\n\n#### SectionHeader\n\nTitle + description + actions slot for sections within a page. Distinct from `PageHeader` which is used at page level.\n\n```tsx\nimport { SectionHeader, Button } from \"@assassin1717/aifelib\";\n\n<SectionHeader\n  title=\"Recent Ideas\"\n  description=\"Ideas submitted in the last 7 days.\"\n  actions={<Button size=\"sm\">View all</Button>}\n/>\n```\n\nProps:\n- `title`: `string`\n- `description`: `string`\n- `actions`: `ReactNode` — right slot\n- `className`: `string`\n\n#### DateInput\n\nNative `<input type=\"date\">` with consistent styling matching `Input`. Supports dark mode date picker icon via `color-scheme`.\n\n```tsx\nimport { DateInput } from \"@assassin1717/aifelib\";\n\nconst [date, setDate] = useState(\"\");\n\n<DateInput value={date} onChange={setDate} />\n<DateInput value={date} onChange={setDate} error min=\"2024-01-01\" max=\"2026-12-31\" />\n```\n\nProps:\n- `value`: `string` — ISO date string (`YYYY-MM-DD`)\n- `onChange`: `(value: string) => void`\n- `error`: `boolean` — red border\n- `min` / `max`: `string` — ISO date bounds\n- All native `<input type=\"date\">` props except `type` and `onChange`\n\nCompose with `FormField` for labels and error messages:\n\n```tsx\n<FormField label=\"Retention date\" htmlFor=\"ret\" error={errors.date}>\n  <DateInput id=\"ret\" value={date} onChange={setDate} error={!!errors.date} />\n</FormField>\n```\n\n#### FileUpload\n\nDrag-and-drop file input with click-to-upload fallback.\n\n```tsx\nimport { FileUpload } from \"@assassin1717/aifelib\";\n\n<FileUpload\n  accept=\".pdf,.jpg,.png\"\n  multiple\n  onFiles={(files) => handleUpload(files)}\n  hint=\"PDF, JPG or PNG up to 10MB\"\n  error={uploadError}\n  loading={isUploading}\n/>\n```\n\nProps:\n- `onFiles`: `(files: File[]) => void` — called with selected/dropped files\n- `accept`: `string` — MIME types or extensions (e.g. `\".pdf,.jpg\"`)\n- `multiple`: `boolean` — allow selecting multiple files\n- `hint`: `string` — helper text shown inside the drop zone\n- `error`: `string` — error message shown below the drop zone\n- `loading`: `boolean` — shows \"Uploading…\" state, disables interaction\n- `disabled`: `boolean`\n- `className`: `string`\n\n#### Slider\n\nRange input with styled track, thumb, and optional value display.\n\n```tsx\nimport { Slider } from \"@assassin1717/aifelib\";\n\nconst [volume, setVolume] = useState(40);\n\n<Slider value={volume} onChange={setVolume} />\n\n<Slider\n  label=\"Price range\"\n  value={price}\n  onChange={setPrice}\n  min={0}\n  max={1000}\n  step={10}\n  showValue\n  formatValue={(v) => `$${v}`}\n  hint=\"Set your maximum budget\"\n/>\n```\n\nProps:\n- `value`: `number` — controlled value\n- `onChange`: `(value: number) => void`\n- `min`: `number` — default `0`\n- `max`: `number` — default `100`\n- `step`: `number` — default `1`\n- `showValue`: `boolean` — shows current value on the right of the label\n- `formatValue`: `(value: number) => string` — custom value formatter, default `String`\n- `label`: `string`\n- `hint`: `string` — helper text\n- `error`: `string` — error message\n- `disabled`: `boolean`\n\n---\n\n## Utilities\n\n### cn\n\nMerges Tailwind classes safely (clsx + tailwind-merge).\n\n```tsx\nimport { cn } from \"@assassin1717/aifelib\";\n\n<div className={cn(\"px-4 py-2\", isActive && \"bg-blue-50\", className)} />\n```\n\n---\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Run Storybook (component explorer)\nnpm run dev\n\n# Run tests\nnpm test\nnpm run test:watch\n\n# Type check\nnpm run type-check\n\n# Lint\nnpm run lint\n\n# Build library\nnpm run build\n```\n\n---\n\n## Release process\n\n1. Work on a feature branch (`dev/<name>`)\n2. Merge to `staging` — pipeline runs lint + type-check + test + build\n3. Bump version in `package.json` (`npm version patch|minor|major`)\n4. Merge `staging` → `main` — pipeline publishes to npm automatically\n\n---\n\n## CI/CD\n\nBitbucket Pipelines (`bitbucket-pipelines.yml`):\n\n| Branch | Steps |\n|---|---|\n| Any push | install → lint + type-check + test (parallel) → build |\n| `staging` | Same as above |\n| `main` | Above + publish to npm |\n\nRequired pipeline variable (set in Bitbucket repository Settings → Pipelines → Variables):\n- `NPM_TOKEN` — npm access token with read+write on `@assassin1717` scope. Mark as **Secured**.\n\n---\n\n## Design decisions\n\n- **No CSS-in-JS** — Tailwind only. No runtime style injection.\n- **No headless UI library** — all components are hand-rolled to keep the bundle small and predictable.\n- **Composition over configuration** — `FormField` injects props into children via `cloneElement`. `Modal`/`Drawer`/`ConfirmDialog` define their own action buttons internally — callers pass callbacks, not buttons.\n- **Mobile-first** — touch targets minimum 44px, bottom sheets on mobile, horizontal scroll on tables replaced by card layout.\n- **Accessibility** — `aria-invalid`, `aria-describedby`, `aria-current`, `role=\"alert\"`, `role=\"status\"`, focus traps in overlays, keyboard navigation in Tabs and DropdownMenu.\n- **`exactOptionalPropertyTypes: true`** — optional props are spread conditionally, never passed as `undefined` explicitly.\n","readmeFilename":"README.md"}