@innosolutions/inno-calendar 1.0.40 → 1.0.41

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.
@@ -1 +1 @@
1
- {"version":3,"file":"week-all-day-row.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/week-all-day-row.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAkC,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAuBrE,MAAM,WAAW,kBAAkB,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,8CAA8C;IAC9C,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,4EAA4E;IAC5E,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gEAAgE;IAChE,YAAY,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAChD;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;QACxB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;KACpB,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAC7B,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA8SD,wBAAgB,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC9D,MAAM,EACN,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,cAAsB,EACtB,aAAa,EACb,SAAS,GACT,EAAE,kBAAkB,CAAC,KAAK,CAAC,kDAsI3B;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"week-all-day-row.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/week-all-day-row.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAkC,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAuBrE,MAAM,WAAW,kBAAkB,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,8CAA8C;IAC9C,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,4EAA4E;IAC5E,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gEAAgE;IAChE,YAAY,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAChD;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;QACvB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAC7B,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8SD,wBAAgB,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC7D,MAAM,EACN,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,cAAsB,EACtB,aAAa,EACb,SAAS,GACV,EAAE,kBAAkB,CAAC,KAAK,CAAC,kDAsI3B;AAED,eAAe,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/date-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/date-utils.ts"],"names":[],"mappings":"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"}
package/dist/utils.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const te=["day","week","month","year","agenda","resource-day","resource-week","timeline-day","timeline-week"],ne={startHour:8,endHour:18,firstDayOfWeek:1,slotDuration:30,showWeekends:!0,timeFormat:"24h",badgeVariant:"colored",showCanceledEvents:!1},re={startHour:0,endHour:24},oe={startHour:8,endHour:18},ae={day:{type:"day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},week:{type:"week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",dayMaxEventRows:3,allDaySlot:!0},month:{type:"month",dayMaxEventRows:4,eventMaxStack:3,allDaySlot:!1},year:{type:"year",dayMaxEventRows:2,allDaySlot:!1},agenda:{type:"agenda",allDaySlot:!1},"resource-day":{type:"resource-day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"resource-week":{type:"resource-week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"timeline-day":{type:"timeline-day",slotDuration:"01:00:00"},"timeline-3day":{type:"timeline-3day",slotDuration:"01:00:00"},"timeline-week":{type:"timeline-week",slotDuration:"01:00:00"}},se={blue:"#3b82f6",green:"#22c55e",red:"#ef4444",yellow:"#eab308",purple:"#a855f7",orange:"#f97316",pink:"#ec4899",teal:"#14b8a6",gray:"#6b7280",indigo:"#6366f1"},ue={blue:{bg:"bg-blue-100",text:"text-blue-800",border:"border-blue-300"},green:{bg:"bg-green-100",text:"text-green-800",border:"border-green-300"},red:{bg:"bg-red-100",text:"text-red-800",border:"border-red-300"},yellow:{bg:"bg-yellow-100",text:"text-yellow-800",border:"border-yellow-300"},purple:{bg:"bg-purple-100",text:"text-purple-800",border:"border-purple-300"},orange:{bg:"bg-orange-100",text:"text-orange-800",border:"border-orange-300"},pink:{bg:"bg-pink-100",text:"text-pink-800",border:"border-pink-300"},teal:{bg:"bg-teal-100",text:"text-teal-800",border:"border-teal-300"},gray:{bg:"bg-gray-100",text:"text-gray-800",border:"border-gray-300"},indigo:{bg:"bg-indigo-100",text:"text-indigo-800",border:"border-indigo-300"}},ie={"#3b82f6":"blue","#22c55e":"green","#ef4444":"red","#eab308":"yellow","#a855f7":"purple","#f97316":"orange","#ec4899":"pink","#14b8a6":"teal","#6b7280":"gray","#6366f1":"indigo"},ce=24,le=60,L=60*1e3,Y=60*L,ge=24*Y,I=64,fe=32,de=56,De=200,B=20;function f(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function T(e){const t=new Date(e);return t.setHours(23,59,59,999),t}function c(e,t){const n=new Date(e);return n.setDate(n.getDate()+t),n}function me(e,t){return c(e,-t)}function h(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function C(e){return h(e,new Date)}function ye(e){return e.getDay()}function x(e){const t=e.getDay();return t===0||t===6}function D(e,t=1){const n=new Date(e),r=n.getDay(),o=(r<t?7:0)+r-t;return n.setDate(n.getDate()-o),n.setHours(0,0,0,0),n}function p(e,t=1){const n=D(e,t);return n.setDate(n.getDate()+6),n.setHours(23,59,59,999),n}function b(e,t){return c(e,t*7)}function he(e,t){return c(e,-t*7)}function Ee(e){const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),n=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-n);const r=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-r.getTime())/864e5+1)/7)}function Te(e,t,n=1){const r=D(e,n),o=D(t,n);return h(r,o)}function S(e){const t=new Date(e);return t.setDate(1),t.setHours(0,0,0,0),t}function M(e){const t=new Date(e.getFullYear(),e.getMonth()+1,0);return t.setHours(23,59,59,999),t}function k(e,t){const n=new Date(e);return n.setMonth(n.getMonth()+t),n}function pe(e,t){return k(e,-t)}function Se(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function _(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()}function U(e){return new Date(e.getFullYear(),0,1,0,0,0,0)}function N(e){return new Date(e.getFullYear(),11,31,23,59,59,999)}function v(e,t){const n=new Date(e);return n.setFullYear(n.getFullYear()+t),n}function Me(e,t){return v(e,-t)}function we(e,t){return e.getFullYear()===t.getFullYear()}function V(e,t){const n=new Date(e);return n.setHours(n.getHours()+t),n}function He(e,t){const n=new Date(e);return n.setMinutes(n.getMinutes()+t),n}function be(e,t,n=0,r=0){const o=new Date(e);return o.setHours(t,n,r,0),o}function Ie(e){return e.getHours()+e.getMinutes()/60}function ke(e,t){return e.getTime()<t.getTime()}function Oe(e,t){return e.getTime()>t.getTime()}function _e(e,t,n){const r=e.getTime();return r>=t.getTime()&&r<=n.getTime()}function ve(e){if(e.length!==0)return e.reduce((t,n)=>n<t?n:t)}function Fe(e){if(e.length!==0)return e.reduce((t,n)=>n>t?n:t)}function F(e,t){return e.getTime()-t.getTime()}function Re(e,t){return Math.floor(F(e,t)/6e4)}function Ae(e,t){return Math.floor(F(e,t)/36e5)}function Ce(e,t){const n=f(e),r=f(t);return Math.floor(F(n,r)/864e5)}function H(e,t="24h"){const n=e.getHours(),r=e.getMinutes();if(t==="12h"){const o=n>=12?"PM":"AM";return`${n%12||12}:${r.toString().padStart(2,"0")} ${o}`}return`${n.toString().padStart(2,"0")}:${r.toString().padStart(2,"0")}`}function xe(e){const t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),r=e.getDate().toString().padStart(2,"0");return`${t}-${n}-${r}`}function Ue(e){return new Date(e)}function P(e,t){const n=[];let r=f(e);const o=f(t);for(;r<=o;)n.push(new Date(r)),r=c(r,1);return n}function We(e,t){const n=[];let r=new Date(e);for(;r<=t;)n.push(new Date(r)),r=V(r,1);return n}function $e(e="en-US",t="short"){const n=new Intl.DateTimeFormat(e,{weekday:t}),r=[],o=new Date(2024,0,7);for(let a=0;a<7;a++)r.push(n.format(c(o,a)));return r}function Le(e="en-US",t="long"){const n=new Intl.DateTimeFormat(e,{month:t}),r=[];for(let o=0;o<12;o++)r.push(n.format(new Date(2024,o,1)));return r}function Ye(e){const t=[];for(let n=e.startHour;n<=e.endHour;n++)t.push(n);return t}function Be(e,t="24h"){if(t==="12h"){const n=e>=12?"PM":"AM";return`${e%12||12} ${n}`}return`${String(e).padStart(2,"0")}:00`}function Ne(e,t=1){const n=D(e,t),r=[];for(let o=0;o<7;o++)r.push(c(n,o));return r}function Ve(e,t=1){const n=S(e),r=M(e),o=D(n,t),a=p(r,t),s=e.getMonth();return P(o,a).map(l=>({date:l,isCurrentMonth:l.getMonth()===s,isWeekend:l.getDay()===0||l.getDay()===6}))}function R(e){if(e.isAllDay)return!0;const t=e.startDate.getHours(),n=e.startDate.getMinutes(),r=e.endDate.getHours(),o=e.endDate.getMinutes(),a=t===0&&n===0,s=r===0&&o===0||r===23&&o>=59;return!!(a&&s)}function Pe(e){const t=[],n=[];for(const r of e)R(r)?n.push(r):h(r.startDate,r.endDate)?t.push(r):n.push(r);return{singleDay:t,multiDay:n}}function Ge(e,t,n){return e.filter(r=>r.startDate<=n&&r.endDate>=t)}function ze(e,t,n){if(!n)return!0;const r=e.getDay(),o=n[r];return!o||!(o.enabled!==!1)||o.from===o.to?!1:t>=o.from&&t<o.to}function Xe(e,t){const n=e.getDay(),r=t[n];return!r||!(r.enabled!==!1)||r.from===r.to?null:{from:r.from,to:r.to}}function je(e){const t=[];for(let n=0;n<12;n++)t.push(new Date(e,n,1));return t}function G(e,t,n){const r=f(t),o=T(n);return e.filter(a=>{const s=a.startDate,u=a.endDate;return s<=o&&u>=r})}function z(e,t){return t.length===0?e:e.filter(n=>n.scheduleTypeId!==void 0&&t.includes(n.scheduleTypeId))}function X(e,t){return t.length===0?e:e.filter(n=>n.resourceId!==void 0&&t.includes(n.resourceId))}function j(e,t){if(!t.trim())return e;const n=t.toLowerCase();return e.filter(r=>{const o=r.title.toLowerCase().includes(n),a=r.description?.toLowerCase().includes(n);return o||a})}function J(e){return e.filter(t=>!t.isCanceled)}function Je(e,t){let n=[...e];return t.dateRange&&(n=G(n,t.dateRange.startDate,t.dateRange.endDate)),t.scheduleTypeIds&&t.scheduleTypeIds.length>0&&(n=z(n,t.scheduleTypeIds)),t.resourceIds&&t.resourceIds.length>0&&(n=X(n,t.resourceIds)),t.search&&(n=j(n,t.search)),t.showCanceled||(n=J(n)),n}function Ke(e){return[...e].sort((t,n)=>t.startDate.getTime()-n.startDate.getTime())}function qe(e){return[...e].sort((t,n)=>t.endDate.getTime()-n.endDate.getTime())}function Qe(e){return[...e].sort((t,n)=>{const r=t.endDate.getTime()-t.startDate.getTime();return n.endDate.getTime()-n.startDate.getTime()-r})}function Ze(e){const t=new Map;for(const n of e){const r=f(n.startDate).toISOString(),o=t.get(r)??[];o.push(n),t.set(r,o)}return t}function et(e){const t=new Map;for(const n of e){const r=t.get(n.scheduleTypeId)??[];r.push(n),t.set(n.scheduleTypeId,r)}return t}function tt(e){const t=new Map;for(const n of e){const r=t.get(n.resourceId)??[];r.push(n),t.set(n.resourceId,r)}return t}function nt(e,t){return e.filter(n=>{const r=f(t),o=T(t);return n.startDate<=o&&n.endDate>=r})}function rt(e){return e.filter(t=>t.isAllDay)}function ot(e){return e.filter(t=>!t.isAllDay)}function at(e){return e.filter(t=>t.isMultiDay?!0:!h(t.startDate,t.endDate))}function st(e){return e.isMultiDay?!0:!h(e.startDate,e.endDate)}function ut(e){return Math.floor((e.endDate.getTime()-e.startDate.getTime())/6e4)}function it(e,t="blue"){return e.color??t}function ct(e,t,n="blue"){if(e.color)return e.color;if(e.scheduleTypeId!==void 0&&t){const r=t.get(e.scheduleTypeId);if(r)return r}return n}function lt(e){if(R(e)){if(h(e.startDate,e.endDate))return"All day";const n=e.startDate.toLocaleDateString(void 0,{month:"short",day:"numeric"}),r=e.endDate.toLocaleDateString(void 0,{month:"short",day:"numeric"});return`All day · ${n} – ${r}`}if(!h(e.startDate,e.endDate)){const n=e.startDate.toLocaleDateString(void 0,{month:"short",day:"numeric"}),r=e.endDate.toLocaleDateString(void 0,{month:"short",day:"numeric"});return`${n}, ${H(e.startDate)} – ${r}, ${H(e.endDate)}`}return`${H(e.startDate)} - ${H(e.endDate)}`}function gt(e){return!R(e)}function K(e,t,n=1){switch(t){case"day":case"resource-day":case"timeline-day":return{startDate:f(e),endDate:T(e)};case"week":case"resource-week":case"timeline-week":return{startDate:D(e,n),endDate:p(e,n)};case"month":{const r=S(e),o=M(e);return{startDate:D(r,n),endDate:p(o,n)}}case"timeline-3day":return{startDate:f(e),endDate:T(c(e,2))};case"year":return{startDate:U(e),endDate:N(e)};case"agenda":return{startDate:f(e),endDate:T(c(e,29))};default:return{startDate:f(e),endDate:T(e)}}}function ft(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,1);case"timeline-3day":return c(e,3);case"week":case"resource-week":case"timeline-week":return b(e,1);case"month":return k(e,1);case"year":return v(e,1);case"agenda":return b(e,1);default:return c(e,1)}}function dt(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,-1);case"timeline-3day":return c(e,-3);case"week":case"resource-week":case"timeline-week":return b(e,-1);case"month":return k(e,-1);case"year":return v(e,-1);case"agenda":return b(e,-1);default:return c(e,-1)}}function Dt(){return f(new Date)}function mt(e,t=1){const n=S(e),r=M(e),o=D(n,t),a=p(r,t),s=[];let u=o;for(;u<=a;)s.push({date:new Date(u),isToday:C(u),isCurrentMonth:_(u,e),isWeekend:x(u),dayOfWeek:u.getDay()}),u=c(u,1);return s}function yt(e,t=1){const n=D(e,t),r=[];for(let o=0;o<7;o++){const a=c(n,o);r.push({date:a,isToday:C(a),isCurrentMonth:_(a,e),isWeekend:x(a),dayOfWeek:a.getDay()})}return r}function ht(e){const t=U(e),n=[];for(let r=0;r<12;r++){const o=k(t,r);n.push({date:o,isToday:_(o,new Date),isCurrentMonth:!0,isWeekend:!1,dayOfWeek:o.getDay()})}return n}function Et(e,t,n=30){const r=[],o=60/n;for(let a=e;a<t;a++)for(let s=0;s<o;s++){const u=s*n;r.push({hour:a,minute:u,label:`${a.toString().padStart(2,"0")}:${u.toString().padStart(2,"0")}`})}return r}function Tt(e,t,n="24h"){const r=[];for(let o=e;o<=t;o++){let a;if(n==="12h"){const s=o>=12?"PM":"AM";a=`${o%12||12} ${s}`}else a=`${o.toString().padStart(2,"0")}:00`;r.push({hour:o,label:a})}return r}function pt(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:"short",month:"short",day:"numeric"}),o=new Intl.DateTimeFormat(n,{month:"short",day:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return r.format(e);case"timeline-3day":{const a=f(e),s=c(e,2);return`${o.format(a)} - ${o.format(s)}`}case"week":case"resource-week":case"timeline-week":{const a=D(e,1),s=p(e,1);return`${o.format(a)} - ${o.format(s)}`}case"month":{const a=S(e),s=M(e);return`${o.format(a)} - ${o.format(s)}`}case"year":return`Jan 1 - Dec 31, ${e.getFullYear()}`;case"agenda":{const a=S(e),s=M(e);return`${o.format(a)} - ${o.format(s)}`}default:return""}}function St(e,t,n,r=1){const o=K(t,n,r);return e.filter(a=>a.startDate<=o.endDate&&a.endDate>=o.startDate).length}function Mt(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{month:"long",year:"numeric"}),o=new Intl.DateTimeFormat(n,{weekday:"long",month:"long",day:"numeric",year:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return o.format(e);case"week":case"resource-week":case"timeline-week":{const a=D(e,1),s=p(e,1),u=new Intl.DateTimeFormat(n,{month:"short"}).format(a),l=new Intl.DateTimeFormat(n,{month:"short"}).format(s),i=a.getFullYear();return u===l?`${u} ${a.getDate()} - ${s.getDate()}, ${i}`:`${u} ${a.getDate()} - ${l} ${s.getDate()}, ${i}`}case"month":return r.format(e);case"year":return e.getFullYear().toString();case"agenda":return`Agenda - ${r.format(e)}`;default:return r.format(e)}}function wt(e=1,t="short",n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:t}),o=[],a=new Date(2024,0,7);for(let s=0;s<7;s++){const u=(e+s)%7,l=c(a,u);o.push({dayOfWeek:u,label:r.format(l)})}return o}function q(e,t,n,r=I){const{startHour:o,endHour:a}=n,s=a-o,u=s*r,l=e.startDate.getHours()+e.startDate.getMinutes()/60,i=e.endDate.getHours()+e.endDate.getMinutes()/60,d=Math.max(l,o),E=Math.min(i,a),m=(d-o)/s*u,y=(E-o)/s*u,g=Math.max(y-m,B);return{top:m,height:g,left:0,width:100,zIndex:1}}function Ht(e,t,n,r=I){if(e.length===0)return[];const o=[...e].sort((i,d)=>{const E=i.startDate.getTime()-d.startDate.getTime();if(E!==0)return E;const m=i.endDate.getTime()-i.startDate.getTime();return d.endDate.getTime()-d.startDate.getTime()-m}),a=[];let s=[],u=0;for(const i of o)s.length===0||i.startDate.getTime()<u?(s.push(i),u=Math.max(u,i.endDate.getTime())):(a.push(s),s=[i],u=i.endDate.getTime());s.length>0&&a.push(s);const l=[];for(const i of a){const d=[];for(const g of i){const Q=g.startDate.getTime(),Z=g.endDate.getTime();let w=-1;for(let O=0;O<d.length;O++){const A=d[O];if(!A)continue;const $=A[A.length-1];if($&&$.endTime<=Q){w=O;break}}w===-1&&(w=d.length,d.push([]));const W=d[w];W&&W.push({event:g,endTime:Z});const ee=q(g,t,n,r);l.push({event:g,position:ee,column:w,columnSpan:1})}const m=100/d.length,y=new Set(i.map(g=>g.id));for(const g of l)y.has(g.event.id)&&(g.position.left=g.column*m,g.position.width=m*g.columnSpan,g.position.zIndex=g.column+1)}return l}function bt(e,t,n,r=I,o=30){const{startHour:a,endHour:s}=n,u=s-a,l=u*r,i=e/l*u,E=(a+i)*60,m=Math.round(E/o)*o,y=new Date(t);return y.setHours(0,0,0,0),y.setMinutes(m),y}function It(e,t,n=I){const{startHour:r,endHour:o}=t,a=o-r,s=a*n,u=e.getHours()+e.getMinutes()/60;return(Math.max(r,Math.min(u,o))-r)/a*s}function kt(e,t){return e.startDate<t.endDate&&e.endDate>t.startDate}function Ot(e){if(e.length===0)return[];const t=[...e].sort((a,s)=>a.startDate.getTime()-s.startDate.getTime()),n=[];let r=[],o=0;for(const a of t)r.length===0||a.startDate.getTime()<o?(r.push(a),o=Math.max(o,a.endDate.getTime())):(r.length>0&&n.push(r),r=[a],o=a.endDate.getTime());return r.length>0&&n.push(r),n}function _t(e,t,n){const r=Math.max(0,Math.min(e,t)),o=Math.min(n,Math.max(e,t));return{top:r,height:o-r}}exports.CALENDAR_VIEWS=te;exports.DEFAULT_BUSINESS_HOURS=oe;exports.DEFAULT_HEADER_HEIGHT=de;exports.DEFAULT_HOUR_HEIGHT=I;exports.DEFAULT_PREFERENCES=ne;exports.DEFAULT_RESOURCE_WIDTH=De;exports.DEFAULT_SLOT_HEIGHT=fe;exports.DEFAULT_VIEW_CONFIGS=ae;exports.DEFAULT_VISIBLE_HOURS=re;exports.EVENT_COLORS=se;exports.EVENT_COLOR_CLASSES=ue;exports.HEX_TO_EVENT_COLOR=ie;exports.HOURS_IN_DAY=ce;exports.MINUTES_IN_HOUR=le;exports.MIN_EVENT_HEIGHT=B;exports.MS_PER_DAY=ge;exports.MS_PER_HOUR=Y;exports.MS_PER_MINUTE=L;exports.addDays=c;exports.addHours=V;exports.addMinutes=He;exports.addMonths=k;exports.addWeeks=b;exports.addYears=v;exports.applyEventFilters=Je;exports.calculateEventPosition=q;exports.calculateOverlappingPositions=Ht;exports.calculateSelectionOverlay=_t;exports.detectAllDayEvent=R;exports.differenceInDays=Ce;exports.differenceInHours=Ae;exports.differenceInMilliseconds=F;exports.differenceInMinutes=Re;exports.eachDayOfInterval=P;exports.eachHourOfInterval=We;exports.endOfDay=T;exports.endOfMonth=M;exports.endOfWeek=p;exports.endOfYear=N;exports.eventsOverlap=kt;exports.filterEventsByDateRange=G;exports.filterEventsByResource=X;exports.filterEventsByScheduleType=z;exports.filterEventsBySearch=j;exports.filterOutCanceled=J;exports.formatDateISO=xe;exports.formatEventTimeDisplay=lt;exports.formatHourLabel=Be;exports.formatTime=H;exports.generateHourLabels=Tt;exports.generateMonthCells=mt;exports.generateMonthGrid=Ve;exports.generateTimeSlots=Et;exports.generateWeekCells=yt;exports.generateYearCells=ht;exports.getAllDayEvents=rt;exports.getDayOfWeek=ye;exports.getDaysInMonth=Se;exports.getDecimalHours=Ie;exports.getEventColor=it;exports.getEventDurationMinutes=ut;exports.getEventsCountInView=St;exports.getEventsForDay=nt;exports.getEventsInRange=Ge;exports.getMonthNames=Le;exports.getMultiDayEvents=at;exports.getOverlappingGroups=Ot;exports.getRangeText=pt;exports.getTimedEvents=ot;exports.getViewDateRange=K;exports.getViewTitle=Mt;exports.getVisibleHoursArray=Ye;exports.getWeekDays=Ne;exports.getWeekNumber=Ee;exports.getWeekdayHeaders=wt;exports.getWeekdayNames=$e;exports.getWorkingHoursForDay=Xe;exports.getYearMonths=je;exports.groupEventsByDate=Ze;exports.groupEventsByResource=tt;exports.groupEventsByScheduleType=et;exports.isAfter=Oe;exports.isBefore=ke;exports.isBetween=_e;exports.isMultiDayEvent=st;exports.isSameDay=h;exports.isSameMonth=_;exports.isSameWeek=Te;exports.isSameYear=we;exports.isToday=C;exports.isWeekend=x;exports.isWorkingHour=ze;exports.maxDate=Fe;exports.minDate=ve;exports.navigateNext=ft;exports.navigatePrev=dt;exports.navigateToday=Dt;exports.parseISO=Ue;exports.resolveEventColor=ct;exports.separateEventsByDuration=Pe;exports.setTime=be;exports.shouldShowEventTime=gt;exports.sortEventsByDuration=Qe;exports.sortEventsByEnd=qe;exports.sortEventsByStart=Ke;exports.startOfDay=f;exports.startOfMonth=S;exports.startOfWeek=D;exports.startOfYear=U;exports.subDays=me;exports.subMonths=pe;exports.subWeeks=he;exports.subYears=Me;exports.timeToY=It;exports.yToTime=bt;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const te=["day","week","month","year","agenda","resource-day","resource-week","timeline-day","timeline-week"],ne={startHour:8,endHour:18,firstDayOfWeek:1,slotDuration:30,showWeekends:!0,timeFormat:"24h",badgeVariant:"colored",showCanceledEvents:!1},re={startHour:0,endHour:24},oe={startHour:8,endHour:18},ae={day:{type:"day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},week:{type:"week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",dayMaxEventRows:3,allDaySlot:!0},month:{type:"month",dayMaxEventRows:4,eventMaxStack:3,allDaySlot:!1},year:{type:"year",dayMaxEventRows:2,allDaySlot:!1},agenda:{type:"agenda",allDaySlot:!1},"resource-day":{type:"resource-day",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"resource-week":{type:"resource-week",slotMinTime:"00:00",slotMaxTime:"24:00",slotDuration:"00:30:00",scrollTime:"08:00:00",allDaySlot:!0},"timeline-day":{type:"timeline-day",slotDuration:"01:00:00"},"timeline-3day":{type:"timeline-3day",slotDuration:"01:00:00"},"timeline-week":{type:"timeline-week",slotDuration:"01:00:00"}},se={blue:"#3b82f6",green:"#22c55e",red:"#ef4444",yellow:"#eab308",purple:"#a855f7",orange:"#f97316",pink:"#ec4899",teal:"#14b8a6",gray:"#6b7280",indigo:"#6366f1"},ue={blue:{bg:"bg-blue-100",text:"text-blue-800",border:"border-blue-300"},green:{bg:"bg-green-100",text:"text-green-800",border:"border-green-300"},red:{bg:"bg-red-100",text:"text-red-800",border:"border-red-300"},yellow:{bg:"bg-yellow-100",text:"text-yellow-800",border:"border-yellow-300"},purple:{bg:"bg-purple-100",text:"text-purple-800",border:"border-purple-300"},orange:{bg:"bg-orange-100",text:"text-orange-800",border:"border-orange-300"},pink:{bg:"bg-pink-100",text:"text-pink-800",border:"border-pink-300"},teal:{bg:"bg-teal-100",text:"text-teal-800",border:"border-teal-300"},gray:{bg:"bg-gray-100",text:"text-gray-800",border:"border-gray-300"},indigo:{bg:"bg-indigo-100",text:"text-indigo-800",border:"border-indigo-300"}},ie={"#3b82f6":"blue","#22c55e":"green","#ef4444":"red","#eab308":"yellow","#a855f7":"purple","#f97316":"orange","#ec4899":"pink","#14b8a6":"teal","#6b7280":"gray","#6366f1":"indigo"},ce=24,le=60,L=60*1e3,Y=60*L,fe=24*Y,I=64,ge=32,de=56,De=200,B=20;function g(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function T(e){const t=new Date(e);return t.setHours(23,59,59,999),t}function c(e,t){const n=new Date(e);return n.setDate(n.getDate()+t),n}function me(e,t){return c(e,-t)}function h(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function C(e){return h(e,new Date)}function ye(e){return e.getDay()}function x(e){const t=e.getDay();return t===0||t===6}function D(e,t=1){const n=new Date(e),r=n.getDay(),o=(r<t?7:0)+r-t;return n.setDate(n.getDate()-o),n.setHours(0,0,0,0),n}function p(e,t=1){const n=D(e,t);return n.setDate(n.getDate()+6),n.setHours(23,59,59,999),n}function b(e,t){return c(e,t*7)}function he(e,t){return c(e,-t*7)}function Ee(e){const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),n=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-n);const r=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-r.getTime())/864e5+1)/7)}function Te(e,t,n=1){const r=D(e,n),o=D(t,n);return h(r,o)}function S(e){const t=new Date(e);return t.setDate(1),t.setHours(0,0,0,0),t}function M(e){const t=new Date(e.getFullYear(),e.getMonth()+1,0);return t.setHours(23,59,59,999),t}function k(e,t){const n=new Date(e);return n.setMonth(n.getMonth()+t),n}function pe(e,t){return k(e,-t)}function Se(e){return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()}function _(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()}function U(e){return new Date(e.getFullYear(),0,1,0,0,0,0)}function N(e){return new Date(e.getFullYear(),11,31,23,59,59,999)}function v(e,t){const n=new Date(e);return n.setFullYear(n.getFullYear()+t),n}function Me(e,t){return v(e,-t)}function we(e,t){return e.getFullYear()===t.getFullYear()}function V(e,t){const n=new Date(e);return n.setHours(n.getHours()+t),n}function He(e,t){const n=new Date(e);return n.setMinutes(n.getMinutes()+t),n}function be(e,t,n=0,r=0){const o=new Date(e);return o.setHours(t,n,r,0),o}function Ie(e){return e.getHours()+e.getMinutes()/60}function ke(e,t){return e.getTime()<t.getTime()}function Oe(e,t){return e.getTime()>t.getTime()}function _e(e,t,n){const r=e.getTime();return r>=t.getTime()&&r<=n.getTime()}function ve(e){if(e.length!==0)return e.reduce((t,n)=>n<t?n:t)}function Fe(e){if(e.length!==0)return e.reduce((t,n)=>n>t?n:t)}function F(e,t){return e.getTime()-t.getTime()}function Re(e,t){return Math.floor(F(e,t)/6e4)}function Ae(e,t){return Math.floor(F(e,t)/36e5)}function Ce(e,t){const n=g(e),r=g(t);return Math.floor(F(n,r)/864e5)}function H(e,t="24h"){const n=e.getHours(),r=e.getMinutes();if(t==="12h"){const o=n>=12?"PM":"AM";return`${n%12||12}:${r.toString().padStart(2,"0")} ${o}`}return`${n.toString().padStart(2,"0")}:${r.toString().padStart(2,"0")}`}function xe(e){const t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),r=e.getDate().toString().padStart(2,"0");return`${t}-${n}-${r}`}function Ue(e){return new Date(e)}function P(e,t){const n=[];let r=g(e);const o=g(t);for(;r<=o;)n.push(new Date(r)),r=c(r,1);return n}function We(e,t){const n=[];let r=new Date(e);for(;r<=t;)n.push(new Date(r)),r=V(r,1);return n}function $e(e="en-US",t="short"){const n=new Intl.DateTimeFormat(e,{weekday:t}),r=[],o=new Date(2024,0,7);for(let a=0;a<7;a++)r.push(n.format(c(o,a)));return r}function Le(e="en-US",t="long"){const n=new Intl.DateTimeFormat(e,{month:t}),r=[];for(let o=0;o<12;o++)r.push(n.format(new Date(2024,o,1)));return r}function Ye(e){const t=[];for(let n=e.startHour;n<=e.endHour;n++)t.push(n);return t}function Be(e,t="24h"){if(t==="12h"){const n=e>=12?"PM":"AM";return`${e%12||12} ${n}`}return`${String(e).padStart(2,"0")}:00`}function Ne(e,t=1){const n=D(e,t),r=[];for(let o=0;o<7;o++)r.push(c(n,o));return r}function Ve(e,t=1){const n=S(e),r=M(e),o=D(n,t),a=p(r,t),s=e.getMonth();return P(o,a).map(l=>({date:l,isCurrentMonth:l.getMonth()===s,isWeekend:l.getDay()===0||l.getDay()===6}))}function R(e){if(e.isAllDay===!0)return!0;if(e.isAllDay===!1)return!1;const t=e.startDate.getHours(),n=e.startDate.getMinutes(),r=e.endDate.getHours(),o=e.endDate.getMinutes(),a=t===0&&n===0,s=r===0&&o===0||r===23&&o>=59;return!!(a&&s)}function Pe(e){const t=[],n=[];for(const r of e)R(r)?n.push(r):h(r.startDate,r.endDate)?t.push(r):n.push(r);return{singleDay:t,multiDay:n}}function Ge(e,t,n){return e.filter(r=>r.startDate<=n&&r.endDate>=t)}function ze(e,t,n){if(!n)return!0;const r=e.getDay(),o=n[r];return!o||!(o.enabled!==!1)||o.from===o.to?!1:t>=o.from&&t<o.to}function Xe(e,t){const n=e.getDay(),r=t[n];return!r||!(r.enabled!==!1)||r.from===r.to?null:{from:r.from,to:r.to}}function je(e){const t=[];for(let n=0;n<12;n++)t.push(new Date(e,n,1));return t}function G(e,t,n){const r=g(t),o=T(n);return e.filter(a=>{const s=a.startDate,u=a.endDate;return s<=o&&u>=r})}function z(e,t){return t.length===0?e:e.filter(n=>n.scheduleTypeId!==void 0&&t.includes(n.scheduleTypeId))}function X(e,t){return t.length===0?e:e.filter(n=>n.resourceId!==void 0&&t.includes(n.resourceId))}function j(e,t){if(!t.trim())return e;const n=t.toLowerCase();return e.filter(r=>{const o=r.title.toLowerCase().includes(n),a=r.description?.toLowerCase().includes(n);return o||a})}function J(e){return e.filter(t=>!t.isCanceled)}function Je(e,t){let n=[...e];return t.dateRange&&(n=G(n,t.dateRange.startDate,t.dateRange.endDate)),t.scheduleTypeIds&&t.scheduleTypeIds.length>0&&(n=z(n,t.scheduleTypeIds)),t.resourceIds&&t.resourceIds.length>0&&(n=X(n,t.resourceIds)),t.search&&(n=j(n,t.search)),t.showCanceled||(n=J(n)),n}function Ke(e){return[...e].sort((t,n)=>t.startDate.getTime()-n.startDate.getTime())}function qe(e){return[...e].sort((t,n)=>t.endDate.getTime()-n.endDate.getTime())}function Qe(e){return[...e].sort((t,n)=>{const r=t.endDate.getTime()-t.startDate.getTime();return n.endDate.getTime()-n.startDate.getTime()-r})}function Ze(e){const t=new Map;for(const n of e){const r=g(n.startDate).toISOString(),o=t.get(r)??[];o.push(n),t.set(r,o)}return t}function et(e){const t=new Map;for(const n of e){const r=t.get(n.scheduleTypeId)??[];r.push(n),t.set(n.scheduleTypeId,r)}return t}function tt(e){const t=new Map;for(const n of e){const r=t.get(n.resourceId)??[];r.push(n),t.set(n.resourceId,r)}return t}function nt(e,t){return e.filter(n=>{const r=g(t),o=T(t);return n.startDate<=o&&n.endDate>=r})}function rt(e){return e.filter(t=>t.isAllDay)}function ot(e){return e.filter(t=>!t.isAllDay)}function at(e){return e.filter(t=>t.isMultiDay?!0:!h(t.startDate,t.endDate))}function st(e){return e.isMultiDay?!0:!h(e.startDate,e.endDate)}function ut(e){return Math.floor((e.endDate.getTime()-e.startDate.getTime())/6e4)}function it(e,t="blue"){return e.color??t}function ct(e,t,n="blue"){if(e.color)return e.color;if(e.scheduleTypeId!==void 0&&t){const r=t.get(e.scheduleTypeId);if(r)return r}return n}function lt(e){if(R(e)){if(h(e.startDate,e.endDate))return"All day";const n=e.startDate.toLocaleDateString(void 0,{month:"short",day:"numeric"}),r=e.endDate.toLocaleDateString(void 0,{month:"short",day:"numeric"});return`All day · ${n} – ${r}`}if(!h(e.startDate,e.endDate)){const n=e.startDate.toLocaleDateString(void 0,{month:"short",day:"numeric"}),r=e.endDate.toLocaleDateString(void 0,{month:"short",day:"numeric"});return`${n}, ${H(e.startDate)} – ${r}, ${H(e.endDate)}`}return`${H(e.startDate)} - ${H(e.endDate)}`}function ft(e){return!R(e)}function K(e,t,n=1){switch(t){case"day":case"resource-day":case"timeline-day":return{startDate:g(e),endDate:T(e)};case"week":case"resource-week":case"timeline-week":return{startDate:D(e,n),endDate:p(e,n)};case"month":{const r=S(e),o=M(e);return{startDate:D(r,n),endDate:p(o,n)}}case"timeline-3day":return{startDate:g(e),endDate:T(c(e,2))};case"year":return{startDate:U(e),endDate:N(e)};case"agenda":return{startDate:g(e),endDate:T(c(e,29))};default:return{startDate:g(e),endDate:T(e)}}}function gt(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,1);case"timeline-3day":return c(e,3);case"week":case"resource-week":case"timeline-week":return b(e,1);case"month":return k(e,1);case"year":return v(e,1);case"agenda":return b(e,1);default:return c(e,1)}}function dt(e,t){switch(t){case"day":case"resource-day":case"timeline-day":return c(e,-1);case"timeline-3day":return c(e,-3);case"week":case"resource-week":case"timeline-week":return b(e,-1);case"month":return k(e,-1);case"year":return v(e,-1);case"agenda":return b(e,-1);default:return c(e,-1)}}function Dt(){return g(new Date)}function mt(e,t=1){const n=S(e),r=M(e),o=D(n,t),a=p(r,t),s=[];let u=o;for(;u<=a;)s.push({date:new Date(u),isToday:C(u),isCurrentMonth:_(u,e),isWeekend:x(u),dayOfWeek:u.getDay()}),u=c(u,1);return s}function yt(e,t=1){const n=D(e,t),r=[];for(let o=0;o<7;o++){const a=c(n,o);r.push({date:a,isToday:C(a),isCurrentMonth:_(a,e),isWeekend:x(a),dayOfWeek:a.getDay()})}return r}function ht(e){const t=U(e),n=[];for(let r=0;r<12;r++){const o=k(t,r);n.push({date:o,isToday:_(o,new Date),isCurrentMonth:!0,isWeekend:!1,dayOfWeek:o.getDay()})}return n}function Et(e,t,n=30){const r=[],o=60/n;for(let a=e;a<t;a++)for(let s=0;s<o;s++){const u=s*n;r.push({hour:a,minute:u,label:`${a.toString().padStart(2,"0")}:${u.toString().padStart(2,"0")}`})}return r}function Tt(e,t,n="24h"){const r=[];for(let o=e;o<=t;o++){let a;if(n==="12h"){const s=o>=12?"PM":"AM";a=`${o%12||12} ${s}`}else a=`${o.toString().padStart(2,"0")}:00`;r.push({hour:o,label:a})}return r}function pt(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:"short",month:"short",day:"numeric"}),o=new Intl.DateTimeFormat(n,{month:"short",day:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return r.format(e);case"timeline-3day":{const a=g(e),s=c(e,2);return`${o.format(a)} - ${o.format(s)}`}case"week":case"resource-week":case"timeline-week":{const a=D(e,1),s=p(e,1);return`${o.format(a)} - ${o.format(s)}`}case"month":{const a=S(e),s=M(e);return`${o.format(a)} - ${o.format(s)}`}case"year":return`Jan 1 - Dec 31, ${e.getFullYear()}`;case"agenda":{const a=S(e),s=M(e);return`${o.format(a)} - ${o.format(s)}`}default:return""}}function St(e,t,n,r=1){const o=K(t,n,r);return e.filter(a=>a.startDate<=o.endDate&&a.endDate>=o.startDate).length}function Mt(e,t,n="en-US"){const r=new Intl.DateTimeFormat(n,{month:"long",year:"numeric"}),o=new Intl.DateTimeFormat(n,{weekday:"long",month:"long",day:"numeric",year:"numeric"});switch(t){case"day":case"resource-day":case"timeline-day":return o.format(e);case"week":case"resource-week":case"timeline-week":{const a=D(e,1),s=p(e,1),u=new Intl.DateTimeFormat(n,{month:"short"}).format(a),l=new Intl.DateTimeFormat(n,{month:"short"}).format(s),i=a.getFullYear();return u===l?`${u} ${a.getDate()} - ${s.getDate()}, ${i}`:`${u} ${a.getDate()} - ${l} ${s.getDate()}, ${i}`}case"month":return r.format(e);case"year":return e.getFullYear().toString();case"agenda":return`Agenda - ${r.format(e)}`;default:return r.format(e)}}function wt(e=1,t="short",n="en-US"){const r=new Intl.DateTimeFormat(n,{weekday:t}),o=[],a=new Date(2024,0,7);for(let s=0;s<7;s++){const u=(e+s)%7,l=c(a,u);o.push({dayOfWeek:u,label:r.format(l)})}return o}function q(e,t,n,r=I){const{startHour:o,endHour:a}=n,s=a-o,u=s*r,l=e.startDate.getHours()+e.startDate.getMinutes()/60,i=e.endDate.getHours()+e.endDate.getMinutes()/60,d=Math.max(l,o),E=Math.min(i,a),m=(d-o)/s*u,y=(E-o)/s*u,f=Math.max(y-m,B);return{top:m,height:f,left:0,width:100,zIndex:1}}function Ht(e,t,n,r=I){if(e.length===0)return[];const o=[...e].sort((i,d)=>{const E=i.startDate.getTime()-d.startDate.getTime();if(E!==0)return E;const m=i.endDate.getTime()-i.startDate.getTime();return d.endDate.getTime()-d.startDate.getTime()-m}),a=[];let s=[],u=0;for(const i of o)s.length===0||i.startDate.getTime()<u?(s.push(i),u=Math.max(u,i.endDate.getTime())):(a.push(s),s=[i],u=i.endDate.getTime());s.length>0&&a.push(s);const l=[];for(const i of a){const d=[];for(const f of i){const Q=f.startDate.getTime(),Z=f.endDate.getTime();let w=-1;for(let O=0;O<d.length;O++){const A=d[O];if(!A)continue;const $=A[A.length-1];if($&&$.endTime<=Q){w=O;break}}w===-1&&(w=d.length,d.push([]));const W=d[w];W&&W.push({event:f,endTime:Z});const ee=q(f,t,n,r);l.push({event:f,position:ee,column:w,columnSpan:1})}const m=100/d.length,y=new Set(i.map(f=>f.id));for(const f of l)y.has(f.event.id)&&(f.position.left=f.column*m,f.position.width=m*f.columnSpan,f.position.zIndex=f.column+1)}return l}function bt(e,t,n,r=I,o=30){const{startHour:a,endHour:s}=n,u=s-a,l=u*r,i=e/l*u,E=(a+i)*60,m=Math.round(E/o)*o,y=new Date(t);return y.setHours(0,0,0,0),y.setMinutes(m),y}function It(e,t,n=I){const{startHour:r,endHour:o}=t,a=o-r,s=a*n,u=e.getHours()+e.getMinutes()/60;return(Math.max(r,Math.min(u,o))-r)/a*s}function kt(e,t){return e.startDate<t.endDate&&e.endDate>t.startDate}function Ot(e){if(e.length===0)return[];const t=[...e].sort((a,s)=>a.startDate.getTime()-s.startDate.getTime()),n=[];let r=[],o=0;for(const a of t)r.length===0||a.startDate.getTime()<o?(r.push(a),o=Math.max(o,a.endDate.getTime())):(r.length>0&&n.push(r),r=[a],o=a.endDate.getTime());return r.length>0&&n.push(r),n}function _t(e,t,n){const r=Math.max(0,Math.min(e,t)),o=Math.min(n,Math.max(e,t));return{top:r,height:o-r}}exports.CALENDAR_VIEWS=te;exports.DEFAULT_BUSINESS_HOURS=oe;exports.DEFAULT_HEADER_HEIGHT=de;exports.DEFAULT_HOUR_HEIGHT=I;exports.DEFAULT_PREFERENCES=ne;exports.DEFAULT_RESOURCE_WIDTH=De;exports.DEFAULT_SLOT_HEIGHT=ge;exports.DEFAULT_VIEW_CONFIGS=ae;exports.DEFAULT_VISIBLE_HOURS=re;exports.EVENT_COLORS=se;exports.EVENT_COLOR_CLASSES=ue;exports.HEX_TO_EVENT_COLOR=ie;exports.HOURS_IN_DAY=ce;exports.MINUTES_IN_HOUR=le;exports.MIN_EVENT_HEIGHT=B;exports.MS_PER_DAY=fe;exports.MS_PER_HOUR=Y;exports.MS_PER_MINUTE=L;exports.addDays=c;exports.addHours=V;exports.addMinutes=He;exports.addMonths=k;exports.addWeeks=b;exports.addYears=v;exports.applyEventFilters=Je;exports.calculateEventPosition=q;exports.calculateOverlappingPositions=Ht;exports.calculateSelectionOverlay=_t;exports.detectAllDayEvent=R;exports.differenceInDays=Ce;exports.differenceInHours=Ae;exports.differenceInMilliseconds=F;exports.differenceInMinutes=Re;exports.eachDayOfInterval=P;exports.eachHourOfInterval=We;exports.endOfDay=T;exports.endOfMonth=M;exports.endOfWeek=p;exports.endOfYear=N;exports.eventsOverlap=kt;exports.filterEventsByDateRange=G;exports.filterEventsByResource=X;exports.filterEventsByScheduleType=z;exports.filterEventsBySearch=j;exports.filterOutCanceled=J;exports.formatDateISO=xe;exports.formatEventTimeDisplay=lt;exports.formatHourLabel=Be;exports.formatTime=H;exports.generateHourLabels=Tt;exports.generateMonthCells=mt;exports.generateMonthGrid=Ve;exports.generateTimeSlots=Et;exports.generateWeekCells=yt;exports.generateYearCells=ht;exports.getAllDayEvents=rt;exports.getDayOfWeek=ye;exports.getDaysInMonth=Se;exports.getDecimalHours=Ie;exports.getEventColor=it;exports.getEventDurationMinutes=ut;exports.getEventsCountInView=St;exports.getEventsForDay=nt;exports.getEventsInRange=Ge;exports.getMonthNames=Le;exports.getMultiDayEvents=at;exports.getOverlappingGroups=Ot;exports.getRangeText=pt;exports.getTimedEvents=ot;exports.getViewDateRange=K;exports.getViewTitle=Mt;exports.getVisibleHoursArray=Ye;exports.getWeekDays=Ne;exports.getWeekNumber=Ee;exports.getWeekdayHeaders=wt;exports.getWeekdayNames=$e;exports.getWorkingHoursForDay=Xe;exports.getYearMonths=je;exports.groupEventsByDate=Ze;exports.groupEventsByResource=tt;exports.groupEventsByScheduleType=et;exports.isAfter=Oe;exports.isBefore=ke;exports.isBetween=_e;exports.isMultiDayEvent=st;exports.isSameDay=h;exports.isSameMonth=_;exports.isSameWeek=Te;exports.isSameYear=we;exports.isToday=C;exports.isWeekend=x;exports.isWorkingHour=ze;exports.maxDate=Fe;exports.minDate=ve;exports.navigateNext=gt;exports.navigatePrev=dt;exports.navigateToday=Dt;exports.parseISO=Ue;exports.resolveEventColor=ct;exports.separateEventsByDuration=Pe;exports.setTime=be;exports.shouldShowEventTime=ft;exports.sortEventsByDuration=Qe;exports.sortEventsByEnd=qe;exports.sortEventsByStart=Ke;exports.startOfDay=g;exports.startOfMonth=S;exports.startOfWeek=D;exports.startOfYear=U;exports.subDays=me;exports.subMonths=pe;exports.subWeeks=he;exports.subYears=Me;exports.timeToY=It;exports.yToTime=bt;
2
2
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sources":["../src/core/constants.ts","../src/core/utils/date-utils.ts","../src/core/utils/event-utils.ts","../src/core/utils/grid-utils.ts","../src/core/utils/position-utils.ts"],"sourcesContent":["/**\n * Constants for @inno/calendar\n *\n * Default values, view configurations, and color mappings.\n */\n\nimport type {\n\tICalendarPreferences,\n\tIViewConfig,\n\tIVisibleHours,\n\tTCalendarView,\n\tTEventColor,\n} from './types';\n\n// ============================================================================\n// CALENDAR VIEWS\n// ============================================================================\n\n/**\n * All available calendar views\n */\nexport const CALENDAR_VIEWS: TCalendarView[] = [\n\t'day',\n\t'week',\n\t'month',\n\t'year',\n\t'agenda',\n\t'resource-day',\n\t'resource-week',\n\t'timeline-day',\n\t'timeline-week',\n];\n\n// ============================================================================\n// DEFAULT PREFERENCES\n// ============================================================================\n\n/**\n * Default calendar preferences\n */\nexport const DEFAULT_PREFERENCES: ICalendarPreferences = {\n\tstartHour: 8,\n\tendHour: 18,\n\tfirstDayOfWeek: 1, // Monday\n\tslotDuration: 30,\n\tshowWeekends: true,\n\ttimeFormat: '24h',\n\tbadgeVariant: 'colored',\n\tshowCanceledEvents: false,\n};\n\n/**\n * Default visible hours\n */\nexport const DEFAULT_VISIBLE_HOURS: IVisibleHours = {\n\tstartHour: 0,\n\tendHour: 24,\n};\n\n/**\n * Default business hours range (used as a fallback for visible hours)\n */\nexport const DEFAULT_BUSINESS_HOURS: IVisibleHours = {\n\tstartHour: 8,\n\tendHour: 18,\n};\n\n// ============================================================================\n// VIEW CONFIGURATIONS\n// ============================================================================\n\n/**\n * Default configuration for each view type\n */\nexport const DEFAULT_VIEW_CONFIGS: Record<TCalendarView, IViewConfig> = {\n\tday: {\n\t\ttype: 'day',\n\t\tslotMinTime: '00:00',\n\t\tslotMaxTime: '24:00',\n\t\tslotDuration: '00:30:00',\n\t\tscrollTime: '08:00:00',\n\t\tallDaySlot: true,\n\t},\n\tweek: {\n\t\ttype: 'week',\n\t\tslotMinTime: '00:00',\n\t\tslotMaxTime: '24:00',\n\t\tslotDuration: '00:30:00',\n\t\tscrollTime: '08:00:00',\n\t\tdayMaxEventRows: 3,\n\t\tallDaySlot: true,\n\t},\n\tmonth: {\n\t\ttype: 'month',\n\t\tdayMaxEventRows: 4,\n\t\teventMaxStack: 3,\n\t\tallDaySlot: false,\n\t},\n\tyear: {\n\t\ttype: 'year',\n\t\tdayMaxEventRows: 2,\n\t\tallDaySlot: false,\n\t},\n\tagenda: {\n\t\ttype: 'agenda',\n\t\tallDaySlot: false,\n\t},\n\t'resource-day': {\n\t\ttype: 'resource-day',\n\t\tslotMinTime: '00:00',\n\t\tslotMaxTime: '24:00',\n\t\tslotDuration: '00:30:00',\n\t\tscrollTime: '08:00:00',\n\t\tallDaySlot: true,\n\t},\n\t'resource-week': {\n\t\ttype: 'resource-week',\n\t\tslotMinTime: '00:00',\n\t\tslotMaxTime: '24:00',\n\t\tslotDuration: '00:30:00',\n\t\tscrollTime: '08:00:00',\n\t\tallDaySlot: true,\n\t},\n\t'timeline-day': {\n\t\ttype: 'timeline-day',\n\t\tslotDuration: '01:00:00',\n\t},\n\t'timeline-3day': {\n\t\ttype: 'timeline-3day',\n\t\tslotDuration: '01:00:00',\n\t},\n\t'timeline-week': {\n\t\ttype: 'timeline-week',\n\t\tslotDuration: '01:00:00',\n\t},\n};\n\n// ============================================================================\n// EVENT COLORS\n// ============================================================================\n\n/**\n * Event color palette with hex values\n */\nexport const EVENT_COLORS: Record<TEventColor, string> = {\n\tblue: '#3b82f6',\n\tgreen: '#22c55e',\n\tred: '#ef4444',\n\tyellow: '#eab308',\n\tpurple: '#a855f7',\n\torange: '#f97316',\n\tpink: '#ec4899',\n\tteal: '#14b8a6',\n\tgray: '#6b7280',\n\tindigo: '#6366f1',\n};\n\n/**\n * TailwindCSS class mappings for event colors\n */\nexport const EVENT_COLOR_CLASSES: Record<\n\tTEventColor,\n\t{ bg: string; text: string; border: string }\n> = {\n\tblue: { bg: 'bg-blue-100', text: 'text-blue-800', border: 'border-blue-300' },\n\tgreen: { bg: 'bg-green-100', text: 'text-green-800', border: 'border-green-300' },\n\tred: { bg: 'bg-red-100', text: 'text-red-800', border: 'border-red-300' },\n\tyellow: { bg: 'bg-yellow-100', text: 'text-yellow-800', border: 'border-yellow-300' },\n\tpurple: { bg: 'bg-purple-100', text: 'text-purple-800', border: 'border-purple-300' },\n\torange: { bg: 'bg-orange-100', text: 'text-orange-800', border: 'border-orange-300' },\n\tpink: { bg: 'bg-pink-100', text: 'text-pink-800', border: 'border-pink-300' },\n\tteal: { bg: 'bg-teal-100', text: 'text-teal-800', border: 'border-teal-300' },\n\tgray: { bg: 'bg-gray-100', text: 'text-gray-800', border: 'border-gray-300' },\n\tindigo: { bg: 'bg-indigo-100', text: 'text-indigo-800', border: 'border-indigo-300' },\n};\n\n/**\n * Map hex colors to event color names\n */\nexport const HEX_TO_EVENT_COLOR: Record<string, TEventColor> = {\n\t'#3b82f6': 'blue',\n\t'#22c55e': 'green',\n\t'#ef4444': 'red',\n\t'#eab308': 'yellow',\n\t'#a855f7': 'purple',\n\t'#f97316': 'orange',\n\t'#ec4899': 'pink',\n\t'#14b8a6': 'teal',\n\t'#6b7280': 'gray',\n\t'#6366f1': 'indigo',\n};\n\n// ============================================================================\n// TIME CONSTANTS\n// ============================================================================\n\n/**\n * Hours in a day\n */\nexport const HOURS_IN_DAY = 24;\n\n/**\n * Minutes in an hour\n */\nexport const MINUTES_IN_HOUR = 60;\n\n/**\n * Milliseconds in a minute\n */\nexport const MS_PER_MINUTE = 60 * 1000;\n\n/**\n * Milliseconds in an hour\n */\nexport const MS_PER_HOUR = 60 * MS_PER_MINUTE;\n\n/**\n * Milliseconds in a day\n */\nexport const MS_PER_DAY = 24 * MS_PER_HOUR;\n\n// ============================================================================\n// GRID CONSTANTS\n// ============================================================================\n\n/**\n * Default hour height in pixels for time grid views\n */\nexport const DEFAULT_HOUR_HEIGHT = 64;\n\n/**\n * Default slot height in pixels\n */\nexport const DEFAULT_SLOT_HEIGHT = 32;\n\n/**\n * Default header height in pixels\n */\nexport const DEFAULT_HEADER_HEIGHT = 56;\n\n/**\n * Default resource column width in pixels\n */\nexport const DEFAULT_RESOURCE_WIDTH = 200;\n\n/**\n * Minimum event height in pixels\n */\nexport const MIN_EVENT_HEIGHT = 20;\n","/**\n * Date Utilities for @inno/calendar\n *\n * Pure functions for date manipulation using native Date API.\n * No external dependencies.\n */\n\nimport type { TWorkingHours } from '../types';\n\n// Re-export TWorkingHours for convenience\nexport type { TWorkingHours };\n\n// ============================================================================\n// DAY OPERATIONS\n// ============================================================================\n\n/**\n * Get start of day (00:00:00.000)\n */\nexport function startOfDay(date: Date): Date {\n\tconst result = new Date(date);\n\tresult.setHours(0, 0, 0, 0);\n\treturn result;\n}\n\n/**\n * Get end of day (23:59:59.999)\n */\nexport function endOfDay(date: Date): Date {\n\tconst result = new Date(date);\n\tresult.setHours(23, 59, 59, 999);\n\treturn result;\n}\n\n/**\n * Add days to a date\n */\nexport function addDays(date: Date, days: number): Date {\n\tconst result = new Date(date);\n\tresult.setDate(result.getDate() + days);\n\treturn result;\n}\n\n/**\n * Subtract days from a date\n */\nexport function subDays(date: Date, days: number): Date {\n\treturn addDays(date, -days);\n}\n\n/**\n * Check if two dates are the same day\n */\nexport function isSameDay(date1: Date, date2: Date): boolean {\n\treturn (\n\t\tdate1.getFullYear() === date2.getFullYear() &&\n\t\tdate1.getMonth() === date2.getMonth() &&\n\t\tdate1.getDate() === date2.getDate()\n\t);\n}\n\n/**\n * Check if date is today\n */\nexport function isToday(date: Date): boolean {\n\treturn isSameDay(date, new Date());\n}\n\n/**\n * Get day of week (0-6, where 0 is Sunday)\n */\nexport function getDayOfWeek(date: Date): number {\n\treturn date.getDay();\n}\n\n/**\n * Check if date is a weekend\n */\nexport function isWeekend(date: Date): boolean {\n\tconst day = date.getDay();\n\treturn day === 0 || day === 6;\n}\n\n// ============================================================================\n// WEEK OPERATIONS\n// ============================================================================\n\n/**\n * Get start of week\n */\nexport function startOfWeek(date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1): Date {\n\tconst result = new Date(date);\n\tconst day = result.getDay();\n\tconst diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\tresult.setDate(result.getDate() - diff);\n\tresult.setHours(0, 0, 0, 0);\n\treturn result;\n}\n\n/**\n * Get end of week\n */\nexport function endOfWeek(date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1): Date {\n\tconst result = startOfWeek(date, weekStartsOn);\n\tresult.setDate(result.getDate() + 6);\n\tresult.setHours(23, 59, 59, 999);\n\treturn result;\n}\n\n/**\n * Add weeks to a date\n */\nexport function addWeeks(date: Date, weeks: number): Date {\n\treturn addDays(date, weeks * 7);\n}\n\n/**\n * Subtract weeks from a date\n */\nexport function subWeeks(date: Date, weeks: number): Date {\n\treturn addDays(date, -weeks * 7);\n}\n\n/**\n * Get week number in year (ISO 8601)\n */\nexport function getWeekNumber(date: Date): number {\n\tconst d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n\tconst dayNum = d.getUTCDay() || 7;\n\td.setUTCDate(d.getUTCDate() + 4 - dayNum);\n\tconst yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n\treturn Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n\n/**\n * Check if two dates are in the same week\n */\nexport function isSameWeek(\n\tdate1: Date,\n\tdate2: Date,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): boolean {\n\tconst start1 = startOfWeek(date1, weekStartsOn);\n\tconst start2 = startOfWeek(date2, weekStartsOn);\n\treturn isSameDay(start1, start2);\n}\n\n// ============================================================================\n// MONTH OPERATIONS\n// ============================================================================\n\n/**\n * Get start of month\n */\nexport function startOfMonth(date: Date): Date {\n\tconst result = new Date(date);\n\tresult.setDate(1);\n\tresult.setHours(0, 0, 0, 0);\n\treturn result;\n}\n\n/**\n * Get end of month\n */\nexport function endOfMonth(date: Date): Date {\n\tconst result = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n\tresult.setHours(23, 59, 59, 999);\n\treturn result;\n}\n\n/**\n * Add months to a date\n */\nexport function addMonths(date: Date, months: number): Date {\n\tconst result = new Date(date);\n\tresult.setMonth(result.getMonth() + months);\n\treturn result;\n}\n\n/**\n * Subtract months from a date\n */\nexport function subMonths(date: Date, months: number): Date {\n\treturn addMonths(date, -months);\n}\n\n/**\n * Get number of days in a month\n */\nexport function getDaysInMonth(date: Date): number {\n\treturn new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\n/**\n * Check if two dates are in the same month\n */\nexport function isSameMonth(date1: Date, date2: Date): boolean {\n\treturn date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth();\n}\n\n// ============================================================================\n// YEAR OPERATIONS\n// ============================================================================\n\n/**\n * Get start of year\n */\nexport function startOfYear(date: Date): Date {\n\treturn new Date(date.getFullYear(), 0, 1, 0, 0, 0, 0);\n}\n\n/**\n * Get end of year\n */\nexport function endOfYear(date: Date): Date {\n\treturn new Date(date.getFullYear(), 11, 31, 23, 59, 59, 999);\n}\n\n/**\n * Add years to a date\n */\nexport function addYears(date: Date, years: number): Date {\n\tconst result = new Date(date);\n\tresult.setFullYear(result.getFullYear() + years);\n\treturn result;\n}\n\n/**\n * Subtract years from a date\n */\nexport function subYears(date: Date, years: number): Date {\n\treturn addYears(date, -years);\n}\n\n/**\n * Check if two dates are in the same year\n */\nexport function isSameYear(date1: Date, date2: Date): boolean {\n\treturn date1.getFullYear() === date2.getFullYear();\n}\n\n// ============================================================================\n// TIME OPERATIONS\n// ============================================================================\n\n/**\n * Add hours to a date\n */\nexport function addHours(date: Date, hours: number): Date {\n\tconst result = new Date(date);\n\tresult.setHours(result.getHours() + hours);\n\treturn result;\n}\n\n/**\n * Add minutes to a date\n */\nexport function addMinutes(date: Date, minutes: number): Date {\n\tconst result = new Date(date);\n\tresult.setMinutes(result.getMinutes() + minutes);\n\treturn result;\n}\n\n/**\n * Set time on a date\n */\nexport function setTime(date: Date, hours: number, minutes = 0, seconds = 0): Date {\n\tconst result = new Date(date);\n\tresult.setHours(hours, minutes, seconds, 0);\n\treturn result;\n}\n\n/**\n * Get time as decimal hours (e.g., 14:30 = 14.5)\n */\nexport function getDecimalHours(date: Date): number {\n\treturn date.getHours() + date.getMinutes() / 60;\n}\n\n// ============================================================================\n// COMPARISON OPERATIONS\n// ============================================================================\n\n/**\n * Check if date is before another date\n */\nexport function isBefore(date: Date, dateToCompare: Date): boolean {\n\treturn date.getTime() < dateToCompare.getTime();\n}\n\n/**\n * Check if date is after another date\n */\nexport function isAfter(date: Date, dateToCompare: Date): boolean {\n\treturn date.getTime() > dateToCompare.getTime();\n}\n\n/**\n * Check if date is between two dates (inclusive)\n */\nexport function isBetween(date: Date, start: Date, end: Date): boolean {\n\tconst time = date.getTime();\n\treturn time >= start.getTime() && time <= end.getTime();\n}\n\n/**\n * Get minimum date from array\n */\nexport function minDate(dates: Date[]): Date | undefined {\n\tif (dates.length === 0) return undefined;\n\treturn dates.reduce((min, date) => (date < min ? date : min));\n}\n\n/**\n * Get maximum date from array\n */\nexport function maxDate(dates: Date[]): Date | undefined {\n\tif (dates.length === 0) return undefined;\n\treturn dates.reduce((max, date) => (date > max ? date : max));\n}\n\n// ============================================================================\n// DIFFERENCE OPERATIONS\n// ============================================================================\n\n/**\n * Get difference in milliseconds\n */\nexport function differenceInMilliseconds(date1: Date, date2: Date): number {\n\treturn date1.getTime() - date2.getTime();\n}\n\n/**\n * Get difference in minutes\n */\nexport function differenceInMinutes(date1: Date, date2: Date): number {\n\treturn Math.floor(differenceInMilliseconds(date1, date2) / 60000);\n}\n\n/**\n * Get difference in hours\n */\nexport function differenceInHours(date1: Date, date2: Date): number {\n\treturn Math.floor(differenceInMilliseconds(date1, date2) / 3600000);\n}\n\n/**\n * Get difference in days\n */\nexport function differenceInDays(date1: Date, date2: Date): number {\n\tconst start = startOfDay(date1);\n\tconst end = startOfDay(date2);\n\treturn Math.floor(differenceInMilliseconds(start, end) / 86400000);\n}\n\n// ============================================================================\n// FORMATTING\n// ============================================================================\n\n/**\n * Format time as HH:MM\n */\nexport function formatTime(date: Date, format: '12h' | '24h' = '24h'): string {\n\tconst hours = date.getHours();\n\tconst minutes = date.getMinutes();\n\n\tif (format === '12h') {\n\t\tconst period = hours >= 12 ? 'PM' : 'AM';\n\t\tconst hour12 = hours % 12 || 12;\n\t\treturn `${hour12}:${minutes.toString().padStart(2, '0')} ${period}`;\n\t}\n\n\treturn `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n}\n\n/**\n * Format date as YYYY-MM-DD\n */\nexport function formatDateISO(date: Date): string {\n\tconst year = date.getFullYear();\n\tconst month = (date.getMonth() + 1).toString().padStart(2, '0');\n\tconst day = date.getDate().toString().padStart(2, '0');\n\treturn `${year}-${month}-${day}`;\n}\n\n/**\n * Parse ISO date string to Date\n */\nexport function parseISO(dateString: string): Date {\n\treturn new Date(dateString);\n}\n\n// ============================================================================\n// ARRAY GENERATION\n// ============================================================================\n\n/**\n * Generate array of dates between start and end (inclusive)\n */\nexport function eachDayOfInterval(start: Date, end: Date): Date[] {\n\tconst dates: Date[] = [];\n\tlet current = startOfDay(start);\n\tconst endDay = startOfDay(end);\n\n\twhile (current <= endDay) {\n\t\tdates.push(new Date(current));\n\t\tcurrent = addDays(current, 1);\n\t}\n\n\treturn dates;\n}\n\n/**\n * Generate array of hours between start and end\n */\nexport function eachHourOfInterval(start: Date, end: Date): Date[] {\n\tconst hours: Date[] = [];\n\tlet current = new Date(start);\n\n\twhile (current <= end) {\n\t\thours.push(new Date(current));\n\t\tcurrent = addHours(current, 1);\n\t}\n\n\treturn hours;\n}\n\n/**\n * Get weekday names\n */\nexport function getWeekdayNames(\n\tlocale = 'en-US',\n\tformat: 'long' | 'short' | 'narrow' = 'short'\n): string[] {\n\tconst formatter = new Intl.DateTimeFormat(locale, { weekday: format });\n\tconst days: string[] = [];\n\n\t// Use a known Sunday to start\n\tconst baseDate = new Date(2024, 0, 7); // Sunday, Jan 7, 2024\n\n\tfor (let i = 0; i < 7; i++) {\n\t\tdays.push(formatter.format(addDays(baseDate, i)));\n\t}\n\n\treturn days;\n}\n\n/**\n * Get month names\n */\nexport function getMonthNames(\n\tlocale = 'en-US',\n\tformat: 'long' | 'short' | 'narrow' = 'long'\n): string[] {\n\tconst formatter = new Intl.DateTimeFormat(locale, { month: format });\n\tconst months: string[] = [];\n\n\tfor (let i = 0; i < 12; i++) {\n\t\tmonths.push(formatter.format(new Date(2024, i, 1)));\n\t}\n\n\treturn months;\n}\n\n// ============================================================================\n// VIEW HELPERS\n// ============================================================================\n\n/**\n * Get array of visible hours based on configuration\n */\nexport function getVisibleHoursArray(visibleHours: {\n\tstartHour: number;\n\tendHour: number;\n}): number[] {\n\tconst hours: number[] = [];\n\tfor (let h = visibleHours.startHour; h <= visibleHours.endHour; h++) {\n\t\thours.push(h);\n\t}\n\treturn hours;\n}\n\n/**\n * Format hour for display (e.g., 8 -> \"8:00\", 14 -> \"14:00\")\n */\nexport function formatHourLabel(hour: number, format: '12h' | '24h' = '24h'): string {\n\tif (format === '12h') {\n\t\tconst period = hour >= 12 ? 'PM' : 'AM';\n\t\tconst hour12 = hour % 12 || 12;\n\t\treturn `${hour12} ${period}`;\n\t}\n\t// 24h format with leading zero (e.g., \"09:00\", \"14:00\")\n\treturn `${String(hour).padStart(2, '0')}:00`;\n}\n\n/**\n * Get an array of 7 days for a week starting from the given date\n */\nexport function getWeekDays(date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1): Date[] {\n\tconst weekStart = startOfWeek(date, weekStartsOn);\n\tconst days: Date[] = [];\n\n\tfor (let i = 0; i < 7; i++) {\n\t\tdays.push(addDays(weekStart, i));\n\t}\n\n\treturn days;\n}\n\n/**\n * Generate month grid cells (typically 6 weeks x 7 days = 42 days)\n * Returns enriched cell objects with date, isCurrentMonth, and isWeekend\n */\nexport function generateMonthGrid(\n\tdate: Date,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): Array<{ date: Date; isCurrentMonth: boolean; isWeekend: boolean }> {\n\tconst monthStart = startOfMonth(date);\n\tconst monthEnd = endOfMonth(date);\n\tconst gridStart = startOfWeek(monthStart, weekStartsOn);\n\tconst gridEnd = endOfWeek(monthEnd, weekStartsOn);\n\tconst currentMonth = date.getMonth();\n\n\tconst dates = eachDayOfInterval(gridStart, gridEnd);\n\n\treturn dates.map((d) => ({\n\t\tdate: d,\n\t\tisCurrentMonth: d.getMonth() === currentMonth,\n\t\tisWeekend: d.getDay() === 0 || d.getDay() === 6,\n\t}));\n}\n\n// ============================================================================\n// ALL-DAY EVENT DETECTION\n// ============================================================================\n\n/**\n * Detect whether an event should be treated as an \"all-day\" event.\n *\n * An event is all-day if:\n * 1. Its `isAllDay` flag is explicitly `true`, OR\n * 2. It starts at 00:00 and ends at 23:59 or 00:00 (next day boundary)\n *\n * All-day events should **not** display time ranges — showing \"00:00 – 23:59\"\n * is confusing for users. Instead, display \"All day\" or a date range.\n *\n * @example\n * ```ts\n * detectAllDayEvent({ startDate: new Date('2026-02-16T00:00'), endDate: new Date('2026-02-16T23:59'), isAllDay: false })\n * // => true (midnight boundaries)\n *\n * detectAllDayEvent({ startDate: new Date('2026-02-16T09:00'), endDate: new Date('2026-02-16T17:00') })\n * // => false (normal timed event)\n * ```\n */\nexport function detectAllDayEvent(event: {\n\tstartDate: Date;\n\tendDate: Date;\n\tisAllDay?: boolean;\n}): boolean {\n\t// Explicit flag takes priority\n\tif (event.isAllDay) return true;\n\n\t// Check if times sit on day boundaries (midnight start, midnight or end-of-day end)\n\tconst startHour = event.startDate.getHours();\n\tconst startMinute = event.startDate.getMinutes();\n\tconst endHour = event.endDate.getHours();\n\tconst endMinute = event.endDate.getMinutes();\n\n\tconst startsAtMidnight = startHour === 0 && startMinute === 0;\n\tconst endsAtDayBoundary =\n\t\t(endHour === 0 && endMinute === 0) || // midnight next day\n\t\t(endHour === 23 && endMinute >= 59); // end of day (23:59 or 23:59:59)\n\n\tif (startsAtMidnight && endsAtDayBoundary) return true;\n\n\treturn false;\n}\n\n/**\n * Separate events into single-day timed events and banner events\n * (multi-day + all-day).\n *\n * All-day events (detected via {@link detectAllDayEvent}) are placed in\n * the `multiDay` bucket even when they span a single calendar day, because\n * they belong in the banner strip — not in the hourly time grid.\n */\nexport function separateEventsByDuration<\n\tTEvent extends { id: string; startDate: Date; endDate: Date; isAllDay?: boolean },\n>(\n\tevents: TEvent[]\n): {\n\tsingleDay: TEvent[];\n\tmultiDay: TEvent[];\n} {\n\tconst singleDay: TEvent[] = [];\n\tconst multiDay: TEvent[] = [];\n\n\tfor (const event of events) {\n\t\t// All-day events always go to the banner, even single-day ones\n\t\tif (detectAllDayEvent(event)) {\n\t\t\tmultiDay.push(event);\n\t\t} else if (isSameDay(event.startDate, event.endDate)) {\n\t\t\tsingleDay.push(event);\n\t\t} else {\n\t\t\tmultiDay.push(event);\n\t\t}\n\t}\n\n\treturn { singleDay, multiDay };\n}\n\n/**\n * Get events within a date range\n */\nexport function getEventsInRange<TEvent extends { startDate: Date; endDate: Date }>(\n\tevents: TEvent[],\n\trangeStart: Date,\n\trangeEnd: Date\n): TEvent[] {\n\treturn events.filter((event) => {\n\t\treturn event.startDate <= rangeEnd && event.endDate >= rangeStart;\n\t});\n}\n\n// ============================================================================\n// WORKING HOURS UTILITIES\n// ============================================================================\n\n/**\n * Check if a given hour is within working hours for a specific day\n * Handles both TWorkingHours (with `enabled`) and TWorkingHoursConfig (without `enabled`)\n */\nexport function isWorkingHour(date: Date, hour: number, workingHours?: TWorkingHours): boolean {\n\tif (!workingHours) return true; // If no working hours defined, all hours are valid\n\n\tconst dayOfWeek = date.getDay();\n\tconst dayHours = workingHours[dayOfWeek];\n\n\tif (!dayHours) return false;\n\n\t// Treat as enabled if `enabled` is undefined (backward compat with TWorkingHoursConfig)\n\tconst isEnabled = dayHours.enabled !== false;\n\tif (!isEnabled || dayHours.from === dayHours.to) {\n\t\treturn false;\n\t}\n\n\treturn hour >= dayHours.from && hour < dayHours.to;\n}\n\n/**\n * Get working hours for a specific day\n * Returns null if the day is disabled or has no working hours\n * Handles both TWorkingHours (with `enabled`) and TWorkingHoursConfig (without `enabled`)\n */\nexport function getWorkingHoursForDay(\n\tdate: Date,\n\tworkingHours: TWorkingHours\n): { from: number; to: number } | null {\n\tconst dayOfWeek = date.getDay();\n\tconst dayHours = workingHours[dayOfWeek];\n\n\tif (!dayHours) return null;\n\n\t// Treat as enabled if `enabled` is undefined (backward compat with TWorkingHoursConfig)\n\tconst isEnabled = dayHours.enabled !== false;\n\tif (!isEnabled || dayHours.from === dayHours.to) {\n\t\treturn null;\n\t}\n\n\treturn { from: dayHours.from, to: dayHours.to };\n}\n\n/**\n * Get all months for a year (for year view)\n */\nexport function getYearMonths(year: number): Date[] {\n\tconst months: Date[] = [];\n\tfor (let month = 0; month < 12; month++) {\n\t\tmonths.push(new Date(year, month, 1));\n\t}\n\treturn months;\n}\n","/**\n * Event Utilities for @inno/calendar\n *\n * Functions for filtering, sorting, and grouping events.\n * All functions are generic to work with any event data type.\n */\n\nimport type { CalendarEvent, TEventColor } from '../types';\nimport { detectAllDayEvent, endOfDay, formatTime, isSameDay, startOfDay } from './date-utils';\n\n// ============================================================================\n// FILTERING\n// ============================================================================\n\n/**\n * Filter events by date range\n */\nexport function filterEventsByDateRange<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tstartDate: Date,\n\tendDate: Date\n): CalendarEvent<TData>[] {\n\tconst rangeStart = startOfDay(startDate);\n\tconst rangeEnd = endOfDay(endDate);\n\n\treturn events.filter((event) => {\n\t\tconst eventStart = event.startDate;\n\t\tconst eventEnd = event.endDate;\n\n\t\t// Event overlaps with range if:\n\t\t// - Event starts before range ends AND\n\t\t// - Event ends after range starts\n\t\treturn eventStart <= rangeEnd && eventEnd >= rangeStart;\n\t});\n}\n\n/**\n * Filter events by schedule type IDs\n */\nexport function filterEventsByScheduleType<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tscheduleTypeIds: number[]\n): CalendarEvent<TData>[] {\n\tif (scheduleTypeIds.length === 0) return events;\n\treturn events.filter(\n\t\t(event) => event.scheduleTypeId !== undefined && scheduleTypeIds.includes(event.scheduleTypeId)\n\t);\n}\n\n/**\n * Filter events by resource IDs\n */\nexport function filterEventsByResource<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tresourceIds: string[]\n): CalendarEvent<TData>[] {\n\tif (resourceIds.length === 0) return events;\n\treturn events.filter(\n\t\t(event) => event.resourceId !== undefined && resourceIds.includes(event.resourceId)\n\t);\n}\n\n/**\n * Filter events by search term\n */\nexport function filterEventsBySearch<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tsearch: string\n): CalendarEvent<TData>[] {\n\tif (!search.trim()) return events;\n\n\tconst searchLower = search.toLowerCase();\n\treturn events.filter((event) => {\n\t\tconst titleMatch = event.title.toLowerCase().includes(searchLower);\n\t\tconst descriptionMatch = event.description?.toLowerCase().includes(searchLower);\n\t\treturn titleMatch || descriptionMatch;\n\t});\n}\n\n/**\n * Filter out canceled events\n */\nexport function filterOutCanceled<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => !event.isCanceled);\n}\n\n/**\n * Apply all filters at once\n */\nexport function applyEventFilters<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\toptions: {\n\t\tdateRange?: { startDate: Date; endDate: Date };\n\t\tscheduleTypeIds?: number[];\n\t\tresourceIds?: string[];\n\t\tsearch?: string;\n\t\tshowCanceled?: boolean;\n\t}\n): CalendarEvent<TData>[] {\n\tlet filtered = [...events];\n\n\tif (options.dateRange) {\n\t\tfiltered = filterEventsByDateRange(\n\t\t\tfiltered,\n\t\t\toptions.dateRange.startDate,\n\t\t\toptions.dateRange.endDate\n\t\t);\n\t}\n\n\tif (options.scheduleTypeIds && options.scheduleTypeIds.length > 0) {\n\t\tfiltered = filterEventsByScheduleType(filtered, options.scheduleTypeIds);\n\t}\n\n\tif (options.resourceIds && options.resourceIds.length > 0) {\n\t\tfiltered = filterEventsByResource(filtered, options.resourceIds);\n\t}\n\n\tif (options.search) {\n\t\tfiltered = filterEventsBySearch(filtered, options.search);\n\t}\n\n\tif (!options.showCanceled) {\n\t\tfiltered = filterOutCanceled(filtered);\n\t}\n\n\treturn filtered;\n}\n\n// ============================================================================\n// SORTING\n// ============================================================================\n\n/**\n * Sort events by start date (ascending)\n */\nexport function sortEventsByStart<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn [...events].sort((a, b) => a.startDate.getTime() - b.startDate.getTime());\n}\n\n/**\n * Sort events by end date (ascending)\n */\nexport function sortEventsByEnd<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn [...events].sort((a, b) => a.endDate.getTime() - b.endDate.getTime());\n}\n\n/**\n * Sort events by duration (longest first)\n */\nexport function sortEventsByDuration<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn [...events].sort((a, b) => {\n\t\tconst durationA = a.endDate.getTime() - a.startDate.getTime();\n\t\tconst durationB = b.endDate.getTime() - b.startDate.getTime();\n\t\treturn durationB - durationA;\n\t});\n}\n\n// ============================================================================\n// GROUPING\n// ============================================================================\n\n/**\n * Group events by date\n */\nexport function groupEventsByDate<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): Map<string, CalendarEvent<TData>[]> {\n\tconst groups = new Map<string, CalendarEvent<TData>[]>();\n\n\tfor (const event of events) {\n\t\tconst dateKey = startOfDay(event.startDate).toISOString();\n\t\tconst existing = groups.get(dateKey) ?? [];\n\t\texisting.push(event);\n\t\tgroups.set(dateKey, existing);\n\t}\n\n\treturn groups;\n}\n\n/**\n * Group events by schedule type\n */\nexport function groupEventsByScheduleType<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): Map<number | undefined, CalendarEvent<TData>[]> {\n\tconst groups = new Map<number | undefined, CalendarEvent<TData>[]>();\n\n\tfor (const event of events) {\n\t\tconst existing = groups.get(event.scheduleTypeId) ?? [];\n\t\texisting.push(event);\n\t\tgroups.set(event.scheduleTypeId, existing);\n\t}\n\n\treturn groups;\n}\n\n/**\n * Group events by resource\n */\nexport function groupEventsByResource<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): Map<string | undefined, CalendarEvent<TData>[]> {\n\tconst groups = new Map<string | undefined, CalendarEvent<TData>[]>();\n\n\tfor (const event of events) {\n\t\tconst existing = groups.get(event.resourceId) ?? [];\n\t\texisting.push(event);\n\t\tgroups.set(event.resourceId, existing);\n\t}\n\n\treturn groups;\n}\n\n// ============================================================================\n// QUERIES\n// ============================================================================\n\n/**\n * Get events for a specific day\n */\nexport function getEventsForDay<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tdate: Date\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => {\n\t\t// Check if event spans this day\n\t\tconst dayStart = startOfDay(date);\n\t\tconst dayEnd = endOfDay(date);\n\t\treturn event.startDate <= dayEnd && event.endDate >= dayStart;\n\t});\n}\n\n/**\n * Get all-day events\n */\nexport function getAllDayEvents<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => event.isAllDay);\n}\n\n/**\n * Get timed events (not all-day)\n */\nexport function getTimedEvents<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => !event.isAllDay);\n}\n\n/**\n * Get multi-day events\n */\nexport function getMultiDayEvents<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => {\n\t\tif (event.isMultiDay) return true;\n\t\treturn !isSameDay(event.startDate, event.endDate);\n\t});\n}\n\n/**\n * Check if event spans multiple days\n */\nexport function isMultiDayEvent<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>\n): boolean {\n\tif (event.isMultiDay) return true;\n\treturn !isSameDay(event.startDate, event.endDate);\n}\n\n/**\n * Get event duration in minutes\n */\nexport function getEventDurationMinutes<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>\n): number {\n\treturn Math.floor((event.endDate.getTime() - event.startDate.getTime()) / 60000);\n}\n\n// ============================================================================\n// COLOR UTILITIES\n// ============================================================================\n\n/**\n * Get event color with fallback\n */\nexport function getEventColor<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>,\n\tdefaultColor: TEventColor = 'blue'\n): TEventColor {\n\treturn event.color ?? defaultColor;\n}\n\n/**\n * Resolve color from schedule type or event\n */\nexport function resolveEventColor<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>,\n\tscheduleTypeColors?: Map<number, TEventColor | string>,\n\tdefaultColor: TEventColor = 'blue'\n): TEventColor | string {\n\t// Event color takes precedence\n\tif (event.color) return event.color;\n\n\t// Then schedule type color\n\tif (event.scheduleTypeId !== undefined && scheduleTypeColors) {\n\t\tconst typeColor = scheduleTypeColors.get(event.scheduleTypeId);\n\t\tif (typeColor) return typeColor;\n\t}\n\n\treturn defaultColor;\n}\n\n// ============================================================================\n// ALL-DAY / TIME DISPLAY\n// ============================================================================\n\n/**\n * Format event time display intelligently based on event type.\n *\n * - **All-day events** → `\"All day\"` (no confusing \"00:00 – 23:59\")\n * - **Multi-day all-day** → `\"All day · Feb 16 – Feb 18\"`\n * - **Multi-day timed** → `\"Feb 16, 09:00 – Feb 18, 17:00\"`\n * - **Regular events** → `\"09:00 – 17:00\"`\n *\n * @example\n * ```ts\n * formatEventTimeDisplay({ startDate: allDayStart, endDate: allDayEnd, isAllDay: true });\n * // => \"All day\"\n *\n * formatEventTimeDisplay({ startDate: normalStart, endDate: normalEnd });\n * // => \"09:00 - 17:00\"\n * ```\n */\nexport function formatEventTimeDisplay(event: {\n\tstartDate: Date;\n\tendDate: Date;\n\tisAllDay?: boolean;\n\tisMultiDay?: boolean;\n}): string {\n\tconst isAllDay = detectAllDayEvent(event);\n\n\tif (isAllDay) {\n\t\tif (isSameDay(event.startDate, event.endDate)) {\n\t\t\treturn 'All day';\n\t\t}\n\t\t// Multi-day all-day: \"All day · Feb 16 – Feb 18\"\n\t\tconst startStr = event.startDate.toLocaleDateString(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t\tconst endStr = event.endDate.toLocaleDateString(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t\treturn `All day · ${startStr} – ${endStr}`;\n\t}\n\n\t// Multi-day timed (not all-day): \"Feb 16, 09:00 – Feb 18, 17:00\"\n\tif (!isSameDay(event.startDate, event.endDate)) {\n\t\tconst startDateStr = event.startDate.toLocaleDateString(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t\tconst endDateStr = event.endDate.toLocaleDateString(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t\treturn `${startDateStr}, ${formatTime(event.startDate)} – ${endDateStr}, ${formatTime(event.endDate)}`;\n\t}\n\n\t// Regular single-day timed event: \"09:00 - 17:00\"\n\treturn `${formatTime(event.startDate)} - ${formatTime(event.endDate)}`;\n}\n\n/**\n * Check whether an event should display its time range.\n *\n * Returns `false` for all-day events (where times like \"00:00 – 23:59\"\n * would be meaningless and confusing to users).\n *\n * @example\n * ```ts\n * shouldShowEventTime({ isAllDay: true, startDate, endDate }); // false\n * shouldShowEventTime({ startDate: new Date('2026-02-16T09:00'), endDate: new Date('2026-02-16T17:00') }); // true\n * ```\n */\nexport function shouldShowEventTime(event: {\n\tstartDate: Date;\n\tendDate: Date;\n\tisAllDay?: boolean;\n}): boolean {\n\treturn !detectAllDayEvent(event);\n}\n","/**\n * Grid Utilities for @inno/calendar\n *\n * Functions for view navigation, date ranges, and cell generation.\n */\n\nimport type { ICalendarCell, IDateRange, TCalendarView } from '../types';\nimport {\n\taddDays,\n\taddMonths,\n\taddWeeks,\n\taddYears,\n\tendOfDay,\n\tendOfMonth,\n\tendOfWeek,\n\tendOfYear,\n\tisSameMonth,\n\tisToday,\n\tisWeekend,\n\tstartOfDay,\n\tstartOfMonth,\n\tstartOfWeek,\n\tstartOfYear,\n} from './date-utils';\n\n// ============================================================================\n// VIEW DATE RANGES\n// ============================================================================\n\n/**\n * Get date range for a specific view\n */\nexport function getViewDateRange(\n\tdate: Date,\n\tview: TCalendarView,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): IDateRange {\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn {\n\t\t\t\tstartDate: startOfDay(date),\n\t\t\t\tendDate: endOfDay(date),\n\t\t\t};\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week':\n\t\t\treturn {\n\t\t\t\tstartDate: startOfWeek(date, weekStartsOn),\n\t\t\t\tendDate: endOfWeek(date, weekStartsOn),\n\t\t\t};\n\n\t\tcase 'month': {\n\t\t\t// Include partial weeks at start and end\n\t\t\tconst monthStart = startOfMonth(date);\n\t\t\tconst monthEnd = endOfMonth(date);\n\t\t\treturn {\n\t\t\t\tstartDate: startOfWeek(monthStart, weekStartsOn),\n\t\t\t\tendDate: endOfWeek(monthEnd, weekStartsOn),\n\t\t\t};\n\t\t}\n\n\t\tcase 'timeline-3day':\n\t\t\treturn {\n\t\t\t\tstartDate: startOfDay(date),\n\t\t\t\tendDate: endOfDay(addDays(date, 2)),\n\t\t\t};\n\n\t\tcase 'year':\n\t\t\treturn {\n\t\t\t\tstartDate: startOfYear(date),\n\t\t\t\tendDate: endOfYear(date),\n\t\t\t};\n\n\t\tcase 'agenda':\n\t\t\t// Agenda typically shows next 30 days\n\t\t\treturn {\n\t\t\t\tstartDate: startOfDay(date),\n\t\t\t\tendDate: endOfDay(addDays(date, 29)),\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tstartDate: startOfDay(date),\n\t\t\t\tendDate: endOfDay(date),\n\t\t\t};\n\t}\n}\n\n// ============================================================================\n// NAVIGATION\n// ============================================================================\n\n/**\n * Navigate to next period based on view\n */\nexport function navigateNext(date: Date, view: TCalendarView): Date {\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn addDays(date, 1);\n\n\t\tcase 'timeline-3day':\n\t\t\treturn addDays(date, 3);\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week':\n\t\t\treturn addWeeks(date, 1);\n\n\t\tcase 'month':\n\t\t\treturn addMonths(date, 1);\n\n\t\tcase 'year':\n\t\t\treturn addYears(date, 1);\n\n\t\tcase 'agenda':\n\t\t\treturn addWeeks(date, 1);\n\n\t\tdefault:\n\t\t\treturn addDays(date, 1);\n\t}\n}\n\n/**\n * Navigate to previous period based on view\n */\nexport function navigatePrev(date: Date, view: TCalendarView): Date {\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn addDays(date, -1);\n\n\t\tcase 'timeline-3day':\n\t\t\treturn addDays(date, -3);\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week':\n\t\t\treturn addWeeks(date, -1);\n\n\t\tcase 'month':\n\t\t\treturn addMonths(date, -1);\n\n\t\tcase 'year':\n\t\t\treturn addYears(date, -1);\n\n\t\tcase 'agenda':\n\t\t\treturn addWeeks(date, -1);\n\n\t\tdefault:\n\t\t\treturn addDays(date, -1);\n\t}\n}\n\n/**\n * Navigate to today\n */\nexport function navigateToday(): Date {\n\treturn startOfDay(new Date());\n}\n\n// ============================================================================\n// CELL GENERATION\n// ============================================================================\n\n/**\n * Generate cells for month view\n */\nexport function generateMonthCells(\n\tdate: Date,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): ICalendarCell[] {\n\tconst monthStart = startOfMonth(date);\n\tconst monthEnd = endOfMonth(date);\n\tconst viewStart = startOfWeek(monthStart, weekStartsOn);\n\tconst viewEnd = endOfWeek(monthEnd, weekStartsOn);\n\n\tconst cells: ICalendarCell[] = [];\n\tlet current = viewStart;\n\n\twhile (current <= viewEnd) {\n\t\tcells.push({\n\t\t\tdate: new Date(current),\n\t\t\tisToday: isToday(current),\n\t\t\tisCurrentMonth: isSameMonth(current, date),\n\t\t\tisWeekend: isWeekend(current),\n\t\t\tdayOfWeek: current.getDay(),\n\t\t});\n\t\tcurrent = addDays(current, 1);\n\t}\n\n\treturn cells;\n}\n\n/**\n * Generate cells for week view\n */\nexport function generateWeekCells(\n\tdate: Date,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): ICalendarCell[] {\n\tconst weekStart = startOfWeek(date, weekStartsOn);\n\tconst cells: ICalendarCell[] = [];\n\n\tfor (let i = 0; i < 7; i++) {\n\t\tconst current = addDays(weekStart, i);\n\t\tcells.push({\n\t\t\tdate: current,\n\t\t\tisToday: isToday(current),\n\t\t\tisCurrentMonth: isSameMonth(current, date),\n\t\t\tisWeekend: isWeekend(current),\n\t\t\tdayOfWeek: current.getDay(),\n\t\t});\n\t}\n\n\treturn cells;\n}\n\n/**\n * Generate cells for year view (months)\n */\nexport function generateYearCells(date: Date): ICalendarCell[] {\n\tconst yearStart = startOfYear(date);\n\tconst cells: ICalendarCell[] = [];\n\n\tfor (let i = 0; i < 12; i++) {\n\t\tconst current = addMonths(yearStart, i);\n\t\tcells.push({\n\t\t\tdate: current,\n\t\t\tisToday: isSameMonth(current, new Date()),\n\t\t\tisCurrentMonth: true,\n\t\t\tisWeekend: false,\n\t\t\tdayOfWeek: current.getDay(),\n\t\t});\n\t}\n\n\treturn cells;\n}\n\n// ============================================================================\n// TIME SLOTS\n// ============================================================================\n\n/**\n * Generate time slots for a day\n */\nexport function generateTimeSlots(\n\tstartHour: number,\n\tendHour: number,\n\tslotDuration: number = 30\n): { hour: number; minute: number; label: string }[] {\n\tconst slots: { hour: number; minute: number; label: string }[] = [];\n\tconst slotsPerHour = 60 / slotDuration;\n\n\tfor (let hour = startHour; hour < endHour; hour++) {\n\t\tfor (let slot = 0; slot < slotsPerHour; slot++) {\n\t\t\tconst minute = slot * slotDuration;\n\t\t\tslots.push({\n\t\t\t\thour,\n\t\t\t\tminute,\n\t\t\t\tlabel: `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn slots;\n}\n\n/**\n * Generate hour labels\n */\nexport function generateHourLabels(\n\tstartHour: number,\n\tendHour: number,\n\tformat: '12h' | '24h' = '24h'\n): { hour: number; label: string }[] {\n\tconst labels: { hour: number; label: string }[] = [];\n\n\tfor (let hour = startHour; hour <= endHour; hour++) {\n\t\tlet label: string;\n\t\tif (format === '12h') {\n\t\t\tconst period = hour >= 12 ? 'PM' : 'AM';\n\t\t\tconst hour12 = hour % 12 || 12;\n\t\t\tlabel = `${hour12} ${period}`;\n\t\t} else {\n\t\t\tlabel = `${hour.toString().padStart(2, '0')}:00`;\n\t\t}\n\t\tlabels.push({ hour, label });\n\t}\n\n\treturn labels;\n}\n\n// ============================================================================\n// VIEW TITLE\n// ============================================================================\n\n/**\n * Get range text for date navigator (e.g., \"Mon, Jan 1 - Sun, Jan 7\")\n * Shows a more compact range description below the month/year title\n */\nexport function getRangeText(date: Date, view: TCalendarView, locale = 'en-US'): string {\n\tconst dayMonthFormat = new Intl.DateTimeFormat(locale, {\n\t\tweekday: 'short',\n\t\tmonth: 'short',\n\t\tday: 'numeric',\n\t});\n\tconst shortFormat = new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric' });\n\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn dayMonthFormat.format(date);\n\n\t\tcase 'timeline-3day': {\n\t\t\tconst start3 = startOfDay(date);\n\t\t\tconst end3 = addDays(date, 2);\n\t\t\treturn `${shortFormat.format(start3)} - ${shortFormat.format(end3)}`;\n\t\t}\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week': {\n\t\t\tconst weekStart = startOfWeek(date, 1);\n\t\t\tconst weekEnd = endOfWeek(date, 1);\n\t\t\treturn `${shortFormat.format(weekStart)} - ${shortFormat.format(weekEnd)}`;\n\t\t}\n\n\t\tcase 'month': {\n\t\t\tconst monthStart = startOfMonth(date);\n\t\t\tconst monthEnd = endOfMonth(date);\n\t\t\treturn `${shortFormat.format(monthStart)} - ${shortFormat.format(monthEnd)}`;\n\t\t}\n\n\t\tcase 'year':\n\t\t\treturn `Jan 1 - Dec 31, ${date.getFullYear()}`;\n\n\t\tcase 'agenda': {\n\t\t\tconst monthStart = startOfMonth(date);\n\t\t\tconst monthEnd = endOfMonth(date);\n\t\t\treturn `${shortFormat.format(monthStart)} - ${shortFormat.format(monthEnd)}`;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\n/**\n * Count events in the current view's date range\n * Useful for showing an event count badge in the navigation\n */\nexport function getEventsCountInView(\n\tevents: { startDate: Date; endDate: Date }[],\n\tdate: Date,\n\tview: TCalendarView,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): number {\n\tconst range = getViewDateRange(date, view, weekStartsOn);\n\n\treturn events.filter((event) => {\n\t\t// Event overlaps with period if it starts before period ends AND ends after period starts\n\t\treturn event.startDate <= range.endDate && event.endDate >= range.startDate;\n\t}).length;\n}\n\n/**\n * Get formatted title for current view\n */\nexport function getViewTitle(date: Date, view: TCalendarView, locale = 'en-US'): string {\n\tconst monthFormat = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' });\n\tconst dateFormat = new Intl.DateTimeFormat(locale, {\n\t\tweekday: 'long',\n\t\tmonth: 'long',\n\t\tday: 'numeric',\n\t\tyear: 'numeric',\n\t});\n\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn dateFormat.format(date);\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week': {\n\t\t\tconst weekStart = startOfWeek(date, 1);\n\t\t\tconst weekEnd = endOfWeek(date, 1);\n\t\t\tconst startMonth = new Intl.DateTimeFormat(locale, { month: 'short' }).format(weekStart);\n\t\t\tconst endMonth = new Intl.DateTimeFormat(locale, { month: 'short' }).format(weekEnd);\n\t\t\tconst year = weekStart.getFullYear();\n\n\t\t\tif (startMonth === endMonth) {\n\t\t\t\treturn `${startMonth} ${weekStart.getDate()} - ${weekEnd.getDate()}, ${year}`;\n\t\t\t}\n\t\t\treturn `${startMonth} ${weekStart.getDate()} - ${endMonth} ${weekEnd.getDate()}, ${year}`;\n\t\t}\n\n\t\tcase 'month':\n\t\t\treturn monthFormat.format(date);\n\n\t\tcase 'year':\n\t\t\treturn date.getFullYear().toString();\n\n\t\tcase 'agenda':\n\t\t\treturn `Agenda - ${monthFormat.format(date)}`;\n\n\t\tdefault:\n\t\t\treturn monthFormat.format(date);\n\t}\n}\n\n// ============================================================================\n// WEEK DAYS\n// ============================================================================\n\n/**\n * Get weekday headers for week/month views\n */\nexport function getWeekdayHeaders(\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1,\n\tformat: 'long' | 'short' | 'narrow' = 'short',\n\tlocale = 'en-US'\n): { dayOfWeek: number; label: string }[] {\n\tconst formatter = new Intl.DateTimeFormat(locale, { weekday: format });\n\tconst headers: { dayOfWeek: number; label: string }[] = [];\n\n\t// Start from a known date (Jan 7, 2024 is a Sunday)\n\tconst baseDate = new Date(2024, 0, 7);\n\n\tfor (let i = 0; i < 7; i++) {\n\t\tconst dayIndex = (weekStartsOn + i) % 7;\n\t\tconst date = addDays(baseDate, dayIndex);\n\t\theaders.push({\n\t\t\tdayOfWeek: dayIndex,\n\t\t\tlabel: formatter.format(date),\n\t\t});\n\t}\n\n\treturn headers;\n}\n","/**\n * Position Utilities for @inno/calendar\n *\n * Functions for calculating event positions in time grid views.\n */\n\nimport { DEFAULT_HOUR_HEIGHT, MIN_EVENT_HEIGHT } from '../constants';\nimport type { CalendarEvent, IEventPosition, IPositionedEvent, IVisibleHours } from '../types';\n\n// ============================================================================\n// POSITION CALCULATION\n// ============================================================================\n\n/**\n * Calculate event position in time grid\n */\nexport function calculateEventPosition<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>,\n\t_dayStart: Date,\n\tvisibleHours: IVisibleHours,\n\thourHeight: number = DEFAULT_HOUR_HEIGHT\n): IEventPosition {\n\tconst { startHour, endHour } = visibleHours;\n\tconst totalVisibleHours = endHour - startHour;\n\tconst totalHeight = totalVisibleHours * hourHeight;\n\n\t// Get event times as decimal hours\n\tconst eventStartHour = event.startDate.getHours() + event.startDate.getMinutes() / 60;\n\tconst eventEndHour = event.endDate.getHours() + event.endDate.getMinutes() / 60;\n\n\t// Clamp to visible range\n\tconst clampedStart = Math.max(eventStartHour, startHour);\n\tconst clampedEnd = Math.min(eventEndHour, endHour);\n\n\t// Calculate position relative to visible area\n\tconst top = ((clampedStart - startHour) / totalVisibleHours) * totalHeight;\n\tconst bottom = ((clampedEnd - startHour) / totalVisibleHours) * totalHeight;\n\tconst height = Math.max(bottom - top, MIN_EVENT_HEIGHT);\n\n\treturn {\n\t\ttop,\n\t\theight,\n\t\tleft: 0,\n\t\twidth: 100,\n\t\tzIndex: 1,\n\t};\n}\n\n/**\n * Calculate positions for overlapping events using group-based columns.\n *\n * Events are first grouped into overlap clusters. Within each cluster,\n * columns are assigned independently so that non-overlapping events can\n * expand to full width instead of being constrained by unrelated events.\n */\nexport function calculateOverlappingPositions<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tdayStart: Date,\n\tvisibleHours: IVisibleHours,\n\thourHeight: number = DEFAULT_HOUR_HEIGHT\n): IPositionedEvent<TData>[] {\n\tif (events.length === 0) return [];\n\n\t// Sort by start time, then by duration (longer events first)\n\tconst sortedEvents = [...events].sort((a, b) => {\n\t\tconst startDiff = a.startDate.getTime() - b.startDate.getTime();\n\t\tif (startDiff !== 0) return startDiff;\n\t\tconst durationA = a.endDate.getTime() - a.startDate.getTime();\n\t\tconst durationB = b.endDate.getTime() - b.startDate.getTime();\n\t\treturn durationB - durationA;\n\t});\n\n\t// --- Step 1: Group events into overlap clusters ---\n\tconst groups: CalendarEvent<TData>[][] = [];\n\tlet currentGroup: CalendarEvent<TData>[] = [];\n\tlet groupEnd = 0;\n\n\tfor (const event of sortedEvents) {\n\t\tif (currentGroup.length === 0 || event.startDate.getTime() < groupEnd) {\n\t\t\tcurrentGroup.push(event);\n\t\t\tgroupEnd = Math.max(groupEnd, event.endDate.getTime());\n\t\t} else {\n\t\t\tgroups.push(currentGroup);\n\t\t\tcurrentGroup = [event];\n\t\t\tgroupEnd = event.endDate.getTime();\n\t\t}\n\t}\n\tif (currentGroup.length > 0) {\n\t\tgroups.push(currentGroup);\n\t}\n\n\t// --- Step 2: Assign columns within each group independently ---\n\tconst positionedEvents: IPositionedEvent<TData>[] = [];\n\n\tfor (const group of groups) {\n\t\tconst columns: { event: CalendarEvent<TData>; endTime: number }[][] = [];\n\n\t\tfor (const event of group) {\n\t\t\tconst eventStart = event.startDate.getTime();\n\t\t\tconst eventEnd = event.endDate.getTime();\n\n\t\t\t// Find first available column within this group\n\t\t\tlet columnIndex = -1;\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst column = columns[i];\n\t\t\t\tif (!column) continue;\n\t\t\t\tconst lastInColumn = column[column.length - 1];\n\t\t\t\tif (lastInColumn && lastInColumn.endTime <= eventStart) {\n\t\t\t\t\tcolumnIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (columnIndex === -1) {\n\t\t\t\tcolumnIndex = columns.length;\n\t\t\t\tcolumns.push([]);\n\t\t\t}\n\n\t\t\tconst column = columns[columnIndex];\n\t\t\tif (column) {\n\t\t\t\tcolumn.push({ event, endTime: eventEnd });\n\t\t\t}\n\n\t\t\tconst basePosition = calculateEventPosition<TData>(event, dayStart, visibleHours, hourHeight);\n\n\t\t\tpositionedEvents.push({\n\t\t\t\tevent,\n\t\t\t\tposition: basePosition,\n\t\t\t\tcolumn: columnIndex,\n\t\t\t\tcolumnSpan: 1,\n\t\t\t});\n\t\t}\n\n\t\t// Calculate width and left using this group's column count\n\t\tconst totalColumns = columns.length;\n\t\tconst widthPerColumn = 100 / totalColumns;\n\n\t\t// Only update positions for events in this group\n\t\tconst groupIds = new Set(group.map((e) => e.id));\n\t\tfor (const positioned of positionedEvents) {\n\t\t\tif (!groupIds.has(positioned.event.id)) continue;\n\t\t\tpositioned.position.left = positioned.column * widthPerColumn;\n\t\t\tpositioned.position.width = widthPerColumn * positioned.columnSpan;\n\t\t\tpositioned.position.zIndex = positioned.column + 1;\n\t\t}\n\t}\n\n\treturn positionedEvents;\n}\n\n// ============================================================================\n// TIME TO POSITION CONVERSION\n// ============================================================================\n\n/**\n * Convert Y position to time\n */\nexport function yToTime(\n\ty: number,\n\tdayStart: Date,\n\tvisibleHours: IVisibleHours,\n\thourHeight: number = DEFAULT_HOUR_HEIGHT,\n\tslotDuration: number = 30\n): Date {\n\tconst { startHour, endHour } = visibleHours;\n\tconst totalVisibleHours = endHour - startHour;\n\tconst totalHeight = totalVisibleHours * hourHeight;\n\n\t// Calculate hours from top\n\tconst hoursFromTop = (y / totalHeight) * totalVisibleHours;\n\tconst absoluteHours = startHour + hoursFromTop;\n\n\t// Snap to slot duration\n\tconst totalMinutes = absoluteHours * 60;\n\tconst snappedMinutes = Math.round(totalMinutes / slotDuration) * slotDuration;\n\n\t// Create date with snapped time\n\tconst result = new Date(dayStart);\n\tresult.setHours(0, 0, 0, 0);\n\tresult.setMinutes(snappedMinutes);\n\n\treturn result;\n}\n\n/**\n * Convert time to Y position\n */\nexport function timeToY(\n\ttime: Date,\n\tvisibleHours: IVisibleHours,\n\thourHeight: number = DEFAULT_HOUR_HEIGHT\n): number {\n\tconst { startHour, endHour } = visibleHours;\n\tconst totalVisibleHours = endHour - startHour;\n\tconst totalHeight = totalVisibleHours * hourHeight;\n\n\tconst hours = time.getHours() + time.getMinutes() / 60;\n\tconst clampedHours = Math.max(startHour, Math.min(hours, endHour));\n\n\treturn ((clampedHours - startHour) / totalVisibleHours) * totalHeight;\n}\n\n// ============================================================================\n// OVERLAP DETECTION\n// ============================================================================\n\n/**\n * Check if two events overlap in time\n */\nexport function eventsOverlap(event1: CalendarEvent, event2: CalendarEvent): boolean {\n\treturn event1.startDate < event2.endDate && event1.endDate > event2.startDate;\n}\n\n/**\n * Get overlapping event groups\n */\nexport function getOverlappingGroups<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[][] {\n\tif (events.length === 0) return [];\n\n\tconst sorted = [...events].sort((a, b) => a.startDate.getTime() - b.startDate.getTime());\n\tconst groups: CalendarEvent<TData>[][] = [];\n\tlet currentGroup: CalendarEvent<TData>[] = [];\n\tlet groupEnd = 0;\n\n\tfor (const event of sorted) {\n\t\tif (currentGroup.length === 0 || event.startDate.getTime() < groupEnd) {\n\t\t\t// Event overlaps with current group\n\t\t\tcurrentGroup.push(event);\n\t\t\tgroupEnd = Math.max(groupEnd, event.endDate.getTime());\n\t\t} else {\n\t\t\t// Start new group\n\t\t\tif (currentGroup.length > 0) {\n\t\t\t\tgroups.push(currentGroup);\n\t\t\t}\n\t\t\tcurrentGroup = [event];\n\t\t\tgroupEnd = event.endDate.getTime();\n\t\t}\n\t}\n\n\tif (currentGroup.length > 0) {\n\t\tgroups.push(currentGroup);\n\t}\n\n\treturn groups;\n}\n\n// ============================================================================\n// SELECTION OVERLAY\n// ============================================================================\n\n/**\n * Calculate selection overlay dimensions\n */\nexport function calculateSelectionOverlay(\n\tstartY: number,\n\tcurrentY: number,\n\tcontainerHeight: number\n): { top: number; height: number } {\n\tconst minY = Math.max(0, Math.min(startY, currentY));\n\tconst maxY = Math.min(containerHeight, Math.max(startY, currentY));\n\n\treturn {\n\t\ttop: minY,\n\t\theight: maxY - minY,\n\t};\n}\n"],"names":["CALENDAR_VIEWS","DEFAULT_PREFERENCES","DEFAULT_VISIBLE_HOURS","DEFAULT_BUSINESS_HOURS","DEFAULT_VIEW_CONFIGS","EVENT_COLORS","EVENT_COLOR_CLASSES","HEX_TO_EVENT_COLOR","HOURS_IN_DAY","MINUTES_IN_HOUR","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_DAY","DEFAULT_HOUR_HEIGHT","DEFAULT_SLOT_HEIGHT","DEFAULT_HEADER_HEIGHT","DEFAULT_RESOURCE_WIDTH","MIN_EVENT_HEIGHT","startOfDay","date","result","endOfDay","addDays","days","subDays","isSameDay","date1","date2","isToday","getDayOfWeek","isWeekend","day","startOfWeek","weekStartsOn","diff","endOfWeek","addWeeks","weeks","subWeeks","getWeekNumber","d","dayNum","yearStart","isSameWeek","start1","start2","startOfMonth","endOfMonth","addMonths","months","subMonths","getDaysInMonth","isSameMonth","startOfYear","endOfYear","addYears","years","subYears","isSameYear","addHours","hours","addMinutes","minutes","setTime","seconds","getDecimalHours","isBefore","dateToCompare","isAfter","isBetween","start","end","time","minDate","dates","min","maxDate","max","differenceInMilliseconds","differenceInMinutes","differenceInHours","differenceInDays","formatTime","format","period","formatDateISO","year","month","parseISO","dateString","eachDayOfInterval","current","endDay","eachHourOfInterval","getWeekdayNames","locale","formatter","baseDate","i","getMonthNames","getVisibleHoursArray","visibleHours","h","formatHourLabel","hour","getWeekDays","weekStart","generateMonthGrid","monthStart","monthEnd","gridStart","gridEnd","currentMonth","detectAllDayEvent","event","startHour","startMinute","endHour","endMinute","startsAtMidnight","endsAtDayBoundary","separateEventsByDuration","events","singleDay","multiDay","getEventsInRange","rangeStart","rangeEnd","isWorkingHour","workingHours","dayOfWeek","dayHours","getWorkingHoursForDay","getYearMonths","filterEventsByDateRange","startDate","endDate","eventStart","eventEnd","filterEventsByScheduleType","scheduleTypeIds","filterEventsByResource","resourceIds","filterEventsBySearch","search","searchLower","titleMatch","descriptionMatch","filterOutCanceled","applyEventFilters","options","filtered","sortEventsByStart","a","b","sortEventsByEnd","sortEventsByDuration","durationA","groupEventsByDate","groups","dateKey","existing","groupEventsByScheduleType","groupEventsByResource","getEventsForDay","dayStart","dayEnd","getAllDayEvents","getTimedEvents","getMultiDayEvents","isMultiDayEvent","getEventDurationMinutes","getEventColor","defaultColor","resolveEventColor","scheduleTypeColors","typeColor","formatEventTimeDisplay","startStr","endStr","startDateStr","endDateStr","shouldShowEventTime","getViewDateRange","view","navigateNext","navigatePrev","navigateToday","generateMonthCells","viewStart","viewEnd","cells","generateWeekCells","generateYearCells","generateTimeSlots","slotDuration","slots","slotsPerHour","slot","minute","generateHourLabels","labels","label","getRangeText","dayMonthFormat","shortFormat","start3","end3","weekEnd","getEventsCountInView","range","getViewTitle","monthFormat","dateFormat","startMonth","endMonth","getWeekdayHeaders","headers","dayIndex","calculateEventPosition","_dayStart","hourHeight","totalVisibleHours","totalHeight","eventStartHour","eventEndHour","clampedStart","clampedEnd","top","bottom","height","calculateOverlappingPositions","sortedEvents","startDiff","currentGroup","groupEnd","positionedEvents","group","columns","columnIndex","column","lastInColumn","basePosition","widthPerColumn","groupIds","e","positioned","yToTime","y","hoursFromTop","totalMinutes","snappedMinutes","timeToY","eventsOverlap","event1","event2","getOverlappingGroups","sorted","calculateSelectionOverlay","startY","currentY","containerHeight","minY","maxY"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","sources":["../src/core/constants.ts","../src/core/utils/date-utils.ts","../src/core/utils/event-utils.ts","../src/core/utils/grid-utils.ts","../src/core/utils/position-utils.ts"],"sourcesContent":["/**\n * Constants for @inno/calendar\n *\n * Default values, view configurations, and color mappings.\n */\n\nimport type {\n\tICalendarPreferences,\n\tIViewConfig,\n\tIVisibleHours,\n\tTCalendarView,\n\tTEventColor,\n} from './types';\n\n// ============================================================================\n// CALENDAR VIEWS\n// ============================================================================\n\n/**\n * All available calendar views\n */\nexport const CALENDAR_VIEWS: TCalendarView[] = [\n\t'day',\n\t'week',\n\t'month',\n\t'year',\n\t'agenda',\n\t'resource-day',\n\t'resource-week',\n\t'timeline-day',\n\t'timeline-week',\n];\n\n// ============================================================================\n// DEFAULT PREFERENCES\n// ============================================================================\n\n/**\n * Default calendar preferences\n */\nexport const DEFAULT_PREFERENCES: ICalendarPreferences = {\n\tstartHour: 8,\n\tendHour: 18,\n\tfirstDayOfWeek: 1, // Monday\n\tslotDuration: 30,\n\tshowWeekends: true,\n\ttimeFormat: '24h',\n\tbadgeVariant: 'colored',\n\tshowCanceledEvents: false,\n};\n\n/**\n * Default visible hours\n */\nexport const DEFAULT_VISIBLE_HOURS: IVisibleHours = {\n\tstartHour: 0,\n\tendHour: 24,\n};\n\n/**\n * Default business hours range (used as a fallback for visible hours)\n */\nexport const DEFAULT_BUSINESS_HOURS: IVisibleHours = {\n\tstartHour: 8,\n\tendHour: 18,\n};\n\n// ============================================================================\n// VIEW CONFIGURATIONS\n// ============================================================================\n\n/**\n * Default configuration for each view type\n */\nexport const DEFAULT_VIEW_CONFIGS: Record<TCalendarView, IViewConfig> = {\n\tday: {\n\t\ttype: 'day',\n\t\tslotMinTime: '00:00',\n\t\tslotMaxTime: '24:00',\n\t\tslotDuration: '00:30:00',\n\t\tscrollTime: '08:00:00',\n\t\tallDaySlot: true,\n\t},\n\tweek: {\n\t\ttype: 'week',\n\t\tslotMinTime: '00:00',\n\t\tslotMaxTime: '24:00',\n\t\tslotDuration: '00:30:00',\n\t\tscrollTime: '08:00:00',\n\t\tdayMaxEventRows: 3,\n\t\tallDaySlot: true,\n\t},\n\tmonth: {\n\t\ttype: 'month',\n\t\tdayMaxEventRows: 4,\n\t\teventMaxStack: 3,\n\t\tallDaySlot: false,\n\t},\n\tyear: {\n\t\ttype: 'year',\n\t\tdayMaxEventRows: 2,\n\t\tallDaySlot: false,\n\t},\n\tagenda: {\n\t\ttype: 'agenda',\n\t\tallDaySlot: false,\n\t},\n\t'resource-day': {\n\t\ttype: 'resource-day',\n\t\tslotMinTime: '00:00',\n\t\tslotMaxTime: '24:00',\n\t\tslotDuration: '00:30:00',\n\t\tscrollTime: '08:00:00',\n\t\tallDaySlot: true,\n\t},\n\t'resource-week': {\n\t\ttype: 'resource-week',\n\t\tslotMinTime: '00:00',\n\t\tslotMaxTime: '24:00',\n\t\tslotDuration: '00:30:00',\n\t\tscrollTime: '08:00:00',\n\t\tallDaySlot: true,\n\t},\n\t'timeline-day': {\n\t\ttype: 'timeline-day',\n\t\tslotDuration: '01:00:00',\n\t},\n\t'timeline-3day': {\n\t\ttype: 'timeline-3day',\n\t\tslotDuration: '01:00:00',\n\t},\n\t'timeline-week': {\n\t\ttype: 'timeline-week',\n\t\tslotDuration: '01:00:00',\n\t},\n};\n\n// ============================================================================\n// EVENT COLORS\n// ============================================================================\n\n/**\n * Event color palette with hex values\n */\nexport const EVENT_COLORS: Record<TEventColor, string> = {\n\tblue: '#3b82f6',\n\tgreen: '#22c55e',\n\tred: '#ef4444',\n\tyellow: '#eab308',\n\tpurple: '#a855f7',\n\torange: '#f97316',\n\tpink: '#ec4899',\n\tteal: '#14b8a6',\n\tgray: '#6b7280',\n\tindigo: '#6366f1',\n};\n\n/**\n * TailwindCSS class mappings for event colors\n */\nexport const EVENT_COLOR_CLASSES: Record<\n\tTEventColor,\n\t{ bg: string; text: string; border: string }\n> = {\n\tblue: { bg: 'bg-blue-100', text: 'text-blue-800', border: 'border-blue-300' },\n\tgreen: { bg: 'bg-green-100', text: 'text-green-800', border: 'border-green-300' },\n\tred: { bg: 'bg-red-100', text: 'text-red-800', border: 'border-red-300' },\n\tyellow: { bg: 'bg-yellow-100', text: 'text-yellow-800', border: 'border-yellow-300' },\n\tpurple: { bg: 'bg-purple-100', text: 'text-purple-800', border: 'border-purple-300' },\n\torange: { bg: 'bg-orange-100', text: 'text-orange-800', border: 'border-orange-300' },\n\tpink: { bg: 'bg-pink-100', text: 'text-pink-800', border: 'border-pink-300' },\n\tteal: { bg: 'bg-teal-100', text: 'text-teal-800', border: 'border-teal-300' },\n\tgray: { bg: 'bg-gray-100', text: 'text-gray-800', border: 'border-gray-300' },\n\tindigo: { bg: 'bg-indigo-100', text: 'text-indigo-800', border: 'border-indigo-300' },\n};\n\n/**\n * Map hex colors to event color names\n */\nexport const HEX_TO_EVENT_COLOR: Record<string, TEventColor> = {\n\t'#3b82f6': 'blue',\n\t'#22c55e': 'green',\n\t'#ef4444': 'red',\n\t'#eab308': 'yellow',\n\t'#a855f7': 'purple',\n\t'#f97316': 'orange',\n\t'#ec4899': 'pink',\n\t'#14b8a6': 'teal',\n\t'#6b7280': 'gray',\n\t'#6366f1': 'indigo',\n};\n\n// ============================================================================\n// TIME CONSTANTS\n// ============================================================================\n\n/**\n * Hours in a day\n */\nexport const HOURS_IN_DAY = 24;\n\n/**\n * Minutes in an hour\n */\nexport const MINUTES_IN_HOUR = 60;\n\n/**\n * Milliseconds in a minute\n */\nexport const MS_PER_MINUTE = 60 * 1000;\n\n/**\n * Milliseconds in an hour\n */\nexport const MS_PER_HOUR = 60 * MS_PER_MINUTE;\n\n/**\n * Milliseconds in a day\n */\nexport const MS_PER_DAY = 24 * MS_PER_HOUR;\n\n// ============================================================================\n// GRID CONSTANTS\n// ============================================================================\n\n/**\n * Default hour height in pixels for time grid views\n */\nexport const DEFAULT_HOUR_HEIGHT = 64;\n\n/**\n * Default slot height in pixels\n */\nexport const DEFAULT_SLOT_HEIGHT = 32;\n\n/**\n * Default header height in pixels\n */\nexport const DEFAULT_HEADER_HEIGHT = 56;\n\n/**\n * Default resource column width in pixels\n */\nexport const DEFAULT_RESOURCE_WIDTH = 200;\n\n/**\n * Minimum event height in pixels\n */\nexport const MIN_EVENT_HEIGHT = 20;\n","/**\n * Date Utilities for @inno/calendar\n *\n * Pure functions for date manipulation using native Date API.\n * No external dependencies.\n */\n\nimport type { TWorkingHours } from '../types';\n\n// Re-export TWorkingHours for convenience\nexport type { TWorkingHours };\n\n// ============================================================================\n// DAY OPERATIONS\n// ============================================================================\n\n/**\n * Get start of day (00:00:00.000)\n */\nexport function startOfDay(date: Date): Date {\n\tconst result = new Date(date);\n\tresult.setHours(0, 0, 0, 0);\n\treturn result;\n}\n\n/**\n * Get end of day (23:59:59.999)\n */\nexport function endOfDay(date: Date): Date {\n\tconst result = new Date(date);\n\tresult.setHours(23, 59, 59, 999);\n\treturn result;\n}\n\n/**\n * Add days to a date\n */\nexport function addDays(date: Date, days: number): Date {\n\tconst result = new Date(date);\n\tresult.setDate(result.getDate() + days);\n\treturn result;\n}\n\n/**\n * Subtract days from a date\n */\nexport function subDays(date: Date, days: number): Date {\n\treturn addDays(date, -days);\n}\n\n/**\n * Check if two dates are the same day\n */\nexport function isSameDay(date1: Date, date2: Date): boolean {\n\treturn (\n\t\tdate1.getFullYear() === date2.getFullYear() &&\n\t\tdate1.getMonth() === date2.getMonth() &&\n\t\tdate1.getDate() === date2.getDate()\n\t);\n}\n\n/**\n * Check if date is today\n */\nexport function isToday(date: Date): boolean {\n\treturn isSameDay(date, new Date());\n}\n\n/**\n * Get day of week (0-6, where 0 is Sunday)\n */\nexport function getDayOfWeek(date: Date): number {\n\treturn date.getDay();\n}\n\n/**\n * Check if date is a weekend\n */\nexport function isWeekend(date: Date): boolean {\n\tconst day = date.getDay();\n\treturn day === 0 || day === 6;\n}\n\n// ============================================================================\n// WEEK OPERATIONS\n// ============================================================================\n\n/**\n * Get start of week\n */\nexport function startOfWeek(date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1): Date {\n\tconst result = new Date(date);\n\tconst day = result.getDay();\n\tconst diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\tresult.setDate(result.getDate() - diff);\n\tresult.setHours(0, 0, 0, 0);\n\treturn result;\n}\n\n/**\n * Get end of week\n */\nexport function endOfWeek(date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1): Date {\n\tconst result = startOfWeek(date, weekStartsOn);\n\tresult.setDate(result.getDate() + 6);\n\tresult.setHours(23, 59, 59, 999);\n\treturn result;\n}\n\n/**\n * Add weeks to a date\n */\nexport function addWeeks(date: Date, weeks: number): Date {\n\treturn addDays(date, weeks * 7);\n}\n\n/**\n * Subtract weeks from a date\n */\nexport function subWeeks(date: Date, weeks: number): Date {\n\treturn addDays(date, -weeks * 7);\n}\n\n/**\n * Get week number in year (ISO 8601)\n */\nexport function getWeekNumber(date: Date): number {\n\tconst d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n\tconst dayNum = d.getUTCDay() || 7;\n\td.setUTCDate(d.getUTCDate() + 4 - dayNum);\n\tconst yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n\treturn Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n\n/**\n * Check if two dates are in the same week\n */\nexport function isSameWeek(\n\tdate1: Date,\n\tdate2: Date,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): boolean {\n\tconst start1 = startOfWeek(date1, weekStartsOn);\n\tconst start2 = startOfWeek(date2, weekStartsOn);\n\treturn isSameDay(start1, start2);\n}\n\n// ============================================================================\n// MONTH OPERATIONS\n// ============================================================================\n\n/**\n * Get start of month\n */\nexport function startOfMonth(date: Date): Date {\n\tconst result = new Date(date);\n\tresult.setDate(1);\n\tresult.setHours(0, 0, 0, 0);\n\treturn result;\n}\n\n/**\n * Get end of month\n */\nexport function endOfMonth(date: Date): Date {\n\tconst result = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n\tresult.setHours(23, 59, 59, 999);\n\treturn result;\n}\n\n/**\n * Add months to a date\n */\nexport function addMonths(date: Date, months: number): Date {\n\tconst result = new Date(date);\n\tresult.setMonth(result.getMonth() + months);\n\treturn result;\n}\n\n/**\n * Subtract months from a date\n */\nexport function subMonths(date: Date, months: number): Date {\n\treturn addMonths(date, -months);\n}\n\n/**\n * Get number of days in a month\n */\nexport function getDaysInMonth(date: Date): number {\n\treturn new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\n/**\n * Check if two dates are in the same month\n */\nexport function isSameMonth(date1: Date, date2: Date): boolean {\n\treturn date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth();\n}\n\n// ============================================================================\n// YEAR OPERATIONS\n// ============================================================================\n\n/**\n * Get start of year\n */\nexport function startOfYear(date: Date): Date {\n\treturn new Date(date.getFullYear(), 0, 1, 0, 0, 0, 0);\n}\n\n/**\n * Get end of year\n */\nexport function endOfYear(date: Date): Date {\n\treturn new Date(date.getFullYear(), 11, 31, 23, 59, 59, 999);\n}\n\n/**\n * Add years to a date\n */\nexport function addYears(date: Date, years: number): Date {\n\tconst result = new Date(date);\n\tresult.setFullYear(result.getFullYear() + years);\n\treturn result;\n}\n\n/**\n * Subtract years from a date\n */\nexport function subYears(date: Date, years: number): Date {\n\treturn addYears(date, -years);\n}\n\n/**\n * Check if two dates are in the same year\n */\nexport function isSameYear(date1: Date, date2: Date): boolean {\n\treturn date1.getFullYear() === date2.getFullYear();\n}\n\n// ============================================================================\n// TIME OPERATIONS\n// ============================================================================\n\n/**\n * Add hours to a date\n */\nexport function addHours(date: Date, hours: number): Date {\n\tconst result = new Date(date);\n\tresult.setHours(result.getHours() + hours);\n\treturn result;\n}\n\n/**\n * Add minutes to a date\n */\nexport function addMinutes(date: Date, minutes: number): Date {\n\tconst result = new Date(date);\n\tresult.setMinutes(result.getMinutes() + minutes);\n\treturn result;\n}\n\n/**\n * Set time on a date\n */\nexport function setTime(date: Date, hours: number, minutes = 0, seconds = 0): Date {\n\tconst result = new Date(date);\n\tresult.setHours(hours, minutes, seconds, 0);\n\treturn result;\n}\n\n/**\n * Get time as decimal hours (e.g., 14:30 = 14.5)\n */\nexport function getDecimalHours(date: Date): number {\n\treturn date.getHours() + date.getMinutes() / 60;\n}\n\n// ============================================================================\n// COMPARISON OPERATIONS\n// ============================================================================\n\n/**\n * Check if date is before another date\n */\nexport function isBefore(date: Date, dateToCompare: Date): boolean {\n\treturn date.getTime() < dateToCompare.getTime();\n}\n\n/**\n * Check if date is after another date\n */\nexport function isAfter(date: Date, dateToCompare: Date): boolean {\n\treturn date.getTime() > dateToCompare.getTime();\n}\n\n/**\n * Check if date is between two dates (inclusive)\n */\nexport function isBetween(date: Date, start: Date, end: Date): boolean {\n\tconst time = date.getTime();\n\treturn time >= start.getTime() && time <= end.getTime();\n}\n\n/**\n * Get minimum date from array\n */\nexport function minDate(dates: Date[]): Date | undefined {\n\tif (dates.length === 0) return undefined;\n\treturn dates.reduce((min, date) => (date < min ? date : min));\n}\n\n/**\n * Get maximum date from array\n */\nexport function maxDate(dates: Date[]): Date | undefined {\n\tif (dates.length === 0) return undefined;\n\treturn dates.reduce((max, date) => (date > max ? date : max));\n}\n\n// ============================================================================\n// DIFFERENCE OPERATIONS\n// ============================================================================\n\n/**\n * Get difference in milliseconds\n */\nexport function differenceInMilliseconds(date1: Date, date2: Date): number {\n\treturn date1.getTime() - date2.getTime();\n}\n\n/**\n * Get difference in minutes\n */\nexport function differenceInMinutes(date1: Date, date2: Date): number {\n\treturn Math.floor(differenceInMilliseconds(date1, date2) / 60000);\n}\n\n/**\n * Get difference in hours\n */\nexport function differenceInHours(date1: Date, date2: Date): number {\n\treturn Math.floor(differenceInMilliseconds(date1, date2) / 3600000);\n}\n\n/**\n * Get difference in days\n */\nexport function differenceInDays(date1: Date, date2: Date): number {\n\tconst start = startOfDay(date1);\n\tconst end = startOfDay(date2);\n\treturn Math.floor(differenceInMilliseconds(start, end) / 86400000);\n}\n\n// ============================================================================\n// FORMATTING\n// ============================================================================\n\n/**\n * Format time as HH:MM\n */\nexport function formatTime(date: Date, format: '12h' | '24h' = '24h'): string {\n\tconst hours = date.getHours();\n\tconst minutes = date.getMinutes();\n\n\tif (format === '12h') {\n\t\tconst period = hours >= 12 ? 'PM' : 'AM';\n\t\tconst hour12 = hours % 12 || 12;\n\t\treturn `${hour12}:${minutes.toString().padStart(2, '0')} ${period}`;\n\t}\n\n\treturn `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n}\n\n/**\n * Format date as YYYY-MM-DD\n */\nexport function formatDateISO(date: Date): string {\n\tconst year = date.getFullYear();\n\tconst month = (date.getMonth() + 1).toString().padStart(2, '0');\n\tconst day = date.getDate().toString().padStart(2, '0');\n\treturn `${year}-${month}-${day}`;\n}\n\n/**\n * Parse ISO date string to Date\n */\nexport function parseISO(dateString: string): Date {\n\treturn new Date(dateString);\n}\n\n// ============================================================================\n// ARRAY GENERATION\n// ============================================================================\n\n/**\n * Generate array of dates between start and end (inclusive)\n */\nexport function eachDayOfInterval(start: Date, end: Date): Date[] {\n\tconst dates: Date[] = [];\n\tlet current = startOfDay(start);\n\tconst endDay = startOfDay(end);\n\n\twhile (current <= endDay) {\n\t\tdates.push(new Date(current));\n\t\tcurrent = addDays(current, 1);\n\t}\n\n\treturn dates;\n}\n\n/**\n * Generate array of hours between start and end\n */\nexport function eachHourOfInterval(start: Date, end: Date): Date[] {\n\tconst hours: Date[] = [];\n\tlet current = new Date(start);\n\n\twhile (current <= end) {\n\t\thours.push(new Date(current));\n\t\tcurrent = addHours(current, 1);\n\t}\n\n\treturn hours;\n}\n\n/**\n * Get weekday names\n */\nexport function getWeekdayNames(\n\tlocale = 'en-US',\n\tformat: 'long' | 'short' | 'narrow' = 'short'\n): string[] {\n\tconst formatter = new Intl.DateTimeFormat(locale, { weekday: format });\n\tconst days: string[] = [];\n\n\t// Use a known Sunday to start\n\tconst baseDate = new Date(2024, 0, 7); // Sunday, Jan 7, 2024\n\n\tfor (let i = 0; i < 7; i++) {\n\t\tdays.push(formatter.format(addDays(baseDate, i)));\n\t}\n\n\treturn days;\n}\n\n/**\n * Get month names\n */\nexport function getMonthNames(\n\tlocale = 'en-US',\n\tformat: 'long' | 'short' | 'narrow' = 'long'\n): string[] {\n\tconst formatter = new Intl.DateTimeFormat(locale, { month: format });\n\tconst months: string[] = [];\n\n\tfor (let i = 0; i < 12; i++) {\n\t\tmonths.push(formatter.format(new Date(2024, i, 1)));\n\t}\n\n\treturn months;\n}\n\n// ============================================================================\n// VIEW HELPERS\n// ============================================================================\n\n/**\n * Get array of visible hours based on configuration\n */\nexport function getVisibleHoursArray(visibleHours: {\n\tstartHour: number;\n\tendHour: number;\n}): number[] {\n\tconst hours: number[] = [];\n\tfor (let h = visibleHours.startHour; h <= visibleHours.endHour; h++) {\n\t\thours.push(h);\n\t}\n\treturn hours;\n}\n\n/**\n * Format hour for display (e.g., 8 -> \"8:00\", 14 -> \"14:00\")\n */\nexport function formatHourLabel(hour: number, format: '12h' | '24h' = '24h'): string {\n\tif (format === '12h') {\n\t\tconst period = hour >= 12 ? 'PM' : 'AM';\n\t\tconst hour12 = hour % 12 || 12;\n\t\treturn `${hour12} ${period}`;\n\t}\n\t// 24h format with leading zero (e.g., \"09:00\", \"14:00\")\n\treturn `${String(hour).padStart(2, '0')}:00`;\n}\n\n/**\n * Get an array of 7 days for a week starting from the given date\n */\nexport function getWeekDays(date: Date, weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1): Date[] {\n\tconst weekStart = startOfWeek(date, weekStartsOn);\n\tconst days: Date[] = [];\n\n\tfor (let i = 0; i < 7; i++) {\n\t\tdays.push(addDays(weekStart, i));\n\t}\n\n\treturn days;\n}\n\n/**\n * Generate month grid cells (typically 6 weeks x 7 days = 42 days)\n * Returns enriched cell objects with date, isCurrentMonth, and isWeekend\n */\nexport function generateMonthGrid(\n\tdate: Date,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): Array<{ date: Date; isCurrentMonth: boolean; isWeekend: boolean }> {\n\tconst monthStart = startOfMonth(date);\n\tconst monthEnd = endOfMonth(date);\n\tconst gridStart = startOfWeek(monthStart, weekStartsOn);\n\tconst gridEnd = endOfWeek(monthEnd, weekStartsOn);\n\tconst currentMonth = date.getMonth();\n\n\tconst dates = eachDayOfInterval(gridStart, gridEnd);\n\n\treturn dates.map((d) => ({\n\t\tdate: d,\n\t\tisCurrentMonth: d.getMonth() === currentMonth,\n\t\tisWeekend: d.getDay() === 0 || d.getDay() === 6,\n\t}));\n}\n\n// ============================================================================\n// ALL-DAY EVENT DETECTION\n// ============================================================================\n\n/**\n * Detect whether an event should be treated as an \"all-day\" event.\n *\n * An event is all-day if:\n * 1. Its `isAllDay` flag is explicitly `true`, OR\n * 2. It starts at 00:00 and ends at 23:59 or 00:00 (next day boundary)\n *\n * All-day events should **not** display time ranges — showing \"00:00 – 23:59\"\n * is confusing for users. Instead, display \"All day\" or a date range.\n *\n * @example\n * ```ts\n * detectAllDayEvent({ startDate: new Date('2026-02-16T00:00'), endDate: new Date('2026-02-16T23:59'), isAllDay: false })\n * // => true (midnight boundaries)\n *\n * detectAllDayEvent({ startDate: new Date('2026-02-16T09:00'), endDate: new Date('2026-02-16T17:00') })\n * // => false (normal timed event)\n * ```\n */\nexport function detectAllDayEvent(event: {\n\tstartDate: Date;\n\tendDate: Date;\n\tisAllDay?: boolean;\n}): boolean {\n\t// Explicit flag takes priority — respect both true AND false\n\tif (event.isAllDay === true) return true;\n\tif (event.isAllDay === false) return false;\n\n\t// Check if times sit on day boundaries (midnight start, midnight or end-of-day end)\n\tconst startHour = event.startDate.getHours();\n\tconst startMinute = event.startDate.getMinutes();\n\tconst endHour = event.endDate.getHours();\n\tconst endMinute = event.endDate.getMinutes();\n\n\tconst startsAtMidnight = startHour === 0 && startMinute === 0;\n\tconst endsAtDayBoundary =\n\t\t(endHour === 0 && endMinute === 0) || // midnight next day\n\t\t(endHour === 23 && endMinute >= 59); // end of day (23:59 or 23:59:59)\n\n\tif (startsAtMidnight && endsAtDayBoundary) return true;\n\n\treturn false;\n}\n\n/**\n * Separate events into single-day timed events and banner events\n * (multi-day + all-day).\n *\n * All-day events (detected via {@link detectAllDayEvent}) are placed in\n * the `multiDay` bucket even when they span a single calendar day, because\n * they belong in the banner strip — not in the hourly time grid.\n */\nexport function separateEventsByDuration<\n\tTEvent extends { id: string; startDate: Date; endDate: Date; isAllDay?: boolean },\n>(\n\tevents: TEvent[]\n): {\n\tsingleDay: TEvent[];\n\tmultiDay: TEvent[];\n} {\n\tconst singleDay: TEvent[] = [];\n\tconst multiDay: TEvent[] = [];\n\n\tfor (const event of events) {\n\t\t// All-day events always go to the banner, even single-day ones\n\t\tif (detectAllDayEvent(event)) {\n\t\t\tmultiDay.push(event);\n\t\t} else if (isSameDay(event.startDate, event.endDate)) {\n\t\t\tsingleDay.push(event);\n\t\t} else {\n\t\t\tmultiDay.push(event);\n\t\t}\n\t}\n\n\treturn { singleDay, multiDay };\n}\n\n/**\n * Get events within a date range\n */\nexport function getEventsInRange<TEvent extends { startDate: Date; endDate: Date }>(\n\tevents: TEvent[],\n\trangeStart: Date,\n\trangeEnd: Date\n): TEvent[] {\n\treturn events.filter((event) => {\n\t\treturn event.startDate <= rangeEnd && event.endDate >= rangeStart;\n\t});\n}\n\n// ============================================================================\n// WORKING HOURS UTILITIES\n// ============================================================================\n\n/**\n * Check if a given hour is within working hours for a specific day\n * Handles both TWorkingHours (with `enabled`) and TWorkingHoursConfig (without `enabled`)\n */\nexport function isWorkingHour(date: Date, hour: number, workingHours?: TWorkingHours): boolean {\n\tif (!workingHours) return true; // If no working hours defined, all hours are valid\n\n\tconst dayOfWeek = date.getDay();\n\tconst dayHours = workingHours[dayOfWeek];\n\n\tif (!dayHours) return false;\n\n\t// Treat as enabled if `enabled` is undefined (backward compat with TWorkingHoursConfig)\n\tconst isEnabled = dayHours.enabled !== false;\n\tif (!isEnabled || dayHours.from === dayHours.to) {\n\t\treturn false;\n\t}\n\n\treturn hour >= dayHours.from && hour < dayHours.to;\n}\n\n/**\n * Get working hours for a specific day\n * Returns null if the day is disabled or has no working hours\n * Handles both TWorkingHours (with `enabled`) and TWorkingHoursConfig (without `enabled`)\n */\nexport function getWorkingHoursForDay(\n\tdate: Date,\n\tworkingHours: TWorkingHours\n): { from: number; to: number } | null {\n\tconst dayOfWeek = date.getDay();\n\tconst dayHours = workingHours[dayOfWeek];\n\n\tif (!dayHours) return null;\n\n\t// Treat as enabled if `enabled` is undefined (backward compat with TWorkingHoursConfig)\n\tconst isEnabled = dayHours.enabled !== false;\n\tif (!isEnabled || dayHours.from === dayHours.to) {\n\t\treturn null;\n\t}\n\n\treturn { from: dayHours.from, to: dayHours.to };\n}\n\n/**\n * Get all months for a year (for year view)\n */\nexport function getYearMonths(year: number): Date[] {\n\tconst months: Date[] = [];\n\tfor (let month = 0; month < 12; month++) {\n\t\tmonths.push(new Date(year, month, 1));\n\t}\n\treturn months;\n}\n","/**\n * Event Utilities for @inno/calendar\n *\n * Functions for filtering, sorting, and grouping events.\n * All functions are generic to work with any event data type.\n */\n\nimport type { CalendarEvent, TEventColor } from '../types';\nimport { detectAllDayEvent, endOfDay, formatTime, isSameDay, startOfDay } from './date-utils';\n\n// ============================================================================\n// FILTERING\n// ============================================================================\n\n/**\n * Filter events by date range\n */\nexport function filterEventsByDateRange<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tstartDate: Date,\n\tendDate: Date\n): CalendarEvent<TData>[] {\n\tconst rangeStart = startOfDay(startDate);\n\tconst rangeEnd = endOfDay(endDate);\n\n\treturn events.filter((event) => {\n\t\tconst eventStart = event.startDate;\n\t\tconst eventEnd = event.endDate;\n\n\t\t// Event overlaps with range if:\n\t\t// - Event starts before range ends AND\n\t\t// - Event ends after range starts\n\t\treturn eventStart <= rangeEnd && eventEnd >= rangeStart;\n\t});\n}\n\n/**\n * Filter events by schedule type IDs\n */\nexport function filterEventsByScheduleType<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tscheduleTypeIds: number[]\n): CalendarEvent<TData>[] {\n\tif (scheduleTypeIds.length === 0) return events;\n\treturn events.filter(\n\t\t(event) => event.scheduleTypeId !== undefined && scheduleTypeIds.includes(event.scheduleTypeId)\n\t);\n}\n\n/**\n * Filter events by resource IDs\n */\nexport function filterEventsByResource<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tresourceIds: string[]\n): CalendarEvent<TData>[] {\n\tif (resourceIds.length === 0) return events;\n\treturn events.filter(\n\t\t(event) => event.resourceId !== undefined && resourceIds.includes(event.resourceId)\n\t);\n}\n\n/**\n * Filter events by search term\n */\nexport function filterEventsBySearch<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tsearch: string\n): CalendarEvent<TData>[] {\n\tif (!search.trim()) return events;\n\n\tconst searchLower = search.toLowerCase();\n\treturn events.filter((event) => {\n\t\tconst titleMatch = event.title.toLowerCase().includes(searchLower);\n\t\tconst descriptionMatch = event.description?.toLowerCase().includes(searchLower);\n\t\treturn titleMatch || descriptionMatch;\n\t});\n}\n\n/**\n * Filter out canceled events\n */\nexport function filterOutCanceled<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => !event.isCanceled);\n}\n\n/**\n * Apply all filters at once\n */\nexport function applyEventFilters<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\toptions: {\n\t\tdateRange?: { startDate: Date; endDate: Date };\n\t\tscheduleTypeIds?: number[];\n\t\tresourceIds?: string[];\n\t\tsearch?: string;\n\t\tshowCanceled?: boolean;\n\t}\n): CalendarEvent<TData>[] {\n\tlet filtered = [...events];\n\n\tif (options.dateRange) {\n\t\tfiltered = filterEventsByDateRange(\n\t\t\tfiltered,\n\t\t\toptions.dateRange.startDate,\n\t\t\toptions.dateRange.endDate\n\t\t);\n\t}\n\n\tif (options.scheduleTypeIds && options.scheduleTypeIds.length > 0) {\n\t\tfiltered = filterEventsByScheduleType(filtered, options.scheduleTypeIds);\n\t}\n\n\tif (options.resourceIds && options.resourceIds.length > 0) {\n\t\tfiltered = filterEventsByResource(filtered, options.resourceIds);\n\t}\n\n\tif (options.search) {\n\t\tfiltered = filterEventsBySearch(filtered, options.search);\n\t}\n\n\tif (!options.showCanceled) {\n\t\tfiltered = filterOutCanceled(filtered);\n\t}\n\n\treturn filtered;\n}\n\n// ============================================================================\n// SORTING\n// ============================================================================\n\n/**\n * Sort events by start date (ascending)\n */\nexport function sortEventsByStart<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn [...events].sort((a, b) => a.startDate.getTime() - b.startDate.getTime());\n}\n\n/**\n * Sort events by end date (ascending)\n */\nexport function sortEventsByEnd<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn [...events].sort((a, b) => a.endDate.getTime() - b.endDate.getTime());\n}\n\n/**\n * Sort events by duration (longest first)\n */\nexport function sortEventsByDuration<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn [...events].sort((a, b) => {\n\t\tconst durationA = a.endDate.getTime() - a.startDate.getTime();\n\t\tconst durationB = b.endDate.getTime() - b.startDate.getTime();\n\t\treturn durationB - durationA;\n\t});\n}\n\n// ============================================================================\n// GROUPING\n// ============================================================================\n\n/**\n * Group events by date\n */\nexport function groupEventsByDate<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): Map<string, CalendarEvent<TData>[]> {\n\tconst groups = new Map<string, CalendarEvent<TData>[]>();\n\n\tfor (const event of events) {\n\t\tconst dateKey = startOfDay(event.startDate).toISOString();\n\t\tconst existing = groups.get(dateKey) ?? [];\n\t\texisting.push(event);\n\t\tgroups.set(dateKey, existing);\n\t}\n\n\treturn groups;\n}\n\n/**\n * Group events by schedule type\n */\nexport function groupEventsByScheduleType<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): Map<number | undefined, CalendarEvent<TData>[]> {\n\tconst groups = new Map<number | undefined, CalendarEvent<TData>[]>();\n\n\tfor (const event of events) {\n\t\tconst existing = groups.get(event.scheduleTypeId) ?? [];\n\t\texisting.push(event);\n\t\tgroups.set(event.scheduleTypeId, existing);\n\t}\n\n\treturn groups;\n}\n\n/**\n * Group events by resource\n */\nexport function groupEventsByResource<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): Map<string | undefined, CalendarEvent<TData>[]> {\n\tconst groups = new Map<string | undefined, CalendarEvent<TData>[]>();\n\n\tfor (const event of events) {\n\t\tconst existing = groups.get(event.resourceId) ?? [];\n\t\texisting.push(event);\n\t\tgroups.set(event.resourceId, existing);\n\t}\n\n\treturn groups;\n}\n\n// ============================================================================\n// QUERIES\n// ============================================================================\n\n/**\n * Get events for a specific day\n */\nexport function getEventsForDay<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tdate: Date\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => {\n\t\t// Check if event spans this day\n\t\tconst dayStart = startOfDay(date);\n\t\tconst dayEnd = endOfDay(date);\n\t\treturn event.startDate <= dayEnd && event.endDate >= dayStart;\n\t});\n}\n\n/**\n * Get all-day events\n */\nexport function getAllDayEvents<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => event.isAllDay);\n}\n\n/**\n * Get timed events (not all-day)\n */\nexport function getTimedEvents<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => !event.isAllDay);\n}\n\n/**\n * Get multi-day events\n */\nexport function getMultiDayEvents<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[] {\n\treturn events.filter((event) => {\n\t\tif (event.isMultiDay) return true;\n\t\treturn !isSameDay(event.startDate, event.endDate);\n\t});\n}\n\n/**\n * Check if event spans multiple days\n */\nexport function isMultiDayEvent<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>\n): boolean {\n\tif (event.isMultiDay) return true;\n\treturn !isSameDay(event.startDate, event.endDate);\n}\n\n/**\n * Get event duration in minutes\n */\nexport function getEventDurationMinutes<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>\n): number {\n\treturn Math.floor((event.endDate.getTime() - event.startDate.getTime()) / 60000);\n}\n\n// ============================================================================\n// COLOR UTILITIES\n// ============================================================================\n\n/**\n * Get event color with fallback\n */\nexport function getEventColor<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>,\n\tdefaultColor: TEventColor = 'blue'\n): TEventColor {\n\treturn event.color ?? defaultColor;\n}\n\n/**\n * Resolve color from schedule type or event\n */\nexport function resolveEventColor<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>,\n\tscheduleTypeColors?: Map<number, TEventColor | string>,\n\tdefaultColor: TEventColor = 'blue'\n): TEventColor | string {\n\t// Event color takes precedence\n\tif (event.color) return event.color;\n\n\t// Then schedule type color\n\tif (event.scheduleTypeId !== undefined && scheduleTypeColors) {\n\t\tconst typeColor = scheduleTypeColors.get(event.scheduleTypeId);\n\t\tif (typeColor) return typeColor;\n\t}\n\n\treturn defaultColor;\n}\n\n// ============================================================================\n// ALL-DAY / TIME DISPLAY\n// ============================================================================\n\n/**\n * Format event time display intelligently based on event type.\n *\n * - **All-day events** → `\"All day\"` (no confusing \"00:00 – 23:59\")\n * - **Multi-day all-day** → `\"All day · Feb 16 – Feb 18\"`\n * - **Multi-day timed** → `\"Feb 16, 09:00 – Feb 18, 17:00\"`\n * - **Regular events** → `\"09:00 – 17:00\"`\n *\n * @example\n * ```ts\n * formatEventTimeDisplay({ startDate: allDayStart, endDate: allDayEnd, isAllDay: true });\n * // => \"All day\"\n *\n * formatEventTimeDisplay({ startDate: normalStart, endDate: normalEnd });\n * // => \"09:00 - 17:00\"\n * ```\n */\nexport function formatEventTimeDisplay(event: {\n\tstartDate: Date;\n\tendDate: Date;\n\tisAllDay?: boolean;\n\tisMultiDay?: boolean;\n}): string {\n\tconst isAllDay = detectAllDayEvent(event);\n\n\tif (isAllDay) {\n\t\tif (isSameDay(event.startDate, event.endDate)) {\n\t\t\treturn 'All day';\n\t\t}\n\t\t// Multi-day all-day: \"All day · Feb 16 – Feb 18\"\n\t\tconst startStr = event.startDate.toLocaleDateString(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t\tconst endStr = event.endDate.toLocaleDateString(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t\treturn `All day · ${startStr} – ${endStr}`;\n\t}\n\n\t// Multi-day timed (not all-day): \"Feb 16, 09:00 – Feb 18, 17:00\"\n\tif (!isSameDay(event.startDate, event.endDate)) {\n\t\tconst startDateStr = event.startDate.toLocaleDateString(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t\tconst endDateStr = event.endDate.toLocaleDateString(undefined, {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t\treturn `${startDateStr}, ${formatTime(event.startDate)} – ${endDateStr}, ${formatTime(event.endDate)}`;\n\t}\n\n\t// Regular single-day timed event: \"09:00 - 17:00\"\n\treturn `${formatTime(event.startDate)} - ${formatTime(event.endDate)}`;\n}\n\n/**\n * Check whether an event should display its time range.\n *\n * Returns `false` for all-day events (where times like \"00:00 – 23:59\"\n * would be meaningless and confusing to users).\n *\n * @example\n * ```ts\n * shouldShowEventTime({ isAllDay: true, startDate, endDate }); // false\n * shouldShowEventTime({ startDate: new Date('2026-02-16T09:00'), endDate: new Date('2026-02-16T17:00') }); // true\n * ```\n */\nexport function shouldShowEventTime(event: {\n\tstartDate: Date;\n\tendDate: Date;\n\tisAllDay?: boolean;\n}): boolean {\n\treturn !detectAllDayEvent(event);\n}\n","/**\n * Grid Utilities for @inno/calendar\n *\n * Functions for view navigation, date ranges, and cell generation.\n */\n\nimport type { ICalendarCell, IDateRange, TCalendarView } from '../types';\nimport {\n\taddDays,\n\taddMonths,\n\taddWeeks,\n\taddYears,\n\tendOfDay,\n\tendOfMonth,\n\tendOfWeek,\n\tendOfYear,\n\tisSameMonth,\n\tisToday,\n\tisWeekend,\n\tstartOfDay,\n\tstartOfMonth,\n\tstartOfWeek,\n\tstartOfYear,\n} from './date-utils';\n\n// ============================================================================\n// VIEW DATE RANGES\n// ============================================================================\n\n/**\n * Get date range for a specific view\n */\nexport function getViewDateRange(\n\tdate: Date,\n\tview: TCalendarView,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): IDateRange {\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn {\n\t\t\t\tstartDate: startOfDay(date),\n\t\t\t\tendDate: endOfDay(date),\n\t\t\t};\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week':\n\t\t\treturn {\n\t\t\t\tstartDate: startOfWeek(date, weekStartsOn),\n\t\t\t\tendDate: endOfWeek(date, weekStartsOn),\n\t\t\t};\n\n\t\tcase 'month': {\n\t\t\t// Include partial weeks at start and end\n\t\t\tconst monthStart = startOfMonth(date);\n\t\t\tconst monthEnd = endOfMonth(date);\n\t\t\treturn {\n\t\t\t\tstartDate: startOfWeek(monthStart, weekStartsOn),\n\t\t\t\tendDate: endOfWeek(monthEnd, weekStartsOn),\n\t\t\t};\n\t\t}\n\n\t\tcase 'timeline-3day':\n\t\t\treturn {\n\t\t\t\tstartDate: startOfDay(date),\n\t\t\t\tendDate: endOfDay(addDays(date, 2)),\n\t\t\t};\n\n\t\tcase 'year':\n\t\t\treturn {\n\t\t\t\tstartDate: startOfYear(date),\n\t\t\t\tendDate: endOfYear(date),\n\t\t\t};\n\n\t\tcase 'agenda':\n\t\t\t// Agenda typically shows next 30 days\n\t\t\treturn {\n\t\t\t\tstartDate: startOfDay(date),\n\t\t\t\tendDate: endOfDay(addDays(date, 29)),\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tstartDate: startOfDay(date),\n\t\t\t\tendDate: endOfDay(date),\n\t\t\t};\n\t}\n}\n\n// ============================================================================\n// NAVIGATION\n// ============================================================================\n\n/**\n * Navigate to next period based on view\n */\nexport function navigateNext(date: Date, view: TCalendarView): Date {\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn addDays(date, 1);\n\n\t\tcase 'timeline-3day':\n\t\t\treturn addDays(date, 3);\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week':\n\t\t\treturn addWeeks(date, 1);\n\n\t\tcase 'month':\n\t\t\treturn addMonths(date, 1);\n\n\t\tcase 'year':\n\t\t\treturn addYears(date, 1);\n\n\t\tcase 'agenda':\n\t\t\treturn addWeeks(date, 1);\n\n\t\tdefault:\n\t\t\treturn addDays(date, 1);\n\t}\n}\n\n/**\n * Navigate to previous period based on view\n */\nexport function navigatePrev(date: Date, view: TCalendarView): Date {\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn addDays(date, -1);\n\n\t\tcase 'timeline-3day':\n\t\t\treturn addDays(date, -3);\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week':\n\t\t\treturn addWeeks(date, -1);\n\n\t\tcase 'month':\n\t\t\treturn addMonths(date, -1);\n\n\t\tcase 'year':\n\t\t\treturn addYears(date, -1);\n\n\t\tcase 'agenda':\n\t\t\treturn addWeeks(date, -1);\n\n\t\tdefault:\n\t\t\treturn addDays(date, -1);\n\t}\n}\n\n/**\n * Navigate to today\n */\nexport function navigateToday(): Date {\n\treturn startOfDay(new Date());\n}\n\n// ============================================================================\n// CELL GENERATION\n// ============================================================================\n\n/**\n * Generate cells for month view\n */\nexport function generateMonthCells(\n\tdate: Date,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): ICalendarCell[] {\n\tconst monthStart = startOfMonth(date);\n\tconst monthEnd = endOfMonth(date);\n\tconst viewStart = startOfWeek(monthStart, weekStartsOn);\n\tconst viewEnd = endOfWeek(monthEnd, weekStartsOn);\n\n\tconst cells: ICalendarCell[] = [];\n\tlet current = viewStart;\n\n\twhile (current <= viewEnd) {\n\t\tcells.push({\n\t\t\tdate: new Date(current),\n\t\t\tisToday: isToday(current),\n\t\t\tisCurrentMonth: isSameMonth(current, date),\n\t\t\tisWeekend: isWeekend(current),\n\t\t\tdayOfWeek: current.getDay(),\n\t\t});\n\t\tcurrent = addDays(current, 1);\n\t}\n\n\treturn cells;\n}\n\n/**\n * Generate cells for week view\n */\nexport function generateWeekCells(\n\tdate: Date,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): ICalendarCell[] {\n\tconst weekStart = startOfWeek(date, weekStartsOn);\n\tconst cells: ICalendarCell[] = [];\n\n\tfor (let i = 0; i < 7; i++) {\n\t\tconst current = addDays(weekStart, i);\n\t\tcells.push({\n\t\t\tdate: current,\n\t\t\tisToday: isToday(current),\n\t\t\tisCurrentMonth: isSameMonth(current, date),\n\t\t\tisWeekend: isWeekend(current),\n\t\t\tdayOfWeek: current.getDay(),\n\t\t});\n\t}\n\n\treturn cells;\n}\n\n/**\n * Generate cells for year view (months)\n */\nexport function generateYearCells(date: Date): ICalendarCell[] {\n\tconst yearStart = startOfYear(date);\n\tconst cells: ICalendarCell[] = [];\n\n\tfor (let i = 0; i < 12; i++) {\n\t\tconst current = addMonths(yearStart, i);\n\t\tcells.push({\n\t\t\tdate: current,\n\t\t\tisToday: isSameMonth(current, new Date()),\n\t\t\tisCurrentMonth: true,\n\t\t\tisWeekend: false,\n\t\t\tdayOfWeek: current.getDay(),\n\t\t});\n\t}\n\n\treturn cells;\n}\n\n// ============================================================================\n// TIME SLOTS\n// ============================================================================\n\n/**\n * Generate time slots for a day\n */\nexport function generateTimeSlots(\n\tstartHour: number,\n\tendHour: number,\n\tslotDuration: number = 30\n): { hour: number; minute: number; label: string }[] {\n\tconst slots: { hour: number; minute: number; label: string }[] = [];\n\tconst slotsPerHour = 60 / slotDuration;\n\n\tfor (let hour = startHour; hour < endHour; hour++) {\n\t\tfor (let slot = 0; slot < slotsPerHour; slot++) {\n\t\t\tconst minute = slot * slotDuration;\n\t\t\tslots.push({\n\t\t\t\thour,\n\t\t\t\tminute,\n\t\t\t\tlabel: `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn slots;\n}\n\n/**\n * Generate hour labels\n */\nexport function generateHourLabels(\n\tstartHour: number,\n\tendHour: number,\n\tformat: '12h' | '24h' = '24h'\n): { hour: number; label: string }[] {\n\tconst labels: { hour: number; label: string }[] = [];\n\n\tfor (let hour = startHour; hour <= endHour; hour++) {\n\t\tlet label: string;\n\t\tif (format === '12h') {\n\t\t\tconst period = hour >= 12 ? 'PM' : 'AM';\n\t\t\tconst hour12 = hour % 12 || 12;\n\t\t\tlabel = `${hour12} ${period}`;\n\t\t} else {\n\t\t\tlabel = `${hour.toString().padStart(2, '0')}:00`;\n\t\t}\n\t\tlabels.push({ hour, label });\n\t}\n\n\treturn labels;\n}\n\n// ============================================================================\n// VIEW TITLE\n// ============================================================================\n\n/**\n * Get range text for date navigator (e.g., \"Mon, Jan 1 - Sun, Jan 7\")\n * Shows a more compact range description below the month/year title\n */\nexport function getRangeText(date: Date, view: TCalendarView, locale = 'en-US'): string {\n\tconst dayMonthFormat = new Intl.DateTimeFormat(locale, {\n\t\tweekday: 'short',\n\t\tmonth: 'short',\n\t\tday: 'numeric',\n\t});\n\tconst shortFormat = new Intl.DateTimeFormat(locale, { month: 'short', day: 'numeric' });\n\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn dayMonthFormat.format(date);\n\n\t\tcase 'timeline-3day': {\n\t\t\tconst start3 = startOfDay(date);\n\t\t\tconst end3 = addDays(date, 2);\n\t\t\treturn `${shortFormat.format(start3)} - ${shortFormat.format(end3)}`;\n\t\t}\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week': {\n\t\t\tconst weekStart = startOfWeek(date, 1);\n\t\t\tconst weekEnd = endOfWeek(date, 1);\n\t\t\treturn `${shortFormat.format(weekStart)} - ${shortFormat.format(weekEnd)}`;\n\t\t}\n\n\t\tcase 'month': {\n\t\t\tconst monthStart = startOfMonth(date);\n\t\t\tconst monthEnd = endOfMonth(date);\n\t\t\treturn `${shortFormat.format(monthStart)} - ${shortFormat.format(monthEnd)}`;\n\t\t}\n\n\t\tcase 'year':\n\t\t\treturn `Jan 1 - Dec 31, ${date.getFullYear()}`;\n\n\t\tcase 'agenda': {\n\t\t\tconst monthStart = startOfMonth(date);\n\t\t\tconst monthEnd = endOfMonth(date);\n\t\t\treturn `${shortFormat.format(monthStart)} - ${shortFormat.format(monthEnd)}`;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\n/**\n * Count events in the current view's date range\n * Useful for showing an event count badge in the navigation\n */\nexport function getEventsCountInView(\n\tevents: { startDate: Date; endDate: Date }[],\n\tdate: Date,\n\tview: TCalendarView,\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1\n): number {\n\tconst range = getViewDateRange(date, view, weekStartsOn);\n\n\treturn events.filter((event) => {\n\t\t// Event overlaps with period if it starts before period ends AND ends after period starts\n\t\treturn event.startDate <= range.endDate && event.endDate >= range.startDate;\n\t}).length;\n}\n\n/**\n * Get formatted title for current view\n */\nexport function getViewTitle(date: Date, view: TCalendarView, locale = 'en-US'): string {\n\tconst monthFormat = new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' });\n\tconst dateFormat = new Intl.DateTimeFormat(locale, {\n\t\tweekday: 'long',\n\t\tmonth: 'long',\n\t\tday: 'numeric',\n\t\tyear: 'numeric',\n\t});\n\n\tswitch (view) {\n\t\tcase 'day':\n\t\tcase 'resource-day':\n\t\tcase 'timeline-day':\n\t\t\treturn dateFormat.format(date);\n\n\t\tcase 'week':\n\t\tcase 'resource-week':\n\t\tcase 'timeline-week': {\n\t\t\tconst weekStart = startOfWeek(date, 1);\n\t\t\tconst weekEnd = endOfWeek(date, 1);\n\t\t\tconst startMonth = new Intl.DateTimeFormat(locale, { month: 'short' }).format(weekStart);\n\t\t\tconst endMonth = new Intl.DateTimeFormat(locale, { month: 'short' }).format(weekEnd);\n\t\t\tconst year = weekStart.getFullYear();\n\n\t\t\tif (startMonth === endMonth) {\n\t\t\t\treturn `${startMonth} ${weekStart.getDate()} - ${weekEnd.getDate()}, ${year}`;\n\t\t\t}\n\t\t\treturn `${startMonth} ${weekStart.getDate()} - ${endMonth} ${weekEnd.getDate()}, ${year}`;\n\t\t}\n\n\t\tcase 'month':\n\t\t\treturn monthFormat.format(date);\n\n\t\tcase 'year':\n\t\t\treturn date.getFullYear().toString();\n\n\t\tcase 'agenda':\n\t\t\treturn `Agenda - ${monthFormat.format(date)}`;\n\n\t\tdefault:\n\t\t\treturn monthFormat.format(date);\n\t}\n}\n\n// ============================================================================\n// WEEK DAYS\n// ============================================================================\n\n/**\n * Get weekday headers for week/month views\n */\nexport function getWeekdayHeaders(\n\tweekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 1,\n\tformat: 'long' | 'short' | 'narrow' = 'short',\n\tlocale = 'en-US'\n): { dayOfWeek: number; label: string }[] {\n\tconst formatter = new Intl.DateTimeFormat(locale, { weekday: format });\n\tconst headers: { dayOfWeek: number; label: string }[] = [];\n\n\t// Start from a known date (Jan 7, 2024 is a Sunday)\n\tconst baseDate = new Date(2024, 0, 7);\n\n\tfor (let i = 0; i < 7; i++) {\n\t\tconst dayIndex = (weekStartsOn + i) % 7;\n\t\tconst date = addDays(baseDate, dayIndex);\n\t\theaders.push({\n\t\t\tdayOfWeek: dayIndex,\n\t\t\tlabel: formatter.format(date),\n\t\t});\n\t}\n\n\treturn headers;\n}\n","/**\n * Position Utilities for @inno/calendar\n *\n * Functions for calculating event positions in time grid views.\n */\n\nimport { DEFAULT_HOUR_HEIGHT, MIN_EVENT_HEIGHT } from '../constants';\nimport type { CalendarEvent, IEventPosition, IPositionedEvent, IVisibleHours } from '../types';\n\n// ============================================================================\n// POSITION CALCULATION\n// ============================================================================\n\n/**\n * Calculate event position in time grid\n */\nexport function calculateEventPosition<TData = Record<string, unknown>>(\n\tevent: CalendarEvent<TData>,\n\t_dayStart: Date,\n\tvisibleHours: IVisibleHours,\n\thourHeight: number = DEFAULT_HOUR_HEIGHT\n): IEventPosition {\n\tconst { startHour, endHour } = visibleHours;\n\tconst totalVisibleHours = endHour - startHour;\n\tconst totalHeight = totalVisibleHours * hourHeight;\n\n\t// Get event times as decimal hours\n\tconst eventStartHour = event.startDate.getHours() + event.startDate.getMinutes() / 60;\n\tconst eventEndHour = event.endDate.getHours() + event.endDate.getMinutes() / 60;\n\n\t// Clamp to visible range\n\tconst clampedStart = Math.max(eventStartHour, startHour);\n\tconst clampedEnd = Math.min(eventEndHour, endHour);\n\n\t// Calculate position relative to visible area\n\tconst top = ((clampedStart - startHour) / totalVisibleHours) * totalHeight;\n\tconst bottom = ((clampedEnd - startHour) / totalVisibleHours) * totalHeight;\n\tconst height = Math.max(bottom - top, MIN_EVENT_HEIGHT);\n\n\treturn {\n\t\ttop,\n\t\theight,\n\t\tleft: 0,\n\t\twidth: 100,\n\t\tzIndex: 1,\n\t};\n}\n\n/**\n * Calculate positions for overlapping events using group-based columns.\n *\n * Events are first grouped into overlap clusters. Within each cluster,\n * columns are assigned independently so that non-overlapping events can\n * expand to full width instead of being constrained by unrelated events.\n */\nexport function calculateOverlappingPositions<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[],\n\tdayStart: Date,\n\tvisibleHours: IVisibleHours,\n\thourHeight: number = DEFAULT_HOUR_HEIGHT\n): IPositionedEvent<TData>[] {\n\tif (events.length === 0) return [];\n\n\t// Sort by start time, then by duration (longer events first)\n\tconst sortedEvents = [...events].sort((a, b) => {\n\t\tconst startDiff = a.startDate.getTime() - b.startDate.getTime();\n\t\tif (startDiff !== 0) return startDiff;\n\t\tconst durationA = a.endDate.getTime() - a.startDate.getTime();\n\t\tconst durationB = b.endDate.getTime() - b.startDate.getTime();\n\t\treturn durationB - durationA;\n\t});\n\n\t// --- Step 1: Group events into overlap clusters ---\n\tconst groups: CalendarEvent<TData>[][] = [];\n\tlet currentGroup: CalendarEvent<TData>[] = [];\n\tlet groupEnd = 0;\n\n\tfor (const event of sortedEvents) {\n\t\tif (currentGroup.length === 0 || event.startDate.getTime() < groupEnd) {\n\t\t\tcurrentGroup.push(event);\n\t\t\tgroupEnd = Math.max(groupEnd, event.endDate.getTime());\n\t\t} else {\n\t\t\tgroups.push(currentGroup);\n\t\t\tcurrentGroup = [event];\n\t\t\tgroupEnd = event.endDate.getTime();\n\t\t}\n\t}\n\tif (currentGroup.length > 0) {\n\t\tgroups.push(currentGroup);\n\t}\n\n\t// --- Step 2: Assign columns within each group independently ---\n\tconst positionedEvents: IPositionedEvent<TData>[] = [];\n\n\tfor (const group of groups) {\n\t\tconst columns: { event: CalendarEvent<TData>; endTime: number }[][] = [];\n\n\t\tfor (const event of group) {\n\t\t\tconst eventStart = event.startDate.getTime();\n\t\t\tconst eventEnd = event.endDate.getTime();\n\n\t\t\t// Find first available column within this group\n\t\t\tlet columnIndex = -1;\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst column = columns[i];\n\t\t\t\tif (!column) continue;\n\t\t\t\tconst lastInColumn = column[column.length - 1];\n\t\t\t\tif (lastInColumn && lastInColumn.endTime <= eventStart) {\n\t\t\t\t\tcolumnIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (columnIndex === -1) {\n\t\t\t\tcolumnIndex = columns.length;\n\t\t\t\tcolumns.push([]);\n\t\t\t}\n\n\t\t\tconst column = columns[columnIndex];\n\t\t\tif (column) {\n\t\t\t\tcolumn.push({ event, endTime: eventEnd });\n\t\t\t}\n\n\t\t\tconst basePosition = calculateEventPosition<TData>(event, dayStart, visibleHours, hourHeight);\n\n\t\t\tpositionedEvents.push({\n\t\t\t\tevent,\n\t\t\t\tposition: basePosition,\n\t\t\t\tcolumn: columnIndex,\n\t\t\t\tcolumnSpan: 1,\n\t\t\t});\n\t\t}\n\n\t\t// Calculate width and left using this group's column count\n\t\tconst totalColumns = columns.length;\n\t\tconst widthPerColumn = 100 / totalColumns;\n\n\t\t// Only update positions for events in this group\n\t\tconst groupIds = new Set(group.map((e) => e.id));\n\t\tfor (const positioned of positionedEvents) {\n\t\t\tif (!groupIds.has(positioned.event.id)) continue;\n\t\t\tpositioned.position.left = positioned.column * widthPerColumn;\n\t\t\tpositioned.position.width = widthPerColumn * positioned.columnSpan;\n\t\t\tpositioned.position.zIndex = positioned.column + 1;\n\t\t}\n\t}\n\n\treturn positionedEvents;\n}\n\n// ============================================================================\n// TIME TO POSITION CONVERSION\n// ============================================================================\n\n/**\n * Convert Y position to time\n */\nexport function yToTime(\n\ty: number,\n\tdayStart: Date,\n\tvisibleHours: IVisibleHours,\n\thourHeight: number = DEFAULT_HOUR_HEIGHT,\n\tslotDuration: number = 30\n): Date {\n\tconst { startHour, endHour } = visibleHours;\n\tconst totalVisibleHours = endHour - startHour;\n\tconst totalHeight = totalVisibleHours * hourHeight;\n\n\t// Calculate hours from top\n\tconst hoursFromTop = (y / totalHeight) * totalVisibleHours;\n\tconst absoluteHours = startHour + hoursFromTop;\n\n\t// Snap to slot duration\n\tconst totalMinutes = absoluteHours * 60;\n\tconst snappedMinutes = Math.round(totalMinutes / slotDuration) * slotDuration;\n\n\t// Create date with snapped time\n\tconst result = new Date(dayStart);\n\tresult.setHours(0, 0, 0, 0);\n\tresult.setMinutes(snappedMinutes);\n\n\treturn result;\n}\n\n/**\n * Convert time to Y position\n */\nexport function timeToY(\n\ttime: Date,\n\tvisibleHours: IVisibleHours,\n\thourHeight: number = DEFAULT_HOUR_HEIGHT\n): number {\n\tconst { startHour, endHour } = visibleHours;\n\tconst totalVisibleHours = endHour - startHour;\n\tconst totalHeight = totalVisibleHours * hourHeight;\n\n\tconst hours = time.getHours() + time.getMinutes() / 60;\n\tconst clampedHours = Math.max(startHour, Math.min(hours, endHour));\n\n\treturn ((clampedHours - startHour) / totalVisibleHours) * totalHeight;\n}\n\n// ============================================================================\n// OVERLAP DETECTION\n// ============================================================================\n\n/**\n * Check if two events overlap in time\n */\nexport function eventsOverlap(event1: CalendarEvent, event2: CalendarEvent): boolean {\n\treturn event1.startDate < event2.endDate && event1.endDate > event2.startDate;\n}\n\n/**\n * Get overlapping event groups\n */\nexport function getOverlappingGroups<TData = Record<string, unknown>>(\n\tevents: CalendarEvent<TData>[]\n): CalendarEvent<TData>[][] {\n\tif (events.length === 0) return [];\n\n\tconst sorted = [...events].sort((a, b) => a.startDate.getTime() - b.startDate.getTime());\n\tconst groups: CalendarEvent<TData>[][] = [];\n\tlet currentGroup: CalendarEvent<TData>[] = [];\n\tlet groupEnd = 0;\n\n\tfor (const event of sorted) {\n\t\tif (currentGroup.length === 0 || event.startDate.getTime() < groupEnd) {\n\t\t\t// Event overlaps with current group\n\t\t\tcurrentGroup.push(event);\n\t\t\tgroupEnd = Math.max(groupEnd, event.endDate.getTime());\n\t\t} else {\n\t\t\t// Start new group\n\t\t\tif (currentGroup.length > 0) {\n\t\t\t\tgroups.push(currentGroup);\n\t\t\t}\n\t\t\tcurrentGroup = [event];\n\t\t\tgroupEnd = event.endDate.getTime();\n\t\t}\n\t}\n\n\tif (currentGroup.length > 0) {\n\t\tgroups.push(currentGroup);\n\t}\n\n\treturn groups;\n}\n\n// ============================================================================\n// SELECTION OVERLAY\n// ============================================================================\n\n/**\n * Calculate selection overlay dimensions\n */\nexport function calculateSelectionOverlay(\n\tstartY: number,\n\tcurrentY: number,\n\tcontainerHeight: number\n): { top: number; height: number } {\n\tconst minY = Math.max(0, Math.min(startY, currentY));\n\tconst maxY = Math.min(containerHeight, Math.max(startY, currentY));\n\n\treturn {\n\t\ttop: minY,\n\t\theight: maxY - minY,\n\t};\n}\n"],"names":["CALENDAR_VIEWS","DEFAULT_PREFERENCES","DEFAULT_VISIBLE_HOURS","DEFAULT_BUSINESS_HOURS","DEFAULT_VIEW_CONFIGS","EVENT_COLORS","EVENT_COLOR_CLASSES","HEX_TO_EVENT_COLOR","HOURS_IN_DAY","MINUTES_IN_HOUR","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_DAY","DEFAULT_HOUR_HEIGHT","DEFAULT_SLOT_HEIGHT","DEFAULT_HEADER_HEIGHT","DEFAULT_RESOURCE_WIDTH","MIN_EVENT_HEIGHT","startOfDay","date","result","endOfDay","addDays","days","subDays","isSameDay","date1","date2","isToday","getDayOfWeek","isWeekend","day","startOfWeek","weekStartsOn","diff","endOfWeek","addWeeks","weeks","subWeeks","getWeekNumber","d","dayNum","yearStart","isSameWeek","start1","start2","startOfMonth","endOfMonth","addMonths","months","subMonths","getDaysInMonth","isSameMonth","startOfYear","endOfYear","addYears","years","subYears","isSameYear","addHours","hours","addMinutes","minutes","setTime","seconds","getDecimalHours","isBefore","dateToCompare","isAfter","isBetween","start","end","time","minDate","dates","min","maxDate","max","differenceInMilliseconds","differenceInMinutes","differenceInHours","differenceInDays","formatTime","format","period","formatDateISO","year","month","parseISO","dateString","eachDayOfInterval","current","endDay","eachHourOfInterval","getWeekdayNames","locale","formatter","baseDate","i","getMonthNames","getVisibleHoursArray","visibleHours","h","formatHourLabel","hour","getWeekDays","weekStart","generateMonthGrid","monthStart","monthEnd","gridStart","gridEnd","currentMonth","detectAllDayEvent","event","startHour","startMinute","endHour","endMinute","startsAtMidnight","endsAtDayBoundary","separateEventsByDuration","events","singleDay","multiDay","getEventsInRange","rangeStart","rangeEnd","isWorkingHour","workingHours","dayOfWeek","dayHours","getWorkingHoursForDay","getYearMonths","filterEventsByDateRange","startDate","endDate","eventStart","eventEnd","filterEventsByScheduleType","scheduleTypeIds","filterEventsByResource","resourceIds","filterEventsBySearch","search","searchLower","titleMatch","descriptionMatch","filterOutCanceled","applyEventFilters","options","filtered","sortEventsByStart","a","b","sortEventsByEnd","sortEventsByDuration","durationA","groupEventsByDate","groups","dateKey","existing","groupEventsByScheduleType","groupEventsByResource","getEventsForDay","dayStart","dayEnd","getAllDayEvents","getTimedEvents","getMultiDayEvents","isMultiDayEvent","getEventDurationMinutes","getEventColor","defaultColor","resolveEventColor","scheduleTypeColors","typeColor","formatEventTimeDisplay","startStr","endStr","startDateStr","endDateStr","shouldShowEventTime","getViewDateRange","view","navigateNext","navigatePrev","navigateToday","generateMonthCells","viewStart","viewEnd","cells","generateWeekCells","generateYearCells","generateTimeSlots","slotDuration","slots","slotsPerHour","slot","minute","generateHourLabels","labels","label","getRangeText","dayMonthFormat","shortFormat","start3","end3","weekEnd","getEventsCountInView","range","getViewTitle","monthFormat","dateFormat","startMonth","endMonth","getWeekdayHeaders","headers","dayIndex","calculateEventPosition","_dayStart","hourHeight","totalVisibleHours","totalHeight","eventStartHour","eventEndHour","clampedStart","clampedEnd","top","bottom","height","calculateOverlappingPositions","sortedEvents","startDiff","currentGroup","groupEnd","positionedEvents","group","columns","columnIndex","column","lastInColumn","basePosition","widthPerColumn","groupIds","e","positioned","yToTime","y","hoursFromTop","totalMinutes","snappedMinutes","timeToY","eventsOverlap","event1","event2","getOverlappingGroups","sorted","calculateSelectionOverlay","startY","currentY","containerHeight","minY","maxY"],"mappings":"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"}