{"_id":"@bernierllc/calendar","_rev":"8-b102c0e4b53a10f5aa0d9c76559642bd","name":"@bernierllc/calendar","dist-tags":{"latest":"1.5.0"},"versions":{"1.0.0":{"name":"@bernierllc/calendar","version":"1.0.0","keywords":[],"author":{"name":"Bernier LLC"},"license":"ISC","_id":"@bernierllc/calendar@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"c7f44e777a86d8fffd73fcad4941662bbeddc940","tarball":"https://registry.npmjs.org/@bernierllc/calendar/-/calendar-1.0.0.tgz","fileCount":23,"integrity":"sha512-PJCc0GTAkhY7B1yvEuRb8YqhqIcgslfKM0QA61zktc45R15QMR2ngMRjuw0x1C71vpC/Z6+7/jv+w6/3s2MQGQ==","signatures":[{"sig":"MEUCIGpw2QRl6uDyk13c304HEwreoCEJ4vMKSPse2+UH6YijAiEAjAGJB4p47mwtcloDEuTnAaCyh72UZsFnYhQdT1C7UZY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135080},"main":"src/index.js","type":"commonjs","types":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.js","require":"./src/index.js"},"./utils/ics":{"types":"./utils/ics.ts","import":"./utils/ics.js","require":"./utils/ics.js"}},"gitHead":"ebc352197e451a637c5d0935336d9f5a98520fc3","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"A calendar package for the tools monorepo.","directories":{},"_nodeVersion":"24.4.1","dependencies":{"ical-generator":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","postcss":"^8.5.6","ts-jest":"^29.4.0","@types/jest":"^30.0.0","tailwindcss":"^4.1.11","autoprefixer":"^10.4.21","@testing-library/react":"^14.3.1","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3"},"peerDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/calendar_1.0.0_1753330114145_0.44360887040267727","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bernierllc/calendar","version":"1.0.1","keywords":[],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/calendar@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"f0034476555237490efdedc299ff907fd072e299","tarball":"https://registry.npmjs.org/@bernierllc/calendar/-/calendar-1.0.1.tgz","fileCount":23,"integrity":"sha512-O56YAE/LzfsqHyE4HLojoXkDskAddTGv/WnfG08vCa+N3sYsuL0YWkT6KxsenG+3MF97VbJ1EhRUjIt5C6jVkQ==","signatures":[{"sig":"MEUCIQClPqtsabowuSo66v+HaKWYpwJs1SZ/BqSf41MHBSTmkAIgPt9tH1t7BbjKUP8fKm4VBcboetwhs9Woal1AIlU2neQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135154},"main":"src/index.js","type":"commonjs","types":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.js","require":"./src/index.js"},"./utils/ics":{"types":"./utils/ics.ts","import":"./utils/ics.js","require":"./utils/ics.js"}},"gitHead":"5b6b8cf24d97ad0d79e20bb05acb89f3960836c5","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"A calendar package for the tools monorepo.","directories":{},"_nodeVersion":"24.4.1","dependencies":{"ical-generator":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","postcss":"^8.5.6","ts-jest":"^29.4.0","@types/jest":"^29.5.14","tailwindcss":"^4.1.11","autoprefixer":"^10.4.21","@testing-library/react":"^14.3.1","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3"},"peerDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/calendar_1.0.1_1754196509005_0.0344914459866732","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/calendar","version":"1.2.0","keywords":[],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/calendar@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"034cceea41a4e90f48982797a454d34e2e94e12f","tarball":"https://registry.npmjs.org/@bernierllc/calendar/-/calendar-1.2.0.tgz","fileCount":24,"integrity":"sha512-brMLp2znRDP8h5Y7P0KvCaD4me7jmDWubDklP0iIou31wmq2LeQ5pLVmRGyiGmDRALlRq+zMbq4Hx+RdO90zRg==","signatures":[{"sig":"MEUCIAC3W6eA2LsP9uX9QRix79gbHbsnauWhygFIOAIaG8ATAiEAs2Wii6Quiulicj5+VfU4vvBNFStqIhzQjVrNdalNNY8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136896},"main":"src/index.js","type":"commonjs","types":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.js","require":"./src/index.js"},"./utils/ics":{"types":"./utils/ics.ts","import":"./utils/ics.js","require":"./utils/ics.js"}},"gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5eb1c4c8-4ac2-4c98-95ff-516f300467d1"}},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"A calendar package for the tools monorepo.","directories":{},"_nodeVersion":"20.19.6","dependencies":{"ical-generator":"^9.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","postcss":"^8.5.6","ts-jest":"^29.4.0","@types/jest":"^29.5.14","tailwindcss":"^4.1.11","autoprefixer":"^10.4.21","@testing-library/react":"^14.3.1","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3"},"peerDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/calendar_1.2.0_1767642351459_0.8692677382101006","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@bernierllc/calendar","version":"1.2.1","keywords":[],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/calendar@1.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"7e18289d98fd697518da97f6a7abcfb74fe956df","tarball":"https://registry.npmjs.org/@bernierllc/calendar/-/calendar-1.2.1.tgz","fileCount":24,"integrity":"sha512-zfiyJYysoeSzYs8fjOowi5SHWGLYYR9ucN/cH8OIerv4PvC03ilqLKo6uRHm90UzdcbLL/AXp10EIe/NdH3cqg==","signatures":[{"sig":"MEQCICxHkL9KaEPMTgrVo299RVcqd47wV1XMB8nyw+glz0iCAiBB1MV0axAo3KTNjzVqHHyVLKR0D861kl07hcW/JQltmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139272},"main":"src/index.js","type":"commonjs","_from":"file:bernierllc-calendar-1.2.1.tgz","types":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.js","require":"./src/index.js"},"./utils/ics":{"types":"./utils/ics.ts","import":"./utils/ics.js","require":"./utils/ics.js"}},"scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5eb1c4c8-4ac2-4c98-95ff-516f300467d1"}},"_resolved":"/tmp/1e91beaa10307cfa47df710eb1f17470/bernierllc-calendar-1.2.1.tgz","_integrity":"sha512-zfiyJYysoeSzYs8fjOowi5SHWGLYYR9ucN/cH8OIerv4PvC03ilqLKo6uRHm90UzdcbLL/AXp10EIe/NdH3cqg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"A calendar package for the tools monorepo.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"ical-generator":"^9.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","postcss":"^8.5.6","ts-jest":"^29.4.0","@types/jest":"^29.5.14","tailwindcss":"^4.1.11","autoprefixer":"^10.4.21","@testing-library/react":"^14.3.1","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3"},"peerDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/calendar_1.2.1_1773078141849_0.3603276986924515","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bernierllc/calendar","version":"1.2.2","keywords":[],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/calendar@1.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"daa48d2c5863a08d07d9f7ec215f578408db8162","tarball":"https://registry.npmjs.org/@bernierllc/calendar/-/calendar-1.2.2.tgz","fileCount":24,"integrity":"sha512-CfL7cvxHm5Rx43Rq5KMRCu5f1rMNiygg6zWcK6LGt+UyXtzbrMfUYvXj2EadiKB67D1VYCCfVAJZ6MFbj2V4SQ==","signatures":[{"sig":"MEQCIAGywnWfWyS2bmsWnRAlwHvnHxb2zNzXHiWKD2zoCswYAiAZTGSLLynaGezEyv7c2WuY3hlVQzQoqV3OigU0/oNElQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139465},"main":"src/index.js","type":"commonjs","_from":"file:bernierllc-calendar-1.2.2.tgz","types":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.js","require":"./src/index.js"},"./utils/ics":{"types":"./utils/ics.ts","import":"./utils/ics.js","require":"./utils/ics.js"}},"scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5eb1c4c8-4ac2-4c98-95ff-516f300467d1"}},"_resolved":"/home/runner/work/tools/tools/packages/ui/calendar/bernierllc-calendar-1.2.2.tgz","_integrity":"sha512-CfL7cvxHm5Rx43Rq5KMRCu5f1rMNiygg6zWcK6LGt+UyXtzbrMfUYvXj2EadiKB67D1VYCCfVAJZ6MFbj2V4SQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"A calendar package for the tools monorepo.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"ical-generator":"^9.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","postcss":"^8.5.6","ts-jest":"^29.4.0","@types/jest":"^29.5.14","tailwindcss":"^4.1.11","autoprefixer":"^10.4.21","@testing-library/react":"^14.3.1","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3"},"peerDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/calendar_1.2.2_1773163778941_0.9341061478049635","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/calendar","version":"1.3.0","keywords":[],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/calendar@1.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"5341eaf5d72ac7325a3e8a304f2bd729155b9a7a","tarball":"https://registry.npmjs.org/@bernierllc/calendar/-/calendar-1.3.0.tgz","fileCount":24,"integrity":"sha512-RP2JrRd3idnKDBBp0mXaUs4jmKjLv2yRU7ebWx+DuyXPYeoxeB8sIar+0nE0g5WlrZp3XsqmrEvD6viNXdwXaw==","signatures":[{"sig":"MEUCIQCfxSkLF0mhtNHtBa3w6R0kZz3YpnKKRBsH0+p5nBBOTQIgKbqxXNv+kMqPXtV8MrytDAzdIcbXOMOBqzfREmgAyX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139664},"main":"src/index.js","type":"commonjs","_from":"file:bernierllc-calendar-1.3.0.tgz","types":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.js","require":"./src/index.js"},"./utils/ics":{"types":"./utils/ics.ts","import":"./utils/ics.js","require":"./utils/ics.js"}},"scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5eb1c4c8-4ac2-4c98-95ff-516f300467d1"}},"_resolved":"/home/runner/work/tools/tools/packages/ui/calendar/bernierllc-calendar-1.3.0.tgz","_integrity":"sha512-RP2JrRd3idnKDBBp0mXaUs4jmKjLv2yRU7ebWx+DuyXPYeoxeB8sIar+0nE0g5WlrZp3XsqmrEvD6viNXdwXaw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"A calendar package for the tools monorepo.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ical-generator":"^9.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","postcss":"^8.5.6","ts-jest":"^29.4.0","@types/jest":"^29.5.14","tailwindcss":"^4.1.11","autoprefixer":"^10.4.21","@testing-library/react":"^14.3.1","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3"},"peerDependencies":{"react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/calendar_1.3.0_1779241983828_0.6176088947110852","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bernierllc/calendar","version":"1.5.0","description":"A calendar package for the tools monorepo.","main":"src/index.js","types":"src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.js","require":"./src/index.js"},"./utils/ics":{"types":"./utils/ics.ts","import":"./utils/ics.js","require":"./utils/ics.js"}},"keywords":[],"author":{"name":"Bernier LLC"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"type":"commonjs","dependencies":{"ical-generator":"^9.0.0"},"peerDependencies":{"@types/react":"^19.0.0","@types/react-dom":"^19.0.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3"},"devDependencies":{"@testing-library/jest-dom":"^6.6.3","@testing-library/react":"^14.3.1","@types/jest":"^29.5.14","autoprefixer":"^10.4.21","jest":"^29.5.0","jest-environment-jsdom":"^30.0.4","postcss":"^8.5.6","tailwindcss":"^4.1.11","ts-jest":"^29.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_id":"@bernierllc/calendar@1.5.0","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"homepage":"https://github.com/bernier-llc/tools#readme","_integrity":"sha512-m165BEG1lEre+6tMBRPrOQfnYQiTuWvta9E+DwrHFtxIgf4p8Y557cezp/GNBiSrN+CqzdC1W/jA4JeQUq1qkg==","_resolved":"/home/runner/work/tools/tools/packages/ui/calendar/bernierllc-calendar-1.5.0.tgz","_from":"file:bernierllc-calendar-1.5.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-m165BEG1lEre+6tMBRPrOQfnYQiTuWvta9E+DwrHFtxIgf4p8Y557cezp/GNBiSrN+CqzdC1W/jA4JeQUq1qkg==","shasum":"76ac354b87570aafe0f4949407ddfa385075fd05","tarball":"https://registry.npmjs.org/@bernierllc/calendar/-/calendar-1.5.0.tgz","fileCount":4,"unpackedSize":12009,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCc1boEVd223FP5cugxl/hKf1jYjzGax7sIxMciOjMZoQIgclXsfsd+IwPPEfud7wMit1hEER5Af0lGNmcS1UVXmg8="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5eb1c4c8-4ac2-4c98-95ff-516f300467d1"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/calendar_1.5.0_1779250735636_0.3001595131081567"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-24T04:08:33.704Z","modified":"2026-05-20T04:18:55.910Z","1.0.0":"2025-07-24T04:08:34.323Z","1.0.1":"2025-08-03T04:48:29.203Z","1.2.0":"2026-01-05T19:45:51.601Z","1.2.1":"2026-03-09T17:42:22.011Z","1.2.2":"2026-03-10T17:29:39.089Z","1.3.0":"2026-05-20T01:53:03.998Z","1.5.0":"2026-05-20T04:18:55.764Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"MIT","homepage":"https://github.com/bernier-llc/tools#readme","keywords":[],"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"description":"A calendar package for the tools monorepo.","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"/*\nCopyright (c) 2025 Bernier LLC\n\nThis file is licensed to the client under a limited-use license.\nThe client may use and modify this code *only within the scope of the project it was delivered for*.\nRedistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n*/\n\n# @bernierllc/calendar\n\nA highly customizable, accessible React calendar component for Next.js projects with support for template-driven and render prop-based customization.\n\n## Features\n\n- 📅 **Month and Week Views** - Toggle between calendar views\n- 🎨 **Flexible Styling** - Custom colors, pills, and styling logic\n- 🧩 **Template Tags** - String-based customization with `{{fieldName}}` syntax\n- ⚛️ **Render Props** - Full React component customization\n- 📋 **Event List** - Sidebar list of events with custom rendering\n- 🔍 **Dynamic Filters** - Custom filter UI with render props\n- ♿ **Accessible** - WCAG 2.1 AA compliant with keyboard navigation\n- 📤 **ICS Export** - Generate iCalendar files with recurring events\n- 🎯 **TypeScript** - Full type safety and IntelliSense support\n\n## Installation\n\n```bash\nnpm install @bernierllc/calendar\n```\n\n## Quick Start\n\n```tsx\nimport { Calendar } from '@bernierllc/calendar';\nimport type { CalendarEvent } from '@bernierllc/calendar';\n\nconst events: CalendarEvent[] = [\n  {\n    uid: '1',\n    summary: 'Team Meeting',\n    description: 'Weekly team sync',\n    start: '2024-01-15T10:00:00Z',\n    end: '2024-01-15T11:00:00Z',\n    categories: ['work'],\n    location: 'Conference Room A'\n  }\n];\n\nfunction App() {\n  return (\n    <Calendar \n      events={events}\n      categoryColors={{ work: 'bg-blue-500' }}\n    />\n  );\n}\n```\n\n## API Reference\n\n### Calendar Props\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `events` | `CalendarEvent[]` | Array of calendar events |\n| `categoryColors` | `Record<string, string>` | Predefined color mapping for categories |\n| `initialView` | `'week' \\| 'month'` | Initial calendar view (default: 'month') |\n| `filters` | `ReactNode \\| Function` | Custom filter UI or render prop |\n| `getEventColor` | `(event: CalendarEvent) => string` | Custom color logic function |\n| `getEventPill` | `(event: CalendarEvent) => { label: string, color: string } \\| null` | Custom pill logic for event list |\n| `ellipsizeTitles` | `boolean` | Always ellipsize event titles (default: true) |\n\n### Template-Driven Customization\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `eventDescriptionTemplate` | `string` | Template for event description/body |\n| `eventModalTemplate` | `string` | Template for event modal content |\n| `eventCellTemplate` | `string` | Template for calendar grid cells |\n| `eventListRowTemplate` | `string` | Template for event list rows |\n\n### Render Prop Customization\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `eventModalRenderer` | `(event: any) => ReactNode` | Custom modal rendering |\n| `eventCellRenderer` | `(event: any, context: { date: Date }) => ReactNode` | Custom calendar cell rendering |\n| `eventListRowRenderer` | `(event: any) => ReactNode` | Custom event list row rendering |\n\n### CalendarEvent Interface\n\n```typescript\ninterface CalendarEvent {\n  uid: string;                    // Unique identifier\n  summary: string;                // Event title\n  description?: string;           // Event description\n  location?: string;              // Event location\n  start: string;                  // ISO 8601 start date\n  end: string;                    // ISO 8601 end date\n  recurrenceRule?: string;        // RRULE string for recurring events\n  status?: 'CONFIRMED' | 'TENTATIVE' | 'CANCELLED';\n  organizer?: string;             // Organizer email/name\n  attendees?: string[];           // Attendee emails\n  categories?: string[];          // Event categories for color coding\n  [key: string]: any;             // Custom fields supported\n}\n```\n\n## Usage Examples\n\n### Basic Usage\n\n```tsx\nimport { Calendar } from '@bernierllc/calendar';\n\nconst events = [\n  {\n    uid: '1',\n    summary: 'Team Meeting',\n    start: '2024-01-15T10:00:00Z',\n    end: '2024-01-15T11:00:00Z',\n    categories: ['work']\n  }\n];\n\n<Calendar \n  events={events}\n  categoryColors={{ work: 'bg-blue-500', personal: 'bg-green-500' }}\n/>\n```\n\n### Template Tags\n\n```tsx\n<Calendar \n  events={events}\n  eventDescriptionTemplate=\"Mentor: {{mentor}}, Location: {{location}}, Type: {{experienceType}}\"\n  eventModalTemplate=\"<h3>{{summary}}</h3><p>Mentor: {{mentor}}</p><p>Experience: {{experienceType}}</p>\"\n  eventCellTemplate=\"{{summary}} ({{mentor}})\"\n  eventListRowTemplate=\"{{summary}} - {{mentor}} - {{experienceType}}\"\n/>\n```\n\n### Render Props\n\n```tsx\n<Calendar \n  events={events}\n  eventModalRenderer={(event) => (\n    <div className=\"custom-modal\">\n      <h2>{event.summary}</h2>\n      <p>Mentor: {event.mentor}</p>\n      <p>Experience: {event.experienceType}</p>\n      <button onClick={() => handleEdit(event)}>Edit</button>\n    </div>\n  )}\n  eventCellRenderer={(event, { date }) => (\n    <div className={`event-cell ${event.experienceType}`}>\n      <span className=\"title\">{event.summary}</span>\n      <span className=\"mentor\">{event.mentor}</span>\n    </div>\n  )}\n/>\n```\n\n### Custom Styling Logic\n\n```tsx\n<Calendar \n  events={events}\n  getEventColor={(event) => {\n    if (event.experienceType === 'mentorship') return 'bg-purple-500';\n    if (event.experienceType === 'workshop') return 'bg-orange-500';\n    return 'bg-gray-500';\n  }}\n  getEventPill={(event) => ({\n    label: event.experienceType,\n    color: event.experienceType === 'mentorship' ? 'bg-purple-100 text-purple-800' : 'bg-orange-100 text-orange-800'\n  })}\n/>\n```\n\n### Custom Filters\n\n```tsx\n<Calendar \n  events={events}\n  filters={({ visibleEvents, filters, setFilters }) => (\n    <div className=\"filters\">\n      <select \n        value={filters.experienceType || ''} \n        onChange={(e) => setFilters({ ...filters, experienceType: e.target.value })}\n      >\n        <option value=\"\">All Types</option>\n        <option value=\"mentorship\">Mentorship</option>\n        <option value=\"workshop\">Workshop</option>\n      </select>\n      <span>{visibleEvents.length} events</span>\n    </div>\n  )}\n/>\n```\n\n### ICS Export\n\n```tsx\nimport { generateICS } from '@bernierllc/calendar/utils/ics';\n\nconst handleExport = () => {\n  const icsString = generateICS(events);\n  const blob = new Blob([icsString], { type: 'text/calendar' });\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = 'calendar.ics';\n  a.click();\n};\n```\n\n## Advanced Patterns\n\n### Combining Template Tags and Render Props\n\nTemplate tags are used as fallbacks when render props aren't provided:\n\n```tsx\n<Calendar \n  events={events}\n  eventModalTemplate=\"<h3>{{summary}}</h3><p>{{description}}</p>\"\n  eventModalRenderer={(event) => {\n    // Custom logic for specific events\n    if (event.experienceType === 'mentorship') {\n      return <MentorshipModal event={event} />;\n    }\n    // Fallback to template for other events\n    return null; // Will use template\n  }}\n/>\n```\n\n### Custom Fields with Type Safety\n\n```tsx\ninterface CustomEvent extends CalendarEvent {\n  mentor: string;\n  experienceType: 'mentorship' | 'workshop' | 'networking';\n  difficulty: 'beginner' | 'intermediate' | 'advanced';\n  maxParticipants?: number;\n}\n\nconst events: CustomEvent[] = [\n  {\n    uid: '1',\n    summary: 'React Workshop',\n    start: '2024-01-15T10:00:00Z',\n    end: '2024-01-15T12:00:00Z',\n    mentor: 'John Doe',\n    experienceType: 'workshop',\n    difficulty: 'intermediate',\n    maxParticipants: 20\n  }\n];\n```\n\n### Dynamic Filtering with Custom Fields\n\n```tsx\n<Calendar \n  events={events}\n  filters={({ visibleEvents, filters, setFilters }) => (\n    <div className=\"space-y-2\">\n      <select \n        value={filters.experienceType || ''} \n        onChange={(e) => setFilters({ ...filters, experienceType: e.target.value })}\n        className=\"border rounded px-2 py-1\"\n      >\n        <option value=\"\">All Experience Types</option>\n        <option value=\"mentorship\">Mentorship</option>\n        <option value=\"workshop\">Workshop</option>\n        <option value=\"networking\">Networking</option>\n      </select>\n      \n      <select \n        value={filters.difficulty || ''} \n        onChange={(e) => setFilters({ ...filters, difficulty: e.target.value })}\n        className=\"border rounded px-2 py-1\"\n      >\n        <option value=\"\">All Difficulties</option>\n        <option value=\"beginner\">Beginner</option>\n        <option value=\"intermediate\">Intermediate</option>\n        <option value=\"advanced\">Advanced</option>\n      </select>\n      \n      <div className=\"text-sm text-gray-600\">\n        {visibleEvents.length} events found\n      </div>\n    </div>\n  )}\n/>\n```\n\n## Accessibility\n\nThe calendar is built with accessibility in mind:\n\n- **Keyboard Navigation** - Full keyboard support for navigation and interaction\n- **ARIA Labels** - Proper ARIA attributes for screen readers\n- **Focus Management** - Logical tab order and focus indicators\n- **Semantic HTML** - Proper use of table elements and landmarks\n- **Color Contrast** - Meets WCAG 2.1 AA contrast requirements\n\n## Styling\n\nThe calendar uses Tailwind CSS classes. You can customize the appearance by:\n\n1. **Overriding Tailwind classes** in your CSS\n2. **Using render props** for complete control\n3. **Using template tags** for simple text customization\n4. **Using `getEventColor` and `getEventPill`** for dynamic styling\n\n## Browser Support\n\n- Chrome 90+\n- Firefox 88+\n- Safari 14+\n- Edge 90+\n\n## License\n\nISC License - see [LICENSE](LICENSE) file for details.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../CONTRIBUTING.md) for development guidelines. \n\n## Monorepo Workspaces & Dependency Management\n\nThis package is part of a monorepo using npm workspaces. All dependencies are hoisted to the root. Always run `npm install` from the root directory.\n\n## React 19 and Testing Library Compatibility\n\nThis package uses React 19.1.0. If you see peer dependency warnings with Testing Library, use:\n\n```bash\nnpm install --legacy-peer-deps\n```\n\nThis is a temporary workaround until official support is released. ","readmeFilename":"README.md"}