{"_id":"rc-sheet-viewer-17","_rev":"29-08d542e95c4ee077b9bfd580959567e3","name":"rc-sheet-viewer-17","dist-tags":{"latest":"2.3.4"},"versions":{"1.0.0":{"name":"rc-sheet-viewer-17","version":"1.0.0","_id":"rc-sheet-viewer-17@1.0.0","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"7ba7dd4401e6f1f9e573e450a7020cafdb4d09df","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-1.0.0.tgz","fileCount":13,"integrity":"sha512-mNfecWU29vzIrXkFyq0kaP7oIQHTaa0k/IslMXZaF1ST8BS4K+fyvSSEdfHNZ1o6DjaTMXmRD3mGoKeSrlR9oA==","signatures":[{"sig":"MEUCIQD9LJVSA5Vr3PEfElsqP8s4cHj7ATOJfkie4sxfIMVyqQIgJSOBKBddGxYMy96KKynw1GukCAUYap/0DyYliHk7s60=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":850543},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"90977abad7c88db8fa876e95306afa37fdc32c0e","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_1.0.0_1771047742553_0.9161905689767869","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"rc-sheet-viewer-17","version":"1.0.1","_id":"rc-sheet-viewer-17@1.0.1","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"38335212df926fcf35c45447baa9cf0e86657dc2","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-1.0.1.tgz","fileCount":11,"integrity":"sha512-MbuNO2Y1sMQB1aOYOyCoBfrUKND5Lj8go4mja/KGHiuTCvMyi040PnvYFjaBZFIJewfFTFhsoYBfatlLMtd/fg==","signatures":[{"sig":"MEYCIQCZ5BLiw9CXCRnR76iSFw8t+OclmliF1zpY8nA5T/jYDgIhAOn5LaeYFF3PpbI9uJXnthjDyXmctb1l2wWw0EwFZREt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1087839},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"1e953bb2c315085ba2cd5ad6cc609683d571c1db","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_1.0.1_1771048201180_0.7360885373859443","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"rc-sheet-viewer-17","version":"1.0.2","_id":"rc-sheet-viewer-17@1.0.2","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"54cf8fca773608262a67fa2f93241c45a2720f3a","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-1.0.2.tgz","fileCount":11,"integrity":"sha512-/zplPbt0mR4rewg79kKZlZfApgt/GyHWVhzJaCXCieMkK7UdgNroX/0feHkqVqw8Gng8UEEjdu8Kb3sxzuFekw==","signatures":[{"sig":"MEUCIHkMfM0pTfm8jGxY+tPdJoaXWRQzCc98hDDMVh7HBs2NAiEAipiEp2OFRARm2l3oBc5Mnit6vcKax0XBLAs5JXoVXvA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1088649},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"9a3af7bd78cc6dfc488397c7fe1414d79ea71f8b","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_1.0.2_1771048958816_0.5838807541084361","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"rc-sheet-viewer-17","version":"2.0.0","_id":"rc-sheet-viewer-17@2.0.0","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"215bb2d16b39dee1ad14cf162d21fd8edc752e4e","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.0.0.tgz","fileCount":11,"integrity":"sha512-sQlxwLfmU6to2knP/TN2KhnStQ6inNpywnxOSAX/xRglfylcqEhkcB8NR7Ss9kSjAuwbNZxiUCW8CQUXaC6Bog==","signatures":[{"sig":"MEUCIDZM+LW+BAxDCW3m0e//m/6O1INdQs/TwHrSjQtZ8aPWAiEAlB5NKA61s+nV2O+Pw73bnCJuztTHypDHgAhAw8+SMd8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1124618},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"abebd4246ee73b467354b12aba1c30fcb61469b0","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.0.0_1771314335907_0.0321176733414652","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"rc-sheet-viewer-17","version":"2.0.1","_id":"rc-sheet-viewer-17@2.0.1","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"49fd7c6443bfa9088846ea5d742fa7155e0ad9e3","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.0.1.tgz","fileCount":11,"integrity":"sha512-d/qxjiJYS3aBLouwJN/n0GftdyAg3w4Uth0WcZhA6xlW2LVZjQbu3wxy/bGOS6zFn/lMt1vk+ZNuYzTx5YkXBg==","signatures":[{"sig":"MEUCIHarhDm+rkGsIUeESPqR/VJ+wy3mUFjGtnrsjD5xmlmwAiEA+Tan0GcavOBBZW45GLcp2May7A/h0/4a6iRCWDof0kQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1125519},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"1ad742f81d6df7a647da025cd19b6a7e754558ef","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.0.1_1772184917408_0.3796302369671767","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"rc-sheet-viewer-17","version":"2.0.2","_id":"rc-sheet-viewer-17@2.0.2","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"ed601ddcedcd29973a98d0970fd07b8acf0b7d28","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.0.2.tgz","fileCount":11,"integrity":"sha512-hGjtyv6N+fZ7vDNX6dOB72SxacAfOhqKrrHyLaFEVvm4Hj8YSQj0WjXy30oxnJz5rCSHKJirRqiMPL683K2G7g==","signatures":[{"sig":"MEUCIAKHVTU2LLtnPeMHydg5cN1uy6gjRnQ7XAFOPA80ewIwAiEAn7zTjJOmuG8jQqDq13qA7sScuBcNNrDZgyeRK5tqTRQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126126},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"c1197d13ff689c08b9ac3740fd8b12044a5f192b","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.0.2_1772186457598_0.9631314842942575","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"rc-sheet-viewer-17","version":"2.0.3","_id":"rc-sheet-viewer-17@2.0.3","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"edd7b0523d639938bbb8981c133989a0a664cea3","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.0.3.tgz","fileCount":11,"integrity":"sha512-hGxZhMyshkkTjbfd7LPa5wRiTSeQCUTmfDOt2ysjprluOJur+pdF/IM8xJwrhKUpe4gekEhXnFwaVo/PTZZRfQ==","signatures":[{"sig":"MEYCIQD50xLYUF+3V5IWPcRxfHOWK9Tb6ixyz/TbGfKoScQmowIhAJi+PaGTey8YSEIvhNP8MTqdWuKJXxflGjN7Zi5Kd2JP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126470},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"fda8027a0a281a27f283a6452be98d1f9651e48a","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.0.3_1772187444811_0.6181589096143902","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"rc-sheet-viewer-17","version":"2.0.4","_id":"rc-sheet-viewer-17@2.0.4","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"c0bac787816bb27ee8f2603c7530ac4526474c1d","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.0.4.tgz","fileCount":11,"integrity":"sha512-lHqq1j3D3gEieZImujL4fUW0TH3arXw4gneiZkk/yFtLaeFxJI137GY829Lot1kOtWVlBy/Zxl5Cl6FrQe7EwA==","signatures":[{"sig":"MEUCIQCw4jjWfXHs0akSvGBvj/Bk6b9ebn4Rnva7sVYC4Q4GUQIgYsDiNOultuWsnGSIacxl0YYOSKdRf6yCLJXLn52wLRI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126519},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"e0f764130b55bf9899fcc2e36a2b2dbb827aefb1","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.0.4_1772188149344_0.8951172093647974","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"rc-sheet-viewer-17","version":"2.1.0","_id":"rc-sheet-viewer-17@2.1.0","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"1e95843c40ac103f344d06f236271a426ed2db3a","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.0.tgz","fileCount":11,"integrity":"sha512-Eqo+xoLqkagL5Qc3MqyM7zTeiijpkjQ57sLBTDj1uwxgTrP1V0y/2kzm9axP8hsNS1HAWbAWWE+f3ADWxewEIg==","signatures":[{"sig":"MEQCIFyyNO5Jf0lzo+UzExSTZSmloxWM502vPXgrZZBFHsyIAiB3ZQahf937Nr/Fz4/6CSdFgNjWN8XxmDIO3qEbtSvhuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1137141},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"8a390eec15b5866f94f3e0c756cde8e94218a5ab","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.0_1775456629992_0.556213140138416","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"rc-sheet-viewer-17","version":"2.1.1","_id":"rc-sheet-viewer-17@2.1.1","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"deb93ef83f61b40194f5556ece0d12f621016758","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.1.tgz","fileCount":11,"integrity":"sha512-kSv7//Oy4qmd9hK35FnbSdxn4hzrCR3QmdSHcZQo0F1C2TX48x91bgG1PVugMjCXGymtebnCGIlFwuA2YVFynA==","signatures":[{"sig":"MEQCIGhglQuWB4McAZYP2PAiqxHY14X3uERSGzvXX78Ig9r8AiBFWLN9HB3Jb3Thav3eYYnM7gw/ddOoAm7UAz1oO/gP1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1137192},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"25f365a286b42e9378466d82f2319a2f63315b62","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.1_1775470217470_0.605788394438669","host":"s3://npm-registry-packages-npm-production"}},"2.1.2":{"name":"rc-sheet-viewer-17","version":"2.1.2","_id":"rc-sheet-viewer-17@2.1.2","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"32ab7033a22063b6a7dd3ee3aa933bb43e94f7d7","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.2.tgz","fileCount":11,"integrity":"sha512-V8z28hDEL7IMBrh1dmuFj25+m0Y+fPYazcAV4E7heNZ8licx7vPMwmbNDfMCST+Elb+dAXRqvv7Bt26lSuZfww==","signatures":[{"sig":"MEUCIQDRub45qpXGvhExs52FKZ+1YBqFBZbogXVDtM0IPhda0AIgH6UjjDpP9dAIGZCII2IixNmO9CJ+r8FvF7Sy/MmxES0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1138906},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"25f365a286b42e9378466d82f2319a2f63315b62","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.2_1775547150567_0.408633805035171","host":"s3://npm-registry-packages-npm-production"}},"2.1.3":{"name":"rc-sheet-viewer-17","version":"2.1.3","_id":"rc-sheet-viewer-17@2.1.3","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"e2d6c7387b2cd75c9e87bf92e9131a364d98d9e1","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.3.tgz","fileCount":11,"integrity":"sha512-hfSaaUkD6n8M6Bh7JtW0g20PgtIhCbUUS4Gof9gfI0qpIaz7UutJy7/dFVxuLYNYSQDoYZsf5wXArPYozjsqdg==","signatures":[{"sig":"MEQCIB/ajqPhuoIvdJE9L0zXp1bQYFduoramK+gHOb0mEmd2AiA+lzoV5ylv3zPf9QOe3zzpg+lYZuioLkNjN4tPoJiE8Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1139110},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"ee13640cdd9e3beac0ba8d374bc40c7c763351cb","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.3_1775547815586_0.5644303511837054","host":"s3://npm-registry-packages-npm-production"}},"2.1.4":{"name":"rc-sheet-viewer-17","version":"2.1.4","_id":"rc-sheet-viewer-17@2.1.4","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"9938ce3b85c222b0e604b9342906276f08d645e0","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.4.tgz","fileCount":11,"integrity":"sha512-dBga11s+I/k+Xk7YHAv189FE02mCzFoADx9guT8QiBssEwL2ovc/HMKOBEUJEOGApIKKcmJ13B9cXsk9+Y8xcg==","signatures":[{"sig":"MEYCIQDx1VNdOf+75lHR/rUcvI+Yq9xErsKKj3wWnUmP5va5VgIhAJTjVeuxnPmf9HfMH1MnyuQavoZxUhlSrWhK15TLQ23/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1139112},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"ee13640cdd9e3beac0ba8d374bc40c7c763351cb","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.4_1775548379782_0.9121757054351931","host":"s3://npm-registry-packages-npm-production"}},"2.1.41":{"name":"rc-sheet-viewer-17","version":"2.1.41","_id":"rc-sheet-viewer-17@2.1.41","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"5f1fe5c40c47f8e6689a3104f6dd98e44396d3bb","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.41.tgz","fileCount":11,"integrity":"sha512-RidZ/d8/ykMftK5WZR7aZa901uGm2eGGJ+Vsl2s3IZurbSmx29ahRB8MrI4vgd9/DBz+wtuBaF+b+peUKO/EKw==","signatures":[{"sig":"MEUCIQDlqctdsMJoGMBnifxcEP6GPqEXCUG0JESO9wThx7FbIQIgDYBqW3lRreHIWo4dze6G9ne8ZjTUIuMofS89yy28Svs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1139098},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"ee13640cdd9e3beac0ba8d374bc40c7c763351cb","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.41_1775561233994_0.046687317043100585","host":"s3://npm-registry-packages-npm-production"}},"2.1.42":{"name":"rc-sheet-viewer-17","version":"2.1.42","_id":"rc-sheet-viewer-17@2.1.42","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"c2c0137721ddfd8e781e9ffa04f2c478c1f4d017","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.42.tgz","fileCount":11,"integrity":"sha512-QTHGn9YU3td/DkpKahc5YemmTe0WuUH01NSbYqmxq1FNk3LwxK0fRZMmSLQJS2qmEEtFS2NkScrxvynrvW+Mow==","signatures":[{"sig":"MEUCIGJsELutn3ymX1VfPsgDNRAJQRJyRqyRZ5NcF5nTouqtAiEA2teSBGDD8lWoVUU23lvZ5aSwDYHP5epjj51DfxvegpM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1139579},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"ee13640cdd9e3beac0ba8d374bc40c7c763351cb","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.42_1775562380339_0.7178253001279158","host":"s3://npm-registry-packages-npm-production"}},"2.1.43":{"name":"rc-sheet-viewer-17","version":"2.1.43","_id":"rc-sheet-viewer-17@2.1.43","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"c9b6eadd3127e05944e7487a627edccd8d272807","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.43.tgz","fileCount":11,"integrity":"sha512-doimDL/BxpUapLJWhHkYSgc1feRxNDm1vBZrsFDtcawGh6j3UdGKUS5sJflDWO58UPy3qwulUZVK6zzNLq3zhA==","signatures":[{"sig":"MEUCIQDJB4GxLJefBRmb/972gcpc2ZQh/HjtANFiEskTn1/G4wIgWLMhIXIAWRTB1GvLdJ3OgkyqGLhWxZpVVdIFtC5BCVk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1139901},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"455d46ac282ce21bc25b53610d88b9341ed21816","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.43_1778477469729_0.8141829866860602","host":"s3://npm-registry-packages-npm-production"}},"2.1.44":{"name":"rc-sheet-viewer-17","version":"2.1.44","_id":"rc-sheet-viewer-17@2.1.44","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"2f45b8e4b730445035dd55e3a0479b7eee6ad58c","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.44.tgz","fileCount":11,"integrity":"sha512-ATXbhFY24v9iWRbQpWNQQ1YPAz+Pf0efBscOr0yU2NvN4y5WIUYvOGNZTA1dGLY/hMVzCxd75wXyDGoUaoXmcw==","signatures":[{"sig":"MEQCIEiC4QJH3LZXEo7jXMLn4v7aUVoNpKbZJv14RVLuYOQUAiBVtr1qMY++pCqjFMThVnKZcjTDWcucsT+HPxXdyJjbMg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140153},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"21b33eed46ca3378b0fa9ad821c18a4838a6083d","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.44_1778479027671_0.5157072292631979","host":"s3://npm-registry-packages-npm-production"}},"2.1.45":{"name":"rc-sheet-viewer-17","version":"2.1.45","_id":"rc-sheet-viewer-17@2.1.45","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"deb44a54120da4d0151ce18323c8edd09b3ebc29","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.45.tgz","fileCount":11,"integrity":"sha512-15qEnvXJrD/eTpyI8ZVgzQOKgrVz653I6AGp47wUPlwx6c0KSDrM2vsHcFN5r5QLNvFuOCHNdwvjPcNshh4o9g==","signatures":[{"sig":"MEYCIQCmN5Fm6woJ3LHDYpLWfAaa8SNEt1ngThDIxrGZIfgdkAIhAP+O1y73g99XR9j1m2u65+GtbbA+y4yNp8+6jej4pf+H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140226},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"b9a432122779db199e65e5a35028f1fb0a21f7e2","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.45_1778480222661_0.3189161204911588","host":"s3://npm-registry-packages-npm-production"}},"2.1.46":{"name":"rc-sheet-viewer-17","version":"2.1.46","_id":"rc-sheet-viewer-17@2.1.46","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"fce8cc4545f11ec929765f1122696c42729e7506","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.46.tgz","fileCount":11,"integrity":"sha512-BJI9H4x6VG0hD+lwj/sgF33xzPtk9HjfRG+r2LW/hHqYhEJFNWFZIqJZofIC0fJsdHxtm6NSjOZKSpxQpY6Iow==","signatures":[{"sig":"MEYCIQDvdlIcd0NFP4i7AxX895qotDMTa5zJYC+P6pVhuy4CjgIhAMxBmDulz/LdEwMqDVjWW0xnzP+bVUS5i2FqHDNC7zk0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140324},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"b9a432122779db199e65e5a35028f1fb0a21f7e2","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.46_1778480754175_0.9255897799458723","host":"s3://npm-registry-packages-npm-production"}},"2.1.47":{"name":"rc-sheet-viewer-17","version":"2.1.47","_id":"rc-sheet-viewer-17@2.1.47","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"531e2250c06b21c374a300b5f443302101c157a9","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.47.tgz","fileCount":11,"integrity":"sha512-aisRml5tnJCSBwyXqDnn3PmdtZmYx/IPVG8eCwQD+rxHOFK35PcIe0ac6fjPkSpZpfOFTa5tsxM4OpLjrO+BGQ==","signatures":[{"sig":"MEUCIDp2i2Bs46uLZRj1FbMtY0ST3dPTzF6kolW9Mcrx87bPAiEA9+E6xnYK8mRKuBXc5wk1sBYKpuI7bg3UMUKTSy2VBqc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140413},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"b9a432122779db199e65e5a35028f1fb0a21f7e2","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.47_1778481091846_0.9238293090934706","host":"s3://npm-registry-packages-npm-production"}},"2.1.48":{"name":"rc-sheet-viewer-17","version":"2.1.48","_id":"rc-sheet-viewer-17@2.1.48","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"ea78854b844a075b248e2b33f08d10392c9e6cd0","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.48.tgz","fileCount":11,"integrity":"sha512-p2xWUYa2ToxAfWqXrz/DOwDlfyuhGDht2mScsky5PVCbZD4O7zXBCBnzLKH+DhryuNEMXXpdKkP1hXctK5722w==","signatures":[{"sig":"MEUCIQDMme0t6xJJl6YcnskT994Wxk2/aZBan2yRIRUvJV4WTAIgGa0nyXOfC4axQ/4z/apCWrLqEJ97CxeCs2Anc4Y6cjs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140543},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"b9a432122779db199e65e5a35028f1fb0a21f7e2","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.48_1778481266890_0.1444187955442897","host":"s3://npm-registry-packages-npm-production"}},"2.1.49":{"name":"rc-sheet-viewer-17","version":"2.1.49","_id":"rc-sheet-viewer-17@2.1.49","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"d9c085e22604dbbb24fa292229c9189950f3d0d1","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.1.49.tgz","fileCount":11,"integrity":"sha512-ViYZrKIFfK1ZIiv5u0QsqTwW6qLfC99xEu5BW45hG81/oYH+PErL1H9h6ME6N1nWJoJkaWPCAmlJ1I+Uc3UXRw==","signatures":[{"sig":"MEUCIQCPEaDM6FizFxOO0TALcN7EZAR2bwbXX7ABuShiwLgx2wIgAWocmIiHaOemagEP2wf2883e0quyug600DKunCfN+s4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140890},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"c5b78edcfbc1c2c08a6414a56a00495ea3019fdc","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.1.49_1779105762210_0.7690932446344727","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"rc-sheet-viewer-17","version":"2.2.0","_id":"rc-sheet-viewer-17@2.2.0","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"7428ad595d30168721b932ebb92f07286fee5aa4","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.2.0.tgz","fileCount":11,"integrity":"sha512-1FbrrVQYXoX1W53Vfi7i+FeDO65WsrZ7XboHFTLBocHYhWV2w2xRgiEFax8YdkF759NpqxgUD/chl5elnZBgdQ==","signatures":[{"sig":"MEUCIQCSUhZNrJlTxKw+25d2Yjg0PF4CJ6eJBhRtYryP7eQ6owIgMJWTXoSACqm4JQ+OdrcBFB57x/pcoN9d2jjutNazXIw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1149695},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"964761a8b7e0498dcdc7c7d3ffd13e16e87b70d0","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","rc-dropdown":"^4.2.1","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.2.0_1785477783228_0.45536580954346917","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"rc-sheet-viewer-17","version":"2.2.1","_id":"rc-sheet-viewer-17@2.2.1","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"cf3297e2a2ee05a1140fa36b6771511e34f19679","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.2.1.tgz","fileCount":11,"integrity":"sha512-qWWiP0fT+YaL/LGKvUJiZuulq88AWFwh39Q28sOPawBVCB1TV764zljXrT1ZlTreR1GBmZl4S1Ftp+YEhCIJKQ==","signatures":[{"sig":"MEQCIH2MorQJYg5yxeQG91tF38acVb/N7P8zXKZbU6+0S1yBAiACk5nkmIFTOmGxCLb6XuJBP+3hp1lPuiXIii9N1lcIkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1152483},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"964761a8b7e0498dcdc7c7d3ffd13e16e87b70d0","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","rc-dropdown":"^4.2.1","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.2.1_1785483380888_0.8292027135807147","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"rc-sheet-viewer-17","version":"2.3.0","_id":"rc-sheet-viewer-17@2.3.0","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"e52f6fc5fd7fa5568348104289346be5deaabc52","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.3.0.tgz","fileCount":11,"integrity":"sha512-5wgjHP5FzmVSWfTZvbX57Euvqzud/9GWCPgn5oVqiZYXKEHaAf7rO8Anpnwf00u6UA6EM17HtD1OPWe7Lrc3UQ==","signatures":[{"sig":"MEYCIQDQbMs9Ivw5ApwxQuayG6Bf6/aa/FUsYWLRKmfhXAk6/wIhANUPN7gvJQZQuVXh9C6MR7qeI/B2GiCqUu4nDQ7P2zqM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1180326},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"49d025e47cc94f01951cf91dfa55c5611c04302f","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","rc-dropdown":"^4.2.1","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.3.0_1786508023005_0.748670842101953","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"rc-sheet-viewer-17","version":"2.3.1","_id":"rc-sheet-viewer-17@2.3.1","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"336f999b211ec0b1bc936ec668ec69ed937de23d","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.3.1.tgz","fileCount":11,"integrity":"sha512-8eysaEZOq6ZEYvzxaThvcSd1dhFPpjjiv5i5XY3xezsRM1+8/F9d4+82IRdam43fGo4uNz1QpoKi+n8zAAj1CQ==","signatures":[{"sig":"MEQCIBTX9leq39HQrIqOgRI9gEDM5hfWXtnO2Bf6QtnoRs5KAiBQAxET91FJUWSITxtJu4eSb7GugGKp04qHIiRtCM5wkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1185648},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"a18ebc1694a7926e4807c73ccd99695ee84385bd","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","rc-dropdown":"^4.2.1","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.3.1_1786598715479_0.7031934366618662","host":"s3://npm-registry-packages-npm-production"}},"2.3.2":{"name":"rc-sheet-viewer-17","version":"2.3.2","_id":"rc-sheet-viewer-17@2.3.2","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"676a076862b349d12e5b12e70b3332dd07fe6c37","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.3.2.tgz","fileCount":11,"integrity":"sha512-Z25MWEzxHziYy5sqoXo70Bq5kK2X7SbSOCFi4Sfo6gFz+CwElaYg1HUmkcI068jJTzxtDIiTm3m9Zc4xnbb+fQ==","signatures":[{"sig":"MEYCIQDTLoJ1AmWZ3PorwhDlva47HHqVTZXKR9dIMR2u3pEGNQIhAJKCUknhwbeJPcKX8z9sjk4QiheFbeny9E5zED6Kdc70","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1193711},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"3471640cbb6c639ec5cf49eb8c2af078ef2df4bb","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","rc-dropdown":"^4.2.1","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.3.2_1787678840709_0.2347486808380168","host":"s3://npm-registry-packages-npm-production"}},"2.3.3":{"name":"rc-sheet-viewer-17","version":"2.3.3","_id":"rc-sheet-viewer-17@2.3.3","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"dist":{"shasum":"bbb1b8864af5d345591f01b299d62ac1fbfd88c9","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.3.3.tgz","fileCount":11,"integrity":"sha512-JPjfUztDMJU7Q/3IsaF7cPSpmfnx18/2NYtxIFlh4i/OcZJppRNS8WUoKfDGBpSfI5S6kbL7o0n0rPQETVrQ7A==","signatures":[{"sig":"MEUCIQDM2pR4ki3PhEZjv2utoWoxTQStpQ3oWY555Z62SrPD1QIgZzCCyh+7NdtnoCNGj3I785vVrC9ttu+oZpEEUawErZE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFQE+N+yHRl3XCCcY6FLNnPkEfrUj3yLsqboGPm0nOCFAiEAtEuiHwrczW806CH6TXFXzaeOlyoUz7sO3y7YC90w7Qk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1187174},"main":"./dist/sheet-viewer.js","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"4d90d80bb4d9da42c33ee4370aebe98218afc24a","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","rc-dropdown":"^4.2.1","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/rc-sheet-viewer-17_2.3.3_1789034177222_0.04421157340735715","host":"s3://npm-registry-packages-npm-production"}},"2.3.4":{"_id":"rc-sheet-viewer-17@2.3.4","dist":{"shasum":"5c5e9f696983128917daf019223d1e2ae13423a9","tarball":"https://registry.npmjs.org/rc-sheet-viewer-17/-/rc-sheet-viewer-17-2.3.4.tgz","fileCount":11,"integrity":"sha512-ELfFBDcbolCma1DekyQrzSsyBBksjn225acLZIT5999mY8Mm6aSOlqrfPJniXbHJddrW/Z6wmnvaFWg95ULrCw==","signatures":[{"sig":"MEUCICypJzLv3dt67aT01jy0nxuuqiEr8P+gL+7IdQdTITDOAiEAzjHT58M9bBxzwTq2BaJ7v6V29g7AQDx3QbNal+LoWXw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCOEv7K5POithDNnUfVM1vtYorPMXDsSovhRkR94Me2PAIhAOAxjfAknpfjrJw3HEBZPmnOcOtcSwoT37NvLMXkErbq"}],"unpackedSize":1195238},"main":"./dist/sheet-viewer.js","name":"rc-sheet-viewer-17","type":"module","types":"./dist/types/index.d.ts","module":"./dist/sheet-viewer.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/sheet-viewer.js"},"./style.css":"./dist/sheet-viewer.css"},"gitHead":"6f9e3176b60c7878b2c9349364cdc55a0dbe49d9","scripts":{"dev":"vite","lint":"eslint .","test":"vitest run","build":"vite build","preview":"vite preview","build:lib":"vite build --mode lib","chromatic":"chromatic --exit-zero-on-changes","storybook":"storybook dev -p 6006","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build:lib","build-storybook":"storybook build"},"version":"2.3.4","_npmUser":{"name":"suraj_magar","email":"suraz.mazar@gmail.com"},"_npmVersion":"11.6.2","description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","directories":{},"maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"_nodeVersion":"24.11.1","dependencies":{"xlsx":"^0.18.5","fflate":"^0.8.2","zustand":"^5.0.11","chart.js":"^4.5.1","react-chartjs-2":"^5.3.1","@tanstack/react-virtual":"^3.13.18","use-sync-external-store":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.3.1","jsdom":"^28.0.0","react":"^17.0.2","eslint":"^9.39.1","vitest":"^4.0.18","globals":"^16.5.0","chromatic":"^15.1.0","react-dom":"^17.0.2","storybook":"^10.2.8","@eslint/js":"^9.39.1","typescript":"^5.9.3","rc-dropdown":"^4.2.1","@types/react":"^17.0.80","vite-plugin-dts":"^4.5.4","@storybook/react":"^10.2.8","@types/react-dom":"^17.0.25","@vitejs/plugin-react":"^5.1.1","@storybook/react-vite":"^10.2.8","@testing-library/react":"^12.1.5","@chromatic-com/storybook":"^5.0.1","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@storybook/addon-essentials":"^8.6.14","@testing-library/user-event":"^14.6.1","eslint-plugin-react-refresh":"^0.4.24","@types/use-sync-external-store":"^1.5.0"},"peerDependencies":{"react":"^17.0.0 || ^18.0.0 || ^19.0.0","react-dom":"^17.0.0 || ^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rc-sheet-viewer-17_2.3.4_1789364571389_0.2978419495784903"}}},"time":{"created":"2026-02-14T05:42:22.553Z","modified":"2026-09-14T05:42:51.689Z","1.0.0":"2026-02-14T05:42:22.729Z","1.0.1":"2026-02-14T05:50:01.432Z","1.0.2":"2026-02-14T06:02:38.999Z","2.0.0":"2026-02-17T07:45:36.117Z","2.0.1":"2026-02-27T09:35:17.690Z","2.0.2":"2026-02-27T10:00:57.823Z","2.0.3":"2026-02-27T10:17:25.037Z","2.0.4":"2026-02-27T10:29:09.547Z","2.1.0":"2026-04-06T06:23:50.201Z","2.1.1":"2026-04-06T10:10:17.699Z","2.1.2":"2026-04-07T07:32:30.784Z","2.1.3":"2026-04-07T07:43:35.741Z","2.1.4":"2026-04-07T07:52:59.930Z","2.1.41":"2026-04-07T11:27:14.171Z","2.1.42":"2026-04-07T11:46:20.557Z","2.1.43":"2026-05-11T05:31:09.975Z","2.1.44":"2026-05-11T05:57:07.857Z","2.1.45":"2026-05-11T06:17:02.860Z","2.1.46":"2026-05-11T06:25:54.331Z","2.1.47":"2026-05-11T06:31:32.021Z","2.1.48":"2026-05-11T06:34:27.135Z","2.1.49":"2026-05-18T12:02:42.413Z","2.2.0":"2026-07-31T06:03:03.405Z","2.2.1":"2026-07-31T07:36:21.046Z","2.3.0":"2026-08-12T04:13:43.153Z","2.3.1":"2026-08-13T05:25:15.647Z","2.3.2":"2026-08-25T17:27:20.916Z","2.3.3":"2026-09-10T09:56:17.585Z","2.3.4":"2026-09-14T05:42:51.515Z"},"description":"A high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI.","maintainers":[{"name":"suraj_magar","email":"suraz.mazar@gmail.com"}],"readme":"# rc-sheet-viewer-17\n\nA high-performance React component for viewing and editing Excel and CSV files with a Google Sheets-like interface. Handles 100k+ rows with virtualized rendering, embedded chart extraction, pivot table reconstruction, and a clean, familiar spreadsheet UI. Compatible with React 17, 18, and 19.\n\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue)](https://www.typescriptlang.org/)\n[![React 17+](https://img.shields.io/badge/React-17%20%7C%2018%20%7C%2019-61dafb)](https://react.dev/)\n[![Storybook](https://img.shields.io/badge/Storybook-stories-ff4785)](https://storybook.js.org/)\n\n---\n\n## Features\n\n- **File format support** — `.xlsx`, `.xls`, and `.csv` parsed entirely client-side\n- **Virtualized grid** — row and column virtualization via TanStack Virtual; renders 100k+ rows smoothly\n- **Google Sheets-like UI** — column headers (A, B, ... Z, AA ...), row numbers, sticky headers, sheet tabs, formula bar, status bar\n- **View & edit modes** — read-only viewing or inline cell editing, controlled via props\n- **Multiple sheets** — tab-based sheet switching with per-sheet selection state\n- **Range highlighting** — pass Excel-style references like `A1:D10` to highlight and scroll into view\n- **Clear highlight API** — remove the active range via `ref.current?.clearHighlight()` or `setHighlight('')`\n- **Highlight area ref** — get one DOM element spanning the whole highlighted range via `highlightAreaRef`, for anchoring your own popovers\n- **Single-cell focus without range tint** — clicking one cell focuses it and updates the formula bar, but does not create a visible 1x1 highlight\n- **Custom highlight colors** — override the selection fill and border color via props\n- **Separate search highlight** — Ctrl+F search uses its own independent highlight with customizable colors\n- **Grid lines** — data-driven visible borders on arbitrary ranges (like Excel's \"All Borders\")\n- **Theme system** — override the entire library color palette via a single `theme` prop object\n- **Show/hide toolbar** — control full toolbar visibility with `showToolbar`, or hide only the filename with `showFileName`\n- **Embedded charts** — extracts charts from Excel files and renders them as floating overlays using Chart.js\n- **Pivot table reconstruction** — reads pivot table definitions from XLSX internals and reconstructs the output\n- **Search** — Ctrl+F search across the active sheet with dedicated highlight colors\n- **Download** — export the current data as `.xlsx` or `.csv`\n- **Charts from selection** — select a data range and create bar, line, pie, or area charts dynamically\n- **Copy & paste with formatting** — Ctrl+C/V with both HTML (preserving styles) and TSV clipboard formats\n- **Undo/redo** — Ctrl+Z and Ctrl+Y (or Ctrl+Shift+Z) for cell edits and paste\n- **Zoom** — Google Sheets-style zoom control in the formula bar, Ctrl/Cmd + scroll over the grid, or the `zoom` prop and ref API\n- **Excel column widths** — column widths set in the original workbook are preserved on render\n- **Auto-fit columns** — double-click a column header's edge to size it to its widest content\n- **Extensible tools** — register your own tools through the `tools` prop; they render at either end of the formula bar and the viewer knows nothing about what they do\n- **Custom loading UI** — replace the built-in parsing card via `renderLoading`, with live progress and status\n- **Column/row resize** — drag column and row header edges to resize\n- **Merged cells** — visually renders merged cell ranges from Excel files\n- **Text wrapping** — cells with `wrapText` style render multi-line content\n- **Cell comments** — red triangle indicator with hover tooltip for commented cells\n- **Conditional formatting** — rule-based cell styling (value comparisons, color scales, data bars)\n- **Data validation** — input validation with dropdown lists, number/date ranges, and error UI\n- **Formula engine** — parse and evaluate Excel-style formulas (24 built-in functions: SUM, IF, VLOOKUP, etc.)\n- **Imperative API** — access sheet data, navigate sheets, resize columns, manage comments, undo/redo, and more via ref\n- **Selection callback with DOM info** — `onSelectionChange` provides the anchor cell's `HTMLElement` and `DOMRect`\n- **Highlightable** — disable all cell/range highlight visuals with `highlightable={false}`\n- **Sheet select callback** — `onSheetSelect` fires when the user clicks a sheet tab\n- **Large cell content** — active cell expands to show full text (Google Sheets-style)\n- **Instance isolation** — multiple `<SheetViewer />` components on the same page are fully independent\n- **Nested container support** — horizontal trackpad/mouse scrolling works in nested scrollable containers\n- **Zero global styles** — all CSS scoped under `.sheet-viewer` with `sv-` prefixed classes\n\n---\n\n## Installation\n\n```bash\npnpm add rc-sheet-viewer-17\n# or\nnpm install rc-sheet-viewer-17\n# or\nyarn add rc-sheet-viewer-17\n```\n\n**Peer dependencies:** `react >= 17` and `react-dom >= 17`\n\n---\n\n## Quick Start\n\n```tsx\nimport { SheetViewer } from 'rc-sheet-viewer-17';\nimport 'rc-sheet-viewer-17/style.css';\n\nfunction App() {\n  return (\n    <SheetViewer\n      source=\"/path/to/spreadsheet.xlsx\"\n      mode=\"view\"\n      height=\"100vh\"\n      width=\"100%\"\n      downloadable\n      searchable\n    />\n  );\n}\n```\n\n---\n\n## Source Types\n\nThe `source` prop accepts multiple formats:\n\n```tsx\n// URL string — fetched automatically\n<SheetViewer source=\"https://example.com/data.xlsx\" />\n\n// File object — from an <input type=\"file\"> or drag-and-drop\n<SheetViewer source={fileFromInput} />\n\n// ArrayBuffer — from any binary source\n<SheetViewer source={arrayBuffer} />\n\n// TypedArray (Uint8Array, etc.)\n<SheetViewer source={uint8Array} />\n```\n\n---\n\n## Props\n\n| Prop | Type | Default | Description |\n|---|---|---|---|\n| `source` | `string \\| File \\| ArrayBuffer \\| ArrayBufferView` | — | Data source to load |\n| `mode` | `'view' \\| 'edit'` | `'view'` | View-only or editable mode |\n| `activeSheet` | `string` | — | Controlled active sheet name |\n| `highlight` | `string` | — | Excel-style range to highlight (e.g. `\"A1:D10\"`) |\n| `highlightColor` | `string` | — | Custom fill color for the highlighted range (e.g. `\"rgba(255,0,0,0.1)\"`) |\n| `highlightBorderColor` | `string` | — | Custom border color for the highlighted range (e.g. `\"#ff0000\"`) |\n| `highlightable` | `boolean` | `true` | When `false`, all selection/highlight visuals are suppressed |\n| `highlightAreaRef` | `Ref<HTMLDivElement>` | — | Receives one DOM element spanning the entire highlighted area; `null` when no highlight. See [Anchoring UI to the highlighted area](#anchoring-ui-to-the-highlighted-area) |\n| `highlightAreaProps` | `HighlightAreaAttributes` | — | Extra HTML attributes (`id`, `data-*`, `style`, handlers…) for that element. `className` is appended to `sv-highlight-area`; geometry always wins over `style` |\n| `gridLines` | `GridLineConfig[]` | — | Draw visible cell borders on specific ranges (like Excel's All Borders) |\n| `tools` | `SheetViewerTool[]` | — | Tools to register in the formula bar's Tools section. See [Tools](#tools) |\n| `toolsPlacement` | `'left' \\| 'right'` | `'left'` | Which end of the formula bar row the tools sit at. A tool's own `placement` overrides this |\n| `renderLoading` | `(state: SheetViewerLoadingState) => ReactNode` | — | Replace the built-in loading UI. See [Custom loading UI](#custom-loading-ui) |\n| `zoomable` | `boolean` | `true` | Show the zoom control in the formula bar |\n| `zoomPlacement` | `'left' \\| 'right'` | `'left'` | Which end of the formula bar row the zoom control sits at |\n| `zoom` | `number` | — | Zoom factor (`1` = 100%). The user can still zoom afterwards; changes report via `onZoomChange` |\n| `defaultZoom` | `number` | `1` | Zoom factor to start at when `zoom` is not supplied |\n| `zoomLevels` | `number[]` | `[0.5, 0.75, 0.9, 1, 1.25, 1.5, 2]` | Levels offered by the zoom control |\n| `minZoom` | `number` | `0.25` | Lowest zoom the viewer will go to |\n| `maxZoom` | `number` | `4` | Highest zoom the viewer will go to |\n| `onZoomChange` | `(zoom: number) => void` | — | Called whenever the zoom factor changes |\n| `showToolbar` | `boolean` | `true` | Show or hide the entire toolbar row |\n| `showFileName` | `boolean` | `true` | Show or hide only the filename/logo in the toolbar. Charts & Download remain visible |\n| `theme` | `SheetViewerTheme` | — | Override the entire color palette of the library |\n| `searchMatchColor` | `string` | — | Background color for search match cells (default: `rgba(255,213,79,0.35)`) |\n| `searchActiveColor` | `string` | — | Background color for the active/current search match (default: `rgba(255,152,0,0.55)`) |\n| `onSheetChange` | `(sheetName: string) => void` | — | Called when the user switches sheets |\n| `onSheetSelect` | `(sheetName: string) => void` | — | Called when the user clicks a sheet tab |\n| `onCellChange` | `(sheet, row, col, value) => void` | — | Called when a cell is edited |\n| `onSelectionChange` | `(ranges: CellRange[], cellInfo?) => void` | — | Called when selection changes; includes anchor cell element + bounding rect |\n| `downloadable` | `boolean` | `false` | Show a download button in the toolbar |\n| `chartable` | `boolean` | `true` | Show Charts button in toolbar |\n| `searchable` | `boolean` | `true` | Enable Ctrl+F search |\n| `tabNavigation` | `boolean` | `true` | Enable Tab / Shift+Tab to move between cells |\n| `keyboardInteractions` | `boolean \\| SheetViewerKeyboardConfig` | `true` | Turn the viewer's keyboard shortcuts and grid navigation off, all at once or by group. See [Keyboard interactions](#keyboard-interactions) |\n| `height` | `number \\| string` | `'100%'` | Container height (px or CSS value) |\n| `width` | `number \\| string` | `'100%'` | Container width (px or CSS value) |\n| `className` | `string` | `''` | Additional CSS class on the root element |\n\n---\n\n## Imperative API (Ref)\n\nAccess sheet data and control navigation programmatically:\n\n```tsx\nimport { useRef } from 'react';\nimport { SheetViewer } from 'rc-sheet-viewer-17';\nimport type { SheetViewerHandle } from 'rc-sheet-viewer-17';\n\nfunction App() {\n  const ref = useRef<SheetViewerHandle>(null);\n\n  const handleClick = () => {\n    // Get all sheet names\n    console.log(ref.current?.getSheetNames());\n\n    // Get data for the active sheet\n    const data = ref.current?.getSheetData();\n    console.log(`${data?.rows} rows, ${data?.cols} cols`);\n\n    // Get data for a specific cell range\n    const rangeData = ref.current?.getCellRangeData('A1:C10');\n    console.log(rangeData); // CellValue[][] | null\n\n    // Get data for the current mouse/drag selection\n    const selData = ref.current?.getSelectedRangeData();\n\n    // Switch to a specific sheet\n    ref.current?.setActiveSheet('Sheet2');\n\n    // Highlight a range (triggers onSelectionChange)\n    ref.current?.setHighlight('A1:F20');\n\n    // Highlight silently (does NOT trigger onSelectionChange)\n    ref.current?.setHighlight('A1:F20', { silent: true });\n\n    // Clear the current highlight / selection\n    ref.current?.clearHighlight();\n\n    // Clear silently (does NOT trigger onSelectionChange)\n    ref.current?.clearHighlight({ silent: true });\n\n    // Get the current highlight/selection range string\n    const range = ref.current?.getHighlight(); // e.g. \"A1:D10\" or null\n\n    // Undo / redo\n    if (ref.current?.canUndo()) ref.current.undo();\n    if (ref.current?.canRedo()) ref.current.redo();\n  };\n\n  return (\n    <>\n      <button onClick={handleClick}>Inspect</button>\n      <SheetViewer ref={ref} source={file} />\n    </>\n  );\n}\n```\n\n### Handle Methods\n\n| Method | Return | Description |\n|---|---|---|\n| `getSheetNames()` | `string[]` | All sheet names in the workbook |\n| `getSheetData(name?)` | `SheetData \\| null` | Data for a sheet (defaults to active) |\n| `getActiveSheet()` | `string \\| null` | Currently active sheet name |\n| `getAllSheets()` | `Record<string, SheetData>` | All parsed sheets |\n| `getFileName()` | `string \\| null` | The loaded file name |\n| `getCellRangeData(range, name?)` | `CellValue[][] \\| null` | Get data for an Excel-style range |\n| `getSelectedRangeData()` | `CellValue[][] \\| null` | Get data for the current drag selection |\n| `setActiveSheet(name)` | `void` | Switch to a sheet |\n| `setHighlight(range, options?)` | `void` | Highlight a range. Pass `''` to clear. `{ silent: true }` suppresses `onSelectionChange` |\n| `clearHighlight(options?)` | `void` | Remove the current highlight. `{ silent: true }` suppresses `onSelectionChange` |\n| `getHighlight()` | `string \\| null` | Current highlight/selection range string (e.g. `\"A1:D10\"`) |\n| `getHighlightElement()` | `HTMLElement \\| null` | The single element spanning the highlighted area (same one `highlightAreaRef` receives) |\n| `scrollToSelection()` | `boolean` | Scroll so the whole selection is visible; `false` if nothing is selected |\n| `setColumnWidth(col, width, name?)` | `void` | Set column width in pixels (min 30px) |\n| `autoFitColumn(col, name?)` | `number \\| null` | Size a column to its widest content. Returns the applied width, or `null` for an empty column |\n| `setRowHeight(row, height, name?)` | `void` | Set row height in pixels (min 20px) |\n| `getZoom()` | `number` | Current zoom factor (`1` = 100%) |\n| `setZoom(zoom)` | `void` | Set the zoom factor, clamped to `minZoom`/`maxZoom` |\n| `zoomIn()` | `void` | Step up to the next zoom level |\n| `zoomOut()` | `void` | Step down to the previous zoom level |\n| `resetZoom()` | `void` | Return to 100% |\n| `getCellComment(cellRef, name?)` | `CellComment \\| null` | Get comment for a cell |\n| `setCellComment(cellRef, text, author?, name?)` | `void` | Set or remove a cell comment |\n| `undo()` | `void` | Undo the last cell edit or paste |\n| `redo()` | `void` | Redo the last undone edit |\n| `canUndo()` | `boolean` | Whether undo is available |\n| `canRedo()` | `boolean` | Whether redo is available |\n\n---\n\n## Custom Highlight Colors\n\nOverride the default blue selection with any fill and border color:\n\n```tsx\n<SheetViewer\n  source={file}\n  highlight=\"B2:D10\"\n  highlightColor=\"rgba(255, 0, 0, 0.12)\"\n  highlightBorderColor=\"#e53935\"\n/>\n```\n\nTo remove a highlight programmatically:\n\n```tsx\nref.current?.clearHighlight();\nref.current?.clearHighlight({ silent: true });\n\n// Equivalent clear via the existing API:\nref.current?.setHighlight('');\n```\n\n---\n\n## Grid Lines\n\nDraw visible Excel-style cell borders on arbitrary ranges:\n\n```tsx\nimport type { GridLineConfig } from 'rc-sheet-viewer-17';\n\nconst gridLines: GridLineConfig[] = [\n  // Bold blue header row with background\n  { range: 'A1:F1', borderColor: '#1a73e8', borderWidth: 2, bgColor: '#e8f0fe' },\n  // Light gray border for all data cells\n  { range: 'A2:F50', borderColor: '#dadce0', borderWidth: 1 },\n  // Dashed red highlight zone\n  { range: 'C2:C50', borderColor: '#ea4335', borderWidth: 1, borderStyle: 'dashed' },\n];\n\n<SheetViewer source={file} gridLines={gridLines} />\n```\n\n### `GridLineConfig` fields\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `range` | `string` | required | Excel-style range e.g. `\"A1:D10\"` |\n| `borderColor` | `string` | `var(--sv-color-border)` | Border color |\n| `borderWidth` | `number` | `1` | Border width in pixels |\n| `borderStyle` | `'solid' \\| 'dashed' \\| 'dotted'` | `'solid'` | Border style |\n| `bgColor` | `string` | — | Optional background fill for cells in this range |\n\n---\n\n## Theme Customization\n\nOverride the entire library color palette with a `theme` prop:\n\n```tsx\nimport type { SheetViewerTheme } from 'rc-sheet-viewer-17';\n\nconst darkTheme: SheetViewerTheme = {\n  bgColor: '#1e1e2e',\n  surfaceColor: '#181825',\n  borderColor: '#313244',\n  borderLightColor: '#45475a',\n  textColor: '#cdd6f4',\n  textSecondaryColor: '#a6adc8',\n  textMutedColor: '#6c7086',\n  primaryColor: '#89b4fa',\n  primaryLightColor: '#313244',\n  primaryBgColor: '#1e1e2e',\n  selectionColor: 'rgba(137,180,250,0.15)',\n  selectionHoverColor: 'rgba(137,180,250,0.25)',\n  headerBgColor: '#181825',\n  headerTextColor: '#a6adc8',\n  hoverColor: '#313244',\n};\n\n<SheetViewer source={file} theme={darkTheme} />\n```\n\n### `SheetViewerTheme` fields\n\n| Field | CSS Variable | Description |\n|---|---|---|\n| `bgColor` | `--sv-color-bg` | Main background color |\n| `surfaceColor` | `--sv-color-surface` | Secondary background (toolbars, headers) |\n| `borderColor` | `--sv-color-border` | Default border color |\n| `borderLightColor` | `--sv-color-border-light` | Light border color |\n| `textColor` | `--sv-color-text` | Primary text color |\n| `textSecondaryColor` | `--sv-color-text-secondary` | Secondary text color |\n| `textMutedColor` | `--sv-color-text-muted` | Muted/placeholder text |\n| `primaryColor` | `--sv-color-primary` | Primary accent color |\n| `primaryLightColor` | `--sv-color-primary-light` | Light primary variant |\n| `primaryBgColor` | `--sv-color-primary-bg` | Very light primary background |\n| `selectionColor` | `--sv-color-selection` | Range selection fill color |\n| `selectionHoverColor` | `--sv-color-selection-hover` | Range selection fill on hover |\n| `headerBgColor` | `--sv-color-header-bg` | Column/row header background |\n| `headerTextColor` | `--sv-color-header-text` | Column/row header text |\n| `hoverColor` | `--sv-color-hover` | Cell hover background |\n\nYou can also override these directly in CSS:\n\n```css\n.sheet-viewer {\n  --sv-color-primary: #7c3aed;\n  --sv-color-selection: rgba(124, 58, 237, 0.1);\n}\n```\n\n---\n\n## Search Highlight Colors\n\nCustomize the colors used to highlight search matches independently from the selection:\n\n```tsx\n<SheetViewer\n  source={file}\n  searchMatchColor=\"rgba(255, 213, 79, 0.45)\"     // all matches — yellow\n  searchActiveColor=\"rgba(255, 152, 0, 0.7)\"      // current match — orange\n/>\n```\n\nPress Ctrl+F (Cmd+F) to open search. Matches are shown with a dedicated highlight that does **not** interfere with the user's cell selection.\n\n**Priority:** Search match highlights always take precedence over the range selection highlight — if a cell is both selected and a search match, the search color wins.\n\n---\n\n## Show / Hide Toolbar\n\n```tsx\n// Hide the entire toolbar row\n<SheetViewer source={file} showToolbar={false} />\n\n// Hide just the filename/logo, keep Charts and Download buttons\n<SheetViewer source={file} showFileName={false} downloadable chartable />\n\n// Show everything (defaults)\n<SheetViewer source={file} showToolbar={true} showFileName={true} downloadable chartable />\n```\n\n`showToolbar={false}` removes the whole toolbar row. `showFileName={false}` keeps the toolbar but hides only the logo and filename text, leaving Charts and Download visible.\n\n---\n\n## Selection Callback with Cell DOM Info\n\n`onSelectionChange` provides the DOM element and bounding rect of the anchor cell for drag selections and programmatic highlights, useful for positioning custom popovers or tooltips:\n\n```tsx\n<SheetViewer\n  source={file}\n  onSelectionChange={(ranges, cellInfo) => {\n    console.log('Selected ranges:', ranges);\n    if (cellInfo) {\n      console.log('Anchor element:', cellInfo.element);\n      console.log('Bounding rect:', cellInfo.rect);\n      // e.g. position a tooltip at cellInfo.rect.bottom, cellInfo.rect.left\n    }\n  }}\n/>\n```\n\n---\n\n## Highlight Syntax\n\nThe `highlight` prop, `setHighlight` method, and `getHighlight` method all use Excel-style cell references:\n\n| Expression | Meaning |\n|---|---|\n| `A1` | Single cell |\n| `A1:D10` | Rectangular range |\n| `B:B` | Entire column |\n| `3:3` | Entire row |\n| `A1:B5, D1:E5` | Multiple ranges (comma-separated) |\n\nNotes:\n\n- A plain single-cell click focuses the cell but does not create a visible highlighted range\n- `setHighlight('')`, `clearHighlight()`, or clearing the controlled `highlight` prop removes the current highlight\n\n---\n\n## Anchoring UI to the highlighted area\n\n`highlightAreaRef` gives you **one** DOM element that spans the entire highlighted area, so you can position your own popover, toolbar, or callout against it:\n\n```tsx\nimport React, { useRef, useState, useEffect } from 'react';\nimport { SheetViewer } from 'rc-sheet-viewer-17';\nimport type { CellRange } from 'rc-sheet-viewer-17';\n\nfunction Example() {\n  const highlightAreaRef = useRef<HTMLDivElement>(null);\n  const [ranges, setRanges] = useState<CellRange[]>([]);\n  const [box, setBox] = useState<DOMRect | null>(null);\n\n  // Read the rect in an effect — see the note below on why not in the callback\n  useEffect(() => {\n    setBox(highlightAreaRef.current?.getBoundingClientRect() ?? null);\n  }, [ranges]);\n\n  return (\n    <>\n      <SheetViewer\n        source=\"/data.xlsx\"\n        highlightAreaRef={highlightAreaRef}\n        onSelectionChange={(r) => setRanges(r)}\n        height={600}\n      />\n      {box && (\n        <div style={{ position: 'fixed', top: box.top - 32, left: box.left }}>\n          {ranges.length} range(s) selected\n        </div>\n      )}\n    </>\n  );\n}\n```\n\nThe grid is virtualized, so the highlighted **cells** are not all in the DOM — most of a large range has no cell node at all. This element is a single invisible box covering the highlight's bounding rectangle instead, positioned in grid content coordinates. Behavior:\n\n- **One element, always.** For a multi-range highlight like `\"A1:B2, D1:E3\"` you get a single element spanning the union (`A1:E3`) — which also covers column `C`, since it is one rectangle.\n- **`null` when there is no highlight.** The element unmounts, so an object ref's `.current` becomes `null` and a callback ref is called with `null`.\n- Populated for **any** selection: `setHighlight()`, the `highlight` prop, drag-selection, and a plain single-cell click (even though a single click draws no tint).\n- Still provided when `highlightable={false}` — that prop suppresses *visuals*, and this element has none.\n- Stays pinned to the content while scrolling, and repositions when columns or rows are resized.\n- Invisible and `pointer-events: none`. You can style it via the `.sv-highlight-area` class if you want your own outline.\n\n> **Do not read the ref inside `onSelectionChange`.** That callback fires synchronously while the store updates, *before* React commits, so the element is not yet positioned (or may not exist). Store the ranges in state as above and read the rect in a `useEffect` / `useLayoutEffect`. If you call `setHighlight()` from outside a React event handler on React 17, updates are unbatched — wrap it in `unstable_batchedUpdates` or read the rect in a `requestAnimationFrame`.\n\n`ref.current?.getHighlightElement()` returns the same element if you already hold a `SheetViewerHandle` and would rather not pass a second ref.\n\n### Attributes on the highlight area\n\n`highlightAreaProps` puts arbitrary HTML attributes on that same element — an `id` for a popover library to resolve as its anchor, a test id, ARIA wiring, or your own styling:\n\n```tsx\n<SheetViewer\n  source={file}\n  highlightAreaProps={{\n    id: 'selection-anchor',\n    'data-testid': 'highlight-box',\n    style: { pointerEvents: 'auto', outline: '2px dashed #e53935' },\n    onClick: () => console.log('highlight clicked'),\n  }}\n/>\n```\n\nTwo merge rules keep the element working:\n\n- **`className` is appended** to `sv-highlight-area`, never replaces it — the class carries the CSS and is what `getHighlightElement()` queries.\n- **The measured geometry wins** over `style`. `top`/`left`/`width`/`height` are always the computed box; everything else in `style` is applied as given.\n\n`aria-hidden=\"true\"` is the default and can be overridden. The element is `pointer-events: none` by default — set `pointerEvents: 'auto'` if you want it clickable (note that this makes it swallow drag-selection over the highlighted cells).\n\n### Scrolling the selection into view\n\n`ref.current?.scrollToSelection()` scrolls so the **entire** selection is visible:\n\n```tsx\nviewerRef.current?.setHighlight('C400:F420');\nviewerRef.current?.scrollToSelection();\n```\n\n- Spans the **union** of every selected range, so multi-range highlights like `A1:B5,D1:E5` are fully revealed.\n- Moves the **minimum** amount needed on each axis — a selection already fully in view does not move, and an axis that is already visible is left alone.\n- A selection larger than the viewport is aligned to its top-left corner.\n- Returns `false` when there is no selection.\n\nThis is separate from the automatic scroll that already runs when the selection changes; calling it does not alter that behavior.\n\n---\n\n## Edit Mode\n\nEnable inline cell editing:\n\n```tsx\n<SheetViewer\n  source={file}\n  mode=\"edit\"\n  onCellChange={(sheet, row, col, value) => {\n    console.log(`${sheet}[${row},${col}] = ${value}`);\n  }}\n/>\n```\n\nDouble-click a cell to start editing. Press Enter to confirm or Escape to cancel.\n\n---\n\n## Copy & Paste with Formatting\n\n- **Ctrl+C** (Cmd+C on Mac) — copies the selected range as HTML (with inline styles) and TSV\n- **Ctrl+V** (Cmd+V on Mac) — pastes HTML (preferred, preserves styles) or plain TSV\n- **Escape** — clears the marching ants copy indicator\n\nPaste requires `mode=\"edit\"`.\n\n---\n\n## Large Cell Content\n\nWhen a cell contains long text, inactive cells truncate with ellipsis. The formula bar always shows the complete value, and highlighted range anchor cells can expand to show full content.\n\n---\n\n## Undo & Redo\n\n- **Ctrl+Z** (Cmd+Z) — undo\n- **Ctrl+Y** or **Ctrl+Shift+Z** — redo\n\nAlso available via ref:\n\n```tsx\nif (ref.current?.canUndo()) ref.current.undo();\nif (ref.current?.canRedo()) ref.current.redo();\n```\n\n---\n\n## Keyboard interactions\n\nBy default the viewer listens on the document for the shortcuts and navigation keys\nlisted above. `keyboardInteractions` turns that off — useful when the viewer is\nembedded in a page or modal that owns those keys itself.\n\n```tsx\n// Nothing the viewer handles at the document level fires\n<SheetViewer source={file} keyboardInteractions={false} />\n```\n\nPass an object to disable individual groups and leave the rest working:\n\n```tsx\n// Arrows and Enter still move the active cell; the app keeps Ctrl+F and Ctrl+Z\n<SheetViewer\n  source={file}\n  keyboardInteractions={{ clipboard: false, history: false, search: false }}\n/>\n```\n\n| Group | Default | Keys |\n| --- | --- | --- |\n| `navigation` | `true` | Arrow keys, Tab / Shift+Tab, Enter, Home, End — plus everything the browser would do by itself, see below |\n| `editing` | `true` | Enter and F2 to open the cell editor (edit mode only) |\n| `clipboard` | `true` | Ctrl/Cmd+C, Ctrl/Cmd+V, Escape to clear the copy marquee |\n| `history` | `true` | Ctrl/Cmd+Z, Ctrl/Cmd+Y, Ctrl/Cmd+Shift+Z |\n| `search` | `true` | Ctrl/Cmd+F to open search, Escape to close it |\n\nTurning `navigation` off also takes away the two keyboard moves the viewer does\nnot handle itself, so the grid really is inert under the keyboard:\n\n- **The browser's own scrolling.** With focus inside the viewer, arrow keys, Page\n  keys, Home/End and Space scroll the grid as a default action, with no handler of\n  the viewer's involved. Those keys are swallowed. Key presses aimed at the page\n  outside the viewer are left alone — scrolling the host document stays the host\n  page's business.\n- **The tab order.** The viewer's buttons and inputs are given `tabindex=\"-1\"`, so\n  Tab walks straight past the whole viewer instead of stepping through the toolbar,\n  sheet tabs, zoom picker and range box. Nothing is trapped: Tab from inside moves\n  on to the next control after the viewer, and mouse clicks still focus and operate\n  every control as before.\n\nNotes:\n\n- Typing inside the viewer's own inputs is never affected. Once the cell editor,\n  the range box, or the search box has focus, text entry works normally — arrow keys\n  move the caret, and Enter commits an edit — because the editor is opened by mouse\n  and would otherwise have no way to finish. This prop governs shortcuts, focus and\n  grid navigation, not text entry.\n- `tabNavigation` applies on top of `navigation`: Tab moves between cells, and\n  commits from the cell editor, only when both are enabled.\n- With `search: false` there is no way left to open the search bar, since Ctrl+F is\n  its only trigger. Mouse-driven behavior — click, drag-select, double-click to\n  edit, column resize, Ctrl+scroll zoom — is untouched either way.\n\n---\n\n## Zoom\n\nA Google Sheets-style zoom picker sits at the start of the formula bar row. Users can also hold Ctrl/Cmd and scroll over the grid. Because it lives in the formula bar rather than the toolbar, `showToolbar={false}` does not hide it.\n\nZoom scales the grid's real geometry — column widths, row heights, headers and type — rather than CSS-transforming it, so selection, scrolling, overlays and hit testing stay exact at every level.\n\n```tsx\n<SheetViewer\n  source={file}\n  defaultZoom={0.75}\n  zoomLevels={[0.5, 1, 1.5, 2]}\n  minZoom={0.5}\n  maxZoom={2}\n  onZoomChange={(zoom) => console.log(`${zoom * 100}%`)}\n/>\n```\n\nProgrammatic control:\n\n```tsx\nref.current?.zoomIn();\nref.current?.zoomOut();\nref.current?.setZoom(1.5);\nref.current?.resetZoom();\nref.current?.getZoom();   // 1\n```\n\n`zoomIn`/`zoomOut` walk the `zoomLevels` ladder and stop at its ends — at 200% (the top level) `zoomIn` is a no-op rather than jumping to `maxZoom`. `minZoom`/`maxZoom` are the limits for `setZoom`, not extra rungs, so stepping never lands on a level the picker does not offer.\n\nHide the control entirely with `zoomable={false}` — the `zoom` prop and ref API still work.\n\n---\n\n## Column & Row Resizing\n\nDrag the right edge of column headers or the bottom edge of row headers to resize. Minimum column: 30px, minimum row: 20px.\n\n**Excel column widths are preserved.** Columns explicitly sized in the source workbook render at that width; columns the author never touched fall back to the viewer's default of 100px.\n\n**Auto-fit:** double-click a column header's right edge to size that column to its widest content, the same gesture as Excel and Google Sheets. Results are clamped to 30–500px so one long cell cannot push everything else off-screen, and very tall sheets are fitted from their leading rows to keep the gesture instant.\n\nProgrammatic control:\n\n```tsx\nref.current?.setColumnWidth(0, 200);  // Column A → 200px\nref.current?.setRowHeight(0, 50);     // Row 1 → 50px\nref.current?.autoFitColumn(0);        // Column A → fits its content\n```\n\n---\n\n## Tools\n\nThe formula bar row hosts a Tools section that renders whatever you register through the `tools` prop, alongside the zoom control. The viewer never knows what a tool does, so new functionality is added from the outside — no changes to the component itself. Tools stay visible when `showToolbar={false}`.\n\nUse `toolsPlacement` to put them at either end of the row, and `zoomPlacement` for the zoom control — the two are independent, so they can sit at opposite ends. An individual tool can opt out with its own `placement`:\n\n```tsx\n<SheetViewer\n  tools={[copyStats, exportTool, { ...sheetInfo, placement: 'right' }]}\n  toolsPlacement=\"left\"    // copyStats + exportTool go left…\n  zoomPlacement=\"right\"    // …zoom goes right, and sheetInfo joins it\n/>\n```\n\nA tool with no configuration is a plain object:\n\n```tsx\nimport { SheetViewer } from 'rc-sheet-viewer-17';\nimport type { SheetViewerTool } from 'rc-sheet-viewer-17';\n\nconst copyStats: SheetViewerTool = {\n  id: 'copy-stats',\n  label: 'Copy stats',\n  icon: StatsIcon,                          // component, or a ready-made element\n  isDisabled: (ctx) => ctx.selection.length === 0,\n  onClick: (ctx) => {\n    const rows = ctx.viewer.getSelectedRangeData();\n    navigator.clipboard.writeText(JSON.stringify(rows));\n  },\n};\n\n<SheetViewer source={file} tools={[copyStats]} />\n```\n\nTools that carry their own settings use `defineSheetViewerTool`, which infers the config type and type-checks every callback against it before binding it in:\n\n```tsx\nimport { defineSheetViewerTool } from 'rc-sheet-viewer-17';\n\nconst exportTool = defineSheetViewerTool({\n  id: 'export-selection',\n  label: 'Export selection',\n  icon: DownloadIcon,\n  config: { format: 'csv' as const, endpoint: '/api/export' },\n  onClick: (ctx, config) => {\n    // config is fully typed here — a typo is a compile error\n    fetch(config.endpoint, {\n      method: 'POST',\n      body: JSON.stringify({ format: config.format, rows: ctx.viewer.getSelectedRangeData() }),\n    });\n  },\n});\n```\n\nThat binding is what keeps `tools` a single concrete `SheetViewerTool[]` — no `any`, no union to widen — while each tool's own options stay checked where the tool is written.\n\n### Tool fields\n\n| Field | Type | Description |\n|---|---|---|\n| `id` | `string` | Stable identifier, unique within the array |\n| `label` | `string` | Tooltip and accessible name |\n| `icon` | `ComponentType<{ size: number }> \\| ReactElement` | Icon component (rendered at 16px) or a ready-made element |\n| `onClick` | `(ctx: SheetViewerToolClickContext) => void` | Runs when the user activates the tool |\n| `showLabel` | `boolean` | Render the label beside the icon. Default: `false` |\n| `placement` | `'left' \\| 'right'` | Pin this tool to one end, overriding the viewer's `toolsPlacement` |\n| `isDisabled` | `(ctx: SheetViewerToolContext) => boolean` | Grey the tool out; re-evaluated as viewer state changes |\n| `isActive` | `(ctx: SheetViewerToolContext) => boolean` | Render the tool pressed |\n\n`defineSheetViewerTool` takes the same fields plus `config`, and passes it as a second argument to `onClick`, `isDisabled` and `isActive`.\n\n### Tool context\n\nEvery callback receives a snapshot of the viewer:\n\n| Field | Type | Description |\n|---|---|---|\n| `viewer` | `SheetViewerHandle` | The same imperative API the `ref` exposes |\n| `fileName` | `string \\| null` | Loaded file name |\n| `sheetNames` | `string[]` | Every sheet in the workbook |\n| `activeSheet` | `string \\| null` | Sheet currently on screen |\n| `sheetData` | `SheetData \\| null` | Data for the active sheet |\n| `selection` | `CellRange[]` | Selected ranges — empty when nothing is selected |\n| `activeCell` | `ActiveCell \\| null` | Anchor cell of the selection |\n| `zoom` | `number` | Current zoom factor |\n| `mode` | `'view' \\| 'edit'` | Current viewer mode |\n\n`onClick` also gets `element`, the tool's own button, for anchoring a popover or menu to it.\n\n---\n\n## Custom loading UI\n\n`renderLoading` replaces the built-in card shown while the file is fetched and parsed. Your node renders inside the viewer's own full-bleed overlay, so you only describe the content — positioning and stacking are handled.\n\n```tsx\n<SheetViewer\n  source={file}\n  renderLoading={({ progress, status, fileName, isFetching }) => (\n    <MyLoader\n      title={fileName ?? 'Reading file…'}\n      label={isFetching ? 'Downloading' : status}\n      value={progress}\n    />\n  )}\n/>\n```\n\n| Field | Type | Description |\n|---|---|---|\n| `progress` | `number` | Overall progress, 0–100 |\n| `status` | `string` | Current step, e.g. `\"Parsing workbook...\"`. Empty while fetching |\n| `fileName` | `string \\| null` | Name of the file being loaded, once known |\n| `isFetching` | `boolean` | True while the source is still being fetched or read, before parsing starts |\n\nReturn `null` to show nothing at all. Omit the prop to keep the default card.\n\n---\n\n## Cell Comments\n\nCells with comments display a red triangle in the top-right corner. Hover to see the comment. Manage via ref:\n\n```tsx\nref.current?.setCellComment('A1', 'Review this value', 'Alice');\nconst comment = ref.current?.getCellComment('A1');\nref.current?.setCellComment('A1', null);  // Remove\n```\n\n---\n\n## Conditional Formatting\n\n```typescript\nconst rules: ConditionalFormatRule[] = [\n  {\n    type: 'greaterThan',\n    range: { startRow: 0, startCol: 0, endRow: 99, endCol: 0 },\n    values: [100],\n    style: { bgColor: '#e6f4ea', fontColor: '#137333' },\n  },\n  {\n    type: 'colorScale',\n    range: { startRow: 0, startCol: 1, endRow: 99, endCol: 1 },\n    colorScale: ['#f4cccc', '#fce8b2', '#b7e1cd'],\n  },\n];\n```\n\nSupported rule types: `greaterThan`, `lessThan`, `between`, `equalTo`, `textContains`, `top10`, `bottom10`, `colorScale`, `dataBar`.\n\n---\n\n## Data Validation\n\n```typescript\nconst validations: Record<string, ValidationRule> = {\n  '0,0': { type: 'list', listItems: ['High', 'Medium', 'Low'] },\n  '0,1': { type: 'number', min: 0, max: 100, errorMessage: 'Must be 0–100' },\n};\n```\n\n---\n\n## Formula Engine\n\nParse and evaluate Excel-style formulas. 24 built-in functions:\n\n| Category | Functions |\n|---|---|\n| Math | `SUM`, `AVERAGE`, `COUNT`, `COUNTA`, `MIN`, `MAX`, `ABS`, `SQRT`, `POWER`, `ROUND` |\n| Logical | `IF`, `AND`, `OR`, `NOT` |\n| Text | `CONCATENATE`, `LEFT`, `RIGHT`, `MID`, `LEN`, `UPPER`, `LOWER`, `TRIM` |\n| Lookup | `VLOOKUP`, `HLOOKUP`, `INDEX`, `MATCH` |\n\n---\n\n## Types\n\nAll types are exported:\n\n```tsx\nimport type {\n  SheetViewerProps,\n  SheetViewerHandle,\n  SheetViewerKeyboardConfig,\n  SheetViewerSource,\n  SheetViewerMode,\n  SheetViewerTheme,\n  SheetViewerTool,\n  SheetViewerToolDefinition,\n  SheetViewerToolContext,\n  SheetViewerToolClickContext,\n  SheetViewerToolIcon,\n  SheetViewerToolIconProps,\n  SheetViewerToolsPlacement,\n  SheetViewerLoadingState,\n  SheetData,\n  CellRange,\n  CellValue,\n  CellComment,\n  CellStyle,\n  ChartOverlay,\n  ChartSeries,\n  ChartType,\n  ConditionalFormatRule,\n  ConditionalFormatRuleType,\n  GridLineConfig,\n  GridLineBorderStyle,\n  ParsedGridLineConfig,\n  MergeCell,\n  SelectionState,\n  UndoEntry,\n  ValidationRule,\n  ValidationRuleType,\n} from 'rc-sheet-viewer-17';\n```\n\n---\n\n## Multiple Instances\n\nEach `<SheetViewer />` is fully isolated with its own state:\n\n```tsx\n<div style={{ display: 'flex', gap: 16 }}>\n  <SheetViewer source={file1} height={400} width=\"50%\" />\n  <SheetViewer source={file2} height={400} width=\"50%\" />\n</div>\n```\n\n---\n\n## Styling\n\nImport the CSS once:\n\n```tsx\nimport 'rc-sheet-viewer-17/style.css';\n```\n\nAll classes are scoped under `.sheet-viewer` and prefixed with `sv-`. Override CSS variables via the `theme` prop or directly in CSS:\n\n```css\n.sheet-viewer {\n  --sv-color-bg: #1e1e2e;\n  --sv-color-primary: #89b4fa;\n  --sv-search-match-color: rgba(137, 180, 250, 0.3);\n  --sv-search-active-color: rgba(137, 180, 250, 0.6);\n}\n```\n\n---\n\n## Development\n\n### Prerequisites\n\n- Node.js 18+\n- pnpm 8+\n\n### Commands\n\n```bash\npnpm dev              # Start demo app (dev server)\npnpm build            # Build demo app\npnpm build:lib        # Build library package\npnpm typecheck        # TypeScript type checking\npnpm test             # Run all tests\npnpm test:watch       # Tests in watch mode\npnpm lint             # ESLint\npnpm storybook        # Storybook at localhost:6006\npnpm build-storybook  # Static Storybook build\npnpm chromatic        # Visual regression tests\n```\n\n---\n\n## Browser Support\n\nWorks in all modern browsers (Chrome, Firefox, Safari, Edge). No IE11 support.\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}