react-modular-datepicker 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,7 @@ interface CalendarProps extends UseDatesProps {
8
8
  translations?: Partial<Translations>;
9
9
  header?: React.ReactNode | ((props: any) => React.ReactNode);
10
10
  footer?: React.ReactNode;
11
- renderDayTooltip?: (dateObj: DateObj) => React.ReactNode;
11
+ getDayProps?: (dateObj: DateObj) => Record<string, any>;
12
12
  }
13
13
  export declare const Calendar: React.FC<CalendarProps>;
14
14
  export {};
@@ -6,7 +6,7 @@ interface DayProps {
6
6
  dateObj: DateObj;
7
7
  [key: string]: any;
8
8
  }) => any;
9
- tooltip?: React.ReactNode;
9
+ dayProps?: Record<string, any>;
10
10
  classNames: Required<CalendarClassNames>;
11
11
  }
12
12
  export declare const Day: React.FC<DayProps>;
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useDates-c17u4Qfs.cjs"),t=require("./utils.cjs");let n=require("react");n=e.i(n,1);let r=require("react/jsx-runtime");var i=({dateObj:e,getDateProps:t,classNames:i,tooltip:a})=>{let[o,s]=(0,n.useState)(!1);if(!e)return(0,r.jsx)(`div`,{className:`aspect-square bg-white`});let{date:c,selected:l,selectable:u,isRangeStart:d,isRangeEnd:f,isRangeBetween:p,isRangeHovering:m,isRangeActive:h}=e,g=i.day,_=`rounded-full`;_=d&&f?`${g.selected} rounded-full`:d?`${g.rangeStart} ${h?`rounded-l-full rounded-r-none`:`rounded-full`}`:f?`${g.rangeEnd} ${h?`rounded-r-full rounded-l-none`:`rounded-full`}`:p?g.rangeBetween||``:m?g.rangeHovering||``:l?g.selected||``:u?g.unselected||``:g.disabled||``;let v=[g.day,_,...(e.modifiers||[]).map(e=>g[e]||e)].filter(Boolean).join(` `);return(0,r.jsxs)(`button`,{...t({dateObj:e,onMouseEnter:()=>s(!0),onMouseLeave:()=>s(!1)}),className:v,children:[c.getDate(),a&&o&&(0,r.jsx)(`div`,{className:`absolute bottom-full left-1/2 -translate-x-1/2 mb-2 hidden group-hover:block z-10`,children:(0,r.jsxs)(`div`,{className:`bg-gray-800 text-white text-xs py-1 px-2 rounded whitespace-nowrap shadow-lg`,children:[a,(0,r.jsx)(`div`,{className:`absolute top-full left-1/2 -translate-x-1/2 border-8 border-transparent border-t-gray-800`})]})})]})};function a(t=e.r,n){return{months:t.getMonths(n),weekdays:t.getWeekdays(n),back:`Previous month`,forward:`Next month`}}function o(t=e.r,n,r){return{...a(t,n),...r}}var s=()=>(0,r.jsx)(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,r.jsx)(`polyline`,{points:`15 18 9 12 15 6`})}),c=()=>(0,r.jsx)(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,r.jsx)(`polyline`,{points:`9 18 15 12 9 6`})}),l=({calendars:e,getBackProps:t,getForwardProps:n,setView:i,monthNames:a,t:o,classNames:l,slideDirection:u,currentView:d})=>(0,r.jsxs)(`div`,{className:l.header,children:[(0,r.jsx)(`button`,{...t({calendars:e}),onMouseDown:e=>e.preventDefault(),className:`${l.navButton} ${d&&d!==`days`?`invisible pointer-events-none`:``}`,"aria-label":o.back,children:(0,r.jsx)(s,{})}),(0,r.jsx)(`div`,{className:l.monthYearContainer,children:e.length===1?(0,r.jsxs)(`div`,{className:`${l.monthYearLabel} ${u===`left`?`animate-slide-in-left`:u===`right`?`animate-slide-in-right`:``}`,children:[(0,r.jsx)(`button`,{onMouseDown:e=>e.preventDefault(),onClick:()=>i(d===`months`?`days`:`months`),className:l.monthYearButton,children:a[e[0].month]}),(0,r.jsx)(`button`,{onMouseDown:e=>e.preventDefault(),onClick:()=>i(d===`years`?`days`:`years`),className:l.monthYearButton,children:e[0].year})]},`${e[0].month}-${e[0].year}`):(0,r.jsx)(`div`,{className:`${l.monthYearLabel} ${u===`left`?`animate-slide-in-left`:u===`right`?`animate-slide-in-right`:``}`,children:(()=>{let t=e[0],n=e[e.length-1];return e.length===12&&t.month===0&&n.month===11&&t.year===n.year?(0,r.jsx)(`span`,{children:t.year}):t.year===n.year?(0,r.jsxs)(`span`,{children:[a[t.month],` - `,a[n.month],` `,t.year]}):(0,r.jsxs)(`span`,{children:[a[t.month],` `,t.year,` - `,a[n.month],` `,n.year]})})()})}),(0,r.jsx)(`button`,{...n({calendars:e}),onMouseDown:e=>e.preventDefault(),className:`${l.navButton} ${d&&d!==`days`?`invisible pointer-events-none`:``}`,"aria-label":o.forward,children:(0,r.jsx)(c,{})})]}),u={root:`w-fit flex flex-col p-4 bg-white rounded-lg shadow-lg`,header:`flex items-center justify-between border-b-2 border-brand-gray-light/40 pb-2`,calendarsContainer:`flex flex-wrap gap-4 mt-3`,calendarContainer:`flex-1 min-w-[280px] max-w-full`,weekdayGrid:`grid grid-cols-7 gap-1 mb-1 border-b border-brand-gray-light/40`,weekday:`text-center text-xs text-gray-400 py-2`,daysGrid:`grid grid-cols-7 gap-px bg-brand-gray-light/20`,footer:`mt-4`,navButton:`p-2 text-brand-text hover:bg-gray-100 rounded-full transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none`,monthYearContainer:`flex gap-8`,monthYearLabel:`flex gap-1 items-center font-semibold text-brand-text`,monthYearButton:`hover:bg-gray-100 px-2 py-1 rounded cursor-pointer`,day:{day:`aspect-square flex items-center justify-center text-sm font-medium transition-all relative group cursor-pointer p-px`,selected:`bg-brand-gold text-white rounded-full`,unselected:`bg-white hover:bg-brand-gray-light text-brand-text`,disabled:`bg-white text-gray-300 cursor-not-allowed`,rangeStart:`bg-brand-gold text-white`,rangeEnd:`bg-brand-gold text-white`,rangeBetween:`bg-brand-gold/25 text-brand-text`,rangeHovering:`bg-brand-gold/25 text-brand-text`},monthsGrid:`grid grid-cols-3 gap-2 animate-slide-in-top`,monthButton:`py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none`,monthButtonSelected:`bg-brand-gold text-white`,monthButtonUnselected:`text-brand-text`,yearsGrid:`grid grid-cols-3 gap-2 max-h-[300px] overflow-y-auto pr-2 animate-slide-in-top`,yearButton:`py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none`,yearButtonSelected:`bg-brand-gold text-white`,yearButtonUnselected:`text-brand-text`},d=e=>{let t={...u};if(!e)return t;for(let n in e){let r=n;r===`day`&&e.day?t.day={...u.day,...e.day}:e[r]&&(t[r]=e[r])}return t},f=({year:e,month:t,monthNames:n,minDate:i,maxDate:a,onMonthSelect:o,classNames:s})=>{let c=t=>!!(i&&e===i.getFullYear()&&t<i.getMonth()||a&&e===a.getFullYear()&&t>a.getMonth());return(0,r.jsx)(`div`,{className:s.monthsGrid,children:n.map((e,n)=>{let i=c(n);return(0,r.jsx)(`button`,{onMouseDown:e=>e.preventDefault(),onClick:()=>!i&&o(n),className:`${s.monthButton} ${n===t?s.monthButtonSelected:s.monthButtonUnselected}`,disabled:i,children:e},e)})})},p=({year:e,minDate:t,maxDate:i,adapter:a,onYearSelect:o,classNames:s})=>{let c=(0,n.useRef)(null);(0,n.useEffect)(()=>{if(c.current){let e=c.current.querySelector(`[data-selected="true"]`);e&&e.scrollIntoView({block:`center`})}},[]);let l=t?a.get(a.date(t),`year`):e-50,u=i?a.get(a.date(i),`year`):e+50,d=[];for(let e=l;e<=u;e++)d.push(e);return(0,r.jsx)(`div`,{ref:c,className:s.yearsGrid,children:d.map(t=>(0,r.jsx)(`button`,{"data-selected":t===e,onMouseDown:e=>e.preventDefault(),onClick:()=>o(t),className:`${s.yearButton} ${t===e?s.yearButtonSelected:s.yearButtonUnselected}`,children:t},t))})},m=t=>{let{classNames:a,locale:s,translations:c,adapter:u=e.r,firstDayOfWeek:m=0,header:h,footer:g,renderDayTooltip:_,...v}=t,y=d(a),[b,x]=(0,n.useState)(`days`),[S,C]=(0,n.useState)(null),w=o(u,s,c),T=w.weekdays,E=w.months,{calendars:D,getBackProps:O,getForwardProps:k,getDateProps:A,setOffset:j}=e.t({...v,adapter:u,firstDayOfWeek:m}),M=[...T.slice(m),...T.slice(0,m)],{month:N,year:P}=D[0],F=e=>{let n=u.set(u.set(u.date(t.date||new Date),`year`,P),`month`,N),r=u.set(n,`month`,e),i=u.startOf(u.date(t.date||new Date),`month`),a=u.diff(r,i,`month`);C(null),j(a),x(`days`)},I=e=>{let n=u.set(u.set(u.date(t.date||new Date),`year`,P),`month`,N),r=u.set(n,`year`,e),i=u.startOf(u.date(t.date||new Date),`month`),a=u.diff(r,i,`month`);C(null),j(a),x(`days`)},L=e=>{let t=O(e);return{...t,onClick:e=>{C(`left`),t.onClick?.(e)}}},R=e=>{let t=k(e);return{...t,onClick:e=>{C(`right`),t.onClick?.(e)}}};return(0,r.jsxs)(`div`,{className:`rmdp ${y.root}`,children:[typeof h==`function`?h({calendars:D,getBackProps:L,getForwardProps:R,setView:x,monthNames:E,t:w,slideDirection:S,currentView:b}):h||(0,r.jsx)(l,{calendars:D,getBackProps:L,getForwardProps:R,setView:x,monthNames:E,t:w,classNames:y,slideDirection:S,currentView:b}),(0,r.jsxs)(`div`,{className:y.calendarsContainer,children:[b===`months`&&D.map(e=>(0,r.jsx)(`div`,{className:y.calendarContainer,children:(0,r.jsx)(f,{year:e.year,month:e.month,monthNames:E,minDate:t.minDate,maxDate:t.maxDate,onMonthSelect:F,classNames:y})},`months-${e.year}`)),b===`years`&&D.map(e=>(0,r.jsx)(`div`,{className:y.calendarContainer,children:(0,r.jsx)(p,{year:e.year,minDate:t.minDate,maxDate:t.maxDate,adapter:u,onYearSelect:I,classNames:y})},`years-${e.year}`)),b===`days`&&D.map(e=>(0,r.jsxs)(`div`,{className:y.calendarContainer,children:[D.length>1&&(0,r.jsxs)(`button`,{type:`button`,"aria-label":E[e.month],className:`block w-full text-center font-semibold mb-2 text-brand-text`,children:[E[e.month],` `,D[0].year===D[D.length-1].year?``:e.year]}),(0,r.jsx)(`div`,{className:y.weekdayGrid,children:M.map(e=>(0,r.jsx)(`div`,{className:y.weekday,children:e},e))}),(0,r.jsx)(`div`,{className:`${y.daysGrid} ${S===`left`?`animate-slide-in-left`:S===`right`?`animate-slide-in-right`:``}`,children:e.weeks.map((e,t)=>e.map((e,n)=>(0,r.jsx)(i,{dateObj:e,getDateProps:A,classNames:y,tooltip:e&&_?.(e)},`${t}-${n}`)))})]},`${e.month}-${e.year}`))]}),g&&(0,r.jsx)(`div`,{className:y.footer,children:g})]})};exports.Calendar=m,exports.CalendarHeader=l,exports.ChevronLeftIcon=s,exports.ChevronRightIcon=c,exports.Day=i,exports.DayjsAdapter=e.n,exports.MonthSelection=f,exports.YearSelection=p,exports.addMonth=t.addMonth,exports.composeEventHandlers=t.composeEventHandlers,exports.defaultAdapter=e.r,exports.defaultClassNames=u,exports.getCalendars=t.getCalendars,exports.getDefaults=a,exports.getTranslations=o,exports.isBackDisabled=t.isBackDisabled,exports.isForwardDisabled=t.isForwardDisabled,exports.mergeClassNames=d,exports.subtractMonth=t.subtractMonth,exports.useDates=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useDates-c17u4Qfs.cjs"),t=require("./utils.cjs");let n=require("react");n=e.i(n,1);let r=require("react/jsx-runtime");var i=({dateObj:e,getDateProps:t,dayProps:n,classNames:i})=>{if(!e)return(0,r.jsx)(`div`,{className:`aspect-square bg-white`});let{date:a,selected:o,selectable:s,isRangeStart:c,isRangeEnd:l,isRangeBetween:u,isRangeHovering:d,isRangeActive:f}=e,p=i.day,m=`rounded-full`;m=c&&l?`${p.selected} rounded-full`:c?`${p.rangeStart} ${f?`rounded-l-full rounded-r-none`:`rounded-full`}`:l?`${p.rangeEnd} ${f?`rounded-r-full rounded-l-none`:`rounded-full`}`:u?p.rangeBetween||``:d?p.rangeHovering||``:o?p.selected||``:s?p.unselected||``:p.disabled||``;let h=[p.day,m,...(e.modifiers||[]).map(e=>p[e]||e)].filter(Boolean).join(` `);return(0,r.jsx)(`button`,{...t({dateObj:e,...n}),className:h,children:a.getDate()})};function a(t=e.r,n){return{months:t.getMonths(n),weekdays:t.getWeekdays(n),back:`Previous month`,forward:`Next month`}}function o(t=e.r,n,r){return{...a(t,n),...r}}var s=()=>(0,r.jsx)(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,r.jsx)(`polyline`,{points:`15 18 9 12 15 6`})}),c=()=>(0,r.jsx)(`svg`,{width:`20`,height:`20`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,r.jsx)(`polyline`,{points:`9 18 15 12 9 6`})}),l=({calendars:e,getBackProps:t,getForwardProps:n,setView:i,monthNames:a,t:o,classNames:l,slideDirection:u,currentView:d})=>(0,r.jsxs)(`div`,{className:l.header,children:[(0,r.jsx)(`button`,{...t({calendars:e}),onMouseDown:e=>e.preventDefault(),className:`${l.navButton} ${d&&d!==`days`?`invisible pointer-events-none`:``}`,"aria-label":o.back,children:(0,r.jsx)(s,{})}),(0,r.jsx)(`div`,{className:l.monthYearContainer,children:e.length===1?(0,r.jsxs)(`div`,{className:`${l.monthYearLabel} ${u===`left`?`animate-slide-in-left`:u===`right`?`animate-slide-in-right`:``}`,children:[(0,r.jsx)(`button`,{onMouseDown:e=>e.preventDefault(),onClick:()=>i(d===`months`?`days`:`months`),className:l.monthYearButton,children:a[e[0].month]}),(0,r.jsx)(`button`,{onMouseDown:e=>e.preventDefault(),onClick:()=>i(d===`years`?`days`:`years`),className:l.monthYearButton,children:e[0].year})]},`${e[0].month}-${e[0].year}`):(0,r.jsx)(`div`,{className:`${l.monthYearLabel} ${u===`left`?`animate-slide-in-left`:u===`right`?`animate-slide-in-right`:``}`,children:(()=>{let t=e[0],n=e[e.length-1];return e.length===12&&t.month===0&&n.month===11&&t.year===n.year?(0,r.jsx)(`span`,{children:t.year}):t.year===n.year?(0,r.jsxs)(`span`,{children:[a[t.month],` - `,a[n.month],` `,t.year]}):(0,r.jsxs)(`span`,{children:[a[t.month],` `,t.year,` - `,a[n.month],` `,n.year]})})()})}),(0,r.jsx)(`button`,{...n({calendars:e}),onMouseDown:e=>e.preventDefault(),className:`${l.navButton} ${d&&d!==`days`?`invisible pointer-events-none`:``}`,"aria-label":o.forward,children:(0,r.jsx)(c,{})})]}),u={root:`w-fit flex flex-col p-4 bg-white rounded-lg shadow-lg`,header:`flex items-center justify-between border-b-2 border-brand-gray-light/40 pb-2`,calendarsContainer:`flex flex-wrap gap-4`,calendarContainer:`flex-1 min-w-[280px] max-w-full`,weekdayGrid:`grid grid-cols-7 gap-1 mb-1 border-b border-brand-gray-light/40`,weekday:`text-center text-xs text-gray-400 py-2`,daysGrid:`grid grid-cols-7 gap-px bg-brand-gray-light/20`,footer:`mt-4`,navButton:`p-2 text-brand-text hover:bg-gray-100 rounded-full transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none`,monthYearContainer:`flex gap-8`,monthYearLabel:`flex gap-1 items-center font-semibold text-brand-text`,monthYearButton:`hover:bg-gray-100 px-2 py-1 rounded cursor-pointer`,day:{day:`aspect-square flex items-center justify-center text-sm font-medium transition-all relative group cursor-pointer p-px`,selected:`bg-brand-gold text-white rounded-full`,unselected:`bg-white hover:bg-brand-gray-light text-brand-text`,disabled:`bg-white text-gray-300 cursor-not-allowed`,rangeStart:`bg-brand-gold text-white`,rangeEnd:`bg-brand-gold text-white`,rangeBetween:`bg-brand-gold/25 text-brand-text`,rangeHovering:`bg-brand-gold/25 text-brand-text`},monthsGrid:`grid grid-cols-3 gap-2 animate-slide-in-top`,monthButton:`py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none`,monthButtonSelected:`bg-brand-gold text-white`,monthButtonUnselected:`text-brand-text`,yearsGrid:`grid grid-cols-3 gap-2 max-h-[210px] overflow-y-auto pr-2 animate-slide-in-top rmdp-scrollbar`,yearButton:`py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none`,yearButtonSelected:`bg-brand-gold text-white`,yearButtonUnselected:`text-brand-text`},d=e=>{let t={...u};if(!e)return t;for(let n in e){let r=n;r===`day`&&e.day?t.day={...u.day,...e.day}:e[r]&&(t[r]=e[r])}return t},f=({year:e,month:t,monthNames:n,minDate:i,maxDate:a,onMonthSelect:o,classNames:s})=>{let c=t=>!!(i&&e===i.getFullYear()&&t<i.getMonth()||a&&e===a.getFullYear()&&t>a.getMonth());return(0,r.jsx)(`div`,{className:s.monthsGrid,children:n.map((e,n)=>{let i=c(n);return(0,r.jsx)(`button`,{onMouseDown:e=>e.preventDefault(),onClick:()=>!i&&o(n),className:`${s.monthButton} ${n===t?s.monthButtonSelected:s.monthButtonUnselected}`,disabled:i,children:e},e)})})},p=({year:e,minDate:t,maxDate:i,adapter:a,onYearSelect:o,classNames:s})=>{let c=(0,n.useRef)(null);(0,n.useEffect)(()=>{if(c.current){let e=c.current.querySelector(`[data-selected="true"]`);e&&e.scrollIntoView({block:`center`})}},[]);let l=t?a.get(a.date(t),`year`):e-50,u=i?a.get(a.date(i),`year`):e+50,d=[];for(let e=l;e<=u;e++)d.push(e);return(0,r.jsx)(`div`,{ref:c,className:s.yearsGrid,children:d.map(t=>(0,r.jsx)(`button`,{"data-selected":t===e,onMouseDown:e=>e.preventDefault(),onClick:()=>o(t),className:`${s.yearButton} ${t===e?s.yearButtonSelected:s.yearButtonUnselected}`,children:t},t))})},m=t=>{let{classNames:a,locale:s,translations:c,adapter:u=e.r,firstDayOfWeek:m=0,header:h,footer:g,getDayProps:_,...v}=t,y=d(a),[b,x]=(0,n.useState)(`days`),[S,C]=(0,n.useState)(null),w=o(u,s,c),T=w.weekdays,E=w.months,{calendars:D,getBackProps:O,getForwardProps:k,getDateProps:A,setOffset:j}=e.t({...v,adapter:u,firstDayOfWeek:m}),M=[...T.slice(m),...T.slice(0,m)],{month:N,year:P}=D[0],F=e=>{let n=u.set(u.set(u.date(t.date||new Date),`year`,P),`month`,N),r=u.set(n,`month`,e),i=u.startOf(u.date(t.date||new Date),`month`),a=u.diff(r,i,`month`);C(null),j(a),x(`days`)},I=e=>{let n=u.set(u.set(u.date(t.date||new Date),`year`,P),`month`,N),r=u.set(n,`year`,e),i=u.startOf(u.date(t.date||new Date),`month`),a=u.diff(r,i,`month`);C(null),j(a),x(`days`)},L=e=>{let t=O(e);return{...t,onClick:e=>{C(`left`),t.onClick?.(e)}}},R=e=>{let t=k(e);return{...t,onClick:e=>{C(`right`),t.onClick?.(e)}}};return(0,r.jsxs)(`div`,{className:`rmdp ${y.root}`,children:[typeof h==`function`?h({calendars:D,getBackProps:L,getForwardProps:R,setView:x,monthNames:E,t:w,slideDirection:S,currentView:b}):h||(0,r.jsx)(l,{calendars:D,getBackProps:L,getForwardProps:R,setView:x,monthNames:E,t:w,classNames:y,slideDirection:S,currentView:b}),(0,r.jsxs)(`div`,{className:y.calendarsContainer,children:[b===`months`&&D.map(e=>(0,r.jsx)(`div`,{className:y.calendarContainer,children:(0,r.jsx)(f,{year:e.year,month:e.month,monthNames:E,minDate:t.minDate,maxDate:t.maxDate,onMonthSelect:F,classNames:y})},`months-${e.year}`)),b===`years`&&D.map(e=>(0,r.jsx)(`div`,{className:y.calendarContainer,children:(0,r.jsx)(p,{year:e.year,minDate:t.minDate,maxDate:t.maxDate,adapter:u,onYearSelect:I,classNames:y})},`years-${e.year}`)),b===`days`&&D.map(e=>(0,r.jsxs)(`div`,{className:y.calendarContainer,children:[D.length>1&&(0,r.jsxs)(`button`,{type:`button`,"aria-label":E[e.month],className:`block w-full text-center font-semibold mb-2 text-brand-text`,children:[E[e.month],` `,D[0].year===D[D.length-1].year?``:e.year]}),(0,r.jsx)(`div`,{className:y.weekdayGrid,children:M.map(e=>(0,r.jsx)(`div`,{className:y.weekday,children:e},e))}),(0,r.jsx)(`div`,{className:`${y.daysGrid} ${S===`left`?`animate-slide-in-left`:S===`right`?`animate-slide-in-right`:``}`,children:e.weeks.map((e,t)=>e.map((e,n)=>(0,r.jsx)(i,{dateObj:e,getDateProps:A,dayProps:e?_?.(e):void 0,classNames:y},`${t}-${n}`)))})]},`${e.month}-${e.year}`))]}),g&&(0,r.jsx)(`div`,{className:y.footer,children:g})]})};exports.Calendar=m,exports.CalendarHeader=l,exports.ChevronLeftIcon=s,exports.ChevronRightIcon=c,exports.Day=i,exports.DayjsAdapter=e.n,exports.MonthSelection=f,exports.YearSelection=p,exports.addMonth=t.addMonth,exports.composeEventHandlers=t.composeEventHandlers,exports.defaultAdapter=e.r,exports.defaultClassNames=u,exports.getCalendars=t.getCalendars,exports.getDefaults=a,exports.getTranslations=o,exports.isBackDisabled=t.isBackDisabled,exports.isForwardDisabled=t.isForwardDisabled,exports.mergeClassNames=d,exports.subtractMonth=t.subtractMonth,exports.useDates=e.t;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/components/Day.tsx","../src/i18n.ts","../src/components/CalendarHeader.tsx","../src/classNames.ts","../src/components/MonthSelection.tsx","../src/components/YearSelection.tsx","../src/components/Calendar.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport type { CalendarClassNames, DateObj } from '../types';\n\ninterface DayProps {\n dateObj: DateObj | null;\n getDateProps: (args: { dateObj: DateObj, [key: string]: any }) => any;\n tooltip?: React.ReactNode;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const Day: React.FC<DayProps> = ({ dateObj, getDateProps, classNames, tooltip }) => {\n const [isHovered, setIsHovered] = useState(false);\n\n if (!dateObj) {\n return <div className=\"aspect-square bg-white\" />;\n }\n\n const { date, selected, selectable, isRangeStart, isRangeEnd, isRangeBetween, isRangeHovering, isRangeActive } = dateObj;\n const dayClasses = classNames.day;\n\n let stateClasses = \"rounded-full\";\n if (isRangeStart && isRangeEnd) {\n stateClasses = `${dayClasses.selected} rounded-full`;\n } else if (isRangeStart) {\n stateClasses = `${dayClasses.rangeStart} ${isRangeActive ? 'rounded-l-full rounded-r-none' : 'rounded-full'}`;\n } else if (isRangeEnd) {\n stateClasses = `${dayClasses.rangeEnd} ${isRangeActive ? 'rounded-r-full rounded-l-none' : 'rounded-full'}`;\n } else if (isRangeBetween) {\n stateClasses = dayClasses.rangeBetween || '';\n } else if (isRangeHovering) {\n stateClasses = dayClasses.rangeHovering || '';\n } else if (selected) {\n stateClasses = dayClasses.selected || '';\n } else if (!selectable) {\n stateClasses = dayClasses.disabled || '';\n } else {\n stateClasses = dayClasses.unselected || '';\n }\n\n const className = [\n dayClasses.day,\n stateClasses,\n ...(dateObj.modifiers || []).map(m => (dayClasses as any)[m] || m)\n ].filter(Boolean).join(' ');\n\n return (\n <button\n {...getDateProps({\n dateObj,\n onMouseEnter: () => setIsHovered(true),\n onMouseLeave: () => setIsHovered(false)\n })}\n className={className}\n >\n {date.getDate()}\n {tooltip && isHovered && (\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 hidden group-hover:block z-10\">\n <div className=\"bg-gray-800 text-white text-xs py-1 px-2 rounded whitespace-nowrap shadow-lg\">\n {tooltip}\n <div className=\"absolute top-full left-1/2 -translate-x-1/2 border-8 border-transparent border-t-gray-800\" />\n </div>\n </div>\n )}\n </button>\n );\n};\n","import { DateAdapter } from \"./types\";\nimport { defaultAdapter } from \"./adapters/dayjs\";\n\nexport interface Translations {\n months: string[];\n weekdays: string[];\n back: string;\n forward: string;\n}\n\nexport function getDefaults(adapter: DateAdapter = defaultAdapter, locale?: string): Translations {\n return {\n months: adapter.getMonths(locale),\n weekdays: adapter.getWeekdays(locale),\n back: 'Previous month',\n forward: 'Next month'\n };\n}\n\nexport function getTranslations(\n adapter: DateAdapter = defaultAdapter,\n locale?: string,\n custom?: Partial<Translations>\n): Translations {\n const base = getDefaults(adapter, locale);\n return { ...base, ...custom };\n}\n","import React from 'react';\nimport { Calendar, CalendarClassNames } from '../types';\n\nexport interface HeaderProps {\n calendars: Calendar[];\n getBackProps: (args: any) => any;\n getForwardProps: (args: any) => any;\n setView: (view: 'days' | 'months' | 'years') => void;\n monthNames: string[];\n t: { back: string; forward: string };\n classNames: Required<CalendarClassNames>;\n slideDirection?: 'left' | 'right' | null;\n currentView?: 'days' | 'months' | 'years';\n}\n\nexport const ChevronLeftIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"></polyline>\n </svg>\n);\n\nexport const ChevronRightIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n);\n\nexport const CalendarHeader: React.FC<HeaderProps> = ({\n calendars,\n getBackProps,\n getForwardProps,\n setView,\n monthNames,\n t,\n classNames,\n slideDirection,\n currentView\n}) => {\n return (\n <div className={classNames.header}>\n <button\n {...getBackProps({ calendars })}\n onMouseDown={(e) => e.preventDefault()}\n className={`${classNames.navButton} ${currentView && currentView !== 'days' ? 'invisible pointer-events-none' : ''}`}\n aria-label={t.back}\n >\n <ChevronLeftIcon />\n </button>\n\n <div className={classNames.monthYearContainer}>\n {calendars.length === 1 ? (\n <div key={`${calendars[0].month}-${calendars[0].year}`} className={`${classNames.monthYearLabel} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n <button\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setView(currentView === 'months' ? 'days' : 'months')}\n className={classNames.monthYearButton}\n >\n {monthNames[calendars[0].month]}\n </button>\n <button\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setView(currentView === 'years' ? 'days' : 'years')}\n className={classNames.monthYearButton}\n >\n {calendars[0].year}\n </button>\n </div>\n ) : (\n <div className={`${classNames.monthYearLabel} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n {(() => {\n const first = calendars[0];\n const last = calendars[calendars.length - 1];\n const isFullYear = calendars.length === 12 && first.month === 0 && last.month === 11 && first.year === last.year;\n\n if (isFullYear) {\n return <span>{first.year}</span>;\n } else if (first.year === last.year) {\n return <span>{monthNames[first.month]} - {monthNames[last.month]} {first.year}</span>;\n } else {\n return <span>{monthNames[first.month]} {first.year} - {monthNames[last.month]} {last.year}</span>;\n }\n })()}\n </div>\n )}\n </div>\n\n <button\n {...getForwardProps({ calendars })}\n onMouseDown={(e) => e.preventDefault()}\n className={`${classNames.navButton} ${currentView && currentView !== 'days' ? 'invisible pointer-events-none' : ''}`}\n aria-label={t.forward}\n >\n <ChevronRightIcon />\n </button>\n </div>\n );\n};\n","export interface DayClassNames {\n day?: string;\n selected?: string;\n unselected?: string;\n disabled?: string;\n rangeStart?: string;\n rangeEnd?: string;\n rangeBetween?: string;\n rangeHovering?: string;\n [key: string]: string | undefined;\n}\n\nexport const defaultClassNames = {\n root: \"w-fit flex flex-col p-4 bg-white rounded-lg shadow-lg\",\n header: \"flex items-center justify-between border-b-2 border-brand-gray-light/40 pb-2\",\n calendarsContainer: \"flex flex-wrap gap-4 mt-3\",\n calendarContainer: \"flex-1 min-w-[280px] max-w-full\",\n weekdayGrid: \"grid grid-cols-7 gap-1 mb-1 border-b border-brand-gray-light/40\",\n weekday: \"text-center text-xs text-gray-400 py-2\",\n daysGrid: \"grid grid-cols-7 gap-px bg-brand-gray-light/20\",\n footer: \"mt-4\",\n\n navButton: \"p-2 text-brand-text hover:bg-gray-100 rounded-full transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n monthYearContainer: \"flex gap-8\",\n monthYearLabel: \"flex gap-1 items-center font-semibold text-brand-text\",\n monthYearButton: \"hover:bg-gray-100 px-2 py-1 rounded cursor-pointer\",\n\n day: {\n day: \"aspect-square flex items-center justify-center text-sm font-medium transition-all relative group cursor-pointer p-px\",\n selected: \"bg-brand-gold text-white rounded-full\",\n unselected: \"bg-white hover:bg-brand-gray-light text-brand-text\",\n disabled: \"bg-white text-gray-300 cursor-not-allowed\",\n rangeStart: \"bg-brand-gold text-white\",\n rangeEnd: \"bg-brand-gold text-white\",\n rangeBetween: \"bg-brand-gold/25 text-brand-text\",\n rangeHovering: \"bg-brand-gold/25 text-brand-text\",\n },\n\n monthsGrid: \"grid grid-cols-3 gap-2 animate-slide-in-top\",\n monthButton: \"py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n monthButtonSelected: \"bg-brand-gold text-white\",\n monthButtonUnselected: \"text-brand-text\",\n\n yearsGrid: \"grid grid-cols-3 gap-2 max-h-[300px] overflow-y-auto pr-2 animate-slide-in-top\",\n yearButton: \"py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n yearButtonSelected: \"bg-brand-gold text-white\",\n yearButtonUnselected: \"text-brand-text\",\n}\n\nexport interface CalendarClassNames {\n root?: string;\n header?: string;\n calendarsContainer?: string;\n calendarContainer?: string;\n weekdayGrid?: string;\n weekday?: string;\n daysGrid?: string;\n footer?: string;\n\n navButton?: string;\n monthYearContainer?: string;\n monthYearLabel?: string;\n monthYearButton?: string;\n\n day?: DayClassNames;\n\n monthsGrid?: string;\n monthButton?: string;\n monthButtonSelected?: string;\n monthButtonUnselected?: string;\n\n yearsGrid?: string;\n yearButton?: string;\n yearButtonSelected?: string;\n yearButtonUnselected?: string;\n}\n\nexport const mergeClassNames = (custom?: CalendarClassNames): Required<CalendarClassNames> => {\n const result = { ...defaultClassNames };\n if (!custom) return result;\n\n for (const key in custom) {\n const k = key as keyof CalendarClassNames;\n if (k === 'day' && custom.day) {\n result.day = { ...defaultClassNames.day, ...custom.day };\n } else if (custom[k]) {\n (result as any)[k] = custom[k];\n }\n }\n return result;\n};\n","import React from 'react';\nimport { CalendarClassNames } from '../types';\n\ninterface MonthSelectionProps {\n year: number;\n month: number;\n monthNames: string[];\n minDate?: Date | null;\n maxDate?: Date | null;\n onMonthSelect: (month: number) => void;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const MonthSelection: React.FC<MonthSelectionProps> = ({\n year,\n month,\n monthNames,\n minDate,\n maxDate,\n onMonthSelect,\n classNames,\n}) => {\n const isMonthDisabled = (monthIdx: number) => {\n if (minDate && year === minDate.getFullYear() && monthIdx < minDate.getMonth()) {\n return true;\n }\n if (maxDate && year === maxDate.getFullYear() && monthIdx > maxDate.getMonth()) {\n return true;\n }\n return false;\n };\n\n return (\n <div className={classNames.monthsGrid}>\n {monthNames.map((name, idx) => {\n const disabled = isMonthDisabled(idx);\n return (\n <button\n key={name}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => !disabled && onMonthSelect(idx)}\n className={`${classNames.monthButton} ${idx === month ? classNames.monthButtonSelected : classNames.monthButtonUnselected}`}\n disabled={disabled}\n >\n {name}\n </button>\n );\n })}\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { CalendarClassNames, DateAdapter } from '../types';\n\ninterface YearSelectionProps {\n year: number;\n minDate?: Date | null;\n maxDate?: Date | null;\n adapter: DateAdapter;\n onYearSelect: (year: number) => void;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const YearSelection: React.FC<YearSelectionProps> = ({\n year,\n minDate,\n maxDate,\n adapter,\n onYearSelect,\n classNames,\n}) => {\n const yearListRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (yearListRef.current) {\n const selectedYearBtn = yearListRef.current.querySelector('[data-selected=\"true\"]');\n if (selectedYearBtn) {\n selectedYearBtn.scrollIntoView({ block: 'center' });\n }\n }\n }, []);\n\n const startYear = minDate ? adapter.get(adapter.date(minDate), 'year') : year - 50;\n const endYear = maxDate ? adapter.get(adapter.date(maxDate), 'year') : year + 50;\n const years = [];\n for (let y = startYear; y <= endYear; y++) {\n years.push(y);\n }\n\n return (\n <div ref={yearListRef} className={classNames.yearsGrid}>\n {years.map((y) => (\n <button\n key={y}\n data-selected={y === year}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onYearSelect(y)}\n className={`${classNames.yearButton} ${y === year ? classNames.yearButtonSelected : classNames.yearButtonUnselected}`}\n >\n {y}\n </button>\n ))}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useDates, UseDatesProps } from '../useDates';\nimport { Day } from './Day';\nimport { defaultAdapter } from '../adapters/dayjs';\nimport { getTranslations, Translations } from '../i18n';\nimport { CalendarHeader } from './CalendarHeader';\nimport { DateObj, CalendarClassNames } from '../types';\nimport { mergeClassNames } from '../classNames';\nimport { MonthSelection } from './MonthSelection';\nimport { YearSelection } from './YearSelection';\n\ninterface CalendarProps extends UseDatesProps {\n classNames?: CalendarClassNames;\n locale?: string;\n translations?: Partial<Translations>;\n header?: React.ReactNode | ((props: any) => React.ReactNode);\n footer?: React.ReactNode;\n renderDayTooltip?: (dateObj: DateObj) => React.ReactNode;\n}\n\ntype CalendarView = 'days' | 'months' | 'years';\n\nexport const Calendar: React.FC<CalendarProps> = (props) => {\n const {\n classNames: customClassNames,\n locale,\n translations: customTranslations,\n adapter = defaultAdapter,\n firstDayOfWeek = 0,\n header,\n footer,\n renderDayTooltip,\n ...useDatesProps\n } = props;\n\n const classNames = mergeClassNames(customClassNames);\n\n const [view, setView] = useState<CalendarView>('days');\n const [slideDirection, setSlideDirection] = useState<'left' | 'right' | null>(null);\n\n const t = getTranslations(adapter, locale, customTranslations);\n const weekdayNames = t.weekdays;\n const monthNames = t.months;\n\n const {\n calendars,\n getBackProps,\n getForwardProps,\n getDateProps,\n setOffset\n } = useDates({ ...useDatesProps, adapter, firstDayOfWeek });\n\n // Adjust weekday names based on firstDayOfWeek\n const sortedWeekdays = [...weekdayNames.slice(firstDayOfWeek), ...weekdayNames.slice(0, firstDayOfWeek)];\n\n const currentCalendar = calendars[0];\n const { month, year } = currentCalendar;\n\n const handleMonthSelect = (newMonth: number) => {\n const currentMonth = adapter.set(adapter.set(adapter.date(props.date || new Date()), 'year', year), 'month', month);\n const targetMonth = adapter.set(currentMonth, 'month', newMonth);\n const baseMonth = adapter.startOf(adapter.date(props.date || new Date()), 'month');\n const newOffset = adapter.diff(targetMonth, baseMonth, 'month');\n setSlideDirection(null);\n setOffset(newOffset);\n setView('days');\n };\n\n const handleYearSelect = (newYear: number) => {\n const currentMonth = adapter.set(adapter.set(adapter.date(props.date || new Date()), 'year', year), 'month', month);\n const targetMonth = adapter.set(currentMonth, 'year', newYear);\n const baseMonth = adapter.startOf(adapter.date(props.date || new Date()), 'month');\n const newOffset = adapter.diff(targetMonth, baseMonth, 'month');\n setSlideDirection(null);\n setOffset(newOffset);\n setView('days');\n };\n\n const wrappedGetBackProps = (args: any) => {\n const props = getBackProps(args);\n return {\n ...props,\n onClick: (e: any) => {\n setSlideDirection('left');\n props.onClick?.(e);\n }\n };\n };\n\n const wrappedGetForwardProps = (args: any) => {\n const props = getForwardProps(args);\n return {\n ...props,\n onClick: (e: any) => {\n setSlideDirection('right');\n props.onClick?.(e);\n }\n };\n };\n\n const renderDefaultHeader = () => (\n <CalendarHeader\n calendars={calendars}\n getBackProps={wrappedGetBackProps}\n getForwardProps={wrappedGetForwardProps}\n setView={setView}\n monthNames={monthNames}\n t={t}\n classNames={classNames}\n slideDirection={slideDirection}\n currentView={view}\n />\n );\n\n return (\n <div className={`rmdp ${classNames.root}`}>\n {typeof header === 'function' ? header({\n calendars,\n getBackProps: wrappedGetBackProps,\n getForwardProps: wrappedGetForwardProps,\n setView,\n monthNames,\n t,\n slideDirection,\n currentView: view\n }) : (header || renderDefaultHeader())}\n\n <div className={classNames.calendarsContainer}>\n {view === 'months' && calendars.map((calendar) => (\n <div key={`months-${calendar.year}`} className={classNames.calendarContainer}>\n <MonthSelection\n year={calendar.year}\n month={calendar.month}\n monthNames={monthNames}\n minDate={props.minDate}\n maxDate={props.maxDate}\n onMonthSelect={handleMonthSelect}\n classNames={classNames}\n />\n </div>\n ))}\n {view === 'years' && calendars.map((calendar) => (\n <div key={`years-${calendar.year}`} className={classNames.calendarContainer}>\n <YearSelection\n year={calendar.year}\n minDate={props.minDate}\n maxDate={props.maxDate}\n adapter={adapter}\n onYearSelect={handleYearSelect}\n classNames={classNames}\n />\n </div>\n ))}\n {view === 'days' && calendars.map((calendar) => (\n <div key={`${calendar.month}-${calendar.year}`} className={classNames.calendarContainer}>\n {calendars.length > 1 && (\n <button\n type=\"button\"\n aria-label={monthNames[calendar.month]}\n className=\"block w-full text-center font-semibold mb-2 text-brand-text\"\n >\n {monthNames[calendar.month]} {calendars[0].year !== calendars[calendars.length - 1].year ? calendar.year : ''}\n </button>\n )}\n <div className={classNames.weekdayGrid}>\n {sortedWeekdays.map((day) => (\n <div key={day} className={classNames.weekday}>{day}</div>\n ))}\n </div>\n <div className={`${classNames.daysGrid} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n {calendar.weeks.map((week, wi) =>\n week.map((dateObj, di) => (\n <Day\n key={`${wi}-${di}`}\n dateObj={dateObj}\n getDateProps={getDateProps}\n classNames={classNames}\n tooltip={dateObj && renderDayTooltip?.(dateObj)}\n />\n ))\n )}\n </div>\n </div>\n ))}\n </div>\n {footer && <div className={classNames.footer}>{footer}</div>}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/components/Day.tsx","../src/i18n.ts","../src/components/CalendarHeader.tsx","../src/classNames.ts","../src/components/MonthSelection.tsx","../src/components/YearSelection.tsx","../src/components/Calendar.tsx"],"sourcesContent":["import React from 'react';\nimport type { CalendarClassNames, DateObj } from '../types';\n\ninterface DayProps {\n dateObj: DateObj | null;\n getDateProps: (args: { dateObj: DateObj, [key: string]: any }) => any;\n dayProps?: Record<string, any>;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const Day: React.FC<DayProps> = ({ dateObj, getDateProps, dayProps, classNames }) => {\n if (!dateObj) {\n return <div className=\"aspect-square bg-white\" />;\n }\n\n const { date, selected, selectable, isRangeStart, isRangeEnd, isRangeBetween, isRangeHovering, isRangeActive } = dateObj;\n const dayClasses = classNames.day;\n\n let stateClasses = \"rounded-full\";\n if (isRangeStart && isRangeEnd) {\n stateClasses = `${dayClasses.selected} rounded-full`;\n } else if (isRangeStart) {\n stateClasses = `${dayClasses.rangeStart} ${isRangeActive ? 'rounded-l-full rounded-r-none' : 'rounded-full'}`;\n } else if (isRangeEnd) {\n stateClasses = `${dayClasses.rangeEnd} ${isRangeActive ? 'rounded-r-full rounded-l-none' : 'rounded-full'}`;\n } else if (isRangeBetween) {\n stateClasses = dayClasses.rangeBetween || '';\n } else if (isRangeHovering) {\n stateClasses = dayClasses.rangeHovering || '';\n } else if (selected) {\n stateClasses = dayClasses.selected || '';\n } else if (!selectable) {\n stateClasses = dayClasses.disabled || '';\n } else {\n stateClasses = dayClasses.unselected || '';\n }\n\n const className = [\n dayClasses.day,\n stateClasses,\n ...(dateObj.modifiers || []).map(m => (dayClasses as any)[m] || m)\n ].filter(Boolean).join(' ');\n\n return (\n <button\n {...getDateProps({ dateObj, ...dayProps })}\n className={className}\n >\n {date.getDate()}\n </button>\n );\n};\n","import { DateAdapter } from \"./types\";\nimport { defaultAdapter } from \"./adapters/dayjs\";\n\nexport interface Translations {\n months: string[];\n weekdays: string[];\n back: string;\n forward: string;\n}\n\nexport function getDefaults(adapter: DateAdapter = defaultAdapter, locale?: string): Translations {\n return {\n months: adapter.getMonths(locale),\n weekdays: adapter.getWeekdays(locale),\n back: 'Previous month',\n forward: 'Next month'\n };\n}\n\nexport function getTranslations(\n adapter: DateAdapter = defaultAdapter,\n locale?: string,\n custom?: Partial<Translations>\n): Translations {\n const base = getDefaults(adapter, locale);\n return { ...base, ...custom };\n}\n","import React from 'react';\nimport { Calendar, CalendarClassNames } from '../types';\n\nexport interface HeaderProps {\n calendars: Calendar[];\n getBackProps: (args: any) => any;\n getForwardProps: (args: any) => any;\n setView: (view: 'days' | 'months' | 'years') => void;\n monthNames: string[];\n t: { back: string; forward: string };\n classNames: Required<CalendarClassNames>;\n slideDirection?: 'left' | 'right' | null;\n currentView?: 'days' | 'months' | 'years';\n}\n\nexport const ChevronLeftIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"></polyline>\n </svg>\n);\n\nexport const ChevronRightIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n);\n\nexport const CalendarHeader: React.FC<HeaderProps> = ({\n calendars,\n getBackProps,\n getForwardProps,\n setView,\n monthNames,\n t,\n classNames,\n slideDirection,\n currentView\n}) => {\n return (\n <div className={classNames.header}>\n <button\n {...getBackProps({ calendars })}\n onMouseDown={(e) => e.preventDefault()}\n className={`${classNames.navButton} ${currentView && currentView !== 'days' ? 'invisible pointer-events-none' : ''}`}\n aria-label={t.back}\n >\n <ChevronLeftIcon />\n </button>\n\n <div className={classNames.monthYearContainer}>\n {calendars.length === 1 ? (\n <div key={`${calendars[0].month}-${calendars[0].year}`} className={`${classNames.monthYearLabel} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n <button\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setView(currentView === 'months' ? 'days' : 'months')}\n className={classNames.monthYearButton}\n >\n {monthNames[calendars[0].month]}\n </button>\n <button\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setView(currentView === 'years' ? 'days' : 'years')}\n className={classNames.monthYearButton}\n >\n {calendars[0].year}\n </button>\n </div>\n ) : (\n <div className={`${classNames.monthYearLabel} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n {(() => {\n const first = calendars[0];\n const last = calendars[calendars.length - 1];\n const isFullYear = calendars.length === 12 && first.month === 0 && last.month === 11 && first.year === last.year;\n\n if (isFullYear) {\n return <span>{first.year}</span>;\n } else if (first.year === last.year) {\n return <span>{monthNames[first.month]} - {monthNames[last.month]} {first.year}</span>;\n } else {\n return <span>{monthNames[first.month]} {first.year} - {monthNames[last.month]} {last.year}</span>;\n }\n })()}\n </div>\n )}\n </div>\n\n <button\n {...getForwardProps({ calendars })}\n onMouseDown={(e) => e.preventDefault()}\n className={`${classNames.navButton} ${currentView && currentView !== 'days' ? 'invisible pointer-events-none' : ''}`}\n aria-label={t.forward}\n >\n <ChevronRightIcon />\n </button>\n </div>\n );\n};\n","export interface DayClassNames {\n day?: string;\n selected?: string;\n unselected?: string;\n disabled?: string;\n rangeStart?: string;\n rangeEnd?: string;\n rangeBetween?: string;\n rangeHovering?: string;\n [key: string]: string | undefined;\n}\n\nexport const defaultClassNames = {\n root: \"w-fit flex flex-col p-4 bg-white rounded-lg shadow-lg\",\n header: \"flex items-center justify-between border-b-2 border-brand-gray-light/40 pb-2\",\n calendarsContainer: \"flex flex-wrap gap-4\",\n calendarContainer: \"flex-1 min-w-[280px] max-w-full\",\n weekdayGrid: \"grid grid-cols-7 gap-1 mb-1 border-b border-brand-gray-light/40\",\n weekday: \"text-center text-xs text-gray-400 py-2\",\n daysGrid: \"grid grid-cols-7 gap-px bg-brand-gray-light/20\",\n footer: \"mt-4\",\n\n navButton: \"p-2 text-brand-text hover:bg-gray-100 rounded-full transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n monthYearContainer: \"flex gap-8\",\n monthYearLabel: \"flex gap-1 items-center font-semibold text-brand-text\",\n monthYearButton: \"hover:bg-gray-100 px-2 py-1 rounded cursor-pointer\",\n\n day: {\n day: \"aspect-square flex items-center justify-center text-sm font-medium transition-all relative group cursor-pointer p-px\",\n selected: \"bg-brand-gold text-white rounded-full\",\n unselected: \"bg-white hover:bg-brand-gray-light text-brand-text\",\n disabled: \"bg-white text-gray-300 cursor-not-allowed\",\n rangeStart: \"bg-brand-gold text-white\",\n rangeEnd: \"bg-brand-gold text-white\",\n rangeBetween: \"bg-brand-gold/25 text-brand-text\",\n rangeHovering: \"bg-brand-gold/25 text-brand-text\",\n },\n\n monthsGrid: \"grid grid-cols-3 gap-2 animate-slide-in-top\",\n monthButton: \"py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n monthButtonSelected: \"bg-brand-gold text-white\",\n monthButtonUnselected: \"text-brand-text\",\n\n yearsGrid: \"grid grid-cols-3 gap-2 max-h-[210px] overflow-y-auto pr-2 animate-slide-in-top rmdp-scrollbar\",\n yearButton: \"py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n yearButtonSelected: \"bg-brand-gold text-white\",\n yearButtonUnselected: \"text-brand-text\",\n}\n\nexport interface CalendarClassNames {\n root?: string;\n header?: string;\n calendarsContainer?: string;\n calendarContainer?: string;\n weekdayGrid?: string;\n weekday?: string;\n daysGrid?: string;\n footer?: string;\n\n navButton?: string;\n monthYearContainer?: string;\n monthYearLabel?: string;\n monthYearButton?: string;\n\n day?: DayClassNames;\n\n monthsGrid?: string;\n monthButton?: string;\n monthButtonSelected?: string;\n monthButtonUnselected?: string;\n\n yearsGrid?: string;\n yearButton?: string;\n yearButtonSelected?: string;\n yearButtonUnselected?: string;\n}\n\nexport const mergeClassNames = (custom?: CalendarClassNames): Required<CalendarClassNames> => {\n const result = { ...defaultClassNames };\n if (!custom) return result;\n\n for (const key in custom) {\n const k = key as keyof CalendarClassNames;\n if (k === 'day' && custom.day) {\n result.day = { ...defaultClassNames.day, ...custom.day };\n } else if (custom[k]) {\n (result as any)[k] = custom[k];\n }\n }\n return result;\n};\n","import React from 'react';\nimport { CalendarClassNames } from '../types';\n\ninterface MonthSelectionProps {\n year: number;\n month: number;\n monthNames: string[];\n minDate?: Date | null;\n maxDate?: Date | null;\n onMonthSelect: (month: number) => void;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const MonthSelection: React.FC<MonthSelectionProps> = ({\n year,\n month,\n monthNames,\n minDate,\n maxDate,\n onMonthSelect,\n classNames,\n}) => {\n const isMonthDisabled = (monthIdx: number) => {\n if (minDate && year === minDate.getFullYear() && monthIdx < minDate.getMonth()) {\n return true;\n }\n if (maxDate && year === maxDate.getFullYear() && monthIdx > maxDate.getMonth()) {\n return true;\n }\n return false;\n };\n\n return (\n <div className={classNames.monthsGrid}>\n {monthNames.map((name, idx) => {\n const disabled = isMonthDisabled(idx);\n return (\n <button\n key={name}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => !disabled && onMonthSelect(idx)}\n className={`${classNames.monthButton} ${idx === month ? classNames.monthButtonSelected : classNames.monthButtonUnselected}`}\n disabled={disabled}\n >\n {name}\n </button>\n );\n })}\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { CalendarClassNames, DateAdapter } from '../types';\n\ninterface YearSelectionProps {\n year: number;\n minDate?: Date | null;\n maxDate?: Date | null;\n adapter: DateAdapter;\n onYearSelect: (year: number) => void;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const YearSelection: React.FC<YearSelectionProps> = ({\n year,\n minDate,\n maxDate,\n adapter,\n onYearSelect,\n classNames,\n}) => {\n const yearListRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (yearListRef.current) {\n const selectedYearBtn = yearListRef.current.querySelector('[data-selected=\"true\"]');\n if (selectedYearBtn) {\n selectedYearBtn.scrollIntoView({ block: 'center' });\n }\n }\n }, []);\n\n const startYear = minDate ? adapter.get(adapter.date(minDate), 'year') : year - 50;\n const endYear = maxDate ? adapter.get(adapter.date(maxDate), 'year') : year + 50;\n const years = [];\n for (let y = startYear; y <= endYear; y++) {\n years.push(y);\n }\n\n return (\n <div ref={yearListRef} className={classNames.yearsGrid}>\n {years.map((y) => (\n <button\n key={y}\n data-selected={y === year}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onYearSelect(y)}\n className={`${classNames.yearButton} ${y === year ? classNames.yearButtonSelected : classNames.yearButtonUnselected}`}\n >\n {y}\n </button>\n ))}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useDates, UseDatesProps } from '../useDates';\nimport { Day } from './Day';\nimport { defaultAdapter } from '../adapters/dayjs';\nimport { getTranslations, Translations } from '../i18n';\nimport { CalendarHeader } from './CalendarHeader';\nimport { DateObj, CalendarClassNames } from '../types';\nimport { mergeClassNames } from '../classNames';\nimport { MonthSelection } from './MonthSelection';\nimport { YearSelection } from './YearSelection';\n\ninterface CalendarProps extends UseDatesProps {\n classNames?: CalendarClassNames;\n locale?: string;\n translations?: Partial<Translations>;\n header?: React.ReactNode | ((props: any) => React.ReactNode);\n footer?: React.ReactNode;\n getDayProps?: (dateObj: DateObj) => Record<string, any>;\n}\n\ntype CalendarView = 'days' | 'months' | 'years';\n\nexport const Calendar: React.FC<CalendarProps> = (props) => {\n const {\n classNames: customClassNames,\n locale,\n translations: customTranslations,\n adapter = defaultAdapter,\n firstDayOfWeek = 0,\n header,\n footer,\n getDayProps,\n ...useDatesProps\n } = props;\n\n const classNames = mergeClassNames(customClassNames);\n\n const [view, setView] = useState<CalendarView>('days');\n const [slideDirection, setSlideDirection] = useState<'left' | 'right' | null>(null);\n\n const t = getTranslations(adapter, locale, customTranslations);\n const weekdayNames = t.weekdays;\n const monthNames = t.months;\n\n const {\n calendars,\n getBackProps,\n getForwardProps,\n getDateProps,\n setOffset\n } = useDates({ ...useDatesProps, adapter, firstDayOfWeek });\n\n // Adjust weekday names based on firstDayOfWeek\n const sortedWeekdays = [...weekdayNames.slice(firstDayOfWeek), ...weekdayNames.slice(0, firstDayOfWeek)];\n\n const currentCalendar = calendars[0];\n const { month, year } = currentCalendar;\n\n const handleMonthSelect = (newMonth: number) => {\n const currentMonth = adapter.set(adapter.set(adapter.date(props.date || new Date()), 'year', year), 'month', month);\n const targetMonth = adapter.set(currentMonth, 'month', newMonth);\n const baseMonth = adapter.startOf(adapter.date(props.date || new Date()), 'month');\n const newOffset = adapter.diff(targetMonth, baseMonth, 'month');\n setSlideDirection(null);\n setOffset(newOffset);\n setView('days');\n };\n\n const handleYearSelect = (newYear: number) => {\n const currentMonth = adapter.set(adapter.set(adapter.date(props.date || new Date()), 'year', year), 'month', month);\n const targetMonth = adapter.set(currentMonth, 'year', newYear);\n const baseMonth = adapter.startOf(adapter.date(props.date || new Date()), 'month');\n const newOffset = adapter.diff(targetMonth, baseMonth, 'month');\n setSlideDirection(null);\n setOffset(newOffset);\n setView('days');\n };\n\n const wrappedGetBackProps = (args: any) => {\n const props = getBackProps(args);\n return {\n ...props,\n onClick: (e: any) => {\n setSlideDirection('left');\n props.onClick?.(e);\n }\n };\n };\n\n const wrappedGetForwardProps = (args: any) => {\n const props = getForwardProps(args);\n return {\n ...props,\n onClick: (e: any) => {\n setSlideDirection('right');\n props.onClick?.(e);\n }\n };\n };\n\n const renderDefaultHeader = () => (\n <CalendarHeader\n calendars={calendars}\n getBackProps={wrappedGetBackProps}\n getForwardProps={wrappedGetForwardProps}\n setView={setView}\n monthNames={monthNames}\n t={t}\n classNames={classNames}\n slideDirection={slideDirection}\n currentView={view}\n />\n );\n\n return (\n <div className={`rmdp ${classNames.root}`}>\n {typeof header === 'function' ? header({\n calendars,\n getBackProps: wrappedGetBackProps,\n getForwardProps: wrappedGetForwardProps,\n setView,\n monthNames,\n t,\n slideDirection,\n currentView: view\n }) : (header || renderDefaultHeader())}\n\n <div className={classNames.calendarsContainer}>\n {view === 'months' && calendars.map((calendar) => (\n <div key={`months-${calendar.year}`} className={classNames.calendarContainer}>\n <MonthSelection\n year={calendar.year}\n month={calendar.month}\n monthNames={monthNames}\n minDate={props.minDate}\n maxDate={props.maxDate}\n onMonthSelect={handleMonthSelect}\n classNames={classNames}\n />\n </div>\n ))}\n {view === 'years' && calendars.map((calendar) => (\n <div key={`years-${calendar.year}`} className={classNames.calendarContainer}>\n <YearSelection\n year={calendar.year}\n minDate={props.minDate}\n maxDate={props.maxDate}\n adapter={adapter}\n onYearSelect={handleYearSelect}\n classNames={classNames}\n />\n </div>\n ))}\n {view === 'days' && calendars.map((calendar) => (\n <div key={`${calendar.month}-${calendar.year}`} className={classNames.calendarContainer}>\n {calendars.length > 1 && (\n <button\n type=\"button\"\n aria-label={monthNames[calendar.month]}\n className=\"block w-full text-center font-semibold mb-2 text-brand-text\"\n >\n {monthNames[calendar.month]} {calendars[0].year !== calendars[calendars.length - 1].year ? calendar.year : ''}\n </button>\n )}\n <div className={classNames.weekdayGrid}>\n {sortedWeekdays.map((day) => (\n <div key={day} className={classNames.weekday}>{day}</div>\n ))}\n </div>\n <div className={`${classNames.daysGrid} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n {calendar.weeks.map((week, wi) =>\n week.map((dateObj, di) => (\n <Day\n key={`${wi}-${di}`}\n dateObj={dateObj}\n getDateProps={getDateProps}\n dayProps={dateObj ? getDayProps?.(dateObj) : undefined}\n classNames={classNames}\n />\n ))\n )}\n </div>\n </div>\n ))}\n </div>\n {footer && <div className={classNames.footer}>{footer}</div>}\n </div>\n );\n};\n"],"mappings":"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"}
package/dist/index.css CHANGED
@@ -6,7 +6,6 @@
6
6
  --color-gray-100: oklch(96.7% 0.003 264.542);
7
7
  --color-gray-300: oklch(87.2% 0.01 258.338);
8
8
  --color-gray-400: oklch(70.7% 0.022 261.325);
9
- --color-gray-800: oklch(27.8% 0.033 256.848);
10
9
  --color-white: #fff;
11
10
  --spacing: 0.25rem;
12
11
  --text-xs: 0.75rem;
@@ -20,6 +19,7 @@
20
19
  --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
21
20
  --color-brand-gold: #c5a059;
22
21
  --color-brand-gray-light: #b5bec6;
22
+ --color-brand-gray-dark: #4a5660;
23
23
  --color-brand-text: #343a40;
24
24
  }
