{"_id":"@andreyfedkovich/elegant-grid","_rev":"10-2ac5598e3c60543e6d8f23c194edd3a6","name":"@andreyfedkovich/elegant-grid","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@andreyfedkovich/elegant-grid","version":"1.0.0","_id":"@andreyfedkovich/elegant-grid@1.0.0","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"dcba18901ed79ffeb461ac734ab1677184941d00","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.0.0.tgz","fileCount":90,"integrity":"sha512-XLkUcCVmYryTWK0XR7Fh2m6UA8EQtWU5BEvnQxRatz4xSblaSR4uIWUO2melzFF74Glnx+Zg0IxCHqg0RwxUxA==","signatures":[{"sig":"MEQCIBtPW1QUWrec1dnKZOFTF4sE8ZtuLkZ28E0PCW+RY0pLAiAHgM/e1cSxmE2K3zFRx/62ctyW+HVNXuqDIXNKIPRy+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":471600},"type":"module","gitHead":"85a8882b2f9a7605bdd2b62142602275baaeaa37","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","test:watch":"vitest"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects—just write standard React components","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","react":"^18.3.1","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","react-dom":"^18.3.1","next-themes":"^0.3.0","lucide-react":"^0.462.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.0.0_1768997849903_0.9421403819711425","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@andreyfedkovich/elegant-grid","version":"1.0.1","_id":"@andreyfedkovich/elegant-grid@1.0.1","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"adb9415fd662a468d9da60e21ab9233421afe7a4","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.0.1.tgz","fileCount":90,"integrity":"sha512-Kt4AzwN8yC9Idz4yPnL2SU6qli2D0nOTF5I2vBLf+XqPTwLTNSJmqWdh91AlMDl5qaOeZZVdOqz+7r9XfghbBQ==","signatures":[{"sig":"MEQCIF7+xDmKQRNIycLorxqTVT81dFSVSenWAe3shbmJjCR9AiBv8a2aZLilPKPdsudE0Nt52FBia+KGM1yUXeLetJE/CA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":481406},"type":"module","gitHead":"209136c4632171fd488580b7c1a2ea1f8eb7e374","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","test:watch":"vitest"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","react":"^18.3.1","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","react-dom":"^18.3.1","next-themes":"^0.3.0","lucide-react":"^0.462.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.0.1_1768998794850_0.5578215533654585","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@andreyfedkovich/elegant-grid","version":"1.0.2","_id":"@andreyfedkovich/elegant-grid@1.0.2","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"3c511da6baf67c628bc8695640e5cfedd633bacf","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.0.2.tgz","fileCount":10,"integrity":"sha512-ZXHW1aoxH1xruCnL5pRC2R+dO0UyBWZ8sJ3IEH1VofJGQfz8735i+t8ifGjm+c87tZe/NE1W1GfOwfB1lgkRzw==","signatures":[{"sig":"MEQCIG4ueUAnUaoz2BVH8l/mEt2Q7K9JFEdB18m4c3UGvWhkAiAhEbuLPc7kYmDU91SiOjAUyv8wVW2qwXYOprIXttSNtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194246},"main":"dist/elegant-grid.cjs.js","type":"module","types":"dist/index.d.ts","module":"dist/elegant-grid.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/elegant-grid.es.js","require":"./dist/elegant-grid.cjs.js"}},"gitHead":"46bcdb3d027bf3b9cfc9ab0ed215c1e1a6e63776","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","build:lib":"vite build --mode library","test:watch":"vitest","prepublishOnly":"npm run build:lib"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","next-themes":"^0.3.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","vite-plugin-dts":"^4.5.4","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.0.2_1769095073666_0.3726108307170872","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@andreyfedkovich/elegant-grid","version":"1.0.3","_id":"@andreyfedkovich/elegant-grid@1.0.3","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"a5eaaeb007192d968e4d2e76490fcf8cc771e8d5","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.0.3.tgz","fileCount":11,"integrity":"sha512-JQsL3IG7nZndyVsQubDX+4ACQwi1T2dCnrup/WIyn2qK59+R97fx91r41JO/BVp42xPEJMzoeYYUL6jxy9wYcw==","signatures":[{"sig":"MEUCIQCMmRRv+vKEuFppBgVOXaS0p8wGBW3LnLlbB0PqIx1pKAIgA/Oqrh7/Sjqx2KvN5FZryYZGwcLh5vn4A+t8shK1DlQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196251},"main":"dist/elegant-grid.cjs.js","type":"module","types":"dist/index.d.ts","module":"dist/elegant-grid.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/elegant-grid.es.js","require":"./dist/elegant-grid.cjs.js"},"./styles.css":"./dist/styles.css"},"gitHead":"71ffded7d245a25e9cf2615058c7e263b7b40475","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","build:lib":"vite build --mode library","test:watch":"vitest","prepublishOnly":"npm run build:lib"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","next-themes":"^0.3.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","vite-plugin-dts":"^4.5.4","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.0.3_1769096664844_0.7594660066841397","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@andreyfedkovich/elegant-grid","version":"1.0.4","_id":"@andreyfedkovich/elegant-grid@1.0.4","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"44799c52dfcc2754f4c8151458a2ef27068b7337","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.0.4.tgz","fileCount":11,"integrity":"sha512-75O4ZUKejwNqQZImN9eqvyXqrPtOaUgvTx610/tNnrR306gR/hAA52rce3641D9K2GSOLFtbSUHADw/m+7txKA==","signatures":[{"sig":"MEYCIQDw8F5MsjzcoFMm57djyemBL4cnrbS7LzAvpdxebNv7nQIhAKnC4djDHDV1Q2VRHLrWl9TMgXLgBjHx4RWZNqvYWyke","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215459},"main":"dist/elegant-grid.cjs.js","type":"module","types":"dist/index.d.ts","module":"dist/elegant-grid.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/elegant-grid.es.js","require":"./dist/elegant-grid.cjs.js"},"./styles.css":"./dist/styles.css"},"gitHead":"f7d57869712b359422d40f0d2d84f71c8be3dd18","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","build:lib":"vite build --mode library","test:watch":"vitest","prepublishOnly":"npm run build:lib"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","next-themes":"^0.3.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","vite-plugin-dts":"^4.5.4","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.0.4_1769098255088_0.3290507730736054","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@andreyfedkovich/elegant-grid","version":"1.0.5","_id":"@andreyfedkovich/elegant-grid@1.0.5","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"e54adeea0a8cab792b1066f4ce8693d066fe79d7","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.0.5.tgz","fileCount":11,"integrity":"sha512-XkiGVmY4eTH9Qsgm0ul0TcV/XUXjBXmv3sglZyhRXBFV5T1C7ErpbKSOav6ekbzp9NDEGRqemfOqzCzK9bY0gQ==","signatures":[{"sig":"MEYCIQCVfpNUpZqgNn09xXx4CGgINTQHM0lXndx0uYu7inYvTQIhAPMZRdWWyWJRVzRU9OYTjnRn0LKcLzB+EW7HkQ8fZ4Rl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217472},"main":"dist/elegant-grid.cjs.js","type":"module","types":"dist/index.d.ts","module":"dist/elegant-grid.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/elegant-grid.es.js","require":"./dist/elegant-grid.cjs.js"},"./styles.css":"./dist/styles.css"},"gitHead":"9291917a3360faadc534ad78921d41302c10b28d","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","build:lib":"vite build --mode library","test:watch":"vitest","prepublishOnly":"npm run build:lib"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","next-themes":"^0.3.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","vite-plugin-dts":"^4.5.4","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.0.5_1769191367214_0.6122772450422038","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@andreyfedkovich/elegant-grid","version":"1.0.6","_id":"@andreyfedkovich/elegant-grid@1.0.6","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"da896655e24234095470f31a7819e2b36d2a55d6","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.0.6.tgz","fileCount":11,"integrity":"sha512-llYwgBAcfoMviNtlb7ZEgp7aYcygbPhg4AVwgnDPhAnVpkFyi5F4r5VrkmKgbc9EB1hrW32xUWTVRKQRupuZfA==","signatures":[{"sig":"MEUCIQCvBp5bgBfwZaU9lZ9e3SaYd74vWZ6y4UNHgtZxIVsqMAIgSx1eAUmQb8+AYtI/zwk1WCMRYpL64NHe9idQ4JxTfSU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":260117},"main":"dist/elegant-grid.cjs.js","type":"module","types":"dist/index.d.ts","module":"dist/elegant-grid.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/elegant-grid.es.js","require":"./dist/elegant-grid.cjs.js"},"./styles.css":"./dist/styles.css"},"gitHead":"f965926b6c8eaa293d0502f3f2f7bd9b9cd42d8f","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","build:lib":"vite build --mode library","test:watch":"vitest","prepublishOnly":"npm run build:lib"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","next-themes":"^0.3.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","vite-plugin-dts":"^4.5.4","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.0.6_1769282501564_0.1625674420806229","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@andreyfedkovich/elegant-grid","version":"1.1.0","_id":"@andreyfedkovich/elegant-grid@1.1.0","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"6bb30bbc0af381002f810bc19ee50397a148565e","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.1.0.tgz","fileCount":11,"integrity":"sha512-wJEXwX9O+jzulgZQ6S2jDdrPnRMYshWsT+EjstzkdFj+uvQWhwlKrqQZDXoCg41xBeQ+UE39MxsGXKIAju2frQ==","signatures":[{"sig":"MEUCIH5hXSmtqxGjmlqYvuqXyC4rqnVPd1bSq9k0oXbFjjlyAiEAhVZabeDhNPMxBMSoJRXhELM2SEzTxQ+Yt57yuk9WfeI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277723},"main":"dist/elegant-grid.cjs.js","type":"module","types":"dist/index.d.ts","module":"dist/elegant-grid.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/elegant-grid.es.js","require":"./dist/elegant-grid.cjs.js"},"./styles.css":"./dist/styles.css"},"gitHead":"96582f43b427ba8763929e6ad676d859055a8383","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","build:lib":"vite build --mode library","test:watch":"vitest","prepublishOnly":"npm run build:lib"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","next-themes":"^0.3.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","vite-plugin-dts":"^4.5.4","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.1.0_1769446327669_0.24567050048080685","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@andreyfedkovich/elegant-grid","version":"1.1.1","_id":"@andreyfedkovich/elegant-grid@1.1.1","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"dist":{"shasum":"652108f2a669e5e90a02f7747660a8fef5c162cd","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.1.1.tgz","fileCount":11,"integrity":"sha512-HjpBvwCVp/a959+zjUSrF416+5MzUcJ4jp0lvEND1bC/W+CN03TPNKv7njc5+KQs9ckBdK1CJl+iD6dqIqntGw==","signatures":[{"sig":"MEQCIFU7RsEryO/8XJkW18kydN5TZRe4iQ8oLsMLEl9UhXN/AiAWtatmVeMXtXPveWVgTAqUiJJFgduYXSPSOPU7Bc5e9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277116},"main":"dist/elegant-grid.cjs.js","type":"module","types":"dist/index.d.ts","module":"dist/elegant-grid.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/elegant-grid.es.js","require":"./dist/elegant-grid.cjs.js"},"./styles.css":"./dist/styles.css"},"gitHead":"c0284799903b879e8d849768a0b485060577d0c3","private":false,"scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:dev":"vite build --mode development","build:lib":"vite build --mode library","test:watch":"vitest","prepublishOnly":"npm run build:lib"},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"_npmVersion":"10.8.2","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.25.76","clsx":"^2.1.1","cmdk":"^1.1.1","vaul":"^0.9.9","sonner":"^1.7.4","date-fns":"^3.6.0","recharts":"^2.15.4","input-otp":"^1.4.2","next-themes":"^0.3.0","tailwind-merge":"^2.6.0","react-hook-form":"^7.61.1","vite-plugin-dts":"^4.5.4","react-day-picker":"^8.10.1","react-router-dom":"^6.30.1","@vercel/analytics":"^1.6.1","@hookform/resolvers":"^3.10.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tabs":"^1.1.12","embla-carousel-react":"^8.6.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-toast":"^1.2.14","@tanstack/react-query":"^5.83.0","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-toggle":"^1.1.9","react-resizable-panels":"^2.1.9","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-tooltip":"^1.2.7","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-progress":"^1.1.7","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-navigation-menu":"^1.2.13"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","jsdom":"^20.0.3","eslint":"^9.32.0","vitest":"^3.2.4","globals":"^15.15.0","postcss":"^8.5.6","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.16.5","tailwindcss":"^3.4.17","@types/react":"^18.3.23","autoprefixer":"^10.4.21","lovable-tagger":"^1.1.13","@types/react-dom":"^18.3.7","typescript-eslint":"^8.38.0","@testing-library/react":"^16.0.0","@tailwindcss/typography":"^0.5.16","@vitejs/plugin-react-swc":"^3.11.0","@testing-library/jest-dom":"^6.6.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","lucide-react":">=0.400.0"},"_npmOperationalInternal":{"tmp":"tmp/elegant-grid_1.1.1_1770025436459_0.04810558052329461","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@andreyfedkovich/elegant-grid","private":false,"version":"1.2.0","description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","type":"module","main":"dist/elegant-grid.cjs.js","module":"dist/elegant-grid.es.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/elegant-grid.es.js","require":"./dist/elegant-grid.cjs.js","types":"./dist/index.d.ts"},"./styles.css":"./dist/styles.css"},"peerDependencies":{"lucide-react":">=0.400.0","react":">=18.0.0","react-dom":">=18.0.0"},"scripts":{"build:lib":"vite build --mode library","prepublishOnly":"npm run build:lib","dev":"vite","build":"vite build","build:dev":"vite build --mode development","lint":"eslint .","preview":"vite preview","test":"vitest run","test:watch":"vitest"},"dependencies":{"@hookform/resolvers":"^3.10.0","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-alert-dialog":"^1.1.14","@radix-ui/react-aspect-ratio":"^1.1.7","@radix-ui/react-avatar":"^1.1.10","@radix-ui/react-checkbox":"^1.3.2","@radix-ui/react-collapsible":"^1.1.11","@radix-ui/react-context-menu":"^2.2.15","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-dropdown-menu":"^2.1.15","@radix-ui/react-hover-card":"^1.1.14","@radix-ui/react-label":"^2.1.7","@radix-ui/react-menubar":"^1.1.15","@radix-ui/react-navigation-menu":"^1.2.13","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-progress":"^1.1.7","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-scroll-area":"^1.2.9","@radix-ui/react-select":"^2.2.5","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-tabs":"^1.1.12","@radix-ui/react-toast":"^1.2.14","@radix-ui/react-toggle":"^1.1.9","@radix-ui/react-toggle-group":"^1.1.10","@radix-ui/react-tooltip":"^1.2.7","@tanstack/react-query":"^5.83.0","@vercel/analytics":"^1.6.1","class-variance-authority":"^0.7.1","clsx":"^2.1.1","cmdk":"^1.1.1","date-fns":"^3.6.0","embla-carousel-react":"^8.6.0","input-otp":"^1.4.2","next-themes":"^0.3.0","react-day-picker":"^8.10.1","react-hook-form":"^7.61.1","react-resizable-panels":"^2.1.9","react-router-dom":"^6.30.1","recharts":"^2.15.4","sonner":"^1.7.4","tailwind-merge":"^2.6.0","tailwindcss-animate":"^1.0.7","vaul":"^0.9.9","vite-plugin-dts":"^4.5.4","zod":"^3.25.76"},"devDependencies":{"@eslint/js":"^9.32.0","@tailwindcss/typography":"^0.5.16","@testing-library/jest-dom":"^6.6.0","@testing-library/react":"^16.0.0","@types/node":"^22.16.5","@types/react":"^18.3.23","@types/react-dom":"^18.3.7","@vitejs/plugin-react-swc":"^3.11.0","autoprefixer":"^10.4.21","eslint":"^9.32.0","eslint-plugin-react-hooks":"^5.2.0","eslint-plugin-react-refresh":"^0.4.20","globals":"^15.15.0","jsdom":"^20.0.3","lovable-tagger":"^1.1.13","postcss":"^8.5.6","tailwindcss":"^3.4.17","typescript":"^5.8.3","typescript-eslint":"^8.38.0","vite":"^5.4.19","vitest":"^3.2.4"},"_id":"@andreyfedkovich/elegant-grid@1.2.0","gitHead":"8427b6ce29574d79c9124901e16d2db4edaa9a29","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-JFu2CRcpVrPoQyiwj1SzwJIA7wcOXtBPa06CEBYlkY2FI4JRAfEPA+69g7MHPClBGX+mykZwnHLqvh7sBf0/1A==","shasum":"e791c8d73d24724d7cc366aacf84e0ed75bab3cd","tarball":"https://registry.npmjs.org/@andreyfedkovich/elegant-grid/-/elegant-grid-1.2.0.tgz","fileCount":11,"unpackedSize":280767,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCjld32m3U7LX3tmbycZC+3rAOBOpJtyTJO24JTl4Wu4wIhAKWRLUA3etlG3ZATFcrWpfZO/xooImHJ9dJ1tc9Ob5cY"}]},"_npmUser":{"name":"andreyfedkovich","email":"fedkovich@gmail.com"},"directories":{},"maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/elegant-grid_1.2.0_1779724361170_0.5881933482543926"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-21T12:17:29.812Z","modified":"2026-05-25T15:52:41.394Z","1.0.0":"2026-01-21T12:17:30.085Z","1.0.1":"2026-01-21T12:33:15.053Z","1.0.2":"2026-01-22T15:17:53.834Z","1.0.3":"2026-01-22T15:44:24.997Z","1.0.4":"2026-01-22T16:10:55.247Z","1.0.5":"2026-01-23T18:02:47.361Z","1.0.6":"2026-01-24T19:21:41.736Z","1.1.0":"2026-01-26T16:52:07.810Z","1.1.1":"2026-02-02T09:43:56.629Z","1.2.0":"2026-05-25T15:52:41.306Z"},"description":"A composition-first Data Grid for React. Batteries included (Sorting, Pagination, Empty States) but flexible rows. No complex configuration objects — just write standard React components","maintainers":[{"name":"andreyfedkovich","email":"fedkovich@gmail.com"}],"readme":"# @andreyfedkovich/elegant-grid\n\nA premium React data grid with compound components, built on Tailwind CSS.\n\n[![npm version](https://badge.fury.io/js/%40andreyfedkovich%2Felegant-grid.svg)](https://www.npmjs.com/package/@andreyfedkovich/elegant-grid)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## 🎮 [Live Demo](https://elegant-grid.vercel.app/)\n\n## Features\n\n- 🧩 **Compound Component API** - Intuitive `ElegantGrid.Row`, `ElegantGrid.Cell`, `ElegantGrid.ActionCell` pattern\n- 🏗️ **Composition-Based Headers** - Define columns with JSX using `ElegantGrid.Headers` and `ElegantGrid.Header`\n- 📐 **CSS Grid Layout** - Modern div-based layout (not tables)\n- ☑️ **Multi-row Selection** - Checkboxes with select-all support\n- 🔀 **Sortable Columns** - Click headers to sort (asc → desc → none)\n- ↔️ **Column Resizing** - Drag column borders to resize\n- 📄 **Full Pagination** - Page size selector, jump-to-page, refresh button\n- 💀 **Skeleton Loading** - Built-in loading states with height stability\n- 📭 **Empty State** - Customizable empty state with icon and action\n- 🎨 **Custom Cells** - Full control over cell rendering\n- ⚙️ **GridConfig** - Fine-tune layout, scrolling, and identification\n- 🌍 **i18n Support** - Customizable labels for internationalization\n- 📘 **TypeScript-first** - Complete type definitions\n- 🎯 **Spread Props** - Pass native HTML attributes to Row, Cell, ActionCell\n\n## Installation\n\n```bash\nnpm install @andreyfedkovich/elegant-grid\n```\n\n## Quick Start\n\n```tsx\nimport { ElegantGrid } from '@andreyfedkovich/elegant-grid';\nimport '@andreyfedkovich/elegant-grid/styles.css'; // Required for styling\n\nconst headers = [\n  { key: 'name', label: 'Name', sortable: true },\n  { key: 'email', label: 'Email' },\n];\n\nconst data = [\n  { id: '1', name: 'John Doe', email: 'john@example.com' },\n  { id: '2', name: 'Jane Smith', email: 'jane@example.com' },\n];\n\nfunction MyGrid() {\n  return (\n    <ElegantGrid headers={headers} totalCount={data.length}>\n      {data.map((item) => (\n        <ElegantGrid.Row key={item.id} data={item} selectable>\n          <ElegantGrid.Cell>{item.name}</ElegantGrid.Cell>\n          <ElegantGrid.Cell>{item.email}</ElegantGrid.Cell>\n        </ElegantGrid.Row>\n      ))}\n    </ElegantGrid>\n  );\n}\n```\n\n## Styles\n\nImport the required CSS file once in your app's entry point:\n\n```tsx\nimport '@andreyfedkovich/elegant-grid/styles.css';\n```\n\nThe styles include scoped CSS variables that won't conflict with your existing design system.\n\n### Dark Mode\n\nElegantGrid automatically adapts to dark mode when:\n- A parent element has the `dark` class (e.g., `<html class=\"dark\">`)\n- Or add the `dark` class directly to the grid's parent container\n\n```tsx\n// Works automatically with next-themes or similar\n<div className=\"dark\">\n  <ElegantGrid ... />\n</div>\n```\n\n## Complete Example\n\nHere's a full-featured example showing all capabilities:\n\n```tsx\nimport { useState } from 'react';\nimport { ElegantGrid, type Header, type SortOrder } from '@andreyfedkovich/elegant-grid';\nimport '@andreyfedkovich/elegant-grid/styles.css';\nimport { Avatar, AvatarFallback } from '@/components/ui/avatar';\nimport { Badge } from '@/components/ui/badge';\n\n// Sample data\nconst sampleTransactions = [\n  { id: '1', fund: 'Growth Fund Alpha', type: 'Subscription', amount: 150000, status: 'completed', date: '2024-01-15' },\n  { id: '2', fund: 'Tech Ventures III', type: 'Redemption', amount: 75000, status: 'pending', date: '2024-01-14' },\n  { id: '3', fund: 'Real Estate Plus', type: 'Distribution', amount: 25000, status: 'completed', date: '2024-01-13' },\n  { id: '4', fund: 'Global Macro Fund', type: 'Subscription', amount: 500000, status: 'failed', date: '2024-01-12' },\n  { id: '5', fund: 'Private Credit II', type: 'Capital Call', amount: 200000, status: 'completed', date: '2024-01-11' },\n];\n\n// Header configuration\nconst headers: Header[] = [\n  { key: 'fund', label: 'Fund Name', sortable: true, minWidth: 200, width: 250 },\n  { key: 'type', label: 'Type', sortable: true, minWidth: 100, width: 120 },\n  { key: 'amount', label: 'Amount', sortable: true, minWidth: 120, width: 150, align: 'right' },\n  { key: 'status', label: 'Status', sortable: true, minWidth: 100, width: 120, align: 'center' },\n  { key: 'date', label: 'Date', sortable: true, minWidth: 100, width: 120 },\n  { key: 'actions', label: 'Actions', minWidth: 100, width: 100, align: 'center', resizable: false },\n];\n\n// Custom cell components\nconst FundCell = ({ name }: { name: string }) => (\n  <div className=\"flex items-center gap-3\">\n    <Avatar className=\"h-8 w-8\">\n      <AvatarFallback className=\"bg-primary/10 text-primary text-xs font-medium\">\n        {name.split(' ').map(w => w[0]).join('').slice(0, 2)}\n      </AvatarFallback>\n    </Avatar>\n    <span className=\"font-medium\">{name}</span>\n  </div>\n);\n\nconst StatusBadge = ({ status }: { status: string }) => {\n  const variants: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n    completed: 'default',\n    pending: 'secondary',\n    failed: 'destructive',\n  };\n  return (\n    <Badge variant={variants[status] || 'outline'} className=\"capitalize\">\n      {status}\n    </Badge>\n  );\n};\n\n// Main component\nexport default function TransactionsPage() {\n  const [sortOrder, setSortOrder] = useState<SortOrder | null>(null);\n  const [selectedRows, setSelectedRows] = useState<any[]>([]);\n  const [loading, setLoading] = useState(false);\n\n  const handleQueryChange = (query: { offset: number; limit: number }) => {\n    console.log('Query changed:', query);\n    // Fetch data based on offset and limit\n  };\n\n  const handleRefresh = () => {\n    setLoading(true);\n    setTimeout(() => setLoading(false), 1000);\n  };\n\n  const handleEdit = (id: string) => {\n    console.log('Edit:', id);\n  };\n\n  const handleDelete = (id: string) => {\n    console.log('Delete:', id);\n  };\n\n  const formatAmount = (amount: number) => {\n    return new Intl.NumberFormat('en-US', {\n      style: 'currency',\n      currency: 'USD',\n      minimumFractionDigits: 0,\n    }).format(amount);\n  };\n\n  const formatDate = (dateString: string) => {\n    return new Date(dateString).toLocaleDateString('en-US', {\n      month: 'short',\n      day: 'numeric',\n      year: 'numeric',\n    });\n  };\n\n  return (\n    <div className=\"p-6\">\n      <h1 className=\"text-2xl font-bold mb-4\">Transactions</h1>\n      \n      {selectedRows.length > 0 && (\n        <div className=\"mb-4 p-3 bg-primary/5 rounded-lg\">\n          Selected {selectedRows.length} transaction(s) - Total: {\n            formatAmount(selectedRows.reduce((sum, row) => sum + row.amount, 0))\n          }\n        </div>\n      )}\n\n      <ElegantGrid\n        headers={headers}\n        totalCount={sampleTransactions.length}\n        loading={loading}\n        onSort={setSortOrder}\n        onSelectionChange={setSelectedRows}\n        config={{\n          maxHeight: '400px',\n          minHeight: '400px',\n          rowIdKey: 'id',\n          skeletonRows: 5,\n        }}\n        pagerOptions={{\n          onQueryChange: handleQueryChange,\n          onRefresh: handleRefresh,\n          defaultPageSize: 25,\n          pageSizeOptions: [10, 25, 50, 100],\n        }}\n        emptyState={{\n          title: 'No transactions found',\n          description: 'There are no transactions to display.',\n        }}\n      >\n        {sampleTransactions.map((transaction) => (\n          <ElegantGrid.Row\n            key={transaction.id}\n            data={transaction}\n            selectable\n            onClick={() => console.log('Row clicked:', transaction.id)}\n            data-testid={`row-${transaction.id}`}\n          >\n            <ElegantGrid.Cell>\n              <FundCell name={transaction.fund} />\n            </ElegantGrid.Cell>\n            <ElegantGrid.Cell>{transaction.type}</ElegantGrid.Cell>\n            <ElegantGrid.Cell align=\"right\">\n              <span className=\"font-mono\">{formatAmount(transaction.amount)}</span>\n            </ElegantGrid.Cell>\n            <ElegantGrid.Cell align=\"center\">\n              <StatusBadge status={transaction.status} />\n            </ElegantGrid.Cell>\n            <ElegantGrid.Cell>{formatDate(transaction.date)}</ElegantGrid.Cell>\n            <ElegantGrid.ActionCell\n              onEdit={() => handleEdit(transaction.id)}\n              onDelete={() => handleDelete(transaction.id)}\n            />\n          </ElegantGrid.Row>\n        ))}\n      </ElegantGrid>\n    </div>\n  );\n}\n```\n\n## Composition-Based Headers\n\nInstead of passing a `headers` prop array, you can define columns using JSX composition:\n\n### Basic Usage\n\n```tsx\n<ElegantGrid totalCount={data.length}>\n  <ElegantGrid.Headers>\n    <ElegantGrid.Header dataKey=\"name\" label=\"Name\" sortable minWidth={150} />\n    <ElegantGrid.Header dataKey=\"email\" label=\"Email\" minWidth={200} />\n    <ElegantGrid.Header dataKey=\"status\" label=\"Status\" align=\"center\" />\n  </ElegantGrid.Headers>\n\n  {data.map((item) => (\n    <ElegantGrid.Row key={item.id} data={item}>\n      <ElegantGrid.Cell>{item.name}</ElegantGrid.Cell>\n      <ElegantGrid.Cell>{item.email}</ElegantGrid.Cell>\n      <ElegantGrid.Cell align=\"center\">{item.status}</ElegantGrid.Cell>\n    </ElegantGrid.Row>\n  ))}\n</ElegantGrid>\n```\n\n### Custom Header Content\n\nUse `children` for custom JSX in header cells:\n\n```tsx\n<ElegantGrid.Header dataKey=\"status\" label=\"Status\" minWidth={100}>\n  <span className=\"flex items-center gap-1.5\">\n    <Circle className=\"h-2.5 w-2.5 fill-current\" />\n    Status\n  </span>\n</ElegantGrid.Header>\n```\n\n### Fill Column\n\nUse `fill` to make a column expand and occupy remaining space:\n\n```tsx\n<ElegantGrid.Header dataKey=\"description\" label=\"Description\" fill />\n```\n\n### ElegantGrid.Header Props\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `dataKey` | `string` | *required* | Column identifier (maps to Header.key) |\n| `label` | `string` | *required* | Display text |\n| `sortable` | `boolean` | `false` | Enable column sorting |\n| `resizable` | `boolean` | `true` | Enable column resizing |\n| `minWidth` | `number` | `100` | Minimum column width in pixels |\n| `width` | `number` | `150` | Initial column width in pixels |\n| `align` | `'left' \\| 'center' \\| 'right'` | `'left'` | Text alignment |\n| `fill` | `boolean` | `false` | Expand to fill remaining space |\n| `children` | `ReactNode` | - | Custom header content (takes precedence over label) |\n\n> **Note:** If both `headers` prop and `<ElegantGrid.Headers>` are provided, the prop takes precedence.\n\n## API Reference\n\n### Header Interface\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `key` | `string` | *required* | Unique column identifier |\n| `label` | `string` | *required* | Column header text |\n| `sortable` | `boolean` | `false` | Enable column sorting |\n| `minWidth` | `number` | `100` | Minimum column width in pixels |\n| `width` | `number` | `150` | Initial column width in pixels |\n| `align` | `'left' \\| 'center' \\| 'right'` | `'left'` | Text alignment |\n| `resizable` | `boolean` | `true` | Enable column resizing |\n| `fill` | `boolean` | `false` | Expand column to fill remaining space |\n| `customContent` | `ReactNode` | - | Custom content for the header cell |\n\n### ElegantGridProps\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `headers` | `Header[]` | Column definitions |\n| `totalCount` | `number` | Total number of items (for pagination) |\n| `loading` | `boolean` | Show skeleton loading state |\n| `onSort` | `(order: SortOrder \\| null) => void` | Called when sort changes |\n| `onSelectionChange` | `(selectedData: any[]) => void` | Called when selection changes |\n| `pagerOptions` | `PagerOptions` | Pagination configuration |\n| `emptyState` | `EmptyStateConfig` | Empty state configuration |\n| `config` | `GridConfig` | Grid layout and styling configuration |\n| `children` | `ReactNode` | Grid rows |\n| `className` | `string` | Additional CSS classes |\n\n### SortOrder\n\n```ts\ninterface SortOrder {\n  key: string;\n  direction: 'asc' | 'desc';\n}\n```\n\n### GridConfig\n\nConfigure grid layout, scrolling behavior, and row identification.\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `checkboxColumnWidth` | `number` | `48` | Width of the checkbox column in pixels |\n| `defaultColumnWidth` | `number` | `150` | Default column width when not specified |\n| `minColumnWidth` | `number` | `80` | Minimum column width |\n| `cellPadding` | `string` | `\"p-3\"` | Cell padding className |\n| `stickyHeaderZIndex` | `number` | `10` | Z-index for sticky header |\n| `maxHeight` | `string` | - | Maximum height before vertical scroll (e.g., `\"400px\"`, `\"50vh\"`) |\n| `height` | `string` | - | Fixed height of grid body (takes precedence over `maxHeight`) |\n| `minHeight` | `string` | - | Minimum height to maintain during loading |\n| `styledScrollbar` | `boolean` | `true` | Enable custom scrollbar styling |\n| `rowIdKey` | `string` | `\"id\"` | Property key for row identification |\n| `skeletonRows` | `number` | - | Number of skeleton rows during loading (defaults to `defaultPageSize` or 5) |\n| `showVerticalDividers` | `boolean` | `true` | Show/hide vertical column dividers in header and body |\n\n#### GridConfig Example\n\n```tsx\n<ElegantGrid\n  headers={headers}\n  totalCount={data.length}\n  config={{\n    maxHeight: '500px',\n    minHeight: '500px',\n    rowIdKey: 'userId',        // Use 'userId' instead of 'id' for row identification\n    skeletonRows: 10,          // Show 10 skeleton rows during loading\n    checkboxColumnWidth: 56,   // Wider checkbox column\n    cellPadding: 'p-4',        // Larger cell padding\n    showVerticalDividers: false, // Hide vertical column dividers\n  }}\n>\n  {/* rows */}\n</ElegantGrid>\n```\n\n### PagerOptions\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `onQueryChange` | `(query: { offset: number; limit: number }) => void` | Called when page changes |\n| `onRefresh` | `() => void` | Called when refresh button clicked |\n| `defaultPageSize` | `number` | Initial page size (default: `25`) |\n| `pageSizeOptions` | `number[]` | Available page sizes (default: `[10, 25, 50, 100]`) |\n| `labels` | `PagerLabels` | Custom labels for internationalization |\n\n### PagerLabels (i18n)\n\nCustomize pagination text for different languages.\n\n```ts\ninterface PagerLabels {\n  /** Custom function to format \"Showing X-Y of Z\" text */\n  showingText?: (start: number, end: number, total: number) => string;\n  /** Label for rows per page selector (default: \"Rows:\") */\n  rowsLabel?: string;\n  /** Label for jump to page input (default: \"Go to:\") */\n  goToLabel?: string;\n}\n```\n\n#### i18n Example (German)\n\n```tsx\n<ElegantGrid\n  headers={headers}\n  totalCount={data.length}\n  pagerOptions={{\n    onQueryChange: handleQueryChange,\n    defaultPageSize: 25,\n    labels: {\n      showingText: (start, end, total) => `Zeige ${start}-${end} von ${total}`,\n      rowsLabel: 'Zeilen:',\n      goToLabel: 'Gehe zu:',\n    },\n  }}\n>\n  {/* rows */}\n</ElegantGrid>\n```\n\n#### i18n Example (Japanese)\n\n```tsx\npagerOptions={{\n  onQueryChange: handleQueryChange,\n  labels: {\n    showingText: (start, end, total) => `${total}件中 ${start}-${end}件を表示`,\n    rowsLabel: '表示件数:',\n    goToLabel: 'ページ:',\n  },\n}}\n```\n\n### EmptyStateConfig\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `title` | `string` | Empty state title |\n| `description` | `string` | Optional description text |\n| `icon` | `ReactNode` | Custom icon component |\n| `action` | `ReactNode` | Action button or link |\n\n### ElegantGrid.Row Props\n\nExtends `React.HTMLAttributes<HTMLDivElement>` - supports all native div attributes including `onClick`, `style`, `data-*`, etc.\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `children` | `ReactNode` | Row cells |\n| `data` | `any` | Row data (passed to selection callback) |\n| `selectable` | `boolean` | Show selection checkbox |\n| `className` | `string` | Additional CSS classes |\n| `onClick` | `(e: MouseEvent) => void` | Native click handler |\n| `style` | `CSSProperties` | Inline styles |\n| `data-*` | `string` | Data attributes |\n\n#### Spread Props Example\n\n```tsx\n<ElegantGrid.Row\n  data={item}\n  selectable\n  onClick={() => handleRowClick(item.id)}\n  onDoubleClick={() => handleRowDoubleClick(item.id)}\n  data-testid={`row-${item.id}`}\n  style={{ cursor: 'pointer' }}\n  aria-label={`Row for ${item.name}`}\n>\n  <ElegantGrid.Cell>{item.name}</ElegantGrid.Cell>\n  <ElegantGrid.Cell>{item.email}</ElegantGrid.Cell>\n</ElegantGrid.Row>\n```\n\n### ElegantGrid.Cell Props\n\nExtends `React.HTMLAttributes<HTMLDivElement>` - supports all native div attributes.\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `children` | `ReactNode` | Cell content |\n| `align` | `'left' \\| 'center' \\| 'right'` | Text alignment |\n| `className` | `string` | Additional CSS classes |\n\n### ElegantGrid.ActionCell Props\n\nExtends `React.HTMLAttributes<HTMLDivElement>` - supports all native div attributes.\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `onEdit` | `() => void` | Edit button click handler |\n| `onDelete` | `() => void` | Delete button click handler |\n| `customActions` | `CustomAction[]` | Additional action buttons |\n| `className` | `string` | Additional CSS classes |\n\n#### CustomAction\n\n```ts\ninterface CustomAction {\n  icon: ReactNode;\n  label: string;\n  onClick: () => void;\n  variant?: 'default' | 'destructive';\n}\n```\n\n## Custom Actions Example\n\n```tsx\nimport { Eye, Download } from 'lucide-react';\n\n<ElegantGrid.ActionCell\n  onEdit={() => handleEdit(item.id)}\n  onDelete={() => handleDelete(item.id)}\n  customActions={[\n    {\n      icon: <Eye className=\"h-4 w-4\" />,\n      label: 'View Details',\n      onClick: () => handleView(item.id),\n    },\n    {\n      icon: <Download className=\"h-4 w-4\" />,\n      label: 'Download',\n      onClick: () => handleDownload(item.id),\n    },\n  ]}\n/>\n```\n\n## Empty State Example\n\n```tsx\nimport { FileX } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\n\n<ElegantGrid\n  headers={headers}\n  totalCount={0}\n  emptyState={{\n    title: 'No transactions found',\n    description: 'Get started by creating your first transaction.',\n    icon: <FileX className=\"h-12 w-12 text-muted-foreground\" />,\n    action: (\n      <Button onClick={() => setShowCreateModal(true)}>\n        Create Transaction\n      </Button>\n    ),\n  }}\n>\n  {/* rows */}\n</ElegantGrid>\n```\n\n## Peer Dependencies\n\n```json\n{\n  \"react\": \">=18.0.0\",\n  \"react-dom\": \">=18.0.0\",\n  \"lucide-react\": \">=0.400.0\"\n}\n```\n\n> **Note:** All UI components (buttons, checkboxes, inputs, selects, etc.) are bundled with this package.\n> You don't need Tailwind CSS or shadcn/ui installed in your project.\n\n## TypeScript Exports\n\n```tsx\n// Components & Types\nimport {\n  ElegantGrid,\n  // Components for composition API\n  ElegantGridHeaders,\n  ElegantGridHeaderComponent,\n  // Types\n  type Header,\n  type SortOrder,\n  type PagerOptions,\n  type PagerLabels,\n  type EmptyStateConfig,\n  type GridConfig,\n  type ResolvedGridConfig,\n  type ElegantGridProps,\n  type ElegantGridRowProps,\n  type ElegantGridCellProps,\n  type ElegantGridActionCellProps,\n  type ElegantGridHeaderProps,\n  type GridContextValue,\n  DEFAULT_GRID_CONFIG,\n} from '@andreyfedkovich/elegant-grid';\n\n// Styles (import once in your app entry point)\nimport '@andreyfedkovich/elegant-grid/styles.css';\n```\n\n## License\n\nMIT © [Andrey Fedkovich](https://github.com/andreyfedkovich)\n","readmeFilename":"README.md"}