jalaali-date-time-picker
Version:
Production-ready Jalali (Persian) date + time picker for **React / Next.js**.
143 lines (100 loc) • 5.41 kB
Markdown
# Jalaali Date-Time Picker 🗓️
Production-ready Jalali (Persian) date + time picker for **React / Next.js**.
- Fully typed
- Tree-shakable ESM build
- Built on Tailwind + ShadCN
- Headless – bring your own theme if you like
- Keyboard navigation (← ↑ → ↓ + Enter)
---
## Installation
```bash
npm install jalaali-date-time-picker
```
## Peer Dependencies
Ensure the following packages are installed in your project:
- [`next`](https://nextjs.org/)
- [`shadcn`](https://ui.shadcn.com/docs)
- [`tailwindcss`](https://tailwindcss.com/)
- [`lucide-react`](https://lucide.dev/guide/packages/lucide-react)
## Tailwind Configuration
You **must** include this path in your `tailwind.config.js`:
```js
module.exports = {
content: [
"./app/**/*.{js,ts,jsx,tsx}",
"./components/**/*.{js,ts,jsx,tsx}",
"./node_modules/jalaali-date-time-picker/**/*.{js,ts,jsx,tsx}", // required
],
}
```
Or in your `app/globals.css` (or similar global style file), add:
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
@source "../../node_modules/jalaali-date-time-picker/**/*.{js,ts,jsx,tsx}";
```
## RTL Support
To render correctly, the parent document must be in RTL mode:
```html
<div lang="fa" dir="rtl">
```
## Usage
```tsx
import { JalaaliDateTimePicker } from "jalaali-date-time-picker";
export default function Page() {
return (
<div dir="rtl">
<JalaaliDateTimePicker onChange={(d) => console.log(d)} />
</div>
);
}
```
## Interactive Example
See the full interactive demo [here](https://alijeyrad.github.io/jalaali-date-time-picker/).
---
## Props
| Prop | Type | Default | Description |
|------------------|---------------------------------------------------|--------------------|-------------|
| `className` | `string` | `""` | Optional Tailwind class |
| `defaultValue` | `Date` | `new Date()` | Default initial date |
| `value` | `Date` | `undefined` | Controlled value |
| `minDate` | `Date` | `1970-01-01` | Minimum date allowed |
| `maxDate` | `Date` | `2100-12-31` | Maximum date allowed |
| `disablePast` | `boolean` | `false` | Disallow past dates |
| `disableFuture` | `boolean` | `false` | Disallow future dates |
| `minuteStep` | `number` | `1` | Step for minute selection |
| `disabled` | `boolean` | `false` | Disable the picker |
| `showTime` | `boolean` | `true` | Show time picker |
| `format` | `"jalali" \| "gregorian"` | `"jalali"` | Date format to display |
| `clearable` | `boolean` | `false` | Show "clear" button |
| `inline` | `boolean` | `false` | Render in-place instead of a modal |
| `trigger` | `ReactNode` | `undefined` | Custom trigger component |
| `formatLabel` | `(date: Date) => string` | `undefined` | Custom display label formatter |
| `onChange` | `(date: Date) => void` | `undefined` | Callback when value changes |
| `onOpenChange` | `(open: boolean) => void` | `undefined` | Callback when modal opens/closes |
| `onClear` | `(prev: Date \| null) => void` | `undefined` | Callback when cleared |
| `inputRef` | `React.RefObject<HTMLInputElement>` | `undefined` | Ref to hidden input |
| `placeholderLabel` | `string` | `"انتخاب تاریخ و زمان"` | Placeholder |
| `inputFieldProps` | `InputFieldProps` | `undefined` | Pass props from RHF, Formik, etc. |
---
## Goal
The long-term goal of this package is to make it as lightweight and dependency-free as possible, reducing external reliance without compromising functionality or designI'm starting with icon rendering as the first optimization.
---
## Contributing
Contributions are welcome and encouraged! 🙌
If you find a bug or have a feature request, please [open an issue](https://github.com/alijeyrad/jalaali-date-time-picker/issues).
To contribute:
1. Fork the repository
2. Create a new branch: `git checkout -b feature-name`
3. Make your changes and commit them
4. Push to your fork and submit a pull request
---
## Author Information
### 👤 Ali Julaee Rad
[](https://github.com/alijeyrad)
- **GitHub**: [alijeyrad](https://github.com/alijeyrad)
- **LinkedIn**: [in/ali-julaee-rad](https://www.linkedin.com/in/ali-julaee-rad/)
- **Email**: [alijrad.dev@gmail.com](mailto:alijrad.dev@gmail.com)
---
> Made with ❤️ in Iran.