25
25
  }
@@ -30,27 +30,9 @@
30
30
  .invisible {
31
31
  visibility: hidden;
32
32
  }
33
- .absolute {
34
- position: absolute;
35
- }
36
33
  .relative {
37
34
  position: relative;
38
35
  }
39
- .top-full {
40
- top: 100%;
41
- }
42
- .bottom-full {
43
- bottom: 100%;
44
- }
45
- .left-1\/2 {
46
- left: calc(1 / 2 * 100%);
47
- }
48
- .z-10 {
49
- z-index: 10;
50
- }
51
- .mt-3 {
52
- margin-top: calc(var(--spacing) * 3);
53
- }
54
36
  .mt-4 {
55
37
  margin-top: calc(var(--spacing) * 4);
56
38
  }
@@ -69,14 +51,11 @@
69
51
  .grid {
70
52
  display: grid;
71
53
  }
72
- .hidden {
73
- display: none;
74
- }
75
54
  .aspect-square {
76
55
  aspect-ratio: 1 / 1;
77
56
  }
78
- .max-h-\[300px\] {
79
- max-height: 300px;
57
+ .max-h-\[210px\] {
58
+ max-height: 210px;
80
59
  }
81
60
  .w-fit {
82
61
  width: fit-content;
@@ -93,10 +72,6 @@
93
72
  .flex-1 {
94
73
  flex: 1;
95
74
  }
96
- .-translate-x-1\/2 {
97
- --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
98
- translate: var(--tw-translate-x) var(--tw-translate-y);
99
- }
100
75
  .cursor-not-allowed {
101
76
  cursor: not-allowed;
102
77
  }
@@ -171,10 +146,6 @@
171
146
  border-style: var(--tw-border-style);
172
147
  border-width: 1px;
173
148
  }
174
- .border-8 {
175
- border-style: var(--tw-border-style);
176
- border-width: 8px;
177
- }
178
149
  .border-b {
179
150
  border-bottom-style: var(--tw-border-style);
180
151
  border-bottom-width: 1px;
@@ -192,12 +163,6 @@
192
163
  border-color: color-mix(in oklab, var(--color-brand-gray-light) 40%, transparent);
193
164
  }
194
165
  }
