{"_id":"@aliasadollahi/jalali-datepicker","_rev":"9-ff4712eb0bcf5d996db9c3b24a68c708","name":"@aliasadollahi/jalali-datepicker","dist-tags":{"latest":"1.3.1"},"versions":{"0.1.0":{"name":"@aliasadollahi/jalali-datepicker","version":"0.1.0","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"author":{"name":"Ali Asadollahi"},"license":"MIT","_id":"@aliasadollahi/jalali-datepicker@0.1.0","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"dist":{"shasum":"3252df2aaccbffd3584999fb61e294cc48bac3b6","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-0.1.0.tgz","fileCount":48,"integrity":"sha512-gsXKdhAQSUrZ8B1pzg2o6Y8pqxhcq3CX4p3upA/byzz6CEXNIQ8uMiK7D90hrL7n/J3QicKTWmlXz02I9zkbAA==","signatures":[{"sig":"MEUCIQDFrr35hf+LvOKAx94BH/HYSLRH+DmDy8GzIHRgfdlvKwIgQdKGmz9YifqoFuSApv/ED9aYHT40MHqpejNX3qeHrtQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":236108},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"gitHead":"60d290070179a726b4139c98259ccb2b7103102d","scripts":{"lint":"eslint .","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","format":"prettier --write .","typecheck":"tsc --noEmit","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"repository":{"url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git","type":"git"},"_npmVersion":"10.8.2","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.20.2","dependencies":{"dayjs":"^1.11.21","jalaliday":"^3.1.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","react":"^19.2.0","eslint":"^9.17.0","prettier":"^3.4.2","react-dom":"^19.2.7","@eslint/js":"^9.17.0","typescript":"^5.7.0","@types/node":"^20.19.43","@types/react":"^19.2.0","@types/react-dom":"^19.2.3","typescript-eslint":"^8.18.0","@vitejs/plugin-react":"^4.3.4","eslint-plugin-react-hooks":"^5.1.0"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/jalali-datepicker_0.1.0_1781864559061_0.9101959524832584","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aliasadollahi/jalali-datepicker","version":"0.1.1","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"author":{"name":"Ali Asadollahi"},"license":"MIT","_id":"@aliasadollahi/jalali-datepicker@0.1.1","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"dist":{"shasum":"da824050c1adf8f69c3e2870e3e7e9e8ae13b9a9","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-0.1.1.tgz","fileCount":48,"integrity":"sha512-wszc5fMqjlLvKwqEYI36PwFIZHf6dPTU9zXQKq42+lHIPHrl1xyKtUHNlgjMY0/HY+5MO94hWP3tAvbHdAiJ3g==","signatures":[{"sig":"MEUCIHL3iR8z0qjyeWSEwJCeCuHolybZNV3D65Aj2XEk8dMqAiEA+3KstHpJOrdMnImoega/6QjAsl9hYpQZ8M0JANvLOH0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":236729},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"gitHead":"d4bdf0cdbef3743fe44f5b536b1c15d254d93bd0","scripts":{"lint":"eslint .","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","format":"prettier --write .","prepare":"husky","release":"semantic-release","typecheck":"tsc --noEmit","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"repository":{"url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git","type":"git"},"_npmVersion":"11.17.0","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,css,md,yml,yaml}":["prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.3","dependencies":{"dayjs":"^1.11.21","jalaliday":"^3.1.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","husky":"^9.1.7","react":"^19.2.0","eslint":"^9.17.0","prettier":"^3.4.2","react-dom":"^19.2.7","@eslint/js":"^9.17.0","typescript":"^5.7.0","@types/node":"^20.19.43","lint-staged":"^17.0.8","@types/react":"^19.2.0","@commitlint/cli":"^21.1.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","typescript-eslint":"^8.18.0","@vitejs/plugin-react":"^4.3.4","@semantic-release/git":"^10.0.1","eslint-plugin-react-hooks":"^5.1.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^21.1.0"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/jalali-datepicker_0.1.1_1782297221582_0.44321805589707663","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aliasadollahi/jalali-datepicker","version":"0.1.2","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"author":{"name":"Ali Asadollahi"},"license":"MIT","_id":"@aliasadollahi/jalali-datepicker@0.1.2","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"dist":{"shasum":"aeffca89b58b0cfe31a9d28ee5293cd4c02756bf","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-0.1.2.tgz","fileCount":48,"integrity":"sha512-1JtqPxPPHQmFBtLBB071KsFIAxv+nxuClK49dxiA4+qQ6fXGLPMAYIkuLVJEkWWzdoQ1UcczSdjp2yMmOU21iA==","signatures":[{"sig":"MEUCIQDyAmLliO9bD/GjORJxZJKCf4gUjkVvkRAcqRw9ekeOqwIgYRXkYZNaBaGg24JU6nZDUzdVjlDywUzpAqoqjoKIqZ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":240147},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"gitHead":"5a0474d0f3e2d4772c813c83d068d9e37e3b1a7c","scripts":{"lint":"eslint .","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","format":"prettier --write .","prepare":"husky","release":"semantic-release","demo:dev":"vite --config vite.demo.config.ts","typecheck":"tsc --noEmit","demo:build":"vite build --config vite.demo.config.ts","demo:preview":"vite preview --config vite.demo.config.ts","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"repository":{"url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git","type":"git"},"_npmVersion":"11.17.0","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,css,md,yml,yaml}":["prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.3","dependencies":{"dayjs":"^1.11.21","jalaliday":"^3.1.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","husky":"^9.1.7","react":"^19.2.0","eslint":"^9.17.0","prettier":"^3.4.2","react-dom":"^19.2.7","@eslint/js":"^9.17.0","typescript":"^5.7.0","@types/node":"^20.19.43","lint-staged":"^17.0.8","@types/react":"^19.2.0","@commitlint/cli":"^21.1.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","typescript-eslint":"^8.18.0","@vitejs/plugin-react":"^4.3.4","@semantic-release/git":"^10.0.1","eslint-plugin-react-hooks":"^5.1.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^21.1.0"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/jalali-datepicker_0.1.2_1782388028724_0.9677389586882084","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@aliasadollahi/jalali-datepicker","version":"1.0.0","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"author":{"name":"Ali Asadollahi"},"license":"MIT","_id":"@aliasadollahi/jalali-datepicker@1.0.0","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"dist":{"shasum":"4a18e1b196b6fc7e974282cdb852d7687fcea884","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-1.0.0.tgz","fileCount":54,"integrity":"sha512-jJ61pw2y1kDIoz+++B6PeveYKH6MER24q7MAJi7IAMJYggDaBPbPX3dloO50ZT/KAT7134deZsJJr47cr1or0A==","signatures":[{"sig":"MEUCIEHG1ESs2sBMmyHfoC9FJxT81ls114vz4QFFVkXeXRkcAiEAiSy6+8I9z72pBbpcZB0BK2hGgxSwd2KBXZblpLQGQ9g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":312479},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"gitHead":"022e85e94813b494c27438f43f707dd583b86f17","scripts":{"lint":"eslint .","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","format":"prettier --write .","prepare":"husky","release":"semantic-release","demo:dev":"vite --config vite.demo.config.ts","typecheck":"tsc --noEmit","demo:build":"vite build --config vite.demo.config.ts","demo:preview":"vite preview --config vite.demo.config.ts","format:check":"prettier --check .","prepublishOnly":"npm run build"},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"repository":{"url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git","type":"git"},"_npmVersion":"11.17.0","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,css,md,yml,yaml}":["prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","dependencies":{"dayjs":"^1.11.21","jalaliday":"^3.1.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","husky":"^9.1.7","react":"^19.2.0","eslint":"^9.17.0","prettier":"^3.4.2","react-dom":"^19.2.7","@eslint/js":"^9.17.0","typescript":"^5.7.0","@types/node":"^20.19.43","lint-staged":"^17.0.8","@types/react":"^19.2.0","@commitlint/cli":"^21.1.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","typescript-eslint":"^8.18.0","@vitejs/plugin-react":"^4.3.4","@semantic-release/git":"^10.0.1","eslint-plugin-react-hooks":"^5.1.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^21.1.0"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/jalali-datepicker_1.0.0_1786102255804_0.9498974526552082","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aliasadollahi/jalali-datepicker","version":"1.0.1","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"author":{"name":"Ali Asadollahi"},"license":"MIT","_id":"@aliasadollahi/jalali-datepicker@1.0.1","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"dist":{"shasum":"e62c9ae1aef036ce0323be126892f18490606951","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-1.0.1.tgz","fileCount":54,"integrity":"sha512-FPzsHs9T+Hhqi5TtBstpfT2K7ww15mHXIheCkCe42AOPd4Nh6QnETw4YwPqfzHiWzUCg/7xc6esNeH5ligd3rA==","signatures":[{"sig":"MEQCICg8slUlg/a7ehLv5GUraNSbZoOfNufnIM7AqG081fd1AiASrDDY8RXFUzyYzd4vopXHT6tv3a1CZu4ZwUF+yObRJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":382045},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"gitHead":"27548267545d0c41a162dae00e1ce2d0205a9d29","scripts":{"lint":"eslint .","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","format":"prettier --write .","prepare":"husky","release":"semantic-release","demo:dev":"vite --config vite.demo.config.ts","typecheck":"tsc --noEmit","check:dist":"node scripts/check-dist.mjs","demo:build":"vite build --config vite.demo.config.ts","demo:preview":"vite preview --config vite.demo.config.ts","format:check":"prettier --check .","prepublishOnly":"npm run build && npm run check:dist"},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"repository":{"url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git","type":"git"},"_npmVersion":"11.17.0","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,css,md,yml,yaml}":["prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","dependencies":{"dayjs":"^1.11.21"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","husky":"^9.1.7","react":"^19.2.0","eslint":"^9.17.0","prettier":"^3.4.2","jalaliday":"^3.1.1","react-dom":"^19.2.7","@eslint/js":"^9.17.0","typescript":"^5.7.0","@types/node":"^20.19.43","lint-staged":"^17.0.8","@types/react":"^19.2.0","@commitlint/cli":"^21.1.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","typescript-eslint":"^8.18.0","@vitejs/plugin-react":"^4.3.4","@semantic-release/git":"^10.0.1","eslint-plugin-react-hooks":"^5.1.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^21.1.0"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/jalali-datepicker_1.0.1_1786116824786_0.4956036065396141","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aliasadollahi/jalali-datepicker","version":"1.1.0","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"author":{"name":"Ali Asadollahi"},"license":"MIT","_id":"@aliasadollahi/jalali-datepicker@1.1.0","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"dist":{"shasum":"775ee37cfaae9e2f0e58d66bb0eb403985cb0c42","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-1.1.0.tgz","fileCount":60,"integrity":"sha512-Cs5ap2zMkBMAd3LTXoySobdZ+T14s0pWS/Jkawk90AF1Da/0oDuL4z3NrtamYRCw6N2y8J/9QOJZ7KWD0P8esA==","signatures":[{"sig":"MEUCIHxLZWhrMfoLHvF0q2bzWEZnA03QIN3dbSJIcLx3nJt/AiEAq1pBiJ533QXCdS06oY0h9vIFtYxHboaZSVhM+XgmP8I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":428013},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"gitHead":"d2b5a71826ac6bcfc87c172e84f3c83deedbc08b","scripts":{"lint":"eslint .","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","format":"prettier --write .","prepare":"husky","release":"semantic-release","demo:dev":"vite --config vite.demo.config.ts","typecheck":"tsc --noEmit","check:dist":"node scripts/check-dist.mjs","demo:build":"vite build --config vite.demo.config.ts","demo:preview":"vite preview --config vite.demo.config.ts","format:check":"prettier --check .","prepublishOnly":"npm run build && npm run check:dist"},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"repository":{"url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git","type":"git"},"_npmVersion":"11.17.0","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,css,md,yml,yaml}":["prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","dependencies":{"dayjs":"^1.11.21"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","husky":"^9.1.7","react":"^19.2.0","eslint":"^9.17.0","prettier":"^3.4.2","jalaliday":"^3.1.1","react-dom":"^19.2.7","@eslint/js":"^9.17.0","typescript":"^5.7.0","@types/node":"^20.19.43","lint-staged":"^17.0.8","@types/react":"^19.2.0","@commitlint/cli":"^21.1.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","typescript-eslint":"^8.18.0","@vitejs/plugin-react":"^4.3.4","@semantic-release/git":"^10.0.1","eslint-plugin-react-hooks":"^5.1.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^21.1.0"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/jalali-datepicker_1.1.0_1786117085097_0.14385897903857514","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aliasadollahi/jalali-datepicker","version":"1.2.0","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"author":{"name":"Ali Asadollahi"},"license":"MIT","_id":"@aliasadollahi/jalali-datepicker@1.2.0","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"dist":{"shasum":"52989c8fe20b6cdcd18cc44889c7b0c1242d4b00","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-1.2.0.tgz","fileCount":60,"integrity":"sha512-jXPL4HVc3/hZx2L3wk/Tc8Zv3A51DQ531r1l3bDTJGGUZN499rozvY0jGIy1iDZ7MMMSyM1yPyIpTwNLIQZx2A==","signatures":[{"sig":"MEYCIQCaqZ8XA/b1Sf0YrP1k55oGwWNFCnAz7BlkBDyzfcFaYAIhAJgIe1+6bHHHVkdCaaIWNZuVh1rpTxnHTgLEr6nCT9yH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":430972},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"gitHead":"f2e1d26fdd91c811deff69c1087178154b54d02e","scripts":{"lint":"eslint .","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","format":"prettier --write .","prepare":"husky","release":"semantic-release","demo:dev":"vite --config vite.demo.config.ts","typecheck":"tsc --noEmit","check:dist":"node scripts/check-dist.mjs","demo:build":"vite build --config vite.demo.config.ts","demo:preview":"vite preview --config vite.demo.config.ts","format:check":"prettier --check .","prepublishOnly":"npm run build && npm run check:dist"},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"repository":{"url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git","type":"git"},"_npmVersion":"11.17.0","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,css,md,yml,yaml}":["prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","dependencies":{"dayjs":"^1.11.21"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","husky":"^9.1.7","react":"^19.2.0","eslint":"^9.17.0","prettier":"^3.4.2","jalaliday":"^3.1.1","react-dom":"^19.2.7","@eslint/js":"^9.17.0","typescript":"^5.7.0","@types/node":"^20.19.43","lint-staged":"^17.0.8","@types/react":"^19.2.0","@commitlint/cli":"^21.1.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","typescript-eslint":"^8.18.0","@vitejs/plugin-react":"^4.3.4","@semantic-release/git":"^10.0.1","eslint-plugin-react-hooks":"^5.1.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^21.1.0"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/jalali-datepicker_1.2.0_1786128415814_0.29209809840010226","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@aliasadollahi/jalali-datepicker","version":"1.3.0","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"author":{"name":"Ali Asadollahi"},"license":"MIT","_id":"@aliasadollahi/jalali-datepicker@1.3.0","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"dist":{"shasum":"36cfccce9fcc29f35d60de340a47caa067d3854c","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-1.3.0.tgz","fileCount":60,"integrity":"sha512-HPy/eIkhqsPZBEDaWS/Y+dilY9tDp8FovW1oov3jCvih+ii36J0NJhknFEAMqL9Q1LtiUPp1s7uUS/Cp3N/ywA==","signatures":[{"sig":"MEQCIGi56FwRfdTmHxMUz4/GobGUJZ/j/74iFaADRizLPaaKAiABS2/aMUxiRn3LHBhmveA048UFNcFBGtJ532+00T/L4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":450065},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"gitHead":"c9398750285ce16b0aedea09dbfb55b8203b77c0","scripts":{"lint":"eslint .","test":"vitest run","build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","format":"prettier --write .","prepare":"husky","release":"semantic-release","demo:dev":"vite --config vite.demo.config.ts","typecheck":"tsc --noEmit","check:dist":"node scripts/check-dist.mjs","demo:build":"vite build --config vite.demo.config.ts","test:watch":"vitest","demo:preview":"vite preview --config vite.demo.config.ts","format:check":"prettier --check .","prepublishOnly":"npm run build && npm run check:dist","test:timezones":"TZ=UTC vitest run && TZ=America/New_York vitest run && TZ=Asia/Tehran vitest run"},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"repository":{"url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git","type":"git"},"_npmVersion":"11.17.0","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","directories":{},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,css,md,yml,yaml}":["prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","dependencies":{"dayjs":"^1.11.21"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","husky":"^9.1.7","jsdom":"^30.0.1","react":"^19.2.0","eslint":"^9.17.0","vitest":"^4.1.10","prettier":"^3.4.2","jalaliday":"^3.1.1","react-dom":"^19.2.7","@eslint/js":"^9.17.0","typescript":"^5.7.0","@types/node":"^20.19.43","lint-staged":"^17.0.8","@types/react":"^19.2.0","@commitlint/cli":"^21.1.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","typescript-eslint":"^8.18.0","@vitejs/plugin-react":"^4.3.4","@semantic-release/git":"^10.0.1","eslint-plugin-react-hooks":"^5.1.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^21.1.0"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/jalali-datepicker_1.3.0_1786166958262_0.6925145696171817","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@aliasadollahi/jalali-datepicker","version":"1.3.1","description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","type":"module","license":"MIT","author":{"name":"Ali Asadollahi"},"homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","repository":{"type":"git","url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git"},"bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"sideEffects":["**/*.css"],"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/jalali-datepicker.css","./package.json":"./package.json"},"scripts":{"build":"vite build && tsc -p tsconfig.build.json --emitDeclarationOnly","test":"vitest run","test:watch":"vitest","test:timezones":"TZ=UTC vitest run && TZ=America/New_York vitest run && TZ=Asia/Tehran vitest run","check:dist":"node scripts/check-dist.mjs","demo:dev":"vite --config vite.demo.config.ts","demo:build":"vite build --config vite.demo.config.ts","demo:preview":"vite preview --config vite.demo.config.ts","typecheck":"tsc --noEmit","lint":"eslint .","format":"prettier --write .","format:check":"prettier --check .","release":"semantic-release","prepublishOnly":"npm run build && npm run check:dist","prepare":"husky"},"lint-staged":{"*.{ts,tsx,js,jsx}":["eslint --fix","prettier --write"],"*.{json,css,md,yml,yaml}":["prettier --write"]},"dependencies":{"dayjs":"^1.11.21"},"peerDependencies":{"react":">=18"},"peerDependenciesMeta":{"react":{"optional":false}},"devDependencies":{"@commitlint/cli":"^21.1.0","@commitlint/config-conventional":"^21.1.0","@eslint/js":"^9.17.0","@semantic-release/changelog":"^6.0.3","@semantic-release/git":"^10.0.1","@types/node":"^20.19.43","@types/react":"^19.2.0","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^4.3.4","eslint":"^9.17.0","eslint-plugin-react-hooks":"^5.1.0","husky":"^9.1.7","jalaliday":"^3.1.1","jsdom":"^30.0.1","lint-staged":"^17.0.8","prettier":"^3.4.2","react":"^19.2.0","react-dom":"^19.2.7","semantic-release":"^25.0.5","typescript":"^5.7.0","typescript-eslint":"^8.18.0","vite":"^6.0.0","vitest":"^4.1.10"},"publishConfig":{"access":"public","provenance":true},"engines":{"node":">=18"},"gitHead":"48e8de0ecd8ed430575383660c7ae167868ede02","_id":"@aliasadollahi/jalali-datepicker@1.3.1","_nodeVersion":"22.23.2","_npmVersion":"11.17.0","dist":{"integrity":"sha512-x4a1v80DNOTJMdUS7JDR0gzbgwBVV9bbzcQtI+KCSSXktspd7kUQKbGZTP6uD1rYSKT3ABNJarCb6A8A6pCGkg==","shasum":"a45cc325648b72031fe793eb3566f9351ab7eec4","tarball":"https://registry.npmjs.org/@aliasadollahi/jalali-datepicker/-/jalali-datepicker-1.3.1.tgz","fileCount":60,"unpackedSize":450359,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aliasadollahi%2fjalali-datepicker@1.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDoUfkfY3DSKvNUtKeBh5tOOXBokw6qEiIb/IqdQw+YNAIgXLT5adYww2pWfL9skcil6DAJJ/At7/zK76P7bbyiUJs="}]},"_npmUser":{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"},"directories":{},"maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jalali-datepicker_1.3.1_1786608205408_0.9922238758901833"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-19T10:22:38.925Z","modified":"2026-08-13T08:03:25.851Z","0.1.0":"2026-06-19T10:22:39.203Z","0.1.1":"2026-06-24T10:33:41.724Z","0.1.2":"2026-06-25T11:47:08.857Z","1.0.0":"2026-08-07T11:30:55.986Z","1.0.1":"2026-08-07T15:33:44.934Z","1.1.0":"2026-08-07T15:38:05.262Z","1.2.0":"2026-08-07T18:46:55.963Z","1.3.0":"2026-08-08T05:29:18.412Z","1.3.1":"2026-08-13T08:03:25.538Z"},"bugs":{"url":"https://github.com/aliasadolahi74/jalali-datepicker/issues"},"author":{"name":"Ali Asadollahi"},"license":"MIT","homepage":"https://github.com/aliasadolahi74/jalali-datepicker#readme","keywords":["jalali","shamsi","khorshidi","persian","iran","calendar","datepicker","date-picker","react","rtl","dayjs"],"repository":{"type":"git","url":"git+https://github.com/aliasadolahi74/jalali-datepicker.git"},"description":"A self-contained, RTL-first Persian (Jalali / Khorshidi) date picker for React — single & range selection, injectable holidays, headless hook, themeable via CSS variables, no Tailwind.","maintainers":[{"name":"aliasadollahi","email":"ali.asadolahi74@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/aliasadolahi74/jalali-datepicker/main/media/cover.png\" alt=\"jalali-datepicker — RTL-first Persian date picker for React\" width=\"100%\" />\n</p>\n\n<p align=\"center\">\n  <a href=\"https://aliasadolahi74.github.io/jalali-datepicker/\"><strong>🔗 Live demo</strong></a>\n</p>\n\n# jalali-datepicker\n\nA self-contained, **RTL-first Persian (Jalali / Khorshidi) date picker** for React.\n\n- 📅 **Single & range** selection\n- 🗓️ **Read-only month grid** (`<JalaliMonthGrid>`) — inert by default, `renderDay` slot\n- 🎯 **Headless hook** (`useJalaliCalendar`) — build your own UI, or use the styled `<JalaliDatePicker />`\n- 🏖️ **Injectable holidays / days-off** — recurring, one-off, and date-**range** rules, with categories (ships a default Iran config)\n- 🔤 **Jalali parsing & day math** — `parseJalali`, `addDays`, `diffDays`, `eachDayOfInterval`\n- 🔵 **Per-day event badges** — stylable dots under any day, plus an `onDayClick` that hands you that day's events\n- 🎨 Themeable purely through **CSS variables** — no Tailwind, no design-system coupling\n- ⌨️ Keyboard navigation, header drill-down (day → month → year), an \"امروز\" shortcut\n- 🧮 Correct leap years & month lengths via the dayjs Jalali engine\n- 📦 ESM + CJS, full TypeScript types, tiny public API surface\n\nThe engine is **dayjs + [`jalaliday`](https://www.npmjs.com/package/jalaliday)** (both MIT);\n`jalaliday` is bundled, so `dayjs` is the only dependency you install.\n\n## How it compares\n\nThe Persian-React date-picker space is crowded. This library is deliberately\n**narrow and self-contained** — one calendar (Jalali), no UI framework, no global\nstate, only `dayjs` + `jalaliday` under the hood — rather than a multi-calendar\ntoolkit. That focus is the trade-off to weigh below.\n\n|                                |  **jalali-datepicker**  |      [react-multi-date-picker]       |      [zaman]       | [react-modern-calendar-datepicker] |\n| ------------------------------ | :---------------------: | :----------------------------------: | :----------------: | :--------------------------------: |\n| Persian (Jalali)               |           ✅            |                  ✅                  |         ✅         |                 ✅                 |\n| Single / range                 |         ✅ / ✅         |         ✅ / ✅ (+ multiple)         |      ✅ / ✅       |              ✅ / ✅               |\n| RTL                            |      ✅ always-on       |              via locale              |      via prop      |                 ✅                 |\n| Headless hook                  | ✅ `useJalaliCalendar`  |                  ❌                  |         ❌         |                 ❌                 |\n| Injectable holidays / days-off | ✅ ships an Iran config |                  ❌                  |         ❌         |                 ❌                 |\n| Theming                        |    ✅ CSS variables     |             CSS classes              | `accentColor` prop |         color props / CSS          |\n| No UI-framework dependency     |           ✅            |         needs popper helper          |   styled output    |             CSS bundle             |\n| First-party TypeScript types   |           ✅            |                  ✅                  |         ✅         |        community (`@types`)        |\n| Built-in time picker           |           ❌            |              via plugin              |         ✅         |                 ❌                 |\n| Other calendars                |     ❌ Jalali-only      | ✅ Gregorian/Arabic/Indian + plugins |     Gregorian      |             Gregorian              |\n| Actively maintained            |           ✅            |              ✅ (2024)               |       ~2023        |      ❌ (last release ~2019)       |\n\n**Reach for an alternative when** you need several calendar systems or a plugin\necosystem ([react-multi-date-picker]), or a time picker baked into the same\ncomponent ([zaman]). If you want a small, themeable, RTL-first Jalali calendar\nwith first-class holiday support and a headless option, this library is the tighter fit.\n\n[react-multi-date-picker]: https://github.com/shahabyazdi/react-multi-date-picker\n[zaman]: https://github.com/rzkhosroshahi/zaman\n[react-modern-calendar-datepicker]: https://github.com/Kiarash-Z/react-modern-calendar-datepicker\n\n> Comparison reflects publicly available information as of June 2026; the other\n> libraries continue to evolve — double-check against their own docs.\n\n## Install\n\n```bash\nnpm install @aliasadollahi/jalali-datepicker dayjs\n# or\nyarn add @aliasadollahi/jalali-datepicker dayjs\n```\n\n`react` (>=18) is a peer dependency. `dayjs` is the one runtime dependency and\nis installed automatically; it is listed above only so you can pin it yourself\nif you wish. The Jalali plugin is bundled into the package, so there is nothing\nelse to install.\n\nBoth `import` and `require` work in plain Node, with no bundler required.\n\n## Usage\n\n```tsx\nimport { useState } from 'react';\nimport {\n  JalaliDatePicker,\n  toGregorian,\n  type JalaliDate,\n} from '@aliasadollahi/jalali-datepicker';\nimport '@aliasadollahi/jalali-datepicker/styles.css'; // import once, anywhere\n\nfunction Example() {\n  const [value, setValue] = useState<JalaliDate | null>(null);\n\n  return (\n    <JalaliDatePicker\n      value={value}\n      onConfirm={setValue} // confirm mode (default): commits on تأیید\n      minDate={{ year: 1400, month: 1, day: 1 }}\n    />\n  );\n}\n```\n\n> **Don't forget `import '@aliasadollahi/jalali-datepicker/styles.css'`** once in your app — the\n> component ships its styles as a separate stylesheet.\n\n`JalaliDate` is `{ year, month /* 1-based */, day }` — the only date shape the API\nexposes (dayjs never leaks out). Convert a selection at the end:\n\n```ts\nimport {\n  toTimestamp,\n  toGregorian,\n  toJalali,\n} from '@aliasadollahi/jalali-datepicker';\n\ntoTimestamp(value); // epoch ms (local midnight)\ntoGregorian(value, 'YYYY-MM-DD'); // \"2025-04-21\"\ntoJalali(value, 'dddd D MMMM YYYY'); // \"دوشنبه ۱ اردیبهشت ۱۴۰۴\"\n```\n\n### Range selection\n\n```tsx\nimport {\n  JalaliDatePicker,\n  type JalaliRange,\n} from '@aliasadollahi/jalali-datepicker';\n\n<JalaliDatePicker\n  selectionMode=\"range\"\n  value={range} // { start, end } | null\n  onConfirm={setRange}\n/>;\n```\n\n### Headless hook\n\n```ts\nimport { useJalaliCalendar } from '@aliasadollahi/jalali-datepicker';\n\nconst cal = useJalaliCalendar({ value, onChange, mode: 'instant' });\n// cal.weeks, cal.monthOptions, cal.yearOptions, cal.goPrev/goNext, cal.selectDay, ...\n```\n\n### Event badges\n\nMark days with small circles under the day number — one circle per event, so a\nday with three meetings shows three dots. Events are independent of the holiday\nconfig: a holiday says the day is _off_, an event only says something is _on_ it.\n\n```tsx\nimport {\n  JalaliDatePicker,\n  type DayEvent,\n} from '@aliasadollahi/jalali-datepicker';\n\n// Hoist or memoize — a new array identity on every render re-enriches the grid.\nconst events: DayEvent[] = [\n  { id: 'standup', date: { year: 1404, month: 1, day: 5 }, label: 'استندآپ' },\n  {\n    id: 'release',\n    date: { year: 1404, month: 1, day: 18 },\n    label: 'انتشار',\n    color: '#16a34a', // overrides --jdp-badge-color for this badge only\n  },\n];\n\n<JalaliDatePicker\n  events={events}\n  maxBadgesPerDay={3} // extra events still reach the tooltip\n  onDayClick={(info) => {\n    // info.events / info.holidayLabels / info.isOff / info.date …\n    console.log(info.events.map((e) => e.label));\n  }}\n/>;\n```\n\n`onDayClick` fires on every (enabled) day click with that day's events and\nholiday labels attached, so you can open a detail panel or fetch without keeping\nyour own day→data map. It is independent of selection — the committed value\nstill arrives through `onChange` / `onConfirm`.\n\nBadges are decorative (`aria-hidden`); every event `label` — including truncated\nones — is folded into the cell's tooltip and accessible name.\n\nStyle them with the `--jdp-badge-*` variables below, per event via `color`, or\nper event via `className` for anything else.\n\n### Read-only month grid\n\n`<JalaliMonthGrid>` is the picker's grid without the chrome — weekday header and\nday cells, nothing else. No navigation, no month/year drill-down, no footer, no\nselection. It's what you want when a month _displays_ data rather than collecting\na date:\n\n```tsx\nimport { JalaliMonthGrid } from '@aliasadollahi/jalali-datepicker';\n\n<JalaliMonthGrid\n  year={1405}\n  month={6} // 1-based\n  weeks=\"auto\" // only the weeks the month touches (Shahrivar 1405 = 5)\n  holidays={holidays}\n  events={events}\n/>;\n```\n\n**It is inert by default.** With no `onDayClick` there is no `role=\"grid\"`, no\ntab stop, and no key handling — nothing for assistive tech to announce as an\ninteractive widget. Pass `onDayClick` and each day becomes a real button; it\nstill never claims to be a grid widget.\n\n| prop                | default         | meaning                                        |\n| ------------------- | --------------- | ---------------------------------------------- |\n| `year` / `month`    | –               | required; `month` is 1-based                   |\n| `weeks`             | `'fixed'`       | `'fixed'` = always 6 rows; `'auto'` trims      |\n| `holidays`          | `IRAN_HOLIDAYS` | same config the picker takes                   |\n| `events`            | –               | same badges the picker draws                   |\n| `maxBadgesPerDay`   | `3`             | badges per day before truncating               |\n| `tintWeekends`      | `true`          | paint weekends with `--jdp-off-fg`             |\n| `today`             | ambient zone    | what counts as today; `null` marks none        |\n| `showWeekdayHeader` | `true`          | render the ش…ج row                             |\n| `renderDay`         | –               | `(cell, meta) => ReactNode`, replaces contents |\n| `onDayClick`        | –               | omit for a fully inert calendar                |\n\n`renderDay` receives the `BaseDayCell` and its resolved `DayMeta`, so you can put\na price, a badge, or anything else in the cell while keeping the grid's tinting\nand layout:\n\n```tsx\n<JalaliMonthGrid\n  year={1405}\n  month={6}\n  renderDay={(cell, meta) => (\n    <span>\n      {toPersianDigits(cell.date.day)}\n      {meta.categories.includes('closure') && <em>✕</em>}\n    </span>\n  )}\n/>\n```\n\nThe grid resolves the `--jdp-*` variables itself, so it themes standalone and\ndoes not have to be nested inside a picker. It ships bare — no card border,\npadding, or shadow — so you can drop it straight into your own container.\n\n### Deciding what \"today\" is\n\nBy default the today marker follows the **ambient** timezone — the browser's zone\non the client, `TZ` on a server. That is wrong in two common cases:\n\n- **A calendar for a fixed locale, viewed from elsewhere.** A Tehran market\n  calendar opened from New York highlights the wrong day for the hours after\n  Tehran's midnight.\n- **Server rendering.** A client component still renders to HTML in Node. If the\n  server's zone differs from the browser's, the initial markup marks a different\n  day than the client does after hydration — silent, and only near midnight.\n\nRather than teach the package about timezones, inject the date:\n\n```tsx\nimport { JalaliMonthGrid, todayJalali } from '@aliasadollahi/jalali-datepicker';\n\n// Whatever rule you want: a fixed zone, the user's profile, a pinned date.\nconst today = todayJalali('Asia/Tehran');\n\n<JalaliMonthGrid year={1405} month={5} today={today} />;\n<JalaliDatePicker today={today} />; // also drives where امروز jumps to\n```\n\n`today` is accepted by `<JalaliDatePicker>`, `<JalaliMonthGrid>`,\n`useJalaliCalendar`, and `buildMonthGrid`. Omit it for today's behaviour; pass\n`null` to mark no day at all.\n\n`todayJalali(timeZone?)` is the convenience — with no argument it reads the\nambient zone, with an IANA name it pins one. You can compute the date any other\nway you like; it is a plain `JalaliDate`.\n\nBecause it is a value rather than a policy, it is also the seam that makes this\ntestable without mocking the clock — the suite asserts the same marked day under\nthree different `TZ` settings.\n\n### Key props\n\n| prop                       | default         | meaning                                             |\n| -------------------------- | --------------- | --------------------------------------------------- |\n| `value` / `defaultValue`   | –               | controlled / uncontrolled selection                 |\n| `onChange`                 | –               | fires when a value is committed                     |\n| `onConfirm` / `onCancel`   | –               | footer تأیید / لغو                                  |\n| `selectionMode`            | `'single'`      | `'single'` or `'range'`                             |\n| `mode`                     | `'confirm'`     | `'instant'` commits on click; `'confirm'` stages it |\n| `minDate` / `maxDate`      | –               | inclusive bounds                                    |\n| `disabledDate(date)`       | –               | disable arbitrary days                              |\n| `holidays`                 | `IRAN_HOLIDAYS` | weekend + holiday config (see below)                |\n| `tintWeekends`             | `true`          | paint weekends with `--jdp-off-fg`                  |\n| `today`                    | ambient zone    | what counts as today; `null` marks none             |\n| `events`                   | –               | days to mark with badges (see above)                |\n| `maxBadgesPerDay`          | `3`             | badges drawn per day before truncating              |\n| `onDayClick(info)`         | –               | day click + that day's events / holiday labels      |\n| `showFooter` / `showToday` | `true`          | footer + امروز shortcut                             |\n\n## Calendar utilities\n\nEverything the picker uses internally is exported, so a custom UI never has to\nreimplement Jalali math:\n\n```ts\nimport {\n  todayJalali, // (timeZone?) → JalaliDate for today; ambient zone by default\n  daysInMonth, // (year, month) → 29 | 30 | 31\n  isLeapYear, // Esfand has 30 days\n  persianWeekday, // (date) → 0 = Saturday … 6 = Friday\n  addMonths, // (year, month, delta) → { year, month }\n  addDays, // (date, delta) → JalaliDate\n  diffDays, // (a, b) → whole days, b - a\n  eachDayOfInterval, // (start, end) → JalaliDate[], both inclusive\n  compareJalali, // (a, b) → -1 | 0 | 1\n  isSameDay,\n  clampToRange, // (date, min?, max?) → JalaliDate\n  buildMonthGrid, // (year, month, { weeks, today }) → BaseDayCell[][]\n  dayKey, // (date) → \"1404-1-13\" — same string as BaseDayCell.key\n  WEEKDAY, // { SATURDAY: 0 … FRIDAY: 6 }\n  IRAN_WEEKEND, // [6] — drop straight into HolidayConfig.weekends\n  groupEventsByDay, // (events) → Map<dayKey, DayEvent[]>\n  resolveDayMeta, // (date, weekday, holidays) → DayMeta\n} from '@aliasadollahi/jalali-datepicker';\n```\n\n`dayKey` is the supported way to index your own per-day data — it produces\nexactly the string `BaseDayCell.key` carries, so the two can never drift.\n\n`eachDayOfInterval` returns `[]` when `end` is before `start` (an empty range,\nnot a reversed one), and both bounds are inclusive. All three helpers cross\nmonth and year boundaries correctly, including Esfand's 29/30 leap-year split.\n\n`buildMonthGrid` returns six weeks by default — a stable height, so a picker does\nnot jump when navigating. Pass `{ weeks: 'auto' }` to get only the weeks the\nmonth actually touches, which is what a static calendar wants.\n\nWeekday indices are `0 = Saturday … 6 = Friday` throughout; use `WEEKDAY` rather\nthan writing `const FRIDAY = 6`.\n\n### Parsing Jalali strings\n\nThe inverse of `toJalali` — for APIs that hand you a rendered Persian date and\nno ISO value alongside:\n\n```ts\nimport { parseJalali, isValidJalali } from '@aliasadollahi/jalali-datepicker';\n\nparseJalali('۵ شهریور ۱۴۰۵'); // { year: 1405, month: 6, day: 5 }\nparseJalali('1404/01/13'); // { year: 1404, month: 1, day: 13 }\nparseJalali('۱۴۰۵-۱۲-۳۱'); // null — Esfand 1405 has only 29 days\nparseJalali('13/01/1404', 'DD/MM/YYYY'); // explicit pattern\n\nisValidJalali({ year: 1403, month: 12, day: 30 }); // true — 1403 is a leap year\nisValidJalali({ year: 1404, month: 12, day: 30 }); // false\n```\n\nIt **returns `null` instead of throwing**, so you can fall back to rendering the\nserver's string verbatim. Persian, Arabic-Indic, and Latin digits all work, and\nZWNJ, bidi marks, and repeated spaces are tolerated. Without a pattern it tries\n`'YYYY/MM/DD'`, `'YYYY-MM-DD'`, then `'D MMMM YYYY'`. Supported tokens: `YYYY`,\n`YY`, `MMMM`, `MM`, `M`, `DD`, `D`.\n\n## Injecting days off / holidays\n\n```ts\nimport {\n  IRAN_HOLIDAYS,\n  type HolidayConfig,\n} from '@aliasadollahi/jalali-datepicker';\n\nconst holidays: HolidayConfig = {\n  weekends: [6], // Persian weekday index: 0 = Saturday … 6 = Friday\n  rules: [\n    { type: 'recurring', month: 1, day: 1, label: 'نوروز' }, // every year\n    { type: 'specific', year: 1405, month: 1, day: 13, label: 'عید فطر' }, // one-off (lunar)\n    {\n      type: 'range', // a contiguous span, both ends inclusive\n      start: { year: 1405, month: 6, day: 5 },\n      end: { year: 1405, month: 6, day: 7 },\n      label: 'تعطیلی بازار',\n      category: 'closure',\n    },\n  ],\n};\n```\n\nFixed solar holidays are `recurring`; lunar (Hijri) holidays shift each year and\nshould be injected as `specific` per-year entries. Use `range` for a shutdown or\nvacation so a two-week closure stays one rule instead of fourteen.\n\n### Categories: styling one kind of day differently\n\nEvery rule takes an optional `category`. `resolveDayMeta` reports the distinct\ncategories that matched, and the picker mirrors them onto the day cell as a\n`data-holiday-categories` attribute, so you can style a market closure\ndifferently from a public holiday without a parallel lookup table:\n\n```css\n.my-picker [data-holiday-categories~='closure'] {\n  text-decoration: underline dotted;\n}\n```\n\n```ts\nconst meta = resolveDayMeta(date, weekday, holidays);\nmeta.categories; // ['closure']\nmeta.matched; // the HolidayRule objects themselves\nmeta.labels; // ['تعطیلی بازار']\n```\n\n### Weekends vs. tinting\n\n`isWeekend` is **factual** — it reports what `weekends` says, always. Whether\nweekends are _painted_ with `--jdp-off-fg` is a separate, styling decision:\n\n```tsx\n// Keep the package's weekend knowledge, but style Fridays yourself.\n<JalaliDatePicker holidays={holidays} tintWeekends={false} />\n```\n\nHolidays stay tinted either way, so a holiday and a plain weekend become\nvisually distinguishable — which `isOff` alone cannot express.\n\n## Theming (CSS variables)\n\nOverride any of these custom properties on an ancestor to retheme — they cascade in:\n\n```\n--jdp-bg            --jdp-fg            --jdp-muted-fg       --jdp-disabled-fg\n--jdp-border        --jdp-hover-bg      --jdp-selected-bg    --jdp-selected-fg\n--jdp-selected-off-fg\n--jdp-range-bg      --jdp-off-fg        --jdp-outside-off-fg --jdp-today-ring\n--jdp-today-bg      --jdp-primary       --jdp-primary-fg     --jdp-focus-ring\n--jdp-radius        --jdp-control-radius --jdp-cell-radius   --jdp-shadow\n--jdp-width         --jdp-font\n```\n\n`--jdp-today-bg` is `transparent` by default, so today reads as a ring. Set it to\nfill today instead — the ring stays, and a selected or in-range day still wins.\n\n`--jdp-outside-off-fg` colours a day that is **both** out-of-month and a weekend.\nIt defaults to a muted mix of `--jdp-off-fg` toward the background, so an\nout-of-month Friday reads as lighter than an in-month one instead of taking the\nfull off colour.\n\n### Metrics\n\nColours alone cannot satisfy a design that specifies cell size or type scale, so\nthe sizing is themeable too. All default to the shipped values, so nothing moves\nunless you set them:\n\n```\n--jdp-grid-gap          /* 2px      → gap between day cells       */\n--jdp-day-font-size     /* inherit  → the day number              */\n--jdp-weekday-height    /* 2rem     → weekday header row height   */\n--jdp-weekday-font-size /* 0.75rem  → weekday header label        */\n```\n\nCell size is a **consequence of the gap**, not a variable of its own: the grid is\n`repeat(7, 1fr)` with a 1:1 aspect ratio, so the cell is whatever the container\nleaves. At a 280px container the default `gap: 2px` gives `(280 − 6×2) / 7 =\n38.3px` cells; `--jdp-grid-gap: 0` gives exactly 40px. Set the gap to hit a cell\nsize rather than widening the container, which would overflow whatever card the\ngrid sits in.\n\n```css\n/* a 40×40 grid with 16px numerals in a 280px container */\n.market-calendar {\n  --jdp-grid-gap: 0;\n  --jdp-day-font-size: 16px;\n  --jdp-weekday-height: 40px;\n  --jdp-weekday-font-size: 14px;\n}\n```\n\nEvent badges have their own set:\n\n```\n--jdp-badge-color           /* dot fill; defaults to --jdp-primary        */\n--jdp-badge-selected-color  /* dot fill on the selected day; --jdp-selected-fg */\n--jdp-badge-size            /* diameter, default 4px                      */\n--jdp-badge-gap             /* space between dots, default 2px            */\n--jdp-badge-offset          /* distance from the bottom of the cell, 4px  */\n```\n\n## API stability\n\nThese are the guarantees a major version buys you. Changing any of them is a\nbreaking change:\n\n1. **`JalaliDate` is `{ year, month, day }`**, with `month` **1-based**\n   (1 = فروردین … 12 = اسفند). No dayjs instance ever crosses the API boundary.\n2. **Weekday indices are 0 = Saturday … 6 = Friday** everywhere — `BaseDayCell.weekday`,\n   `HolidayConfig.weekends`, and `persianWeekday()`.\n3. **`BaseDayCell.key` has a stable format**, `` `${year}-${month}-${day}` ``,\n   produced by the exported `dayKey()`.\n4. **The `--jdp-*` custom properties are the public theming contract.** Everything\n   in [Theming](#theming-css-variables) is supported; the private `--_*` variables\n   and the CSS-module class names are not — do not target them.\n5. **The picker root always sets `dir=\"rtl\"`** (and `lang=\"fa\"`), independent of the\n   host document's direction.\n\n`resolveDayMeta`, `buildMonthGrid`, and the `useJalaliCalendar` result shape are\npublic API too. Fields may be **added** to `DayMeta` / `BaseDayCell` /\n`EnrichedDayCell` in a minor release, so read them rather than constructing them\nby hand.\n\n## License\n\n[MIT](./LICENSE) © Ali Asadollahi\n","readmeFilename":"README.md"}