@zener/nepali-datepicker-react
Version:
Nepali Datepicker React is a lightweight, highly customizable, and feature-rich datepicker component, specifically designed for handling Nepali dates in React.js applications. It offers seamless integration, intuitive user experience, and extensive config
1,436 lines (1,426 loc) • 46.8 kB
JavaScript
// src/datepicker/index.ts
import NepaliDate3, * as nepaliDateConstants from "@zener/nepali-date";
// src/datepicker/nepali-date-picker.tsx
import { useEffect as useEffect2, useLayoutEffect as useLayoutEffect2, useRef as useRef2, useState as useState3 } from "react";
import NepaliDate2, { formatADDate } from "@zener/nepali-date";
// src/datepicker/menu.tsx
import { AnimatePresence, motion } from "framer-motion";
import { useEffect, useMemo, useState } from "react";
import { Portal } from "@radix-ui/react-portal";
import NepaliDate, {
AD_MONTH,
AD_MONTH_NEPALI,
ENGLISH_NEPALI_MONTH,
ENGLISH_WEEK,
NEPALI_MONTH,
NEPALI_TODAY,
NEPALI_WEEK,
lowerADDate,
startDateBS as startDateBS2,
yearMonthDays as yearMonthDays2
} from "@zener/nepali-date";
// src/utils/calendar.ts
import { startDateBS, toAD, yearMonthDays } from "@zener/nepali-date";
var toInt = (value) => ~~value;
var yearDivider = 1e4;
var monthDivider = 100;
var padTwo = (v) => `${v}`.padStart(2, "0");
var padFour = (v) => `${v}`.padStart(4, "0");
var padFourNumber = (v) => `${v}`.padStart(4, "0");
var stringDateFormatter = ({ year, month, date }) => `${padFour(year)}-${padTwo(month)}-${padTwo(date)}`;
var getDateFromNumber = (n) => {
const year = toInt(n / yearDivider);
const month = toInt(n % yearDivider / monthDivider);
const date = n % (yearDivider / monthDivider);
const dateData = { year, month, date };
return {
...dateData,
toString: () => stringDateFormatter(dateData)
};
};
var getStartYearAD = () => toAD(getDateFromNumber(startDateBS).toString());
var getEndYearAD = () => toAD(
stringDateFormatter({
year: getDateFromNumber(startDateBS).year + yearMonthDays.length - 1,
month: 12,
date: yearMonthDays[yearMonthDays.length - 1][11]
})
);
var getBSYearIndexFromBS = (year) => {
const startBSYear = getDateFromNumber(startDateBS).year;
if (year < startBSYear) {
throw new Error(`Invalid year, year should be greater than ${startBSYear}`);
}
return year - startBSYear;
};
var getMonthInfo = ({
type = "BS",
year,
month
}) => {
if (month > 12 || month < 0) {
throw new Error("Invalid month");
}
const getPrevMonthDays = (yearIndex = 0) => {
let monthDays = 0;
try {
let m = month - 2;
if (m < 0) {
m = 11;
monthDays = yearMonthDays[yearIndex - 1][m];
} else {
monthDays = yearMonthDays[yearIndex][m];
}
} catch (err) {
monthDays = 0;
}
return monthDays;
};
const getNextMonthDays = (yearIndex = 0) => {
let monthDays = 0;
try {
let m = month;
if (m > 11) {
m = 0;
monthDays = yearMonthDays[yearIndex + 1][m];
} else {
monthDays = yearMonthDays[yearIndex][m];
}
} catch (err) {
monthDays = 0;
}
return monthDays;
};
switch (type) {
case "AD": {
const currentDate = new Date(year, month, 0);
const prevDate = new Date(year, month - 1, 0).getDate();
const nextDate = new Date(year, month + 1, 0).getDate();
const firstWeekDay = new Date(
stringDateFormatter({ year, month, date: 1 })
).getDay();
return {
currentMonthDays: currentDate.getDate(),
firstWeekDay,
prevMonthDays: prevDate,
nextMonthDays: nextDate
};
}
case "BS":
default: {
const yearIndex = getBSYearIndexFromBS(year);
const engYear = toAD(stringDateFormatter({ year, month, date: 1 }));
const firstWeekDay = new Date(engYear.toString()).getDay();
return {
prevMonthDays: getPrevMonthDays(yearIndex),
nextMonthDays: getNextMonthDays(yearIndex),
currentMonthDays: yearMonthDays[yearIndex][month - 1],
firstWeekDay
};
}
}
};
var groupDates = (monthInfo) => {
const groups = [];
let x = 1;
const items = Array.from({ length: 42 }, (_, i) => {
let day = i + 1 - monthInfo.firstWeekDay;
let month = "current";
if (day <= 0) {
day = monthInfo.prevMonthDays + day;
month = "prev";
} else if (day > monthInfo.currentMonthDays) {
day = x;
x += 1;
month = "next";
}
return { day, month, currentMonth: monthInfo.currentMonth };
});
for (let i = 0; i < items.length; i += 7) {
groups.push(items.slice(i, i + 7));
}
return groups;
};
var getYearsArray = (startYear) => {
return Array.from({ length: 10 }, (_, i) => {
return startYear + i;
});
};
var getDecadeRange = (year) => {
const start = Math.floor(year / 10) * 10;
const end = start + 9;
return { start, end };
};
// src/utils/commons.ts
import { NEPALI_DIGITS } from "@zener/nepali-date";
import classNames from "classnames";
var cn = (...props) => {
return classNames(...props);
};
var engToNepaliNumber = (number) => {
return number.toString().split("").map((n) => NEPALI_DIGITS[n]).join("");
};
var engToNepNumberFullDate = (date) => {
return date.split("").map((d) => {
if (d !== "-") {
return NEPALI_DIGITS[d];
}
return "-";
}).join("");
};
var groupArray = (array, groupSize) => {
const result = [];
for (let i = 0; i < array.length; i += groupSize) {
result.push(array.slice(i, i + groupSize));
}
return result;
};
// src/icons.tsx
import { jsx, jsxs } from "react/jsx-runtime";
var PreviousIcon = ({ size = 16 }) => {
return /* @__PURE__ */ jsxs(
"svg",
{
height: size,
width: size,
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
focusable: false,
children: [
/* @__PURE__ */ jsx("g", { id: "SVGRepo_bgCarrier", strokeWidth: "0" }),
/* @__PURE__ */ jsx(
"g",
{
id: "SVGRepo_tracerCarrier",
strokeLinecap: "round",
strokeLinejoin: "round"
}
),
/* @__PURE__ */ jsx("g", { id: "SVGRepo_iconCarrier", children: /* @__PURE__ */ jsx(
"path",
{
d: "M15 6L9 12L15 18",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}
) })
]
}
);
};
var NextIcon = ({ size = 16 }) => {
return /* @__PURE__ */ jsxs(
"svg",
{
focusable: false,
height: size,
width: size,
viewBox: "0 0 24 24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg",
children: [
/* @__PURE__ */ jsx("g", { id: "SVGRepo_bgCarrier", strokeWidth: "0" }),
/* @__PURE__ */ jsx(
"g",
{
id: "SVGRepo_tracerCarrier",
strokeLinecap: "round",
strokeLinejoin: "round"
}
),
/* @__PURE__ */ jsx("g", { id: "SVGRepo_iconCarrier", children: /* @__PURE__ */ jsx(
"path",
{
d: "M9 6L15 12L9 18",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}
) })
]
}
);
};
var CloseIcon = ({ size = 16 }) => {
return /* @__PURE__ */ jsx(
"svg",
{
className: "zener-outline-none",
tabIndex: -1,
focusable: "false",
"data-icon": "close",
width: size,
height: size,
strokeWidth: "2",
fill: "currentColor",
"aria-hidden": "true",
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 32 32",
children: /* @__PURE__ */ jsx(
"path",
{
stroke: "currentColor",
strokeLinecap: "round",
strokeLinejoin: "round",
strokeWidth: "2",
d: "M24 8 8 24M24 24 8 8"
}
)
}
);
};
// src/datepicker/menu.tsx
import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
var Menu = ({
type,
show,
bounds,
portalRef,
today,
onChange,
selectedDate,
lang,
menuContainerClassName,
calendarClassName,
portalClassName,
components,
converterMode,
animation,
max,
min
}) => {
const [selectionMode, setSelectionMode] = useState("day");
const [currentYearRangeIndex, setCurrentYearRangeIndex] = useState(0);
const [days, setDays] = useState([]);
const [selectedMonthYear, setSelectedMonthYear] = useState();
const [adDateRangeForConverter, setAdDateRangeForConverter] = useState({
start: getStartYearAD(),
end: getEndYearAD()
});
const todayText = lang === "en" ? "Today" : NEPALI_TODAY;
const changeMonth = ({ m, y }) => {
const mI = getMonthInfo({
year: y,
// since month index start from 0 but getMonthInfo requires index from 1
month: m + 1,
type
});
const gD = groupDates({
...mI,
// since month index start from 0 but groupDates requires index from 1
currentMonth: m + 1
});
setDays(gD);
setSelectedMonthYear({
year: y,
month: m
});
setCurrentYearRangeIndex(getDecadeRange(y).start);
};
useEffect(() => {
setAdDateRangeForConverter({
start: getStartYearAD(),
end: getEndYearAD()
});
}, []);
useEffect(() => {
setSelectionMode("day");
}, [show]);
useEffect(() => {
if (today || selectedDate) {
let y = 0;
let m = 0;
if (selectedDate) {
m = selectedDate.getMonth();
y = selectedDate.getFullYear();
} else if (today) {
m = today.getMonth();
y = today.getFullYear();
}
changeMonth({ m, y });
}
}, [today, selectedDate, show]);
const canGoNextYear = () => {
if (!selectedMonthYear) {
return false;
}
if (type === "AD") {
return true;
}
const startBSYear = getDateFromNumber(startDateBS2).year;
const endBSYear = startBSYear + yearMonthDays2.length - 1;
const y = selectedMonthYear.year + 1;
if (y <= endBSYear) {
return true;
}
return false;
};
const nextYear = () => {
if (!selectedMonthYear) {
return;
}
const y = selectedMonthYear.year + 1;
const m = selectedMonthYear.month;
if (canGoNextYear()) {
changeMonth({
y,
m
});
}
};
const canGoPrevYear = () => {
if (!selectedMonthYear) {
return false;
}
const startBSYear = getDateFromNumber(startDateBS2).year;
const y = (selectedMonthYear.year || 1) - 1;
if (type === "AD") {
if ((/* @__PURE__ */ new Date(
`${padFourNumber(y)}-${padTwo(selectedMonthYear.month + 1)}-01`
)).getTime() > lowerADDate) {
return true;
}
return false;
}
if (y >= startBSYear) {
return true;
}
return false;
};
const prevYear = () => {
const y = (selectedMonthYear?.year || 0) - 1;
const m = selectedMonthYear?.month || 0;
if (canGoPrevYear()) {
changeMonth({
y,
m
});
}
};
const canGoNextDecade = () => {
if (type === "AD") {
return true;
}
const startBSYear = getDateFromNumber(startDateBS2).year;
const endBSYear = startBSYear + yearMonthDays2.length - 1;
if (currentYearRangeIndex < getDecadeRange(endBSYear).start) {
return true;
}
return false;
};
const canGoPrevDecade = () => {
if (!selectedMonthYear) {
return false;
}
if (type === "AD") {
if ((/* @__PURE__ */ new Date(
`${padFourNumber(currentYearRangeIndex)}-${padTwo(selectedMonthYear.month + 1)}-01`
)).getTime() > lowerADDate) {
return true;
}
return false;
}
const startBSYear = getDateFromNumber(startDateBS2).year;
if (currentYearRangeIndex > startBSYear) {
return true;
}
return false;
};
const nextDecade = () => {
if (canGoNextDecade()) {
setCurrentYearRangeIndex((prev) => prev + 10);
}
};
const prevDecade = () => {
if (canGoPrevDecade()) {
setCurrentYearRangeIndex((prev) => prev - 10);
}
};
const canGoPrevMonth = () => {
if (!selectedMonthYear) {
return false;
}
if (type === "AD") {
if ((/* @__PURE__ */ new Date(
`${padFourNumber(selectedMonthYear.year)}-${padTwo(selectedMonthYear.month + 1)}-01`
)).getTime() > lowerADDate) {
return true;
}
return false;
}
const startBSYear = getDateFromNumber(startDateBS2);
if (selectedMonthYear) {
if (selectedMonthYear.year > startBSYear.year) {
return true;
} else if (selectedMonthYear.year === startBSYear.year) {
return selectedMonthYear.month > 0;
}
return false;
}
return false;
};
const canGoNextMonth = () => {
if (type === "AD") {
return true;
}
const startBSYear = getDateFromNumber(startDateBS2);
const endBSYear = startBSYear.year + yearMonthDays2.length - 1;
if (selectedMonthYear) {
if (selectedMonthYear.year < endBSYear) {
return true;
} else if (selectedMonthYear.year === endBSYear) {
return selectedMonthYear.month < 11;
}
}
return false;
};
const prevMonth = () => {
if (!selectedMonthYear) {
return;
}
if (!canGoPrevMonth()) {
return;
}
let m = selectedMonthYear.month - 1;
let y = selectedMonthYear.year;
if (m < 0) {
y -= 1;
m = 11;
}
if (y < 0) {
y = 0;
}
changeMonth({ m, y });
};
const nextMonth = () => {
if (!selectedMonthYear) {
return;
}
let m = selectedMonthYear.month + 1;
let y = selectedMonthYear.year;
if (m > 11) {
y += 1;
m = 0;
}
if (y < 0) {
y = 0;
}
changeMonth({ m, y });
};
const isSelectedDate = (date, month) => {
if (!selectedDate || !selectedMonthYear) {
return false;
}
return selectedDate.getFullYear() === selectedMonthYear.year && selectedDate.getMonth() === selectedMonthYear.month && selectedDate.getDate() === date && month === "current";
};
const isTodayDate = (date) => {
if (!today || !selectedMonthYear) {
return false;
}
return today.getFullYear() === selectedMonthYear.year && today.getMonth() === selectedMonthYear.month && date === today.getDate();
};
const checkDayDisabledInBs = (month) => {
if (!selectedMonthYear) {
return true;
}
const startBSYear = getDateFromNumber(startDateBS2);
const endBSYear = startBSYear.year + yearMonthDays2.length - 1;
let m = selectedMonthYear.month;
let y = selectedMonthYear.year;
if (type === "BS") {
switch (month) {
case "next": {
if (m > 10) {
y += 1;
if (y > endBSYear) {
return true;
}
}
return false;
}
case "prev": {
m -= 1;
if (m < 0) {
y -= 1;
if (y < startBSYear.year) {
return true;
}
}
return false;
}
default:
return false;
}
}
return false;
};
const checkDayDisabledInAD = (month) => {
if (!selectedMonthYear) {
return true;
}
let m = selectedMonthYear.month;
let y = selectedMonthYear.year;
switch (month) {
case "prev": {
m -= 1;
if (m < 0) {
y -= 1;
if (y < 1) {
return true;
}
return false;
}
return false;
}
case "next":
default:
return false;
}
};
const handleOnChange = (month, date) => {
if (!selectedMonthYear) {
return;
}
let m = selectedMonthYear.month;
let y = selectedMonthYear.year;
if (checkDayDisabledInBs(month)) {
return;
}
if (month === "next") {
if (m > 10) {
y += 1;
m = 0;
} else {
m += 1;
}
} else if (month === "prev") {
m -= 1;
if (m < 0) {
m = 11;
y -= 1;
}
}
const x = `${padFourNumber(y)}-${padTwo(m + 1)}-${padTwo(date)}`;
onChange?.(
// @ts-ignore
type === "BS" ? new NepaliDate(y, m, date) : new Date(x)
);
};
const getSelectionContent = useMemo(() => {
const num_columns = 3;
switch (selectionMode) {
case "month": {
const getMonths = () => {
if (type === "BS") {
return lang === "en" ? ENGLISH_NEPALI_MONTH : NEPALI_MONTH;
} else {
return lang === "en" ? AD_MONTH : AD_MONTH_NEPALI;
}
};
const monthArray = groupArray(getMonths(), num_columns);
const getMonthIndex = (index, mIndex) => index * num_columns + mIndex;
const onMonthClicked = (index, mIndex) => {
changeMonth({
m: getMonthIndex(index, mIndex),
y: selectedMonthYear?.year || 0
});
setSelectionMode("day");
};
const isMonthDisabled = (month) => {
if (!selectedMonthYear) {
return true;
}
if (min) {
if (selectedMonthYear?.year === min.getFullYear() && month < min.getMonth() || selectedMonthYear?.year < min.getFullYear()) {
return true;
}
}
if (max) {
if (selectedMonthYear?.year === max.getFullYear() && month > max.getMonth() || selectedMonthYear?.year > max.getFullYear()) {
return true;
}
}
if (!converterMode) {
return false;
}
if (type === "BS") {
return false;
}
if (!selectedMonthYear) {
return true;
}
if (selectedMonthYear.year < adDateRangeForConverter.start.year || selectedMonthYear.year > adDateRangeForConverter.end.year) {
return true;
}
if (selectedMonthYear.year === adDateRangeForConverter.start.year || selectedMonthYear.year === adDateRangeForConverter.end.year) {
if (selectedMonthYear.year === adDateRangeForConverter.start.year && month < adDateRangeForConverter.start.month || selectedMonthYear.year === adDateRangeForConverter.end.year && month > adDateRangeForConverter.end.month) {
return true;
}
return false;
}
return false;
};
return /* @__PURE__ */ jsx2("tbody", { children: monthArray.map((ma, index) => {
const i = index;
return /* @__PURE__ */ jsx2("tr", { children: ma.map((m, mIndex) => {
const monthIndex = getMonthIndex(index, mIndex);
const monthDisabled = isMonthDisabled(monthIndex);
return /* @__PURE__ */ jsx2("td", { children: components?.month ? components.month({
onClick: () => !monthDisabled ? onMonthClicked(index, mIndex) : null,
monthText: m,
monthNumber: monthIndex,
year: selectedMonthYear?.year || 0,
isDisabled: monthDisabled
}) : /* @__PURE__ */ jsx2(
"div",
{
className: cn(
"zener-text-center zener-p-3 zener-group",
{
"zener-cursor-pointer": !monthDisabled,
"zener-cursor-default": monthDisabled
}
),
onClick: () => !monthDisabled ? onMonthClicked(index, mIndex) : null,
children: /* @__PURE__ */ jsx2(
"div",
{
className: cn(
"zener-text-sm zener-flex zener-items-center zener-justify-center zener-h-[28px] zener-rounded",
{
"group-hover:zener-bg-menu-container-item-hover": !monthDisabled,
"zener-text-menu-container-text-disabled": monthDisabled
}
),
children: m
}
)
}
) }, m);
}) }, i);
}) });
}
case "year": {
const range = getDecadeRange(currentYearRangeIndex);
const groupedYears = groupArray(
getYearsArray(range.start),
num_columns
);
const getYearIndex = (index, mIndex) => index * num_columns + mIndex;
const onYearClicked = (index, mIndex) => {
changeMonth({
m: selectedMonthYear?.month || 0,
y: getYearIndex(index, mIndex) + range.start
});
setSelectionMode("month");
};
const isYearDisabled = (year) => {
if (min) {
if (year < min.getFullYear()) {
return true;
}
}
if (max) {
if (year > max.getFullYear()) {
return true;
}
}
if (type === "BS") {
return false;
}
if (type === "AD" && !converterMode) {
return year < 1;
}
if (year < adDateRangeForConverter.start.year || year > adDateRangeForConverter.end.year) {
return true;
}
return false;
};
return /* @__PURE__ */ jsx2("tbody", { children: groupedYears.map((ma, index) => {
const i = index;
return /* @__PURE__ */ jsx2("tr", { children: ma.map((m, mIndex) => {
const yearText = lang === "en" ? padFourNumber(m) : engToNepaliNumber(padFourNumber(m));
const indexNumber = getYearIndex(index, mIndex) + range.start;
const yearDisabled = isYearDisabled(indexNumber);
return /* @__PURE__ */ jsx2("td", { children: components?.year ? components.year({
onClick: () => !yearDisabled ? onYearClicked(index, mIndex) : null,
yearText,
yearNumber: indexNumber,
isDisabled: yearDisabled
}) : /* @__PURE__ */ jsx2(
"div",
{
className: cn(
"zener-text-center zener-p-3 zener-group",
{
"zener-cursor-pointer": !yearDisabled,
"zener-cursor-default": yearDisabled
}
),
onClick: () => !yearDisabled ? onYearClicked(index, mIndex) : null,
children: /* @__PURE__ */ jsx2(
"div",
{
className: cn(
"zener-text-sm zener-flex zener-items-center zener-justify-center zener-h-[28px] zener-rounded",
{
"group-hover:zener-bg-menu-container-item-hover": !yearDisabled,
"zener-text-menu-container-text-disabled": yearDisabled
}
),
children: yearText
}
)
}
) }, m);
}) }, i);
}) });
}
case "day":
default: {
const onDayClicked = (month, date) => handleOnChange(month, date);
const isDayDisabled = (day, month) => {
if (!selectedMonthYear) {
return true;
}
if (min) {
if (selectedMonthYear?.year === min.getFullYear() && selectedMonthYear?.month === min.getMonth() && (day < min.getDate() && month !== "next" || month === "prev") || selectedMonthYear.month < min.getMonth() && selectedMonthYear.year === min.getFullYear() || selectedMonthYear.year < min.getFullYear()) {
return true;
}
}
if (max) {
if (selectedMonthYear?.year === max.getFullYear() && selectedMonthYear?.month === max.getMonth() && (day > max.getDate() && month !== "prev" || month === "next") || selectedMonthYear.month > max.getMonth() && selectedMonthYear.year === max.getFullYear() || selectedMonthYear.year > max.getFullYear()) {
return true;
}
}
if (type === "BS") {
return checkDayDisabledInBs(month);
}
if (type === "AD" && !converterMode) {
return checkDayDisabledInAD(month);
}
if (selectedMonthYear.year < adDateRangeForConverter.start.year || selectedMonthYear.year > adDateRangeForConverter.end.year) {
return true;
}
if (selectedMonthYear.year === adDateRangeForConverter.start.year || selectedMonthYear.year === adDateRangeForConverter.end.year) {
if (selectedMonthYear.year === adDateRangeForConverter.start.year && selectedMonthYear.month < adDateRangeForConverter.start.month || selectedMonthYear.year === adDateRangeForConverter.end.year && selectedMonthYear.month > adDateRangeForConverter.end.month) {
return true;
}
if (selectedMonthYear.year === adDateRangeForConverter.start.year && selectedMonthYear.month === adDateRangeForConverter.start.month && (day < adDateRangeForConverter.start.date && month === "current" || month === "prev") || selectedMonthYear.year === adDateRangeForConverter.end.year && selectedMonthYear.month === adDateRangeForConverter.end.month && adDateRangeForConverter.start.month && (day > adDateRangeForConverter.end.date && month === "current" || month === "next")) {
return true;
}
return false;
}
return false;
};
return /* @__PURE__ */ jsxs2(Fragment, { children: [
/* @__PURE__ */ jsx2("thead", { children: /* @__PURE__ */ jsx2("tr", { className: "zener-text-sm", children: (lang === "en" ? ENGLISH_WEEK : NEPALI_WEEK).map(
(week, index) => /* @__PURE__ */ jsx2("th", { children: components?.week ? components.week({ weekText: week, weekNumber: index }) : /* @__PURE__ */ jsx2("div", { className: "zener-w-[28px] zener-h-[28px] zener-flex zener-items-center zener-justify-center zener-font-normal", children: week }) }, week)
) }) }),
/* @__PURE__ */ jsx2("tbody", { children: days.map((d, i) => {
const ii = i;
return /* @__PURE__ */ jsx2("tr", { children: d.map((dd, index) => {
const date = dd.day < 1 ? 0 : dd.day;
const isSelected = isSelectedDate(date, dd.month);
const isToday = isTodayDate(date);
const dateText = lang === "en" ? date : engToNepaliNumber(date);
const dayDisabled = isDayDisabled(date, dd.month);
return /* @__PURE__ */ jsx2("td", { children: components?.date ? components.date({
dateMonthType: dd.month,
dateText,
date,
month: selectedMonthYear?.month || 0,
year: selectedMonthYear?.year || 0,
isSelected,
isToday,
onClick: () => !dayDisabled ? onDayClicked(dd.month, date) : null,
isDisabled: dayDisabled,
weekDay: index
}) : /* @__PURE__ */ jsx2(
"div",
{
className: cn(
"zener-text-center zener-p-1 zener-group",
{
"zener-cursor-pointer": !dayDisabled,
"zener-cursor-default": dayDisabled
}
),
onClick: () => !dayDisabled ? onDayClicked(dd.month, date) : null,
children: /* @__PURE__ */ jsx2(
"div",
{
className: cn(
"zener-text-sm zener-flex zener-items-center zener-justify-center zener-h-[28px] zener-w-[28px] zener-rounded",
{
"zener-text-menu-container-text-disabled": dd.month !== "current" || dayDisabled,
"zener-border zener-border-solid zener-box-border zener-border-menu-container-text-border": isToday && dd.month === "current" && !dayDisabled,
"zener-bg-menu-container-text-selected-bg zener-text-menu-container-text-selected zener-transition-none": isSelected && dd.month === "current" && !dayDisabled,
"zener-bg-menu-container-text-selected-disabled-bg zener-text-menu-container-text-selected-disabled zener-transition-none": isSelected && dd.month === "current" && dayDisabled,
"group-hover:zener-bg-menu-container-item-hover": !isSelected && !dayDisabled
}
),
children: dateText
}
)
}
) }, dd.day);
}) }, ii);
}) })
] });
}
}
}, [
lang,
selectedMonthYear,
currentYearRangeIndex,
selectionMode,
converterMode
]);
const getYearRange = useMemo(() => {
const yearRange = `${padFourNumber(getDecadeRange(currentYearRangeIndex).start)}-${padFourNumber(getDecadeRange(currentYearRangeIndex).end)}`;
return lang === "en" ? yearRange : engToNepNumberFullDate(yearRange);
}, [currentYearRangeIndex, lang]);
const isPrevDisabled = () => {
switch (selectionMode) {
case "month":
return !canGoPrevYear();
case "year":
return !canGoPrevDecade();
case "day":
default:
return !canGoPrevMonth();
}
};
const isNextDisabled = () => {
switch (selectionMode) {
case "month":
return !canGoNextYear();
case "year":
return !canGoNextDecade();
case "day":
default:
return !canGoNextMonth();
}
};
const onNextClick = () => {
switch (selectionMode) {
case "month":
nextYear();
break;
case "year":
nextDecade();
break;
case "day":
default:
nextMonth();
break;
}
};
const onPrevClicked = () => {
switch (selectionMode) {
case "month":
prevYear();
break;
case "year":
prevDecade();
break;
case "day":
default:
prevMonth();
break;
}
};
const onMonthSelectClicked = () => {
setSelectionMode("month");
};
const onYearSelectClicked = () => {
setSelectionMode("year");
};
const getHeaderYearText = () => {
return lang === "en" ? padFourNumber(selectedMonthYear?.year || 1) : engToNepaliNumber(padFourNumber(selectedMonthYear?.year || 1));
};
const getHeaderMonthText = () => {
if (type === "BS") {
return (lang === "en" ? ENGLISH_NEPALI_MONTH : NEPALI_MONTH)[selectedMonthYear?.month || 0];
} else {
return (lang === "en" ? AD_MONTH : AD_MONTH_NEPALI)[selectedMonthYear?.month || 0];
}
};
const selectToday = () => {
onChange?.(today);
};
return /* @__PURE__ */ jsx2(AnimatePresence, { children: show && /* @__PURE__ */ jsx2(
Portal,
{
tabIndex: -1,
className: cn(
"zener-date-picker zener-pointer-events-auto zener-absolute zener-z-[9999999999999999999] zener-min-w-[282px] zener-left-0 zener-top-0",
portalClassName || "zener-font-sans zener-mt-1"
),
style: {
transform: `translate(${bounds.left}px,${bounds.height + bounds.top}px)`
},
ref: portalRef,
children: /* @__PURE__ */ jsxs2(
motion.div,
{
...animation || (animation === null ? {} : {
initial: { opacity: 0, translateY: -5 },
animate: { opacity: 1, translateY: 0 },
exit: { opacity: 0, translateY: -5 },
transition: { duration: 0.2 }
}),
className: cn(
"zener-overflow-hidden zener-h-full",
menuContainerClassName || "zener-bg-menu-container-bg zener-rounded-md zener-shadow-menu zener-text-menu-container-text"
),
children: [
components?.header ? components.header({
prevClick: onPrevClicked,
nextClick: onNextClick,
prevDisabled: isPrevDisabled(),
nextDisabled: isNextDisabled(),
selectionMode,
onMonthSelectClicked,
onYearSelectClicked,
monthText: getHeaderMonthText(),
yearText: getHeaderYearText(),
monthNumber: selectedMonthYear?.month || 0,
yearRange: getDecadeRange(currentYearRangeIndex),
yearNumber: selectedMonthYear?.year || 0,
yearRangeText: getYearRange
}) : /* @__PURE__ */ jsxs2("div", { className: "zener-flex zener-flex-row zener-items-center zener-text-sm zener-justify-between zener-py-2 zener-border-0 zener-border-b zener-border-b-menu-container-top-bottom-border zener-border-solid", children: [
/* @__PURE__ */ jsx2(
"button",
{
className: cn(
"month-prev-button zener-p-2 zener-text-menu-header-icon hover:zener-text-menu-header-icon-hover disabled:zener-text-menu-header-icon-disabled",
{
"zener-cursor-pointer": !isPrevDisabled(),
"!zener-cursor-default": isPrevDisabled()
}
),
disabled: isPrevDisabled(),
onClick: onPrevClicked,
tabIndex: -1,
children: /* @__PURE__ */ jsx2(PreviousIcon, { size: 20 })
}
),
(selectionMode === "day" || selectionMode === "month") && /* @__PURE__ */ jsxs2("div", { className: "zener-font-semibold zener-flex zener-flex-row zener-items-center", children: [
selectionMode === "day" && /* @__PURE__ */ jsx2(
"button",
{
tabIndex: -1,
className: "zener-py-1 zener-px-1.5 zener-rounded zener-cursor-pointer hover:zener-bg-menu-container-item-hover",
onClick: onMonthSelectClicked,
children: getHeaderMonthText()
}
),
/* @__PURE__ */ jsx2(
"button",
{
tabIndex: -1,
className: "zener-py-1 zener-px-1.5 zener-rounded zener-cursor-pointer hover:zener-bg-menu-container-item-hover",
onClick: onYearSelectClicked,
children: getHeaderYearText()
}
)
] }),
selectionMode === "year" && /* @__PURE__ */ jsx2("div", { className: "zener-cursor-default zener-font-semibold zener-flex zener-flex-row zener-items-center", children: getYearRange }),
/* @__PURE__ */ jsx2(
"button",
{
className: cn(
"month-next-button zener-p-2 zener-text-menu-header-icon hover:zener-text-menu-header-icon-hover disabled:zener-text-menu-header-icon-disabled",
{
"zener-cursor-pointer": !isNextDisabled(),
"!zener-cursor-default": isNextDisabled()
}
),
tabIndex: -1,
disabled: isNextDisabled(),
onClick: onNextClick,
children: /* @__PURE__ */ jsx2(NextIcon, { size: 20 })
}
)
] }),
/* @__PURE__ */ jsx2("div", { className: cn(calendarClassName || "zener-p-2"), children: /* @__PURE__ */ jsx2("table", { className: "zener-w-full zener-h-full zener-border-collapse", children: getSelectionContent }) }),
components?.footer ? components.footer({
onTodayClick: selectToday,
todayText
}) : /* @__PURE__ */ jsx2("div", { className: "zener-flex zener-flex-row zener-items-center zener-justify-center zener-border-0 zener-border-t zener-border-solid zener-border-t-menu-container-top-bottom-border", children: /* @__PURE__ */ jsx2(
"button",
{
className: "zener-text-menu-footer-today zener-font-normal !zener-text-sm zener-p-2 hover:zener-text-menu-footer-today-hover",
onClick: selectToday,
children: todayText
}
) })
]
}
)
}
) });
};
var menu_default = Menu;
// src/utils/use-bounds.ts
import { useLayoutEffect, useRef, useState as useState2 } from "react";
var getPosition = (target) => {
const { left, top, height, width } = target.getBoundingClientRect();
return {
left: left + window.pageXOffset,
top: top + window.pageYOffset,
width,
height
};
};
var useBounds = (inputRef, deps) => {
const [bounds, setBounds] = useState2({
left: 0,
top: 0,
height: 0,
width: 0
});
const boundRef = useRef({
left: 0,
top: 0,
height: 0,
width: 0
});
useLayoutEffect(() => {
const resizeListener = () => {
if (inputRef && inputRef.current) {
const b = getPosition(inputRef.current);
setBounds(b);
boundRef.current = b;
}
};
window.addEventListener("resize", resizeListener);
resizeListener();
return () => {
window.removeEventListener("resize", resizeListener);
};
}, [inputRef.current]);
useLayoutEffect(() => {
if (inputRef && inputRef.current) {
const b = getPosition(inputRef.current);
setBounds(b);
boundRef.current = b;
}
let int = 0;
if (deps.some((e) => !!e)) {
int = setInterval(() => {
const b = getPosition(inputRef.current);
if (JSON.stringify(b) !== JSON.stringify(boundRef.current)) {
setBounds(b);
boundRef.current = b;
}
}, 50);
} else {
clearInterval(int);
}
return () => {
clearInterval(int);
};
}, [inputRef.current, ...deps]);
return { bounds, getPosition, setBounds };
};
var use_bounds_default = useBounds;
// src/datepicker/nepali-date-picker.tsx
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
var NepaliDatePicker = ({
type = "BS",
open,
disabled,
placeholder,
onChange,
className,
value,
lang = "np",
menuContainerClassName,
calendarClassName,
portalClassName,
components,
prefix,
suffix,
showclear = true,
converterMode,
animation,
format = "YYYY-MM-DD",
max,
min
}) => {
const inputRef = useRef2(null);
const containerRef = useRef2(null);
const portalRef = useRef2(null);
const [show, setShow] = useState3(false);
const [selectedDate, setSelectedDate] = useState3();
const [inputValue, setInputValue] = useState3("");
const [today, setToday] = useState3(
type === "BS" ? new NepaliDate2() : /* @__PURE__ */ new Date()
);
const { bounds } = use_bounds_default(containerRef, [show, open]);
useEffect2(() => {
setToday(type === "BS" ? new NepaliDate2() : /* @__PURE__ */ new Date());
}, []);
useEffect2(() => {
setToday(type === "BS" ? new NepaliDate2() : /* @__PURE__ */ new Date());
}, [type]);
useEffect2(() => {
if (selectedDate) {
if (type === "BS") {
setInputValue(selectedDate.format(format, lang));
} else {
setInputValue(formatADDate(selectedDate, format, lang));
}
} else {
setInputValue("");
}
}, [selectedDate]);
const closeMenu = () => {
if (!open) {
setShow(false);
}
};
useLayoutEffect2(() => {
setShow(!!open);
}, [open]);
useEffect2(() => {
if (value) {
switch (type) {
case "AD":
if (typeof value === "string" || value instanceof Date) {
setSelectedDate(new Date(value));
}
break;
case "BS":
default:
if (typeof value === "string" || value instanceof NepaliDate2) {
setSelectedDate(new NepaliDate2(value));
}
break;
}
} else {
setSelectedDate(null);
}
}, [value, lang, type, format]);
const setFocus = () => {
if (disabled) {
return;
}
if (className && typeof className === "function" && !!className().focus) {
containerRef.current?.classList.add(
...className().focus?.split(" ") || [""]
);
}
};
const removeFocus = () => {
if (className && typeof className === "function" && !!className().focus) {
containerRef.current?.classList.remove(
...className().focus?.split(" ") || [""]
);
containerRef.current?.classList.add(
...className().default?.split(" ") || [""]
);
}
};
const clear = () => {
setSelectedDate(void 0);
onChange?.(null);
};
return /* @__PURE__ */ jsxs3("div", { className: "zener-w-full", children: [
/* @__PURE__ */ jsxs3(
"div",
{
ref: containerRef,
className: cn(
"zener-relative zener-flex zener-flex-row zener-items-center",
{
"zener-text-input-disabled-text zener-bg-input-disabled-bg zener-border-input-disabled-border": !className && !!disabled
},
className && typeof className === "function" ? `${disabled ? className().disabled : className().default}` : className || `${!disabled ? "focus:zener-ring-1 focus:zener-ring-input-focus-ring focus-within:zener-ring-1 focus-within:zener-ring-input-focus-ring" : ""} zener-font-sans zener-bg-input-bg zener-text-sm zener-px-2 zener-py-0.5 zener-border-solid zener-border zener-border-input-border zener-rounded zener-min-w-[122px] zener-outline-none zener-w-full zener-text-input-text`
),
onFocus: () => {
if (disabled) {
return;
}
setFocus();
},
onBlur: () => {
removeFocus();
},
children: [
prefix && /* @__PURE__ */ jsx3("div", { children: prefix }),
/* @__PURE__ */ jsx3(
"input",
{
className: "zener-outline-none focus-visible:zener-outline-none focus:zener-outline-none focus-within:zener-outline-none zener-border-0 zener-w-fit zener-bg-transparent zener-flex-1 zener-text-inherit zener-min-h-[24px]",
size: 10,
tabIndex: 0,
ref: inputRef,
type: "text",
disabled,
readOnly: true,
onClick: () => {
if (!disabled) {
if (!open) {
setShow((prev) => !prev);
}
}
},
onBlur: (e) => {
const rT = e.relatedTarget;
const isInMenu = portalRef.current?.contains(rT);
if (isInMenu) {
inputRef.current?.focus();
return;
}
if (!inputValue && selectedDate) {
setInputValue(selectedDate.toString());
}
removeFocus();
closeMenu();
},
onFocus: () => {
if (disabled) {
return;
}
setFocus();
},
value: inputValue,
onKeyDown: (e) => {
if (disabled) {
return;
}
const { code, ctrlKey } = e;
switch (code) {
case "ArrowUp":
case "ArrowDown":
e.preventDefault();
if (!show) {
setShow(true);
break;
}
break;
case "Space":
if (ctrlKey) {
e.preventDefault();
if (show) {
setShow(false);
} else {
setShow(true);
}
}
break;
case "Escape":
e.preventDefault();
closeMenu();
break;
default:
break;
}
},
placeholder
}
),
suffix?.({
onClear: clear,
isOpen: show || !!open,
showclear
}) || /* @__PURE__ */ jsx3(
"div",
{
tabIndex: -1,
className: "zener-flex zener-flex-row zener-items-center gap-2 zener-h-full zener-text-inherit",
children: showclear && !disabled && !!inputValue && /* @__PURE__ */ jsx3(
"button",
{
"aria-label": "clear",
onClick: (e) => {
e.stopPropagation();
clear();
},
tabIndex: -1,
className: "zener-cursor-pointer zener-outline-none zener-border-0 zener-opacity-80 hover:zener-opacity-100 zener-transition-all zener-bg-transparent zener-flex zener-items-center zener-justify-center zener-text-inherit",
type: "button",
children: /* @__PURE__ */ jsx3(CloseIcon, { size: 16 })
}
)
}
)
]
}
),
/* @__PURE__ */ jsx3(
menu_default,
{
lang,
portalRef,
show,
bounds,
today,
selectedDate,
onChange: (e) => {
setSelectedDate(e);
onChange?.(e);
closeMenu();
},
menuContainerClassName,
portalClassName,
calendarClassName,
components,
type,
converterMode,
animation,
max,
min
}
)
] });
};
var nepali_date_picker_default = NepaliDatePicker;
// src/datepicker/index.ts
var {
AD_MONTH: AD_MONTH2,
AD_MONTH_FULL,
AD_MONTH_NEPALI: AD_MONTH_NEPALI2,
ENGLISH_NEPALI_MONTH: ENGLISH_NEPALI_MONTH2,
ENGLISH_WEEK: ENGLISH_WEEK2,
ENGLISH_WEEK_FULL,
lowerADDate: lowerADDate2,
NEPALI_DIGITS: NEPALI_DIGITS2,
NEPALI_MONTH: NEPALI_MONTH2,
NEPALI_TODAY: NEPALI_TODAY2,
NEPALI_WEEK: NEPALI_WEEK2,
NEPALI_WEEK_FULL,
startDateBS: startDateBS3,
toAD: toAD2,
toBS,
yearMonthDays: yearMonthDays3
} = nepaliDateConstants;
var datepicker_default = nepali_date_picker_default;
export {
AD_MONTH2 as AD_MONTH,
AD_MONTH_FULL,
AD_MONTH_NEPALI2 as AD_MONTH_NEPALI,
ENGLISH_NEPALI_MONTH2 as ENGLISH_NEPALI_MONTH,
ENGLISH_WEEK2 as ENGLISH_WEEK,
ENGLISH_WEEK_FULL,
NEPALI_DIGITS2 as NEPALI_DIGITS,
NEPALI_MONTH2 as NEPALI_MONTH,
NEPALI_TODAY2 as NEPALI_TODAY,
NEPALI_WEEK2 as NEPALI_WEEK,
NEPALI_WEEK_FULL,
NepaliDate3 as NepaliDate,
datepicker_default as default,
lowerADDate2 as lowerADDate,
startDateBS3 as startDateBS,
toAD2 as toAD,
toBS,
yearMonthDays3 as yearMonthDays
};