195
- .border-transparent {
196
- border-color: transparent;
197
- }
198
- .border-t-gray-800 {
199
- border-top-color: var(--color-gray-800);
200
- }
201
166
  .bg-brand-gold {
202
167
  background-color: var(--color-brand-gold);
203
168
  }
@@ -213,9 +178,6 @@
213
178
  background-color: color-mix(in oklab, var(--color-brand-gray-light) 20%, transparent);
214
179
  }
215
180
  }
216
- .bg-gray-800 {
217
- background-color: var(--color-gray-800);
218
- }
219
181
  .bg-white {
220
182
  background-color: var(--color-white);
221
183
  }
@@ -265,9 +227,6 @@
265
227
  --tw-font-weight: var(--font-weight-semibold);
266
228
  font-weight: var(--font-weight-semibold);
267
229
  }
268
- .whitespace-nowrap {
269
- white-space: nowrap;
270
- }
271
230
  .text-brand-gold {
272
231
  color: var(--color-brand-gold);
273
232
  }
@@ -301,9 +260,6 @@
301
260
  transition-duration: var(--tw-duration, var(--default-transition-duration));
302
261
  }
303
262
  @media (hover: hover) {
304
- .group-hover\:block:is(:where(.group):hover *) {
305
- display: block;
306
- }
307
263
  .hover\:bg-brand-gray-light:hover {
308
264
  background-color: var(--color-brand-gray-light);
309
265
  }
@@ -383,20 +339,22 @@
383
339
  .rmdp .animate-slide-in-left {
384
340
  animation: slideInLeft 0.2s ease-out forwards;
385
341
  }
386
- @property --tw-translate-x {
387
- syntax: "*";
388
- inherits: false;
389
- initial-value: 0;
342
+ .rmdp .rmdp-scrollbar {
343
+ scrollbar-width: thin;
344
+ scrollbar-color: var(--color-brand-gray-light) transparent;
390
345
  }
391
- @property --tw-translate-y {
392
- syntax: "*";
393
- inherits: false;
394
- initial-value: 0;
346
+ .rmdp .rmdp-scrollbar::-webkit-scrollbar {
347
+ width: 6px;
395
348
  }
396
- @property --tw-translate-z {
397
- syntax: "*";
398
- inherits: false;
399
- initial-value: 0;
349
+ .rmdp .rmdp-scrollbar::-webkit-scrollbar-track {
350
+ background: transparent;
351
+ }
352
+ .rmdp .rmdp-scrollbar::-webkit-scrollbar-thumb {
353
+ background-color: var(--color-brand-gray-light);
354
+ border-radius: 9999px;
355
+ }
356
+ .rmdp .rmdp-scrollbar::-webkit-scrollbar-thumb:hover {
357
+ background-color: var(--color-brand-gray-dark);
400
358
  }
401
359
  @property --tw-border-style {
402
360
  syntax: "*";
@@ -475,9 +433,6 @@
475
433
  @layer properties {
476
434
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
477
435
  *, ::before, ::after, ::backdrop {
478
- --tw-translate-x: 0;
479
- --tw-translate-y: 0;
480
- --tw-translate-z: 0;
481
436
  --tw-border-style: solid;
482
437
  --tw-font-weight: initial;
483
438
  --tw-shadow: 0 0 #0000;
package/dist/index.js CHANGED
@@ -3,30 +3,22 @@ import { addMonth as r, composeEventHandlers as i, getCalendars as a, isBackDisa
3
3
  import { useEffect as l, useRef as u, useState as d } from "react";
4
4
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
5
5
  //#region src/components/Day.tsx
6
- var m = ({ dateObj: e, getDateProps: t, classNames: n, tooltip: r }) => {
7
- let [i, a] = d(!1);
6
+ var m = ({ dateObj: e, getDateProps: t, dayProps: n, classNames: r }) => {
8
7
  if (!e) return /* @__PURE__ */ f("div", { className: "aspect-square bg-white" });
9
- let { date: o, selected: s, selectable: c, isRangeStart: l, isRangeEnd: u, isRangeBetween: m, isRangeHovering: h, isRangeActive: g } = e, _ = n.day, v = "rounded-full";
10
- v = l && u ? `${_.selected} rounded-full` : l ? `${_.rangeStart} ${g ? "rounded-l-full rounded-r-none" : "rounded-full"}` : u ? `${_.rangeEnd} ${g ? "rounded-r-full rounded-l-none" : "rounded-full"}` : m ? _.rangeBetween || "" : h ? _.rangeHovering || "" : s ? _.selected || "" : c ? _.unselected || "" : _.disabled || "";
11
- let y = [
12
- _.day,
13
- v,
14
- ...(e.modifiers || []).map((e) => _[e] || e)
8
+ let { date: i, selected: a, selectable: o, isRangeStart: s, isRangeEnd: c, isRangeBetween: l, isRangeHovering: u, isRangeActive: d } = e, p = r.day, m = "rounded-full";
9
+ m = s && c ? `${p.selected} rounded-full` : s ? `${p.rangeStart} ${d ? "rounded-l-full rounded-r-none" : "rounded-full"}` : c ? `${p.rangeEnd} ${d ? "rounded-r-full rounded-l-none" : "rounded-full"}` : l ? p.rangeBetween || "" : u ? p.rangeHovering || "" : a ? p.selected || "" : o ? p.unselected || "" : p.disabled || "";
10
+ let h = [
11
+ p.day,
12
+ m,
13
+ ...(e.modifiers || []).map((e) => p[e] || e)
15
14
  ].filter(Boolean).join(" ");
16
- return /* @__PURE__ */ p("button", {
15
+ return /* @__PURE__ */ f("button", {
17
16
  ...t({
18
17
  dateObj: e,
19
- onMouseEnter: () => a(!0),
20
- onMouseLeave: () => a(!1)
18
+ ...n
21
19
  }),
22
- className: y,
23
- children: [o.getDate(), r && i && /* @__PURE__ */ f("div", {
24
- className: "absolute bottom-full left-1/2 -translate-x-1/2 mb-2 hidden group-hover:block z-10",
25
- children: /* @__PURE__ */ p("div", {
26
- className: "bg-gray-800 text-white text-xs py-1 px-2 rounded whitespace-nowrap shadow-lg",
27
- children: [r, /* @__PURE__ */ f("div", { className: "absolute top-full left-1/2 -translate-x-1/2 border-8 border-transparent border-t-gray-800" })]
28
- })
29
- })]
20
+ className: h,
21
+ children: i.getDate()
30
22
  });
31
23
  };
32
24
  //#endregion
@@ -125,7 +117,7 @@ var _ = () => /* @__PURE__ */ f("svg", {
125
117
  }), b = {
126
118
  root: "w-fit flex flex-col p-4 bg-white rounded-lg shadow-lg",
127
119
  header: "flex items-center justify-between border-b-2 border-brand-gray-light/40 pb-2",
128
- calendarsContainer: "flex flex-wrap gap-4 mt-3",
120
+ calendarsContainer: "flex flex-wrap gap-4",
129
121
  calendarContainer: "flex-1 min-w-[280px] max-w-full",
130
122
  weekdayGrid: "grid grid-cols-7 gap-1 mb-1 border-b border-brand-gray-light/40",
131
123
  weekday: "text-center text-xs text-gray-400 py-2",
@@ -149,7 +141,7 @@ var _ = () => /* @__PURE__ */ f("svg", {
149
141
  monthButton: "py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none",
150
142
  monthButtonSelected: "bg-brand-gold text-white",
151
143
  monthButtonUnselected: "text-brand-text",
152
- yearsGrid: "grid grid-cols-3 gap-2 max-h-[300px] overflow-y-auto pr-2 animate-slide-in-top",
144
+ yearsGrid: "grid grid-cols-3 gap-2 max-h-[210px] overflow-y-auto pr-2 animate-slide-in-top rmdp-scrollbar",
153
145
  yearButton: "py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none",
154
146
  yearButtonSelected: "bg-brand-gold text-white",
155
147
  yearButtonUnselected: "text-brand-text"
@@ -201,7 +193,7 @@ var _ = () => /* @__PURE__ */ f("svg", {
201
193
  }, t))
202
194
  });
203
195
  }, w = (e) => {
204
- let { classNames: r, locale: i, translations: a, adapter: o = t, firstDayOfWeek: s = 0, header: c, footer: l, renderDayTooltip: u, ...h } = e, _ = x(r), [v, b] = d("days"), [w, T] = d(null), E = g(o, i, a), D = E.weekdays, O = E.months, { calendars: k, getBackProps: A, getForwardProps: j, getDateProps: M, setOffset: N } = n({
196
+ let { classNames: r, locale: i, translations: a, adapter: o = t, firstDayOfWeek: s = 0, header: c, footer: l, getDayProps: u, ...h } = e, _ = x(r), [v, b] = d("days"), [w, T] = d(null), E = g(o, i, a), D = E.weekdays, O = E.months, { calendars: k, getBackProps: A, getForwardProps: j, getDateProps: M, setOffset: N } = n({
205
197
  ...h,
206
198
  adapter: o,
207
199
  firstDayOfWeek: s
@@ -302,8 +294,8 @@ var _ = () => /* @__PURE__ */ f("svg", {
302
294
  children: e.weeks.map((e, t) => e.map((e, n) => /* @__PURE__ */ f(m, {
303
295
  dateObj: e,
304
296
  getDateProps: M,
305
- classNames: _,
306
- tooltip: e && u?.(e)
297
+ dayProps: e ? u?.(e) : void 0,
298
+ classNames: _
307
299
  }, `${t}-${n}`)))
308
300
  })
309
301
  ]
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/components/Day.tsx","../src/i18n.ts","../src/components/CalendarHeader.tsx","../src/classNames.ts","../src/components/MonthSelection.tsx","../src/components/YearSelection.tsx","../src/components/Calendar.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport type { CalendarClassNames, DateObj } from '../types';\n\ninterface DayProps {\n dateObj: DateObj | null;\n getDateProps: (args: { dateObj: DateObj, [key: string]: any }) => any;\n tooltip?: React.ReactNode;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const Day: React.FC<DayProps> = ({ dateObj, getDateProps, classNames, tooltip }) => {\n const [isHovered, setIsHovered] = useState(false);\n\n if (!dateObj) {\n return <div className=\"aspect-square bg-white\" />;\n }\n\n const { date, selected, selectable, isRangeStart, isRangeEnd, isRangeBetween, isRangeHovering, isRangeActive } = dateObj;\n const dayClasses = classNames.day;\n\n let stateClasses = \"rounded-full\";\n if (isRangeStart && isRangeEnd) {\n stateClasses = `${dayClasses.selected} rounded-full`;\n } else if (isRangeStart) {\n stateClasses = `${dayClasses.rangeStart} ${isRangeActive ? 'rounded-l-full rounded-r-none' : 'rounded-full'}`;\n } else if (isRangeEnd) {\n stateClasses = `${dayClasses.rangeEnd} ${isRangeActive ? 'rounded-r-full rounded-l-none' : 'rounded-full'}`;\n } else if (isRangeBetween) {\n stateClasses = dayClasses.rangeBetween || '';\n } else if (isRangeHovering) {\n stateClasses = dayClasses.rangeHovering || '';\n } else if (selected) {\n stateClasses = dayClasses.selected || '';\n } else if (!selectable) {\n stateClasses = dayClasses.disabled || '';\n } else {\n stateClasses = dayClasses.unselected || '';\n }\n\n const className = [\n dayClasses.day,\n stateClasses,\n ...(dateObj.modifiers || []).map(m => (dayClasses as any)[m] || m)\n ].filter(Boolean).join(' ');\n\n return (\n <button\n {...getDateProps({\n dateObj,\n onMouseEnter: () => setIsHovered(true),\n onMouseLeave: () => setIsHovered(false)\n })}\n className={className}\n >\n {date.getDate()}\n {tooltip && isHovered && (\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 hidden group-hover:block z-10\">\n <div className=\"bg-gray-800 text-white text-xs py-1 px-2 rounded whitespace-nowrap shadow-lg\">\n {tooltip}\n <div className=\"absolute top-full left-1/2 -translate-x-1/2 border-8 border-transparent border-t-gray-800\" />\n </div>\n </div>\n )}\n </button>\n );\n};\n","import { DateAdapter } from \"./types\";\nimport { defaultAdapter } from \"./adapters/dayjs\";\n\nexport interface Translations {\n months: string[];\n weekdays: string[];\n back: string;\n forward: string;\n}\n\nexport function getDefaults(adapter: DateAdapter = defaultAdapter, locale?: string): Translations {\n return {\n months: adapter.getMonths(locale),\n weekdays: adapter.getWeekdays(locale),\n back: 'Previous month',\n forward: 'Next month'\n };\n}\n\nexport function getTranslations(\n adapter: DateAdapter = defaultAdapter,\n locale?: string,\n custom?: Partial<Translations>\n): Translations {\n const base = getDefaults(adapter, locale);\n return { ...base, ...custom };\n}\n","import React from 'react';\nimport { Calendar, CalendarClassNames } from '../types';\n\nexport interface HeaderProps {\n calendars: Calendar[];\n getBackProps: (args: any) => any;\n getForwardProps: (args: any) => any;\n setView: (view: 'days' | 'months' | 'years') => void;\n monthNames: string[];\n t: { back: string; forward: string };\n classNames: Required<CalendarClassNames>;\n slideDirection?: 'left' | 'right' | null;\n currentView?: 'days' | 'months' | 'years';\n}\n\nexport const ChevronLeftIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"></polyline>\n </svg>\n);\n\nexport const ChevronRightIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n);\n\nexport const CalendarHeader: React.FC<HeaderProps> = ({\n calendars,\n getBackProps,\n getForwardProps,\n setView,\n monthNames,\n t,\n classNames,\n slideDirection,\n currentView\n}) => {\n return (\n <div className={classNames.header}>\n <button\n {...getBackProps({ calendars })}\n onMouseDown={(e) => e.preventDefault()}\n className={`${classNames.navButton} ${currentView && currentView !== 'days' ? 'invisible pointer-events-none' : ''}`}\n aria-label={t.back}\n >\n <ChevronLeftIcon />\n </button>\n\n <div className={classNames.monthYearContainer}>\n {calendars.length === 1 ? (\n <div key={`${calendars[0].month}-${calendars[0].year}`} className={`${classNames.monthYearLabel} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n <button\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setView(currentView === 'months' ? 'days' : 'months')}\n className={classNames.monthYearButton}\n >\n {monthNames[calendars[0].month]}\n </button>\n <button\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setView(currentView === 'years' ? 'days' : 'years')}\n className={classNames.monthYearButton}\n >\n {calendars[0].year}\n </button>\n </div>\n ) : (\n <div className={`${classNames.monthYearLabel} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n {(() => {\n const first = calendars[0];\n const last = calendars[calendars.length - 1];\n const isFullYear = calendars.length === 12 && first.month === 0 && last.month === 11 && first.year === last.year;\n\n if (isFullYear) {\n return <span>{first.year}</span>;\n } else if (first.year === last.year) {\n return <span>{monthNames[first.month]} - {monthNames[last.month]} {first.year}</span>;\n } else {\n return <span>{monthNames[first.month]} {first.year} - {monthNames[last.month]} {last.year}</span>;\n }\n })()}\n </div>\n )}\n </div>\n\n <button\n {...getForwardProps({ calendars })}\n onMouseDown={(e) => e.preventDefault()}\n className={`${classNames.navButton} ${currentView && currentView !== 'days' ? 'invisible pointer-events-none' : ''}`}\n aria-label={t.forward}\n >\n <ChevronRightIcon />\n </button>\n </div>\n );\n};\n","export interface DayClassNames {\n day?: string;\n selected?: string;\n unselected?: string;\n disabled?: string;\n rangeStart?: string;\n rangeEnd?: string;\n rangeBetween?: string;\n rangeHovering?: string;\n [key: string]: string | undefined;\n}\n\nexport const defaultClassNames = {\n root: \"w-fit flex flex-col p-4 bg-white rounded-lg shadow-lg\",\n header: \"flex items-center justify-between border-b-2 border-brand-gray-light/40 pb-2\",\n calendarsContainer: \"flex flex-wrap gap-4 mt-3\",\n calendarContainer: \"flex-1 min-w-[280px] max-w-full\",\n weekdayGrid: \"grid grid-cols-7 gap-1 mb-1 border-b border-brand-gray-light/40\",\n weekday: \"text-center text-xs text-gray-400 py-2\",\n daysGrid: \"grid grid-cols-7 gap-px bg-brand-gray-light/20\",\n footer: \"mt-4\",\n\n navButton: \"p-2 text-brand-text hover:bg-gray-100 rounded-full transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n monthYearContainer: \"flex gap-8\",\n monthYearLabel: \"flex gap-1 items-center font-semibold text-brand-text\",\n monthYearButton: \"hover:bg-gray-100 px-2 py-1 rounded cursor-pointer\",\n\n day: {\n day: \"aspect-square flex items-center justify-center text-sm font-medium transition-all relative group cursor-pointer p-px\",\n selected: \"bg-brand-gold text-white rounded-full\",\n unselected: \"bg-white hover:bg-brand-gray-light text-brand-text\",\n disabled: \"bg-white text-gray-300 cursor-not-allowed\",\n rangeStart: \"bg-brand-gold text-white\",\n rangeEnd: \"bg-brand-gold text-white\",\n rangeBetween: \"bg-brand-gold/25 text-brand-text\",\n rangeHovering: \"bg-brand-gold/25 text-brand-text\",\n },\n\n monthsGrid: \"grid grid-cols-3 gap-2 animate-slide-in-top\",\n monthButton: \"py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n monthButtonSelected: \"bg-brand-gold text-white\",\n monthButtonUnselected: \"text-brand-text\",\n\n yearsGrid: \"grid grid-cols-3 gap-2 max-h-[300px] overflow-y-auto pr-2 animate-slide-in-top\",\n yearButton: \"py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n yearButtonSelected: \"bg-brand-gold text-white\",\n yearButtonUnselected: \"text-brand-text\",\n}\n\nexport interface CalendarClassNames {\n root?: string;\n header?: string;\n calendarsContainer?: string;\n calendarContainer?: string;\n weekdayGrid?: string;\n weekday?: string;\n daysGrid?: string;\n footer?: string;\n\n navButton?: string;\n monthYearContainer?: string;\n monthYearLabel?: string;\n monthYearButton?: string;\n\n day?: DayClassNames;\n\n monthsGrid?: string;\n monthButton?: string;\n monthButtonSelected?: string;\n monthButtonUnselected?: string;\n\n yearsGrid?: string;\n yearButton?: string;\n yearButtonSelected?: string;\n yearButtonUnselected?: string;\n}\n\nexport const mergeClassNames = (custom?: CalendarClassNames): Required<CalendarClassNames> => {\n const result = { ...defaultClassNames };\n if (!custom) return result;\n\n for (const key in custom) {\n const k = key as keyof CalendarClassNames;\n if (k === 'day' && custom.day) {\n result.day = { ...defaultClassNames.day, ...custom.day };\n } else if (custom[k]) {\n (result as any)[k] = custom[k];\n }\n }\n return result;\n};\n","import React from 'react';\nimport { CalendarClassNames } from '../types';\n\ninterface MonthSelectionProps {\n year: number;\n month: number;\n monthNames: string[];\n minDate?: Date | null;\n maxDate?: Date | null;\n onMonthSelect: (month: number) => void;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const MonthSelection: React.FC<MonthSelectionProps> = ({\n year,\n month,\n monthNames,\n minDate,\n maxDate,\n onMonthSelect,\n classNames,\n}) => {\n const isMonthDisabled = (monthIdx: number) => {\n if (minDate && year === minDate.getFullYear() && monthIdx < minDate.getMonth()) {\n return true;\n }\n if (maxDate && year === maxDate.getFullYear() && monthIdx > maxDate.getMonth()) {\n return true;\n }\n return false;\n };\n\n return (\n <div className={classNames.monthsGrid}>\n {monthNames.map((name, idx) => {\n const disabled = isMonthDisabled(idx);\n return (\n <button\n key={name}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => !disabled && onMonthSelect(idx)}\n className={`${classNames.monthButton} ${idx === month ? classNames.monthButtonSelected : classNames.monthButtonUnselected}`}\n disabled={disabled}\n >\n {name}\n </button>\n );\n })}\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { CalendarClassNames, DateAdapter } from '../types';\n\ninterface YearSelectionProps {\n year: number;\n minDate?: Date | null;\n maxDate?: Date | null;\n adapter: DateAdapter;\n onYearSelect: (year: number) => void;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const YearSelection: React.FC<YearSelectionProps> = ({\n year,\n minDate,\n maxDate,\n adapter,\n onYearSelect,\n classNames,\n}) => {\n const yearListRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (yearListRef.current) {\n const selectedYearBtn = yearListRef.current.querySelector('[data-selected=\"true\"]');\n if (selectedYearBtn) {\n selectedYearBtn.scrollIntoView({ block: 'center' });\n }\n }\n }, []);\n\n const startYear = minDate ? adapter.get(adapter.date(minDate), 'year') : year - 50;\n const endYear = maxDate ? adapter.get(adapter.date(maxDate), 'year') : year + 50;\n const years = [];\n for (let y = startYear; y <= endYear; y++) {\n years.push(y);\n }\n\n return (\n <div ref={yearListRef} className={classNames.yearsGrid}>\n {years.map((y) => (\n <button\n key={y}\n data-selected={y === year}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onYearSelect(y)}\n className={`${classNames.yearButton} ${y === year ? classNames.yearButtonSelected : classNames.yearButtonUnselected}`}\n >\n {y}\n </button>\n ))}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useDates, UseDatesProps } from '../useDates';\nimport { Day } from './Day';\nimport { defaultAdapter } from '../adapters/dayjs';\nimport { getTranslations, Translations } from '../i18n';\nimport { CalendarHeader } from './CalendarHeader';\nimport { DateObj, CalendarClassNames } from '../types';\nimport { mergeClassNames } from '../classNames';\nimport { MonthSelection } from './MonthSelection';\nimport { YearSelection } from './YearSelection';\n\ninterface CalendarProps extends UseDatesProps {\n classNames?: CalendarClassNames;\n locale?: string;\n translations?: Partial<Translations>;\n header?: React.ReactNode | ((props: any) => React.ReactNode);\n footer?: React.ReactNode;\n renderDayTooltip?: (dateObj: DateObj) => React.ReactNode;\n}\n\ntype CalendarView = 'days' | 'months' | 'years';\n\nexport const Calendar: React.FC<CalendarProps> = (props) => {\n const {\n classNames: customClassNames,\n locale,\n translations: customTranslations,\n adapter = defaultAdapter,\n firstDayOfWeek = 0,\n header,\n footer,\n renderDayTooltip,\n ...useDatesProps\n } = props;\n\n const classNames = mergeClassNames(customClassNames);\n\n const [view, setView] = useState<CalendarView>('days');\n const [slideDirection, setSlideDirection] = useState<'left' | 'right' | null>(null);\n\n const t = getTranslations(adapter, locale, customTranslations);\n const weekdayNames = t.weekdays;\n const monthNames = t.months;\n\n const {\n calendars,\n getBackProps,\n getForwardProps,\n getDateProps,\n setOffset\n } = useDates({ ...useDatesProps, adapter, firstDayOfWeek });\n\n // Adjust weekday names based on firstDayOfWeek\n const sortedWeekdays = [...weekdayNames.slice(firstDayOfWeek), ...weekdayNames.slice(0, firstDayOfWeek)];\n\n const currentCalendar = calendars[0];\n const { month, year } = currentCalendar;\n\n const handleMonthSelect = (newMonth: number) => {\n const currentMonth = adapter.set(adapter.set(adapter.date(props.date || new Date()), 'year', year), 'month', month);\n const targetMonth = adapter.set(currentMonth, 'month', newMonth);\n const baseMonth = adapter.startOf(adapter.date(props.date || new Date()), 'month');\n const newOffset = adapter.diff(targetMonth, baseMonth, 'month');\n setSlideDirection(null);\n setOffset(newOffset);\n setView('days');\n };\n\n const handleYearSelect = (newYear: number) => {\n const currentMonth = adapter.set(adapter.set(adapter.date(props.date || new Date()), 'year', year), 'month', month);\n const targetMonth = adapter.set(currentMonth, 'year', newYear);\n const baseMonth = adapter.startOf(adapter.date(props.date || new Date()), 'month');\n const newOffset = adapter.diff(targetMonth, baseMonth, 'month');\n setSlideDirection(null);\n setOffset(newOffset);\n setView('days');\n };\n\n const wrappedGetBackProps = (args: any) => {\n const props = getBackProps(args);\n return {\n ...props,\n onClick: (e: any) => {\n setSlideDirection('left');\n props.onClick?.(e);\n }\n };\n };\n\n const wrappedGetForwardProps = (args: any) => {\n const props = getForwardProps(args);\n return {\n ...props,\n onClick: (e: any) => {\n setSlideDirection('right');\n props.onClick?.(e);\n }\n };\n };\n\n const renderDefaultHeader = () => (\n <CalendarHeader\n calendars={calendars}\n getBackProps={wrappedGetBackProps}\n getForwardProps={wrappedGetForwardProps}\n setView={setView}\n monthNames={monthNames}\n t={t}\n classNames={classNames}\n slideDirection={slideDirection}\n currentView={view}\n />\n );\n\n return (\n <div className={`rmdp ${classNames.root}`}>\n {typeof header === 'function' ? header({\n calendars,\n getBackProps: wrappedGetBackProps,\n getForwardProps: wrappedGetForwardProps,\n setView,\n monthNames,\n t,\n slideDirection,\n currentView: view\n }) : (header || renderDefaultHeader())}\n\n <div className={classNames.calendarsContainer}>\n {view === 'months' && calendars.map((calendar) => (\n <div key={`months-${calendar.year}`} className={classNames.calendarContainer}>\n <MonthSelection\n year={calendar.year}\n month={calendar.month}\n monthNames={monthNames}\n minDate={props.minDate}\n maxDate={props.maxDate}\n onMonthSelect={handleMonthSelect}\n classNames={classNames}\n />\n </div>\n ))}\n {view === 'years' && calendars.map((calendar) => (\n <div key={`years-${calendar.year}`} className={classNames.calendarContainer}>\n <YearSelection\n year={calendar.year}\n minDate={props.minDate}\n maxDate={props.maxDate}\n adapter={adapter}\n onYearSelect={handleYearSelect}\n classNames={classNames}\n />\n </div>\n ))}\n {view === 'days' && calendars.map((calendar) => (\n <div key={`${calendar.month}-${calendar.year}`} className={classNames.calendarContainer}>\n {calendars.length > 1 && (\n <button\n type=\"button\"\n aria-label={monthNames[calendar.month]}\n className=\"block w-full text-center font-semibold mb-2 text-brand-text\"\n >\n {monthNames[calendar.month]} {calendars[0].year !== calendars[calendars.length - 1].year ? calendar.year : ''}\n </button>\n )}\n <div className={classNames.weekdayGrid}>\n {sortedWeekdays.map((day) => (\n <div key={day} className={classNames.weekday}>{day}</div>\n ))}\n </div>\n <div className={`${classNames.daysGrid} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n {calendar.weeks.map((week, wi) =>\n week.map((dateObj, di) => (\n <Day\n key={`${wi}-${di}`}\n dateObj={dateObj}\n getDateProps={getDateProps}\n classNames={classNames}\n tooltip={dateObj && renderDayTooltip?.(dateObj)}\n />\n ))\n )}\n </div>\n </div>\n ))}\n </div>\n {footer && <div className={classNames.footer}>{footer}</div>}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/components/Day.tsx","../src/i18n.ts","../src/components/CalendarHeader.tsx","../src/classNames.ts","../src/components/MonthSelection.tsx","../src/components/YearSelection.tsx","../src/components/Calendar.tsx"],"sourcesContent":["import React from 'react';\nimport type { CalendarClassNames, DateObj } from '../types';\n\ninterface DayProps {\n dateObj: DateObj | null;\n getDateProps: (args: { dateObj: DateObj, [key: string]: any }) => any;\n dayProps?: Record<string, any>;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const Day: React.FC<DayProps> = ({ dateObj, getDateProps, dayProps, classNames }) => {\n if (!dateObj) {\n return <div className=\"aspect-square bg-white\" />;\n }\n\n const { date, selected, selectable, isRangeStart, isRangeEnd, isRangeBetween, isRangeHovering, isRangeActive } = dateObj;\n const dayClasses = classNames.day;\n\n let stateClasses = \"rounded-full\";\n if (isRangeStart && isRangeEnd) {\n stateClasses = `${dayClasses.selected} rounded-full`;\n } else if (isRangeStart) {\n stateClasses = `${dayClasses.rangeStart} ${isRangeActive ? 'rounded-l-full rounded-r-none' : 'rounded-full'}`;\n } else if (isRangeEnd) {\n stateClasses = `${dayClasses.rangeEnd} ${isRangeActive ? 'rounded-r-full rounded-l-none' : 'rounded-full'}`;\n } else if (isRangeBetween) {\n stateClasses = dayClasses.rangeBetween || '';\n } else if (isRangeHovering) {\n stateClasses = dayClasses.rangeHovering || '';\n } else if (selected) {\n stateClasses = dayClasses.selected || '';\n } else if (!selectable) {\n stateClasses = dayClasses.disabled || '';\n } else {\n stateClasses = dayClasses.unselected || '';\n }\n\n const className = [\n dayClasses.day,\n stateClasses,\n ...(dateObj.modifiers || []).map(m => (dayClasses as any)[m] || m)\n ].filter(Boolean).join(' ');\n\n return (\n <button\n {...getDateProps({ dateObj, ...dayProps })}\n className={className}\n >\n {date.getDate()}\n </button>\n );\n};\n","import { DateAdapter } from \"./types\";\nimport { defaultAdapter } from \"./adapters/dayjs\";\n\nexport interface Translations {\n months: string[];\n weekdays: string[];\n back: string;\n forward: string;\n}\n\nexport function getDefaults(adapter: DateAdapter = defaultAdapter, locale?: string): Translations {\n return {\n months: adapter.getMonths(locale),\n weekdays: adapter.getWeekdays(locale),\n back: 'Previous month',\n forward: 'Next month'\n };\n}\n\nexport function getTranslations(\n adapter: DateAdapter = defaultAdapter,\n locale?: string,\n custom?: Partial<Translations>\n): Translations {\n const base = getDefaults(adapter, locale);\n return { ...base, ...custom };\n}\n","import React from 'react';\nimport { Calendar, CalendarClassNames } from '../types';\n\nexport interface HeaderProps {\n calendars: Calendar[];\n getBackProps: (args: any) => any;\n getForwardProps: (args: any) => any;\n setView: (view: 'days' | 'months' | 'years') => void;\n monthNames: string[];\n t: { back: string; forward: string };\n classNames: Required<CalendarClassNames>;\n slideDirection?: 'left' | 'right' | null;\n currentView?: 'days' | 'months' | 'years';\n}\n\nexport const ChevronLeftIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"></polyline>\n </svg>\n);\n\nexport const ChevronRightIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n);\n\nexport const CalendarHeader: React.FC<HeaderProps> = ({\n calendars,\n getBackProps,\n getForwardProps,\n setView,\n monthNames,\n t,\n classNames,\n slideDirection,\n currentView\n}) => {\n return (\n <div className={classNames.header}>\n <button\n {...getBackProps({ calendars })}\n onMouseDown={(e) => e.preventDefault()}\n className={`${classNames.navButton} ${currentView && currentView !== 'days' ? 'invisible pointer-events-none' : ''}`}\n aria-label={t.back}\n >\n <ChevronLeftIcon />\n </button>\n\n <div className={classNames.monthYearContainer}>\n {calendars.length === 1 ? (\n <div key={`${calendars[0].month}-${calendars[0].year}`} className={`${classNames.monthYearLabel} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n <button\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setView(currentView === 'months' ? 'days' : 'months')}\n className={classNames.monthYearButton}\n >\n {monthNames[calendars[0].month]}\n </button>\n <button\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setView(currentView === 'years' ? 'days' : 'years')}\n className={classNames.monthYearButton}\n >\n {calendars[0].year}\n </button>\n </div>\n ) : (\n <div className={`${classNames.monthYearLabel} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n {(() => {\n const first = calendars[0];\n const last = calendars[calendars.length - 1];\n const isFullYear = calendars.length === 12 && first.month === 0 && last.month === 11 && first.year === last.year;\n\n if (isFullYear) {\n return <span>{first.year}</span>;\n } else if (first.year === last.year) {\n return <span>{monthNames[first.month]} - {monthNames[last.month]} {first.year}</span>;\n } else {\n return <span>{monthNames[first.month]} {first.year} - {monthNames[last.month]} {last.year}</span>;\n }\n })()}\n </div>\n )}\n </div>\n\n <button\n {...getForwardProps({ calendars })}\n onMouseDown={(e) => e.preventDefault()}\n className={`${classNames.navButton} ${currentView && currentView !== 'days' ? 'invisible pointer-events-none' : ''}`}\n aria-label={t.forward}\n >\n <ChevronRightIcon />\n </button>\n </div>\n );\n};\n","export interface DayClassNames {\n day?: string;\n selected?: string;\n unselected?: string;\n disabled?: string;\n rangeStart?: string;\n rangeEnd?: string;\n rangeBetween?: string;\n rangeHovering?: string;\n [key: string]: string | undefined;\n}\n\nexport const defaultClassNames = {\n root: \"w-fit flex flex-col p-4 bg-white rounded-lg shadow-lg\",\n header: \"flex items-center justify-between border-b-2 border-brand-gray-light/40 pb-2\",\n calendarsContainer: \"flex flex-wrap gap-4\",\n calendarContainer: \"flex-1 min-w-[280px] max-w-full\",\n weekdayGrid: \"grid grid-cols-7 gap-1 mb-1 border-b border-brand-gray-light/40\",\n weekday: \"text-center text-xs text-gray-400 py-2\",\n daysGrid: \"grid grid-cols-7 gap-px bg-brand-gray-light/20\",\n footer: \"mt-4\",\n\n navButton: \"p-2 text-brand-text hover:bg-gray-100 rounded-full transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n monthYearContainer: \"flex gap-8\",\n monthYearLabel: \"flex gap-1 items-center font-semibold text-brand-text\",\n monthYearButton: \"hover:bg-gray-100 px-2 py-1 rounded cursor-pointer\",\n\n day: {\n day: \"aspect-square flex items-center justify-center text-sm font-medium transition-all relative group cursor-pointer p-px\",\n selected: \"bg-brand-gold text-white rounded-full\",\n unselected: \"bg-white hover:bg-brand-gray-light text-brand-text\",\n disabled: \"bg-white text-gray-300 cursor-not-allowed\",\n rangeStart: \"bg-brand-gold text-white\",\n rangeEnd: \"bg-brand-gold text-white\",\n rangeBetween: \"bg-brand-gold/25 text-brand-text\",\n rangeHovering: \"bg-brand-gold/25 text-brand-text\",\n },\n\n monthsGrid: \"grid grid-cols-3 gap-2 animate-slide-in-top\",\n monthButton: \"py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n monthButtonSelected: \"bg-brand-gold text-white\",\n monthButtonUnselected: \"text-brand-text\",\n\n yearsGrid: \"grid grid-cols-3 gap-2 max-h-[210px] overflow-y-auto pr-2 animate-slide-in-top rmdp-scrollbar\",\n yearButton: \"py-3 rounded-lg hover:bg-brand-gray-light transition-colors cursor-pointer disabled:opacity-30 disabled:pointer-events-none\",\n yearButtonSelected: \"bg-brand-gold text-white\",\n yearButtonUnselected: \"text-brand-text\",\n}\n\nexport interface CalendarClassNames {\n root?: string;\n header?: string;\n calendarsContainer?: string;\n calendarContainer?: string;\n weekdayGrid?: string;\n weekday?: string;\n daysGrid?: string;\n footer?: string;\n\n navButton?: string;\n monthYearContainer?: string;\n monthYearLabel?: string;\n monthYearButton?: string;\n\n day?: DayClassNames;\n\n monthsGrid?: string;\n monthButton?: string;\n monthButtonSelected?: string;\n monthButtonUnselected?: string;\n\n yearsGrid?: string;\n yearButton?: string;\n yearButtonSelected?: string;\n yearButtonUnselected?: string;\n}\n\nexport const mergeClassNames = (custom?: CalendarClassNames): Required<CalendarClassNames> => {\n const result = { ...defaultClassNames };\n if (!custom) return result;\n\n for (const key in custom) {\n const k = key as keyof CalendarClassNames;\n if (k === 'day' && custom.day) {\n result.day = { ...defaultClassNames.day, ...custom.day };\n } else if (custom[k]) {\n (result as any)[k] = custom[k];\n }\n }\n return result;\n};\n","import React from 'react';\nimport { CalendarClassNames } from '../types';\n\ninterface MonthSelectionProps {\n year: number;\n month: number;\n monthNames: string[];\n minDate?: Date | null;\n maxDate?: Date | null;\n onMonthSelect: (month: number) => void;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const MonthSelection: React.FC<MonthSelectionProps> = ({\n year,\n month,\n monthNames,\n minDate,\n maxDate,\n onMonthSelect,\n classNames,\n}) => {\n const isMonthDisabled = (monthIdx: number) => {\n if (minDate && year === minDate.getFullYear() && monthIdx < minDate.getMonth()) {\n return true;\n }\n if (maxDate && year === maxDate.getFullYear() && monthIdx > maxDate.getMonth()) {\n return true;\n }\n return false;\n };\n\n return (\n <div className={classNames.monthsGrid}>\n {monthNames.map((name, idx) => {\n const disabled = isMonthDisabled(idx);\n return (\n <button\n key={name}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => !disabled && onMonthSelect(idx)}\n className={`${classNames.monthButton} ${idx === month ? classNames.monthButtonSelected : classNames.monthButtonUnselected}`}\n disabled={disabled}\n >\n {name}\n </button>\n );\n })}\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { CalendarClassNames, DateAdapter } from '../types';\n\ninterface YearSelectionProps {\n year: number;\n minDate?: Date | null;\n maxDate?: Date | null;\n adapter: DateAdapter;\n onYearSelect: (year: number) => void;\n classNames: Required<CalendarClassNames>;\n}\n\nexport const YearSelection: React.FC<YearSelectionProps> = ({\n year,\n minDate,\n maxDate,\n adapter,\n onYearSelect,\n classNames,\n}) => {\n const yearListRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (yearListRef.current) {\n const selectedYearBtn = yearListRef.current.querySelector('[data-selected=\"true\"]');\n if (selectedYearBtn) {\n selectedYearBtn.scrollIntoView({ block: 'center' });\n }\n }\n }, []);\n\n const startYear = minDate ? adapter.get(adapter.date(minDate), 'year') : year - 50;\n const endYear = maxDate ? adapter.get(adapter.date(maxDate), 'year') : year + 50;\n const years = [];\n for (let y = startYear; y <= endYear; y++) {\n years.push(y);\n }\n\n return (\n <div ref={yearListRef} className={classNames.yearsGrid}>\n {years.map((y) => (\n <button\n key={y}\n data-selected={y === year}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onYearSelect(y)}\n className={`${classNames.yearButton} ${y === year ? classNames.yearButtonSelected : classNames.yearButtonUnselected}`}\n >\n {y}\n </button>\n ))}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useDates, UseDatesProps } from '../useDates';\nimport { Day } from './Day';\nimport { defaultAdapter } from '../adapters/dayjs';\nimport { getTranslations, Translations } from '../i18n';\nimport { CalendarHeader } from './CalendarHeader';\nimport { DateObj, CalendarClassNames } from '../types';\nimport { mergeClassNames } from '../classNames';\nimport { MonthSelection } from './MonthSelection';\nimport { YearSelection } from './YearSelection';\n\ninterface CalendarProps extends UseDatesProps {\n classNames?: CalendarClassNames;\n locale?: string;\n translations?: Partial<Translations>;\n header?: React.ReactNode | ((props: any) => React.ReactNode);\n footer?: React.ReactNode;\n getDayProps?: (dateObj: DateObj) => Record<string, any>;\n}\n\ntype CalendarView = 'days' | 'months' | 'years';\n\nexport const Calendar: React.FC<CalendarProps> = (props) => {\n const {\n classNames: customClassNames,\n locale,\n translations: customTranslations,\n adapter = defaultAdapter,\n firstDayOfWeek = 0,\n header,\n footer,\n getDayProps,\n ...useDatesProps\n } = props;\n\n const classNames = mergeClassNames(customClassNames);\n\n const [view, setView] = useState<CalendarView>('days');\n const [slideDirection, setSlideDirection] = useState<'left' | 'right' | null>(null);\n\n const t = getTranslations(adapter, locale, customTranslations);\n const weekdayNames = t.weekdays;\n const monthNames = t.months;\n\n const {\n calendars,\n getBackProps,\n getForwardProps,\n getDateProps,\n setOffset\n } = useDates({ ...useDatesProps, adapter, firstDayOfWeek });\n\n // Adjust weekday names based on firstDayOfWeek\n const sortedWeekdays = [...weekdayNames.slice(firstDayOfWeek), ...weekdayNames.slice(0, firstDayOfWeek)];\n\n const currentCalendar = calendars[0];\n const { month, year } = currentCalendar;\n\n const handleMonthSelect = (newMonth: number) => {\n const currentMonth = adapter.set(adapter.set(adapter.date(props.date || new Date()), 'year', year), 'month', month);\n const targetMonth = adapter.set(currentMonth, 'month', newMonth);\n const baseMonth = adapter.startOf(adapter.date(props.date || new Date()), 'month');\n const newOffset = adapter.diff(targetMonth, baseMonth, 'month');\n setSlideDirection(null);\n setOffset(newOffset);\n setView('days');\n };\n\n const handleYearSelect = (newYear: number) => {\n const currentMonth = adapter.set(adapter.set(adapter.date(props.date || new Date()), 'year', year), 'month', month);\n const targetMonth = adapter.set(currentMonth, 'year', newYear);\n const baseMonth = adapter.startOf(adapter.date(props.date || new Date()), 'month');\n const newOffset = adapter.diff(targetMonth, baseMonth, 'month');\n setSlideDirection(null);\n setOffset(newOffset);\n setView('days');\n };\n\n const wrappedGetBackProps = (args: any) => {\n const props = getBackProps(args);\n return {\n ...props,\n onClick: (e: any) => {\n setSlideDirection('left');\n props.onClick?.(e);\n }\n };\n };\n\n const wrappedGetForwardProps = (args: any) => {\n const props = getForwardProps(args);\n return {\n ...props,\n onClick: (e: any) => {\n setSlideDirection('right');\n props.onClick?.(e);\n }\n };\n };\n\n const renderDefaultHeader = () => (\n <CalendarHeader\n calendars={calendars}\n getBackProps={wrappedGetBackProps}\n getForwardProps={wrappedGetForwardProps}\n setView={setView}\n monthNames={monthNames}\n t={t}\n classNames={classNames}\n slideDirection={slideDirection}\n currentView={view}\n />\n );\n\n return (\n <div className={`rmdp ${classNames.root}`}>\n {typeof header === 'function' ? header({\n calendars,\n getBackProps: wrappedGetBackProps,\n getForwardProps: wrappedGetForwardProps,\n setView,\n monthNames,\n t,\n slideDirection,\n currentView: view\n }) : (header || renderDefaultHeader())}\n\n <div className={classNames.calendarsContainer}>\n {view === 'months' && calendars.map((calendar) => (\n <div key={`months-${calendar.year}`} className={classNames.calendarContainer}>\n <MonthSelection\n year={calendar.year}\n month={calendar.month}\n monthNames={monthNames}\n minDate={props.minDate}\n maxDate={props.maxDate}\n onMonthSelect={handleMonthSelect}\n classNames={classNames}\n />\n </div>\n ))}\n {view === 'years' && calendars.map((calendar) => (\n <div key={`years-${calendar.year}`} className={classNames.calendarContainer}>\n <YearSelection\n year={calendar.year}\n minDate={props.minDate}\n maxDate={props.maxDate}\n adapter={adapter}\n onYearSelect={handleYearSelect}\n classNames={classNames}\n />\n </div>\n ))}\n {view === 'days' && calendars.map((calendar) => (\n <div key={`${calendar.month}-${calendar.year}`} className={classNames.calendarContainer}>\n {calendars.length > 1 && (\n <button\n type=\"button\"\n aria-label={monthNames[calendar.month]}\n className=\"block w-full text-center font-semibold mb-2 text-brand-text\"\n >\n {monthNames[calendar.month]} {calendars[0].year !== calendars[calendars.length - 1].year ? calendar.year : ''}\n </button>\n )}\n <div className={classNames.weekdayGrid}>\n {sortedWeekdays.map((day) => (\n <div key={day} className={classNames.weekday}>{day}</div>\n ))}\n </div>\n <div className={`${classNames.daysGrid} ${slideDirection === 'left' ? 'animate-slide-in-left' : slideDirection === 'right' ? 'animate-slide-in-right' : ''}`}>\n {calendar.weeks.map((week, wi) =>\n week.map((dateObj, di) => (\n <Day\n key={`${wi}-${di}`}\n dateObj={dateObj}\n getDateProps={getDateProps}\n dayProps={dateObj ? getDayProps?.(dateObj) : undefined}\n classNames={classNames}\n />\n ))\n )}\n </div>\n </div>\n ))}\n </div>\n {footer && <div className={classNames.footer}>{footer}</div>}\n </div>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "react-modular-datepicker",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "A modular, lightweight, and type-safe React datepicker and calendar component with headless hooks for single, multiple, and range selection.",
5
5
  "author": "",
6
6
  "license": "MIT",
7
- "homepage": "https://react-modular-datepicker.vercel.app/",
7
+ "homepage": "https://react-modular-datepicker.vercel.app",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "git+https://github.com/Dragate/react-modular-datepicker.git"
@@ -43,9 +43,28 @@
43
43
  "sideEffects": [
44
44
  "*.css"
45
45
  ],
46
- "main": "./dist/index.js",
47
- "module": "./dist/index.mjs",
46
+ "main": "./dist/index.cjs",
47
+ "module": "./dist/index.js",
48
48
  "types": "./dist/index.d.ts",
49
+ "exports": {
50
+ ".": {
51
+ "types": "./dist/index.d.ts",
52
+ "import": "./dist/index.js",
53
+ "require": "./dist/index.cjs"
54
+ },
55
+ "./useDates": {
56
+ "types": "./dist/useDates.d.ts",
57
+ "import": "./dist/useDates.js",
58
+ "require": "./dist/useDates.cjs"
59
+ },
60
+ "./utils": {
61
+ "types": "./dist/utils.d.ts",
62
+ "import": "./dist/utils.js",
63
+ "require": "./dist/utils.cjs"
64
+ },
65
+ "./dist/*": "./dist/*",
66
+ "./package.json": "./package.json"
67
+ },
49
68
  "peerDependencies": {
50
69
  "dayjs": "^1.11.20",
51
70
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",