events-calendar
Version:
A flexible, responsive, and feature-rich calendar component for modern React applications.
2 lines • 32.4 kB
JavaScript
"use client";import{useMemo as Ut,useRef as mn}from"react";import{useRef as gr}from"react";var Ae=e=>{switch(e){case"both":return"polygon(10px 0%, calc(100% - 10px) 0%, 100% 50%, calc(100% - 10px) 100%, 10px 100%, 0% 50%)";case"left":return"polygon(10px 0%, 100% 0%, 100% 100%, 10px 100%, 0% 50%)";case"right":return"polygon(0% 0%, calc(100% - 10px) 0%, 100% 50%, calc(100% - 10px) 100%, 0% 100%)";case"none":return;default:return}};var Pe=(e,t,r,n,a,o)=>{if(e)return{width:"100%"};let i=t.start.isSame(r,"w")?t.start.day():0,d=t.end.isSame(r,"w")?t.end.day():6;return{position:"absolute",left:o?"0.125rem":`calc(${i*100/7}% + 0.125rem)`,top:`calc(${o?4:n?24:26}px + ${t.order*(n?21:22)}px + ${a?6:0}px)`,width:o?"calc(100% - 6px)":`calc(${100*(1+(d-i))/7}% - 0.25rem - 1px)`}};function Se(e,t){return!t.isActive&&t.id===e.placeholderEvent.dragId}var Oe=(e,t,r,n,a)=>{let o=e?r.isBefore(t,"day"):!!a?.first&&r.isBefore(a.first,"day"),i=e?n.isAfter(t,"day"):!!a?.last&&n.isAfter(a.last,"day");return o&&i?"both":o?"left":i?"right":"none"};function te(e,t){return e.hour(t.hour()).minute(t.minute())}var _=["year","month","week","day"],re=["January","February","March","April","May","June","July","August","September","October","November","December"],Re=["S","M","T","W","T","F","S"],je=42,ne="#0ea5e9",Ne=["1 AM","2 AM","3 AM","4 AM","5 AM","6 AM","7 AM","8 AM","9 AM","10 AM","11 AM","12 PM","1 PM","2 PM","3 PM","4 PM","5 PM","6 PM","7 PM","8 PM","9 PM","10 PM","11 PM"];function z(e,t,r,n=!1){return e.isSame(t,"d")||!n&&e.isSame(r,"d")?!0:e.isAfter(t)&&e.isBefore(r)}function ge(e,t){return e.isBefore(t,"d")||e.isSame(t,"d")}function V(e,t,r,n){return ge(e,n)&&ge(r,t)}function ae({state:e,dispatch:t,date:r,view:n}){let a=n==="month"?"day":"minute";if(e.dragStartOffset===null){let c=r.diff(e.clickedEvent.start,a);t({type:"update_event",dragStartOffset:c});return}let{start:o,end:i,startTime:d,endTime:l}=e.clickedEvent,s=r.subtract(e.dragStartOffset,a),p=i.diff(o,a),v=s.add(p,a);n!=="month"&&!s.isSame(v,"day")||t({type:"update_event",event:{...e.placeholderEvent,start:n==="month"?s.hour(o.hour()).minute(o.minute()):s,end:n==="month"?v.hour(i.hour()).minute(i.minute()):v,startTime:n==="month"?d:s.format("h:mma"),endTime:n==="month"?l:v.format("h:mma")}})}function O(e,t){let r=e.hour()*60+e.minute();return t.hour()*60+t.minute()-r}function _e(e,t){if(!e.start||!e.end)return"";let r=t<=30?", ":"";return e.start.isBefore(e.end)?`${r}${e.start.format("h:mma")} - ${e.end.format("h:mma")}`:`${r}${e.end.format("h:mma")} - ${e.start.format("h:mma")}`}function oe(e,t){let r=t.add(6,"d");return e.filter(({start:n,end:a})=>V(t,r,n,a||n))}function P(e,t){return e.filter(({start:r,end:n})=>z(t,r,n))}function ze(e,t,r){let n=r==="year"?"year":"month",a=t.startOf(n).day(0),o=t.endOf(n).day(6);return e.filter(({start:i,end:d})=>V(a,o,i,d))}import ie from"dayjs";var ye=(e,t)=>{let r=t.replace(/.{2}$/," $&").toUpperCase();return ie(`${e.format("DD-MMM-YYYY")} ${r}`)};function Ve(e){return e.filter(t=>t.start||t.end).map((t,r)=>{let n=t.start?ie(t.start):ie(t.end);t.startTime&&(n=ye(n,t.startTime));let a=t.end?ie(t.end):n;return(t.startTime||t.endTime||t.isAllDay===!1)&&(!t.startTime&&!t.endTime?a=n.add(1,"hour"):t.endTime?a=ye(a,t.endTime):a=ye(a,t.startTime).add(1,"hour")),{...t,id:t.id??r,title:t.title??"",start:n,end:a,isAllDay:t.isAllDay!==!1}})}function Ie(e,t,r,n){return e.filter(({order:a,start:o})=>a<r&&(n||t.day()===0||t.isSame(o,"day")))}function qt(e){return[...e].sort((r,n)=>{let a=r.end.diff(r.start,"day")+1,o=n.end.diff(n.start,"day")+1;return a>o?-1:a<o?1:r.start.isBefore(n.start,"day")?-1:n.start.isBefore(r.start,"day")?1:r.isAllDay&&!n.isAllDay?-1:!r.isAllDay&&n.isAllDay?1:0})}function Kt(e){let t=0;for(;e.has(t);)t++;return t}function I(e){if(e.length<2)return e.map(o=>({...o,order:0,indent:0}));let t=qt(e),[r,...n]=t,a=[{...r,order:0,indent:0}];return n.forEach(o=>{let i=o.start,d=o.end||i,l=new Set;for(let p of a){let v=p.start,c=p.end||v;V(i,d,v,c)&&l.add(p.order)}let s=Kt(l);a.push({...o,order:s,indent:0})}),a}function de(e,t){return t?e.isSame(t)||e.isBefore(t)?[e,t]:[t,e]:[e,e]}import He from"dayjs";var T={id:null,dragId:null,title:"Untitled",groups:[],start:He(),end:He(),startTime:void 0,endTime:void 0,isActive:!1,isAllDay:!0,indent:0,order:0};var le=(e,t,r,n)=>{let[a,o]=de(e,t),i=n&&r?a.add(15,"minute"):o;return{...T,id:null,start:a,end:i,isActive:!0,isAllDay:!r,startTime:r?a.format("h:mma"):void 0,endTime:r?i.format("h:mma"):void 0,order:r?100:0}};function Qt(e){return e.length<2?e:e.sort((t,r)=>{let n=O(t.start,r.start);return n>0?-1:n<0?1:0})}function er(e,t,r){return e.isSame(t)||e.isAfter(t)&&e.isBefore(r)}function Be(e,t){if(e.length<2)return e.map(i=>({...i,order:0,indent:0}));let r=Qt(e),[n,...a]=r,o=[{...n,order:0,indent:0}];return a.forEach((i,d)=>{let l=te(t,i.start),s=0;o.forEach(p=>{let v=te(t,p.start),c=te(t,p.end);er(l,v,c)&&(s+=1)}),o.push({...i,order:d+1,indent:s})}),o}import Le from"dayjs";var ta=(e,t,r="01-Jan-2000",n="01-Jan-2000")=>{let a=e?.replace(/.{2}$/," $&").toUpperCase()||"12:00 AM",o=t?.replace(/.{2}$/," $&").toUpperCase()||"12:00 AM",i=Le(`${r} ${a}`),d=Le(`${n} ${o}`);return{start:i,end:d}};function H(e){let t=e?.map(a=>a.color).filter(Boolean)??[];if(!t.length)return{backgroundColor:ne};if(t.length===1)return{backgroundColor:t[0]};let r=100/t.length;return{backgroundImage:`-webkit-linear-gradient(-30deg,${t.map((a,o)=>`${a} ${r*o}% ${r*o+r}%`).join(", ")})`}}var Ye=(e,t,r,n,a)=>{let o=r===0?6:0;return{gridColumnStart:r+1,gridRowStart:e.start&&e.start.hour()*4+Math.round(e.start.minute()/15)+1,gridRowEnd:e.end&&e.end.hour()*4+Math.round(e.end.minute()/15)+1,height:12*((t||60)/15)-2,borderWidth:e.indent>0?t>30?"1px":"0.5px":0,marginLeft:n*e.indent+o,width:`calc(100% - ${n*(e.indent+1)+o}px)`,zIndex:a?100:1+e.order,...H(e.groups)}};import{jsx as we}from"react/jsx-runtime";function $e({date:e,event:t,minMaxDatesInView:r,isCompact:n,isInOverflow:a}){let o=Oe(a,e,t.start,t.end,r),i=Ae(o),d=H(t.groups);return we("div",{className:"events-calendar-all-day-event",style:{...d,clipPath:i},children:we("div",{className:"events-calendar-all-day-event-content","data-sm":n,children:we("span",{className:"events-calendar-all-day-event-text","data-arrows":o,children:t.title})})})}import{jsx as be,jsxs as tr}from"react/jsx-runtime";function We({event:e,isCompact:t}){let{title:r,start:n,groups:a}=e,o=H(a),d={border:`1px solid ${(a?.map(l=>l.color).filter(Boolean)??[])[0]??ne}`};return tr("div",{className:"events-calendar-time","data-sm":t,style:d,children:[be("div",{className:"events-calendar-time-dot",style:o}),be("div",{className:"events-calendar-time-text",children:n.format("h:mma")}),be("span",{className:"events-calendar-time-label",children:r})]})}var rr=({isTimeEvent:e,firstClickDate:t,start:r,date:n,dispatch:a})=>{if(e){let o=O(t,n)<0?de(r,t.add(15,"minute"))[1]:t,i=r.hour(n.hour()).minute(n.minute());if(Math.abs(O(o,n))>=15){let d=le(o,i,!0);a({type:"update_event",event:d})}}else{let o=le(t,n);a({type:"update_event",event:o})}},Fe=({enableDragCreation:e,dispatch:t,state:r,onEventCreate:n})=>{if(!e)return d=>{d.type==="mousedown"&&t({type:"reset_calendar"})};let a=()=>t({type:"open_popover"}),o=()=>t({type:"reset_calendar"});return(d,l,s,p)=>{let{dragActive:v,firstClickDate:c,placeholderEvent:f}=r,{start:g}=f;if(d.button!==0){v&&t({type:"event_create_stop"});return}switch(d.type){case"mousedown":{if(r.eventAnchor||r.overflowIsOpen){t({type:"reset_calendar"});return}let m=le(l,l,s,!0);t({type:"event_create_start",date:l,event:m,anchor:p.current});break}case"mouseenter":{if(d.buttons!==1||!v||!c)return;rr({isTimeEvent:s,firstClickDate:c,start:g,date:l,dispatch:t});break}case"mouseup":{if(!v)return;n&&n({clickedEvent:r.clickedEvent,newEvent:r.placeholderEvent,eventRef:p.current,openPopover:a,reset:o}),t({type:"event_create_end",anchor:p.current})}}}};import{useEffect as nr,useMemo as ar,useRef as Ue,useState as or}from"react";var ir={x:0,y:0,width:0,height:0,top:0,left:0,bottom:0,right:0};function dr(e){let t=Ue(0),r=Ue(null),[n,a]=or(ir),o=ar(()=>typeof window<"u"?new ResizeObserver(i=>{let d=i[0];d&&(cancelAnimationFrame(t.current),t.current=requestAnimationFrame(()=>{r.current&&a(d.contentRect)}))}):null,[]);return nr(()=>(r.current&&o?.observe(r.current,e),()=>{o?.disconnect(),t.current&&cancelAnimationFrame(t.current)}),[r.current]),[r,n]}function Ge(e){let[t,{width:r,height:n}]=dr(e);return{ref:t,width:r,height:n}}import{useState as lr}from"react";import{flip as sr,offset as cr,shift as mr,useDismiss as pr,useFloating as vr,useInteractions as fr}from"@floating-ui/react";function Je({dispatch:e,event:t,isInOverflow:r,hasContextMenu:n,state:a}){let[o,i]=lr(!1),d=()=>i(!1),l=t.id!==null&&a.clickedEvent?.id===t.id,{refs:s,floatingStyles:p,context:v}=vr({open:o,onOpenChange:i,middleware:[cr({mainAxis:5,alignmentAxis:4}),sr({fallbackPlacements:["left-start"]}),mr({padding:10})],placement:"right-start"}),c=pr(v),{getFloatingProps:f}=fr([c]);return{handleContextMenu:(m,u)=>{n&&(m.preventDefault(),!(a.popoverIsOpen||a.overflowIsOpen&&!r)&&(s.setPositionReference({getBoundingClientRect(){return{width:0,height:0,x:m.clientX,y:m.clientY,top:m.clientY,right:m.clientX,bottom:m.clientY,left:m.clientX}}}),e({type:"open_context_menu",event:t,anchor:u.current}),i(!0)))},isActive:l,contextIsOpen:o,refs:s,floatingStyles:p,getFloatingProps:f,closeContextMenu:d}}import Ze from"dayjs";import{useEffect as ur,useReducer as hr,useState as qe}from"react";var Z={clickedEvent:T,popoverIsOpen:!1,eventAnchor:null,dragActive:!1,firstClickDate:null,placeholderEvent:T,dragStartOffset:null,eventDragActive:!1,overflowAnchor:null,overflowIsOpen:!1};function Xe(e,t){switch(t.type){case"reset_calendar":return Z;case"open_overflow":return{...e,...Z,overflowIsOpen:!0,overflowAnchor:t.anchor||e.overflowAnchor};case"open_popover":return{...e,popoverIsOpen:!0};case"open_context_menu":return{...e,clickedEvent:t.event||e.clickedEvent,eventAnchor:t.anchor||e.eventAnchor};case"set_clicked_event":return{...e,clickedEvent:t.event||e.clickedEvent,eventAnchor:t.anchor||e.eventAnchor,placeholderEvent:T};case"update_event":return{...e,dragStartOffset:t.dragStartOffset??e.dragStartOffset,placeholderEvent:{...e.placeholderEvent,...t.event,id:null}};case"event_create_start":return{...e,dragActive:!0,firstClickDate:t.date||e.firstClickDate,placeholderEvent:{...e.placeholderEvent,...t.event,isActive:!0},eventAnchor:t.anchor||e.eventAnchor};case"event_create_end":return{...e,dragActive:!1,firstClickDate:null,placeholderEvent:{...e.placeholderEvent,isActive:!0},eventAnchor:t.anchor||e.eventAnchor};case"event_create_stop":return{...e,dragActive:!1,firstClickDate:null,clickedEvent:T,placeholderEvent:T,eventDragActive:!1};case"event_reschedule_start":return{...e,eventDragActive:!0,clickedEvent:t.event||e.clickedEvent,placeholderEvent:{...e.placeholderEvent,order:0,...t.event,id:null,isActive:!0}};case"event_reschedule_end":return{...e,eventDragActive:!1,dragStartOffset:null,eventAnchor:t.anchor||e.eventAnchor};default:return console.log(`Invalid action type ${t.type} passed to calendar reducer`),e}}function Ke({isInitialised:e=!1,initialDate:t=Ze(),initialView:r="month",closeOnClickOutside:n=!0}={}){let[a,o]=qe(Ze(t)),[i,d]=qe(r),[l,s]=hr(Xe,Z);return ur(()=>{if(!n||e)return;let p=()=>s({type:"reset_calendar"});return window.addEventListener("click",p),()=>{window.removeEventListener("click",p)}},[s,e,n]),{activeDate:a,setActiveDate:o,view:i,setView:d,state:l,dispatch:s}}function Qe(e){let r=Ke({isInitialised:!!e});return e||r}import{Fragment as yr,jsx as B,jsxs as et}from"react/jsx-runtime";function L({view:e,enableRescheduling:t,compact:r=!1,date:n,dispatch:a,event:o,isInWeekHeader:i=!1,isInOverflow:d=!1,isInDayHeader:l=!1,minMaxDatesInView:s,onEventClick:p,placeholderRef:v,renderContextMenu:c,state:f}){let g=gr(null),m=!!c,u=!!p||t,h=e==="month",w=e==="day",b=()=>a({type:"open_popover"}),x=()=>a({type:"reset_calendar"}),y=()=>a({type:"reset_calendar"}),C=(M,Jt,ee,Xt)=>{if(M.stopPropagation(),Jt||!ee.current)return;let he=k&&f.eventAnchor?.dataset.anchorday===ee.current.dataset.anchorday;!d&&f.overflowIsOpen&&a({type:"reset_calendar"}),he||a({type:"set_clicked_event",event:o,anchor:ee.current});let Zt=()=>he?x():b();Xt?.({event:o,isDoubleClick:he,eventRef:ee.current,openPopover:b,closePopover:x,togglePopover:Zt})},{handleContextMenu:D,isActive:k,contextIsOpen:A,refs:S,floatingStyles:E,getFloatingProps:j,closeContextMenu:N}=Je({dispatch:a,event:o,state:f,hasContextMenu:m,isInOverflow:d}),U=o.id===null,G=U&&o.start.isSame(n,"d")?v:g,J=Math.abs(O(o.start,o.end)),X=J<=30,ue=w?120:20,K=w?0:n.day(),Q=()=>{a({type:"reset_calendar"}),t&&!d&&a({type:"event_reschedule_start",event:{...o,dragId:o.id,order:h?o.order:1e3}})},Te=h?Pe(d,o,n,r,i,l):Ye(o,J,K,ue,u&&k);return et(yr,{children:[B("div",{className:h?"events-calendar-month-item-container":"events-calendar-week-item-container","data-interactive":u,"data-active":u&&k,"data-anchorday":n.format("DD-MMM-YYYY"),"data-placeholder":U,"data-dragactive":f.dragActive||f.eventDragActive,"data-isdragging":Se(f,o),"data-sm":r,"data-time":h&&!o.isAllDay,draggable:"true",onClick:M=>C(M,U,G,p),onContextMenu:M=>D(M,G),onDragStart:Q,ref:G,style:Te,children:h?o.isAllDay?B($e,{date:n,event:o,isCompact:r,isInOverflow:d,minMaxDatesInView:s}):B(We,{event:o,isCompact:r}):et("div",{className:"events-calendar-item-label","data-short":X,children:[B("span",{style:X?void 0:{width:"100%"},children:o.title}),B("span",{className:"events-calendar-time-text",children:_e(o,J)})]})}),A&&B("div",{ref:S.setFloating,style:{...E,zIndex:2},...j(),children:c&&c({event:o,closeContextMenu:N,onClose:y,openPopover:b})})]})}import{useEffect as Mr,useRef as Tr}from"react";import{createPortal as Ar}from"react-dom";import{autoPlacement as wr,autoUpdate as br,detectOverflow as xr,hide as Er,offset as Cr,useFloating as Dr}from"@floating-ui/react-dom";var kr=32,tt=32,rt=16;function nt({anchor:e}){let t={name:"preventViewportOverflow",async fn(a){let o=await xr(a),i=a.x;o.left>0&&(i=a.x+o.left+tt),o.right>0&&(i=a.x-o.right-tt);let d=a.y;return o.top>0&&(d=a.y+o.top+rt),o.bottom>0&&(d=a.y-o.bottom-rt),a.middlewareData.hide?.referenceHidden?{...a,x:i}:{...a,x:i,y:d}}},{refs:r,floatingStyles:n}=Dr({elements:{reference:e},placement:"bottom",strategy:"fixed",whileElementsMounted:br,middleware:[Er(),Cr(8),wr({crossAxis:!0,padding:kr}),t]});return{refs:r,floatingStyles:n}}import{jsx as at}from"react/jsx-runtime";function ot({anchor:e,zIndex:t,children:r}){let n=Tr({}),{refs:a,floatingStyles:o}=nt({anchor:e});return Mr(()=>{setTimeout(()=>{n.current={transitionDuration:"250ms",transitionProperty:"all"}},100)},[]),Ar(at("div",{ref:a.setFloating,style:{...o,...n.current,zIndex:t},children:at("div",{onClick:i=>i.stopPropagation(),children:r})}),document.body)}import{jsx as Pr}from"react/jsx-runtime";function se({anchor:e,isOpen:t,zIndex:r=1,children:n}){return!t||!e?null:Pr(ot,{anchor:e,zIndex:r,children:n})}import Rr from"dayjs";import{useRef as Sr}from"react";import{jsx as Or,jsxs as it}from"react/jsx-runtime";function ce({date:e,dispatch:t,isCompact:r,numOverflowEvents:n,state:a}){let o=Sr(null),i=d=>{a.overflowIsOpen&&d.target===a.overflowAnchor?t({type:"reset_calendar"}):t({type:"open_overflow",date:e,anchor:o.current})};if(n)return it("div",{className:"events-calendar-show-more-text-container","data-sm":r,"data-date":e.format("DD-MMM-YYYY"),onClick:i,onMouseDown:d=>d.stopPropagation(),ref:o,children:[Or("span",{className:"events-calendar-show-more-text-label events-calendar-sm-only",children:`+${n}`}),it("span",{className:"events-calendar-show-more-text-label events-calendar-lg-only",children:[n," more"]})]})}import{jsx as xe,jsxs as jr}from"react/jsx-runtime";function dt({dayRecord:e,dispatch:t,isCompact:r,numOverflowEvents:n,state:a}){let{date:o,isCurrentMonth:i}=e,d=o.isSame(Rr(),"day");return jr("div",{className:"events-calendar-month-cell-header",children:[xe("div",{className:"events-calendar-month-cell-date-container","data-today":d,children:xe("span",{className:"events-calendar-month-cell-date-label","data-color":d?"white":i?"dark":"dim","data-sm":r,children:o.date()})}),xe(ce,{date:o,dispatch:t,isCompact:r,numOverflowEvents:n,state:a})]})}import{Fragment as _r,jsx as me,jsxs as lt}from"react/jsx-runtime";var Nr=(e,t,r=!1)=>{let{isActive:n,isAllDay:a,start:o,end:i}=e;return n&&(!r||a)&&z(t,o,i)&&(t.day()===0||t.isSame(o,"day"))};function pe({EVENT_LIMIT:e,enableRescheduling:t,compact:r,dayRecord:n,dispatch:a,handleMouseEvent:o,headerHeight:i="100%",isInWeekHeader:d=!1,isInDayHeader:l=!1,minMaxDatesInView:s,onEventClick:p,onEventReschedule:v,orderedEvents:c,placeholderRef:f,renderContextMenu:g,state:m}){let{date:u}=n,h=P(c,u),w=Ie(h,u,e,l),b=h.reduce((E,j)=>E+(j.order>=e?1:0),0),x=(l||d)&&b>0;Nr(m.placeholderEvent,u,d||l)&&w.push(m.placeholderEvent);let C=()=>a({type:"open_popover"}),D=()=>a({type:"reset_calendar"}),k=E=>{o(E,u,!1,f)},A=E=>{m.eventDragActive&&ae({state:m,dispatch:a,date:u,view:"month"}),o(E,u,!1,f)},S=E=>{m.eventDragActive&&(a({type:"event_reschedule_end",anchor:f.current}),v?.({clickedEvent:m.clickedEvent,newEvent:m.placeholderEvent,eventRef:f.current,openPopover:C,reset:D})),o(E,u,!1,f)};return lt(_r,{children:[lt("div",{className:"events-calendar-month-cell","data-border":!l&&u.day()!==6,onMouseDown:k,onMouseEnter:A,onMouseUp:S,style:{height:i,cursor:m.eventDragActive?"grabbing":"auto"},children:[!d&&!l&&me(dt,{state:m,dispatch:a,isCompact:r,dayRecord:n,numOverflowEvents:b}),me("div",{className:"events-calendar-month-cell-content","data-week":d||l,children:x&&me(ce,{date:u,state:m,dispatch:a,isCompact:r,numOverflowEvents:b})})]}),w.map(E=>me(L,{date:u,view:"month",state:m,event:E,compact:r,dispatch:a,onEventClick:p,isInDayHeader:l,isInWeekHeader:d,placeholderRef:f,renderContextMenu:g,minMaxDatesInView:s,enableRescheduling:t},E.id))]})}import{jsx as st}from"react/jsx-runtime";function ct({visible:e}){if(e)return st("div",{className:"events-calendar-loader-wrapper",children:st("span",{className:"events-calendar-loader"})})}import{jsx as zr}from"react/jsx-runtime";function Y({isGroupButton:e,active:t=!1,onClick:r=()=>null,variant:n,children:a}){return zr("button",{type:"button",onClick:r,"data-group":e,"data-active":t,"data-variant":n,className:"events-calendar-header-button",children:a})}import{jsx as mt,jsxs as Vr}from"react/jsx-runtime";function pt({hideViewToggle:e,views:t,setView:r,view:n,children:a}){if(t.length<1&&!a)return;let o=_.filter(i=>t.includes(i));return Vr("div",{className:"events-calendar-header-controls",children:[!e&&o.length>1&&mt("div",{className:"events-calendar-button-group",children:o.map(i=>mt(Y,{isGroupButton:!0,active:n===i,onClick:()=>r(i),children:i},i))}),a]})}import Br from"dayjs";import{jsx as vt,jsxs as Ir}from"react/jsx-runtime";function ft({size:e="24",stroke:t="2"}){return Ir("svg",{xmlns:"http://www.w3.org/2000/svg",width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:t,strokeLinecap:"round",strokeLinejoin:"round",className:"icon icon-tabler icons-tabler-outline icon-tabler-chevron-left",children:[vt("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),vt("path",{d:"M15 6l-6 6l6 6"})]})}import{jsx as ut,jsxs as Hr}from"react/jsx-runtime";function ht({size:e="24",stroke:t="2"}){return Hr("svg",{xmlns:"http://www.w3.org/2000/svg",width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:t,strokeLinecap:"round",strokeLinejoin:"round",className:"icon icon-tabler icons-tabler-outline icon-tabler-chevron-right",children:[ut("path",{stroke:"none",d:"M0 0h24v24H0z",fill:"none"}),ut("path",{d:"M9 6l6 6l-6 6"})]})}import{jsx as $,jsxs as gt}from"react/jsx-runtime";var Lr=(e,t)=>{let r=e.startOf("week"),n=e.endOf("week");return t==="year"?e.format("YYYY"):t==="month"?e.format("MMMM YYYY"):t==="week"?`${r.format("MMM DD")} - ${n.format("MMM DD, YYYY")}`:e.format("D MMMM, YYYY")};function yt({activeDate:e,setActiveDate:t,view:r}){let n=()=>t(Br()),a=i=>t(d=>d.add(1,i)),o=i=>t(d=>d.subtract(1,i));return gt("div",{className:"events-calendar-nav",children:[$(Y,{variant:"outline",onClick:n,children:"Today"}),gt("div",{className:"events-calendar-nav-actions",children:[$(Y,{variant:"subtle",onClick:()=>o(r),children:$(ft,{size:"1.5rem"})}),$(Y,{variant:"subtle",onClick:()=>a(r),children:$(ht,{size:"1.5rem"})})]}),$("span",{className:"events-calendar-title",children:Lr(e,r)})]})}import{jsx as wt,jsxs as Yr}from"react/jsx-runtime";function bt({activeDate:e,onClick:t=()=>null,hideViewToggle:r,setActiveDate:n,setView:a=()=>null,views:o=[..._],view:i="month",customControls:d}){return Yr("div",{className:"events-calendar-header",onClick:t,children:[wt(yt,{activeDate:e,setActiveDate:n,view:i}),wt(pt,{hideViewToggle:r,views:o,setView:a,view:i,children:d})]})}import{useMemo as Rt}from"react";import{jsx as Ee}from"react/jsx-runtime";function xt(){return Ee("div",{className:"events-calendar-hours-column",children:Ne.map(e=>Ee("div",{className:"events-calendar-hour",children:Ee("span",{className:"events-calendar-hour-label",children:e})},e))})}import $r from"dayjs";import{jsx as Et,jsxs as Wr}from"react/jsx-runtime";var ve=$r();function Ct({activeDate:e,isDayView:t}){if(!e.isSame(ve,"day"))return;let r=t?1:ve.day()+1,n=ve.hour()*4+Math.round(ve.minute()/15)+1;return Wr("div",{className:"events-calendar-time-indicator",style:{gridColumn:r,gridRow:n},children:[Et("div",{className:"events-calendar-time-indicator-dot"}),Et("div",{className:"events-calendar-time-indicator-line"})]})}import{Fragment as Ur,jsx as Dt}from"react/jsx-runtime";var Ce=e=>Array(e).fill(0).map((t,r)=>r),Fr=(e,t,r,n,a)=>(a==="day"?e:e.startOf("week").add(t,"d")).hour(r).minute(n*15);function kt({view:e,activeDate:t,handleMouseEvent:r,placeholderRef:n,state:a,dispatch:o,onEventReschedule:i}){let d=e==="day"?[0]:Ce(7),l=Ce(24),s=Ce(4),p=()=>o({type:"open_popover"}),v=()=>o({type:"reset_calendar"});return Dt(Ur,{children:d.map(c=>l.map(f=>s.map(g=>{let m=Fr(t,c,f,g,e);return Dt("div",{className:"events-calendar-time-background-cell","data-isweekview":e==="week",onMouseDown:u=>r(u,m,!0,n),onMouseEnter:u=>{a.eventDragActive&&ae({state:a,dispatch:o,date:m,view:e}),r(u,m,!0,n)},onMouseUp:u=>{a.eventDragActive&&(o({type:"event_reschedule_end",anchor:n.current}),i?.({clickedEvent:a.clickedEvent,newEvent:a.placeholderEvent,eventRef:n.current,openPopover:p,reset:v})),r(u,m,!0,n)},style:{gridColumnStart:c+1,gridRow:`${f*4+g+1} / ${f*4+g+2}`,cursor:a.eventDragActive?"grabbing":"auto"}},`${c}${f}${g}`)})))})}import Gr from"dayjs";import{jsx as De,jsxs as Jr}from"react/jsx-runtime";var Mt=2;function Tt({view:e,enableRescheduling:t,compact:r,allDayEvents:n,dispatch:a,handleMouseEvent:o,handleStopDrag:i,minMaxDatesInView:d,onEventClick:l,onEventReschedule:s,placeholderRef:p,renderContextMenu:v,state:c,weekDatesArray:f}){let g=e==="day"?P(n,f[0].date):oe(n,f[0].date),m=I(g),u=m.length>0?Math.max(...m.map(y=>y.order+1)):0,h=Math.min(u,Mt+1),w=r?20:23,b=h>0?8:0,x=w*h+b;return De("div",{className:"events-calendar-time-view-header","data-isweekview":e==="week",onMouseLeave:i,children:f.map((y,C)=>{let{date:D}=y,k=e==="week"||g.length>0;return Jr("div",{className:"events-calendar-time-view-header-cell","data-border":k,children:[e==="week"&&De("div",{className:"events-calendar-time-view-header-label","data-today":D.isSame(Gr(),"day"),onMouseEnter:i,children:`${D.format("ddd")} ${D.format("DD")}`}),De(pe,{isInDayHeader:e==="day",isInWeekHeader:e==="week",EVENT_LIMIT:Mt,enableRescheduling:t,compact:r,dayRecord:y,dispatch:a,handleMouseEvent:o,headerHeight:x,minMaxDatesInView:d,onEventClick:l,onEventReschedule:s,orderedEvents:m,placeholderRef:p,renderContextMenu:v,state:c})]},C)})})}import At from"dayjs";import{useEffect as Xr,useRef as Zr}from"react";var qr=48,Kr=60,Qr=At().diff(At().startOf("day"),"m"),en=qr/Kr;function Pt({minutesToScroll:e=Qr,offset:t=140}={}){let r=Zr(null);return Xr(()=>{if(!r.current)return;let n=en*e-t;r.current.scrollTo({top:n})},[e,t]),r}var St=(e,t)=>{if(t==="day")return[{date:e}];let r=e.startOf("week"),a=r.subtract(r.day(),"d"),o=[];for(let i=0;i<7;i++)o.push({date:a,isCurrentMonth:a.month()===e.month()}),a=a.add(1,"day");return o};function Ot(e,t){return e.reduce((r,n,a)=>({...r,[a]:Be(P(t,n.date),n.date)}),{})}import{jsx as W,jsxs as ke}from"react/jsx-runtime";function jt({view:e,activeDate:t,compact:r,dispatch:n,enableRescheduling:a,events:o,handleMouseEvent:i,handleStopDrag:d,onEventClick:l,onEventReschedule:s,placeholderRef:p,renderContextMenu:v,state:c}){let f=e==="day",g=e==="week",m=o.filter(y=>y.isAllDay),u=o.filter(y=>!y.isAllDay),h=Pt(),w=Rt(()=>St(t,e),[t,e]),b={first:f?t:w[0].date,last:f?t:w[6].date},x=Rt(()=>Ot(w,u),[u,w]);return ke("div",{className:"events-calendar-time-view",children:[W(Tt,{allDayEvents:m,compact:r,dispatch:n,enableRescheduling:a,handleMouseEvent:i,handleStopDrag:d,minMaxDatesInView:b,onEventClick:l,onEventReschedule:s,placeholderRef:p,renderContextMenu:v,state:c,view:e,weekDatesArray:w}),W("div",{ref:h,className:"events-calendar-time-view-scroll-wrapper",children:ke("div",{className:"events-calendar-time-view-grid-wrapper",children:[W(xt,{}),ke("div",{className:"events-calendar-time-view-grid","data-isweekview":g,onMouseEnter:d,onMouseLeave:d,children:[W(kt,{activeDate:t,dispatch:n,handleMouseEvent:i,onEventReschedule:s,placeholderRef:p,state:c,view:e}),W(Ct,{activeDate:t,isDayView:f}),w.map(({date:y},C)=>{let D=x[C],{isActive:k,isAllDay:A,start:S,end:E}=c.placeholderEvent;return k&&!A&&z(y,S,E)&&D.push(c.placeholderEvent),D.map(N=>W(L,{date:y,dispatch:n,enableRescheduling:a,event:N,onEventClick:l,placeholderRef:p,renderContextMenu:v,state:c,view:e},N.id))})]})]})})]})}import{useRef as tn}from"react";import{jsx as rn}from"react/jsx-runtime";function Nt({date:e,handleClick:t,isToday:r,isDimmed:n,isActive:a}){let o=tn(null);return rn("div",{ref:o,"data-date":e.format("DD-MMM-YYYY"),className:"events-calendar-year-view-month-date","data-today":r,"data-dimmed":n,"data-active":a,onMouseDown:i=>i.stopPropagation(),onClick:i=>t(i,e,o),children:e.format("D")})}import nn from"dayjs";function _t(e,t){let r={},n=new Set;t.forEach(({start:o,end:i})=>{let d=o.clone().startOf("day"),l=i.clone().startOf("day");for(;d.isBefore(l,"day")||d.isSame(l,"day");)n.add(d.format("YYYY-MM-DD")),d=d.add(1,"day")});let a=e.startOf("year");return re.forEach((o,i)=>{let d=a.clone().day(0),l=Array.from({length:42},(s,p)=>{let v=d.clone().add(p,"day"),c=v.isSame(nn(),"day"),f=a.isSame(v,"month"),g=f&&n.has(v.format("YYYY-MM-DD"));return{date:v,isToday:c,isActive:g,isCurrentMonth:f}});r[o]=l,a=a.month(i+1)}),r}import{jsx as q,jsxs as zt}from"react/jsx-runtime";function Vt({activeDate:e,dispatch:t,events:r,state:n}){let a=_t(e,r),o=()=>t({type:"reset_calendar"}),i=(d,l,s)=>{n.overflowIsOpen&&d.target===n.overflowAnchor?t({type:"reset_calendar"}):t({type:"open_overflow",date:l,anchor:s.current})};return q("div",{className:"events-calendar-year-view-scroll-wrapper",children:q("div",{className:"events-calendar-year-view",onMouseDown:o,children:re.map(d=>zt("div",{className:"events-calendar-year-view-month",children:[q("div",{className:"events-calendar-year-view-month-label",children:d}),zt("div",{className:"events-calendar-year-view-month-dates",children:[Re.map((l,s)=>q("div",{className:"events-calendar-year-view-month-header",children:l},`${d}-${s}`)),a[d].map(({date:l,isToday:s,isCurrentMonth:p,isActive:v},c)=>q(Nt,{date:l,handleClick:i,isToday:s,isActive:v,isDimmed:!p},c))]})]},d))})})}import{useMemo as $t}from"react";import{jsx as It}from"react/jsx-runtime";var an=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];function Ht({isCompact:e}){return It("div",{className:"events-calendar-month-header","data-sm":e,children:an.map((t,r)=>It("div",{className:"events-calendar-month-header-cell",children:t},r))})}var Bt=(e,t)=>{if(e===0)return 0;let r=2,n=8,a=26,o=t?18:20;return Math.max(Math.floor((e-a-n)/(o+r)),0)};var Lt=e=>{let t=e.startOf("month").day(0),r=t,n=e.add(1,"month").month(),a=[],o=[],i=1;for(;r.subtract(r.day(),"d").month()!==n;)a.push({date:r,isCurrentMonth:r.month()===e.month()}),i===7&&(o.push(a),a=[],i=0),i++,r=r.add(1,"day");return{weeks:o,first:t,last:r}};function Yt(e,t){return e.reduce((r,n,a)=>({...r,[a]:I(oe(t,n[0].date))}),{})}import{jsx as fe,jsxs as on}from"react/jsx-runtime";var Wt=process.env.NODE_ENV==="test";function Ft({enableRescheduling:e,compact:t,activeDate:r,dispatch:n,events:a,handleMouseEvent:o,handleStopDrag:i,onEventClick:d,onEventReschedule:l,placeholderRef:s,renderContextMenu:p,state:v}){let c=$t(()=>Lt(r),[r]),f={first:c.first,last:c.last},{ref:g,height:m}=Ge(),u=Wt?100:m/c.weeks.length,h=Bt(u,t),w=$t(()=>Yt(c.weeks,a),[a,c.weeks]);return on("div",{className:"events-calendar-month-view",children:[fe(Ht,{isCompact:t}),fe("div",{className:"events-calendar-month-view-grid",onMouseLeave:i,ref:g,children:c.weeks.map((b,x)=>{let y=Wt||m>0?w[x]:[];return fe("div",{className:"events-calendar-month-view-row",children:b.map((C,D)=>fe(pe,{EVENT_LIMIT:h,enableRescheduling:e,compact:t,dayRecord:C,dispatch:n,handleMouseEvent:o,isInWeekHeader:!1,minMaxDatesInView:f,onEventClick:d,onEventReschedule:l,orderedEvents:y,placeholderRef:s,renderContextMenu:p,state:v},D))},x)})})]})}import dn from"dayjs";import{Fragment as sn,jsx as F,jsxs as cn}from"react/jsx-runtime";var ln=e=>e?dn(e):void 0;function Me({compact:e,dispatch:t,events:r,onEventClick:n,placeholderRef:a,renderContextMenu:o,state:i,enableRescheduling:d,zIndex:l}){let s=ln(i.overflowAnchor?.dataset.date);if(!s||!i.overflowAnchor)return F(sn,{});let p=I(P(r,s));return F(se,{zIndex:l,anchor:i.overflowAnchor,isOpen:i.overflowIsOpen,children:cn("div",{className:"events-calendar-overflow-card",children:[F("span",{className:"events-calendar-overflow-card-label",children:s.format("dddd, MMMM D")}),!p.length&&F("div",{className:"events-calendar-overflow-card-text",children:"No events scheduled for this date"}),F("div",{className:"events-calendar-overflow-card-content",children:p.map(v=>F(L,{view:"month",isInOverflow:!0,enableRescheduling:d,compact:e,date:s,dispatch:t,event:v,onEventClick:n,placeholderRef:a,renderContextMenu:o,state:i},v.id))})]})})}import{jsx as R,jsxs as Gt}from"react/jsx-runtime";function hl({calendar:e,compact:t=!1,enableDragCreation:r=!1,enableRescheduling:n=!1,events:a=[],overflowPopoverZIndex:o=2,popoverZIndex:i=101,isFetching:d=!1,noHeader:l=!1,onEventClick:s,onEventCreate:p,onEventReschedule:v,renderPopover:c,renderContextMenu:f,views:g=[..._]}){let{activeDate:m,setActiveDate:u,view:h,setView:w,state:b,dispatch:x}=Qe(e),y=Ut(()=>Ve(a),[a]),C=Ut(()=>ze(y,m,h),[y,m,h]),k=h==="week"||h==="day"?C.filter(M=>M.isAllDay):C,{eventAnchor:A,dragActive:S,eventDragActive:E,popoverIsOpen:j,clickedEvent:N,placeholderEvent:U}=b,G=()=>x({type:"reset_calendar"}),J=()=>{(S||E)&&x({type:"event_create_stop"})},X=mn(null),ue=Fe({enableDragCreation:r,dispatch:x,state:b,onEventCreate:p}),K={activeDate:m,dispatch:x,state:b,events:C},Q={...K,compact:t,onEventClick:s,handleStopDrag:J,placeholderRef:X,handleMouseEvent:ue,onEventReschedule:v,renderContextMenu:f,enableRescheduling:n};return Gt("div",{className:"events-calendar-wrapper",children:[l?null:R(bt,{view:h,setActiveDate:u,setView:w,activeDate:m,views:g}),Gt("div",{className:"events-calendar","data-withheader":!l,onClick:M=>M.stopPropagation(),children:[R(ct,{visible:d}),(()=>{switch(h){case"year":return R(Vt,{...K});case"month":return R(Ft,{...Q});case"week":case"day":return R(jt,{...Q,view:h});default:return null}})(),c&&A&&R(se,{isOpen:j,anchor:A,zIndex:i,children:c({onClose:G,clickedEvent:N,newEvent:U})}),R(Me,{state:b,compact:t,dispatch:x,events:k,onEventClick:s,placeholderRef:X,renderContextMenu:f,enableRescheduling:n,zIndex:o})]})]})}export{_ as CALENDAR_VIEWS,je as DAYS_IN_FULL_MONTH,Re as DAY_LABELS_SHORT,ne as DEFAULT_COLOR,hl as EventsCalendar,Ne as HOURS,bt as Header,re as MONTHS,I as arrangeWeekEvents,Be as arrangeWeekdayEvents,ta as createDayjsObjFromTime,P as filterByDate,ze as filterByView,oe as filterByWeek,H as getBackgroundFromGroups,le as getPlaceholderEvent,O as getTimeDiff,_e as getTimeLabel,Ie as getVisibleEvents,V as hasOverlap,z as isBetween,Ve as parseRawEvents,de as returnValidStartEnd,te as setTime,ae as updateEvent,Ke as useEventsCalendar};
//# sourceMappingURL=index.mjs.map