@forcecalendar/interface 1.5.0 → 1.6.1

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,4 +1,4 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@forcecalendar/core")):typeof define==`function`&&define.amd?define([`exports`,`@forcecalendar/core`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ForceCalendarInterface={},e.ForceCalendarCore))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}),this._listeners=[],this._state=null,this._props=new Map,this._initialized=!1}connectedCallback(){this._initialized||=(this.initialize(),!0),this.mount()}disconnectedCallback(){this.unmount(),this.cleanup(),this._styleEl=null,this._contentWrapper=null}initialize(){}mount(){this.render()}unmount(){}cleanup(){this._listeners.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),this._listeners=[]}setState(e){let t=this._state;this._state={...this._state,...e},this.stateChanged(t,this._state),this.render()}getState(){return this._state}stateChanged(e,t){}setProp(e,t){let n=this._props.get(e);this._props.set(e,t),this.propChanged(e,n,t)}getProp(e){return this._props.get(e)}propChanged(e,t,n){}addListener(e,t,n){if(!e||!t||!n){console.warn(`addListener called with invalid parameters`,{element:e,event:t,handler:n});return}let r=n.bind(this);e.addEventListener(t,r),this._listeners.push({element:e,event:t,handler:r})}emit(e,t={}){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}getStyles(){return``}getBaseStyles(){return`
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@forcecalendar/core")):typeof define==`function`&&define.amd?define([`exports`,`@forcecalendar/core`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ForceCalendarInterface={},e.ForceCalendarCore))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}),this._listeners=[],this._state=null,this._props=new Map,this._initialized=!1}connectedCallback(){this._initialized||=(this.initialize(),!0),this.mount()}disconnectedCallback(){this.unmount(),this.cleanup(),this._styleEl&&this._styleEl.remove(),this._contentWrapper&&this._contentWrapper.remove(),this._styleEl=null,this._contentWrapper=null}initialize(){}mount(){this.render()}unmount(){}cleanup(){this._listeners.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),this._listeners=[]}setState(e){let t=this._state;this._state={...this._state,...e},this.stateChanged(t,this._state),this.render()}getState(){return this._state}stateChanged(e,t){}setProp(e,t){let n=this._props.get(e);this._props.set(e,t),this.propChanged(e,n,t)}getProp(e){return this._props.get(e)}propChanged(e,t,n){}addListener(e,t,n){if(!e||!t||!n){console.warn(`addListener called with invalid parameters`,{element:e,event:t,handler:n});return}let r=n.bind(this);e.addEventListener(t,r),this._listeners.push({element:e,event:t,handler:r})}emit(e,t={}){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}getStyles(){return``}getBaseStyles(){return`
2
2
  :host {
3
3
  display: block;
4
4
  box-sizing: border-box;
@@ -8,7 +8,7 @@
8
8
  box-sizing: inherit;
9
9
  }
10
10
  `}render(){this.cleanup();let e=this.template();this._styleEl||(this._styleEl=document.createElement(`style`),this.shadowRoot.appendChild(this._styleEl),this._contentWrapper=document.createElement(`div`),this._contentWrapper.setAttribute(`id`,`fc-root`),this._contentWrapper.style.display=`contents`,this.shadowRoot.appendChild(this._contentWrapper)),this._styleEl.textContent=this.getBaseStyles()+`
11
- `+this.getStyles();let t=this._saveScrollPositions(),n=this._getActiveElementSelector();this._contentWrapper.innerHTML=e,this._restoreScrollPositions(t),this._restoreFocus(n),this.afterRender()}_saveScrollPositions(){let e=new Map;return this._contentWrapper&&this._contentWrapper.querySelectorAll(`[id]`).forEach(t=>{(t.scrollTop!==0||t.scrollLeft!==0)&&e.set(t.id,{top:t.scrollTop,left:t.scrollLeft})}),e}_restoreScrollPositions(e){if(!this._contentWrapper||e.size===0)return;let t=typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape:e=>String(e).replace(/["\\]/g,`\\$&`);e.forEach((e,n)=>{let r=this._contentWrapper.querySelector(`[id="${t(n)}"]`);r&&(r.scrollTop=e.top,r.scrollLeft=e.left)})}_getActiveElementSelector(){let e=this.shadowRoot.activeElement;return!e||e===this._contentWrapper?null:e.id?`[id="${CSS.escape(e.id)}"]`:e.dataset&&e.dataset.action?`[data-action="${CSS.escape(e.dataset.action)}"]`:e.dataset&&e.dataset.view?`[data-view="${CSS.escape(e.dataset.view)}"]`:e.tagName?e.tagName.toLowerCase():null}_restoreFocus(e){if(!(!e||!this._contentWrapper))try{let t=this._contentWrapper.querySelector(e);t&&typeof t.focus==`function`&&t.focus()}catch{}}template(){return``}afterRender(){}$(e){return this.shadowRoot.querySelector(e)}$$(e){return this.shadowRoot.querySelectorAll(e)}static get observedAttributes(){return[]}attributeChangedCallback(e,t,n){this.setProp(e,n),this._initialized&&this.render()}},r=class{constructor(){this.events=new Map,this.wildcardHandlers=new Set}on(e,t,n={}){let{once:r=!1,priority:i=0}=n;if(e.includes(`*`)){let n={pattern:e,handler:t,once:r,priority:i};return this.wildcardHandlers.add(n),()=>this.wildcardHandlers.delete(n)}this.events.has(e)||this.events.set(e,[]);let a={handler:t,once:r,priority:i},o=this.events.get(e);return o.push(a),o.sort((e,t)=>t.priority-e.priority),()=>{let e=o.indexOf(a);e>-1&&o.splice(e,1)}}once(e,t,n={}){return this.on(e,t,{...n,once:!0})}off(e,t){if(e.includes(`*`)){for(let n of this.wildcardHandlers)if(n.pattern===e&&n.handler===t){this.wildcardHandlers.delete(n);return}return}if(!this.events.has(e))return;let n=this.events.get(e),r=n.findIndex(e=>e.handler===t);r>-1&&n.splice(r,1),n.length===0&&this.events.delete(e)}offWildcard(e){for(let t of[...this.wildcardHandlers])t.pattern===e&&this.wildcardHandlers.delete(t)}offAll(e){for(let[t,n]of this.events){let r=n.findIndex(t=>t.handler===e);r>-1&&n.splice(r,1),n.length===0&&this.events.delete(t)}for(let t of[...this.wildcardHandlers])t.handler===e&&this.wildcardHandlers.delete(t)}emit(e,t){if(this.events.has(e)){let n=[...this.events.get(e)];for(let r of n){let{handler:n,once:i}=r;i&&this.off(e,n);try{n(t,e)}catch(t){console.error(`Error in event handler for ${e}:`,t)}}}let n=[];for(let r of[...this.wildcardHandlers])if(this.matchesPattern(e,r.pattern)){let{handler:i,once:a}=r;a&&n.push(r);try{i(t,e)}catch(t){console.error(`Error in wildcard handler for ${e}:`,t)}}n.forEach(e=>this.wildcardHandlers.delete(e))}matchesPattern(e,t){let n=t.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`^`+n.replace(/\*/g,`.*`)+`$`).test(e)}clear(){this.events.clear(),this.wildcardHandlers.clear()}getEventNames(){return Array.from(this.events.keys())}getHandlerCount(e){return this.events.has(e)?this.events.get(e).length:0}getWildcardHandlerCount(){return this.wildcardHandlers.size}getTotalHandlerCount(){let e=this.wildcardHandlers.size;for(let t of this.events.values())e+=t.length;return e}},i=new r,a=class{constructor(e={}){this.eventBus=new r,this.calendar=new t.Calendar({view:e.view||`month`,date:e.date||new Date,weekStartsOn:e.weekStartsOn??0,locale:e.locale||`en-US`,timeZone:e.timeZone||Intl.DateTimeFormat().resolvedOptions().timeZone,...e}),this.state={view:this.calendar.getView(),currentDate:this.calendar.getCurrentDate(),events:[],selectedEvent:null,selectedDate:null,loading:!1,error:null,config:{...e}},this.subscribers=new Set,this.subscribe=this.subscribe.bind(this),this.unsubscribe=this.unsubscribe.bind(this),this.setState=this.setState.bind(this),this._syncEventsFromCore({silent:!0})}_syncEventsFromCore(e={}){let{force:t=!1}=e,n=this.calendar.getEvents()||[];return(t||this.state.events.length!==n.length||!this._eventsMatch(this.state.events,n))&&this.setState({events:[...n]},e),n}_eventsMatch(e,t){if(e.length!==t.length)return!1;let n=new Set(e.map(e=>e.id));return t.every(e=>n.has(e.id))}getState(){return{...this.state,config:{...this.state.config},events:[...this.state.events]}}setState(e,t={}){let{silent:n=!1}=t,r={...this.state};return this.state={...this.state,...e},n||(this.notifySubscribers(r,this.state),this.emitStateChange(r,this.state)),this.state}subscribe(e,t=null){return this.subscribers.add(e),t&&(this._subscriberIds||=new Map,this._subscriberIds.set(t,e)),()=>this.unsubscribe(e,t)}unsubscribe(e,t=null){this.subscribers.delete(e),t&&this._subscriberIds&&this._subscriberIds.delete(t)}unsubscribeById(e){if(!this._subscriberIds)return!1;let t=this._subscriberIds.get(e);return t?(this.subscribers.delete(t),this._subscriberIds.delete(e),!0):!1}getSubscriberCount(){return this.subscribers.size}notifySubscribers(e,t){this.subscribers.forEach(n=>{try{n(t,e)}catch(e){console.error(`Error in state subscriber:`,e)}})}emitStateChange(e,t){let n=Object.keys(t).filter(n=>e[n]!==t[n]);n.forEach(n=>{this.eventBus.emit(`state:${n}:changed`,{oldValue:e[n],newValue:t[n],state:t})}),n.length>0&&this.eventBus.emit(`state:changed`,{oldState:e,newState:t,changedKeys:n})}setView(e){this.calendar.setView(e),this.setState({view:e}),this.eventBus.emit(`view:changed`,{view:e})}getView(){return this.state.view}setDate(e){this.calendar.goToDate(e),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`date:changed`,{date:this.state.currentDate})}getCurrentDate(){return this.state.currentDate}next(){this.calendar.next(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:next`,{date:this.state.currentDate})}previous(){this.calendar.previous(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:previous`,{date:this.state.currentDate})}today(){this.calendar.today(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:today`,{date:this.state.currentDate})}goToDate(e){this.calendar.goToDate(e),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:goto`,{date:this.state.currentDate})}addEvent(e){let t=this.calendar.addEvent(e);return t?(this._syncEventsFromCore(),this.eventBus.emit(`event:add`,{event:t}),this.eventBus.emit(`event:added`,{event:t}),t):(console.error(`Failed to add event to calendar`),this.eventBus.emit(`event:error`,{action:`add`,event:e,error:`Failed to add event`}),null)}updateEvent(e,t){this._syncEventsFromCore({silent:!0});let n=this.calendar.updateEvent(e,t);return n?(this._syncEventsFromCore({force:!0}),this.eventBus.emit(`event:update`,{event:n}),this.eventBus.emit(`event:updated`,{event:n}),n):(console.error(`Failed to update event: ${e}`),this.eventBus.emit(`event:error`,{action:`update`,eventId:e,updates:t,error:`Event not found in calendar`}),null)}deleteEvent(e){return this._syncEventsFromCore({silent:!0}),this.calendar.removeEvent(e)?(this._syncEventsFromCore(),this.eventBus.emit(`event:remove`,{eventId:e}),this.eventBus.emit(`event:deleted`,{eventId:e}),!0):(console.error(`Failed to delete event: ${e}`),this.eventBus.emit(`event:error`,{action:`delete`,eventId:e,error:`Event not found`}),!1)}getEvents(){return this.calendar.getEvents()||[]}syncEvents(){return this._syncEventsFromCore()}getEventsForDate(e){return this.calendar.getEventsForDate(e)}getEventsInRange(e,t){return this.calendar.getEventsInRange(e,t)}getViewData(){let e=this.calendar.getViewData();return this.enrichViewData(e)}enrichViewData(e){let t={...e},n=this.state.selectedDate?.toDateString();if(t.weeks&&=t.weeks.map(e=>({...e,days:e.days.map(e=>{let t=new Date(e.date);return{...e,isSelected:t.toDateString()===n,events:e.events||this.getEventsForDate(t)}})})),t.days&&=t.days.map(e=>{let t=new Date(e.date);return{...e,isSelected:t.toDateString()===n,events:e.events||this.getEventsForDate(t)}}),t.date&&!t.days&&!t.weeks){let e=new Date(t.date);t.isSelected=e.toDateString()===n,t.events=t.events||this.getEventsForDate(e)}return t}selectEvent(e){this.setState({selectedEvent:e}),this.eventBus.emit(`event:selected`,{event:e})}selectEventById(e){let t=this.state.events.find(t=>t.id===e);t&&this.selectEvent(t)}deselectEvent(){this.setState({selectedEvent:null}),this.eventBus.emit(`event:deselected`,{})}selectDate(e){this.setState({selectedDate:e}),this.eventBus.emit(`date:selected`,{date:e})}deselectDate(){this.setState({selectedDate:null}),this.eventBus.emit(`date:deselected`,{})}isToday(e){let t=new Date;return e.toDateString()===t.toDateString()}isSelectedDate(e){return this.state.selectedDate&&e.toDateString()===this.state.selectedDate.toDateString()}isWeekend(e){let t=e.getDay();return t===0||t===6}setLoading(e){this.setState({loading:e})}setError(e){this.setState({error:e}),e&&this.eventBus.emit(`error`,{error:e})}clearError(){this.setState({error:null})}updateConfig(e){this.setState({config:{...this.state.config,...e}}),e.weekStartsOn!==void 0&&this.calendar.setWeekStartsOn(e.weekStartsOn),e.locale!==void 0&&this.calendar.setLocale(e.locale),e.timeZone!==void 0&&this.calendar.setTimezone(e.timeZone)}destroy(){this.subscribers.clear(),this._subscriberIds&&=(this._subscriberIds.clear(),null),this.eventBus&&=(this.eventBus.clear(),null),this.state=null,this.calendar=null}},o=class extends t.DateUtils{static formatDate(e,t=`default`,n=`en-US`){if(!e)return``;let r={default:{year:`numeric`,month:`long`,day:`numeric`},short:{year:`numeric`,month:`short`,day:`numeric`},long:{weekday:`long`,year:`numeric`,month:`long`,day:`numeric`},month:{year:`numeric`,month:`long`},monthShort:{year:`numeric`,month:`short`},day:{weekday:`long`,day:`numeric`},dayShort:{weekday:`short`,day:`numeric`},time:{hour:`numeric`,minute:`2-digit`},timeShort:{hour:`numeric`},datetime:{year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}},i=r[t]||r.default;return new Intl.DateTimeFormat(n,i).format(e)}static formatTime(e,t=!0,n=!1,r=`en-US`){if(!e)return``;let i={hour:`numeric`,minute:t?`2-digit`:void 0,hour12:!n};return new Intl.DateTimeFormat(r,i).format(e)}static formatDateRange(e,t,n=`en-US`){if(!e)return``;if(!t||this.isSameDay(e,t))return this.formatDate(e,`default`,n);let r=this.isSameYear(e,t)?`short`:`default`;return`${this.formatDate(e,r,n)} - ${this.formatDate(t,`default`,n)}`}static formatTimeRange(e,t,n=`en-US`){if(!e)return``;let r=this.formatTime(e,!0,!1,n);return t?`${r} - ${this.formatTime(t,!0,!1,n)}`:r}static getRelativeTime(e,t=new Date,n=`en-US`){let r=new Intl.RelativeTimeFormat(n,{numeric:`auto`}),i=e-t,a=Math.floor(i/1e3),o=Math.floor(a/60),s=Math.floor(o/60),c=Math.floor(s/24),l=Math.floor(c/7),u=Math.floor(c/30),d=Math.floor(c/365);return Math.abs(a)<60?r.format(a,`second`):Math.abs(o)<60?r.format(o,`minute`):Math.abs(s)<24?r.format(s,`hour`):Math.abs(c)<7?r.format(c,`day`):Math.abs(l)<4?r.format(l,`week`):Math.abs(u)<12?r.format(u,`month`):r.format(d,`year`)}static isToday(e){let t=new Date;return this.isSameDay(e,t)}static isPast(e){return e<new Date}static isFuture(e){return e>new Date}static getWeekNumber(e){let t=new Date(e.getFullYear(),0,1),n=(e-t)/864e5;return Math.ceil((n+t.getDay()+1)/7)}static getDayAbbreviation(e,t=`en-US`){let n=new Date(2024,0,7+e);return new Intl.DateTimeFormat(t,{weekday:`short`}).format(n)}static getDayName(e,t=`en-US`){let n=new Date(2024,0,7+e);return new Intl.DateTimeFormat(t,{weekday:`long`}).format(n)}static getMonthName(e,t=`long`,n=`en-US`){let r=new Date(2024,e,1);return new Intl.DateTimeFormat(n,{month:t}).format(r)}static parseTimeString(e,t=new Date){let n=new Date(t),[r,i]=e.split(/\s+/),[a,o]=r.split(`:`).map(Number),s=a;return i&&(i.toLowerCase()===`pm`&&a<12?s=a+12:i.toLowerCase()===`am`&&a===12&&(s=0)),n.setHours(s,o||0,0,0),n}},s=class{static createElement(e,t={},n=[]){let r=document.createElement(e);return Object.entries(t).forEach(([e,t])=>{if(e===`className`)r.className=t;else if(e===`style`&&typeof t==`object`)Object.assign(r.style,t);else if(e.startsWith(`data-`))r.setAttribute(e,t);else if(e.startsWith(`on`)&&typeof t==`function`){let n=e.slice(2).toLowerCase();r.addEventListener(n,t)}else r[e]=t}),n.forEach(e=>{typeof e==`string`?r.appendChild(document.createTextNode(e)):e instanceof Node&&r.appendChild(e)}),r}static addEventListeners(e,t){return Object.entries(t).forEach(([t,n])=>{e.addEventListener(t,n)}),()=>{Object.entries(t).forEach(([t,n])=>{e.removeEventListener(t,n)})}}static delegate(e,t,n,r){let i=n=>{let i=n.target.closest(t);i&&e.contains(i)&&r.call(i,n)};return e.addEventListener(n,i),()=>e.removeEventListener(n,i)}static getPosition(e){let t=e.getBoundingClientRect();return{top:t.top+window.scrollY,left:t.left+window.scrollX,bottom:t.bottom+window.scrollY,right:t.right+window.scrollX,width:t.width,height:t.height}}static isInViewport(e,t=0){let n=e.getBoundingClientRect();return n.top>=-t&&n.left>=-t&&n.bottom<=(window.innerHeight||document.documentElement.clientHeight)+t&&n.right<=(window.innerWidth||document.documentElement.clientWidth)+t}static scrollToElement(e,t={}){let{behavior:n=`smooth`,block:r=`start`,inline:i=`nearest`}=t;e.scrollIntoView({behavior:n,block:r,inline:i})}static getStyle(e,t){return window.getComputedStyle(e).getPropertyValue(t)}static setStyles(e,t){Object.assign(e.style,t)}static async animateClass(e,t,n=300){e.classList.add(t),await this.wait(n),e.classList.remove(t)}static waitForAnimation(e,t=`animationend`,n=3e3){return new Promise(r=>{let i=null,a=()=>{i!==null&&clearTimeout(i),e.removeEventListener(t,a),r()};e.addEventListener(t,a),n>0&&(i=setTimeout(a,n))})}static wait(e){return new Promise(t=>setTimeout(t,e))}static parseHTML(e,{sanitize:t=!0}={}){let n=document.createElement(`template`);return n.innerHTML=e.trim(),t&&this._sanitizeNode(n.content),n.content.firstChild}static _sanitizeNode(e){e.querySelectorAll(`script, iframe, object, embed, link, meta, base`).forEach(e=>e.remove());let t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),n=t.nextNode();for(;n;){for(let e of Array.from(n.attributes)){let t=e.name.toLowerCase(),r=e.value.replace(/[\u0000-\u0020]/g,``).toLowerCase();(t.startsWith(`on`)||r.startsWith(`javascript:`)||r.startsWith(`data:text/html`))&&n.removeAttribute(e.name)}n=t.nextNode()}}static escapeHTML(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}static debounce(e,t=250){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>e.apply(this,r),t)}}static throttle(e,t=250){let n;return function(...r){n||(e.apply(this,r),n=!0,setTimeout(()=>n=!1,t))}}static closest(e,t){return e.closest(t)}static parents(e,t){let n=[],r=e.parentElement;for(;r;)r.matches(t)&&n.push(r),r=r.parentElement;return n}static getOuterDimensions(e){let t=window.getComputedStyle(e),n={top:parseInt(t.marginTop),right:parseInt(t.marginRight),bottom:parseInt(t.marginBottom),left:parseInt(t.marginLeft)};return{width:e.offsetWidth+n.left+n.right,height:e.offsetHeight+n.top+n.bottom,margin:n}}static cloneWithEvents(e,t=!0){return e.cloneNode(t)}static trapFocus(e){let t=e.querySelectorAll(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`);if(t.length===0)return e.setAttribute(`tabindex`,`-1`),e.focus(),()=>e.removeAttribute(`tabindex`);let n=t[0],r=t[t.length-1],i=t=>{if(t.key!==`Tab`)return;let i=e.getRootNode().activeElement??document.activeElement;t.shiftKey?i===n&&(r?.focus(),t.preventDefault()):i===r&&(n?.focus(),t.preventDefault())};return e.addEventListener(`keydown`,i),n?.focus(),()=>e.removeEventListener(`keydown`,i)}},c={slds:{"--fc-primary-color":`#0176d3`,"--fc-primary-hover":`#014486`,"--fc-primary-light":`#eef4ff`,"--fc-accent-color":`#0b5cab`,"--fc-text-color":`#181818`,"--fc-text-secondary":`#706e6b`,"--fc-text-light":`#939393`,"--fc-border-color":`#e5e5e5`,"--fc-border-color-hover":`#c9c9c9`,"--fc-background":`#ffffff`,"--fc-background-alt":`#f3f3f3`,"--fc-background-hover":`#f3f3f3`,"--fc-background-active":`#d8e6fe`,"--fc-danger-color":`#ea001e`,"--fc-success-color":`#2e844a`,"--fc-border-radius":`0.25rem`,"--fc-border-radius-sm":`0.125rem`,"--fc-font-family":`'Salesforce Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif`}},l=class{static colors={primary:`#3B82F6`,secondary:`#64748B`,accent:`#F59E0B`,danger:`#EF4444`,warning:`#F97316`,info:`#06B6D4`,success:`#22C55E`,light:`#F8FAFC`,dark:`#0F172A`,white:`#FFFFFF`,gray:{50:`#F8FAFC`,100:`#F1F5F9`,200:`#E2E8F0`,300:`#CBD5E1`,400:`#94A3B8`,500:`#64748B`,600:`#475569`,700:`#334155`,800:`#1E293B`,900:`#0F172A`}};static cssVariables={"--fc-primary-color":`#2563EB`,"--fc-primary-hover":`#1D4ED8`,"--fc-primary-light":`#EFF6FF`,"--fc-text-color":`#111827`,"--fc-text-secondary":`#6B7280`,"--fc-text-light":`#9CA3AF`,"--fc-border-color":`#E5E7EB`,"--fc-border-color-hover":`#D1D5DB`,"--fc-background":`#FFFFFF`,"--fc-background-alt":`#FAFAFA`,"--fc-background-hover":`#F3F4F6`,"--fc-background-active":`#E5E7EB`,"--fc-accent-color":`#F59E0B`,"--fc-danger-color":`#EF4444`,"--fc-success-color":`#10B981`,"--fc-font-family":`Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,"--fc-font-size-xs":`11px`,"--fc-font-size-sm":`12px`,"--fc-font-size-base":`13px`,"--fc-font-size-lg":`15px`,"--fc-font-size-xl":`18px`,"--fc-font-size-2xl":`24px`,"--fc-line-height":`1.4`,"--fc-font-weight-normal":`400`,"--fc-font-weight-medium":`500`,"--fc-font-weight-semibold":`600`,"--fc-font-weight-bold":`700`,"--fc-spacing-xs":`2px`,"--fc-spacing-sm":`6px`,"--fc-spacing-md":`10px`,"--fc-spacing-lg":`14px`,"--fc-spacing-xl":`20px`,"--fc-spacing-2xl":`28px`,"--fc-border-width":`1px`,"--fc-border-radius-sm":`3px`,"--fc-border-radius":`5px`,"--fc-border-radius-lg":`8px`,"--fc-border-radius-full":`9999px`,"--fc-shadow-sm":`0 1px 1px rgba(0,0,0,0.05)`,"--fc-shadow":`0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06)`,"--fc-shadow-md":`0 4px 6px -1px rgba(0, 0, 0, 0.1)`,"--fc-shadow-lg":`0 10px 15px -3px rgba(0, 0, 0, 0.1)`,"--fc-transition-fast":`100ms ease-out`,"--fc-transition":`150ms ease-out`,"--fc-transition-slow":`250ms ease-out`,"--fc-z-dropdown":`1000`,"--fc-z-modal":`2000`,"--fc-z-tooltip":`3000`};static getCSSVariable(e,t=document.documentElement){return getComputedStyle(t).getPropertyValue(e).trim()}static setCSSVariables(e,t=document.documentElement){Object.entries(e).forEach(([e,n])=>{t.style.setProperty(e,n)})}static getBaseStyles(){return`
11
+ `+this.getStyles();let t=this._saveScrollPositions(),n=this._getActiveElementSelector();this._contentWrapper.innerHTML=e,this._restoreScrollPositions(t),this._restoreFocus(n),this.afterRender()}_saveScrollPositions(){let e=new Map;return this._contentWrapper&&this._contentWrapper.querySelectorAll(`[id]`).forEach(t=>{(t.scrollTop!==0||t.scrollLeft!==0)&&e.set(t.id,{top:t.scrollTop,left:t.scrollLeft})}),e}_restoreScrollPositions(e){if(!this._contentWrapper||e.size===0)return;let t=typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape:e=>String(e).replace(/["\\]/g,`\\$&`);e.forEach((e,n)=>{let r=this._contentWrapper.querySelector(`[id="${t(n)}"]`);r&&(r.scrollTop=e.top,r.scrollLeft=e.left)})}_getActiveElementSelector(){let e=this.shadowRoot.activeElement;return!e||e===this._contentWrapper?null:e.id?`[id="${CSS.escape(e.id)}"]`:e.dataset&&e.dataset.action?`[data-action="${CSS.escape(e.dataset.action)}"]`:e.dataset&&e.dataset.view?`[data-view="${CSS.escape(e.dataset.view)}"]`:e.tagName?e.tagName.toLowerCase():null}_restoreFocus(e){if(!(!e||!this._contentWrapper))try{let t=this._contentWrapper.querySelector(e);t&&typeof t.focus==`function`&&t.focus()}catch{}}template(){return``}afterRender(){}$(e){return this.shadowRoot.querySelector(e)}$$(e){return this.shadowRoot.querySelectorAll(e)}static get observedAttributes(){return[]}attributeChangedCallback(e,t,n){this.setProp(e,n),this._initialized&&this.render()}},r=class{constructor(){this.events=new Map,this.wildcardHandlers=new Set}on(e,t,n={}){let{once:r=!1,priority:i=0}=n;if(e.includes(`*`)){let n={pattern:e,handler:t,once:r,priority:i};return this.wildcardHandlers.add(n),()=>this.wildcardHandlers.delete(n)}this.events.has(e)||this.events.set(e,[]);let a={handler:t,once:r,priority:i},o=this.events.get(e);return o.push(a),o.sort((e,t)=>t.priority-e.priority),()=>{let e=o.indexOf(a);e>-1&&o.splice(e,1)}}once(e,t,n={}){return this.on(e,t,{...n,once:!0})}off(e,t){if(e.includes(`*`)){for(let n of this.wildcardHandlers)if(n.pattern===e&&n.handler===t){this.wildcardHandlers.delete(n);return}return}if(!this.events.has(e))return;let n=this.events.get(e),r=n.findIndex(e=>e.handler===t);r>-1&&n.splice(r,1),n.length===0&&this.events.delete(e)}offWildcard(e){for(let t of[...this.wildcardHandlers])t.pattern===e&&this.wildcardHandlers.delete(t)}offAll(e){for(let[t,n]of this.events){let r=n.findIndex(t=>t.handler===e);r>-1&&n.splice(r,1),n.length===0&&this.events.delete(t)}for(let t of[...this.wildcardHandlers])t.handler===e&&this.wildcardHandlers.delete(t)}emit(e,t){if(this.events.has(e)){let n=[...this.events.get(e)];for(let r of n){let{handler:n,once:i}=r;i&&this.off(e,n);try{n(t,e)}catch(t){console.error(`Error in event handler for ${e}:`,t)}}}let n=[];for(let r of[...this.wildcardHandlers])if(this.matchesPattern(e,r.pattern)){let{handler:i,once:a}=r;a&&n.push(r);try{i(t,e)}catch(t){console.error(`Error in wildcard handler for ${e}:`,t)}}n.forEach(e=>this.wildcardHandlers.delete(e))}matchesPattern(e,t){let n=t.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`^`+n.replace(/\*/g,`.*`)+`$`).test(e)}clear(){this.events.clear(),this.wildcardHandlers.clear()}getEventNames(){return Array.from(this.events.keys())}getHandlerCount(e){return this.events.has(e)?this.events.get(e).length:0}getWildcardHandlerCount(){return this.wildcardHandlers.size}getTotalHandlerCount(){let e=this.wildcardHandlers.size;for(let t of this.events.values())e+=t.length;return e}},i=new r,a=class{constructor(e={}){this.eventBus=new r,this.calendar=new t.Calendar({view:e.view||`month`,date:e.date||new Date,weekStartsOn:e.weekStartsOn??0,locale:e.locale||`en-US`,timeZone:e.timeZone||Intl.DateTimeFormat().resolvedOptions().timeZone,...e}),this.state={view:this.calendar.getView(),currentDate:this.calendar.getCurrentDate(),events:[],selectedEvent:null,selectedDate:null,loading:!1,error:null,config:{...e}},this.subscribers=new Set,this.subscribe=this.subscribe.bind(this),this.unsubscribe=this.unsubscribe.bind(this),this.setState=this.setState.bind(this),this._syncEventsFromCore({silent:!0}),this._visibleRangeKey=this._rangeKey(this.getVisibleRange())}_syncEventsFromCore(e={}){let{force:t=!1}=e,n=this.calendar.getEvents()||[];return(t||this.state.events.length!==n.length||!this._eventsMatch(this.state.events,n))&&this.setState({events:[...n]},e),n}_eventsMatch(e,t){if(e.length!==t.length)return!1;let n=new Set(e.map(e=>e.id));return t.every(e=>n.has(e.id))}getState(){return{...this.state,config:{...this.state.config},events:[...this.state.events]}}setState(e,t={}){let{silent:n=!1}=t,r={...this.state};return this.state={...this.state,...e},n||(this.notifySubscribers(r,this.state),this.emitStateChange(r,this.state)),this.state}subscribe(e,t=null){return this.subscribers.add(e),t&&(this._subscriberIds||=new Map,this._subscriberIds.set(t,e)),()=>this.unsubscribe(e,t)}unsubscribe(e,t=null){this.subscribers.delete(e),t&&this._subscriberIds&&this._subscriberIds.delete(t)}unsubscribeById(e){if(!this._subscriberIds)return!1;let t=this._subscriberIds.get(e);return t?(this.subscribers.delete(t),this._subscriberIds.delete(e),!0):!1}getSubscriberCount(){return this.subscribers.size}notifySubscribers(e,t){this.subscribers.forEach(n=>{try{n(t,e)}catch(e){console.error(`Error in state subscriber:`,e)}})}emitStateChange(e,t){let n=Object.keys(t).filter(n=>e[n]!==t[n]);n.forEach(n=>{this.eventBus.emit(`state:${n}:changed`,{oldValue:e[n],newValue:t[n],state:t})}),n.length>0&&this.eventBus.emit(`state:changed`,{oldState:e,newState:t,changedKeys:n})}setView(e){this.calendar.setView(e),this.setState({view:e}),this.eventBus.emit(`view:changed`,{view:e}),this._syncVisibleRange()}getView(){return this.state.view}setDate(e){this.calendar.goToDate(e),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`date:changed`,{date:this.state.currentDate}),this._syncVisibleRange()}getCurrentDate(){return this.state.currentDate}next(){this.calendar.next(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:next`,{date:this.state.currentDate}),this._syncVisibleRange()}previous(){this.calendar.previous(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:previous`,{date:this.state.currentDate}),this._syncVisibleRange()}today(){this.calendar.today(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:today`,{date:this.state.currentDate}),this._syncVisibleRange()}goToDate(e){this.calendar.goToDate(e),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:goto`,{date:this.state.currentDate}),this._syncVisibleRange()}addEvent(e){let t=this.calendar.addEvent(e);return t?(this._syncEventsFromCore(),this.eventBus.emit(`event:add`,{event:t}),this.eventBus.emit(`event:added`,{event:t}),t):(console.error(`Failed to add event to calendar`),this.eventBus.emit(`event:error`,{action:`add`,event:e,error:`Failed to add event`}),null)}updateEvent(e,t){this._syncEventsFromCore({silent:!0});let n=this.calendar.updateEvent(e,t);return n?(this._syncEventsFromCore({force:!0}),this.eventBus.emit(`event:update`,{event:n}),this.eventBus.emit(`event:updated`,{event:n}),n):(console.error(`Failed to update event: ${e}`),this.eventBus.emit(`event:error`,{action:`update`,eventId:e,updates:t,error:`Event not found in calendar`}),null)}deleteEvent(e){return this._syncEventsFromCore({silent:!0}),this.calendar.removeEvent(e)?(this._syncEventsFromCore(),this.eventBus.emit(`event:remove`,{eventId:e}),this.eventBus.emit(`event:deleted`,{eventId:e}),!0):(console.error(`Failed to delete event: ${e}`),this.eventBus.emit(`event:error`,{action:`delete`,eventId:e,error:`Event not found`}),!1)}getEvents(){return this.calendar.getEvents()||[]}setEvents(e,t={}){let{removeMissing:n=!0}=t,r=e?Array.from(e):[],i;try{i=typeof this.calendar.reconcileEvents==`function`?this.calendar.setEvents(r,{reconcile:!0,removeMissing:n}):this._reconcileFallback(r,n)}catch(e){throw this.eventBus.emit(`event:error`,{action:`set`,events:r,error:e}),e}let{added:a,updated:o,removed:s,unchanged:c}=i,l={events:this.getEvents(),added:a,updated:o,removed:s,unchanged:c};return(a.length>0||o.length>0||s.length>0)&&this.setState({events:[...l.events]}),this.eventBus.emit(`events:set`,l),l}_reconcileFallback(e,t){let n=new Map;e.forEach(e=>{let t=e&&e.id;if(t==null||t===``)throw Error(`Every event in a snapshot must have an id`);if(n.has(t))throw Error(`Duplicate event id in snapshot: ${t}`);n.set(t,e)});let r={added:[],updated:[],removed:[],unchanged:[]},i=new Map(this.getEvents().map(e=>[e.id,e]));return t&&i.forEach((e,t)=>{!n.has(t)&&this.calendar.removeEvent(t)&&r.removed.push(e)}),n.forEach((e,t)=>{let n=i.get(t),a=typeof e.toObject==`function`?e.toObject():e;if(!n){let n=this.calendar.addEvent(e);if(!n)throw Error(`Failed to add event: ${t}`);r.added.push(n)}else if(n===e||this._isEquivalentFallback(n,a))r.unchanged.push(n);else{let e=this.calendar.updateEvent(t,a);if(!e)throw Error(`Failed to update event: ${t}`);r.updated.push({event:e,oldEvent:n})}}),r}_isEquivalentFallback(e,t){let n=e=>e instanceof Date?e.getTime():e==null?NaN:new Date(e).getTime();return Object.keys(t).every(r=>{let i=e[r],a=t[r];return r===`start`||r===`end`?n(i)===n(a):i===a?!0:i==null||a==null?!1:JSON.stringify(i)===JSON.stringify(a)})}syncEvents(){return this._syncEventsFromCore()}getEventsForDate(e){return this.calendar.getEventsForDate(e)}getEventsInRange(e,t){return this.calendar.getEventsInRange(e,t)}getViewData(){let e=this.calendar.getViewData();return this.enrichViewData(e)}enrichViewData(e){let t={...e},n=this.state.selectedDate?.toDateString();if(t.weeks&&=t.weeks.map(e=>({...e,days:e.days.map(e=>{let t=new Date(e.date);return{...e,isSelected:t.toDateString()===n,events:e.events||this.getEventsForDate(t)}})})),t.days&&=t.days.map(e=>{let t=new Date(e.date);return{...e,isSelected:t.toDateString()===n,events:e.events||this.getEventsForDate(t)}}),t.date&&!t.days&&!t.weeks){let e=new Date(t.date);t.isSelected=e.toDateString()===n,t.events=t.events||this.getEventsForDate(e)}return t}getVisibleRange(){let e=this.calendar.getView(),t=this.calendar.getCurrentDate();if(e!==`day`){let e=this.calendar.getViewData()||{};if(e.startDate instanceof Date&&e.endDate instanceof Date){let t=new Date(e.startDate),n=new Date(e.endDate);return e.type===`list`&&(n=new Date(n.getTime()-1)),{start:t,end:n}}}let n=new Date(t);n.setHours(0,0,0,0);let r=new Date(n);return r.setDate(r.getDate()+1),r.setMilliseconds(-1),{start:n,end:r}}_rangeKey(e){return`${e.start.getTime()}:${e.end.getTime()}`}_syncVisibleRange(){if(!this.calendar)return;let e=this.getVisibleRange(),t=this._rangeKey(e);if(t===this._visibleRangeKey)return;this._visibleRangeKey=t;let n={...e,view:this.state.view,date:this.state.currentDate};this.eventBus.emit(`range:changed`,n)}selectEvent(e){this.setState({selectedEvent:e}),this.eventBus.emit(`event:selected`,{event:e})}selectEventById(e){let t=this.state.events.find(t=>t.id===e);t&&this.selectEvent(t)}deselectEvent(){this.setState({selectedEvent:null}),this.eventBus.emit(`event:deselected`,{})}selectDate(e){this.setState({selectedDate:e}),this.eventBus.emit(`date:selected`,{date:e})}deselectDate(){this.setState({selectedDate:null}),this.eventBus.emit(`date:deselected`,{})}isToday(e){let t=new Date;return e.toDateString()===t.toDateString()}isSelectedDate(e){return this.state.selectedDate&&e.toDateString()===this.state.selectedDate.toDateString()}isWeekend(e){let t=e.getDay();return t===0||t===6}setLoading(e){this.setState({loading:e})}setError(e){this.setState({error:e}),e&&this.eventBus.emit(`error`,{error:e})}clearError(){this.setState({error:null})}updateConfig(e){this.setState({config:{...this.state.config,...e}}),e.weekStartsOn!==void 0&&(this.calendar.setWeekStartsOn(e.weekStartsOn),this._syncVisibleRange()),e.locale!==void 0&&this.calendar.setLocale(e.locale),e.timeZone!==void 0&&this.calendar.setTimezone(e.timeZone)}destroy(){this.subscribers.clear(),this._subscriberIds&&=(this._subscriberIds.clear(),null),this.eventBus&&=(this.eventBus.clear(),null),this.state=null,this.calendar=null}},o=class extends t.DateUtils{static formatDate(e,t=`default`,n=`en-US`){if(!e)return``;let r={default:{year:`numeric`,month:`long`,day:`numeric`},short:{year:`numeric`,month:`short`,day:`numeric`},long:{weekday:`long`,year:`numeric`,month:`long`,day:`numeric`},month:{year:`numeric`,month:`long`},monthShort:{year:`numeric`,month:`short`},day:{weekday:`long`,day:`numeric`},dayShort:{weekday:`short`,day:`numeric`},time:{hour:`numeric`,minute:`2-digit`},timeShort:{hour:`numeric`},datetime:{year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}},i=r[t]||r.default;return new Intl.DateTimeFormat(n,i).format(e)}static formatTime(e,t=!0,n=!1,r=`en-US`){if(!e)return``;let i={hour:`numeric`,minute:t?`2-digit`:void 0,hour12:!n};return new Intl.DateTimeFormat(r,i).format(e)}static formatDateRange(e,t,n=`en-US`){if(!e)return``;if(!t||this.isSameDay(e,t))return this.formatDate(e,`default`,n);let r=this.isSameYear(e,t)?`short`:`default`;return`${this.formatDate(e,r,n)} - ${this.formatDate(t,`default`,n)}`}static formatTimeRange(e,t,n=`en-US`){if(!e)return``;let r=this.formatTime(e,!0,!1,n);return t?`${r} - ${this.formatTime(t,!0,!1,n)}`:r}static getRelativeTime(e,t=new Date,n=`en-US`){let r=new Intl.RelativeTimeFormat(n,{numeric:`auto`}),i=e-t,a=Math.floor(i/1e3),o=Math.floor(a/60),s=Math.floor(o/60),c=Math.floor(s/24),l=Math.floor(c/7),u=Math.floor(c/30),d=Math.floor(c/365);return Math.abs(a)<60?r.format(a,`second`):Math.abs(o)<60?r.format(o,`minute`):Math.abs(s)<24?r.format(s,`hour`):Math.abs(c)<7?r.format(c,`day`):Math.abs(l)<4?r.format(l,`week`):Math.abs(u)<12?r.format(u,`month`):r.format(d,`year`)}static isToday(e){let t=new Date;return this.isSameDay(e,t)}static isPast(e){return e<new Date}static isFuture(e){return e>new Date}static getWeekNumber(e){let t=new Date(e.getFullYear(),0,1),n=(e-t)/864e5;return Math.ceil((n+t.getDay()+1)/7)}static getDayAbbreviation(e,t=`en-US`){let n=new Date(2024,0,7+e);return new Intl.DateTimeFormat(t,{weekday:`short`}).format(n)}static getDayName(e,t=`en-US`){let n=new Date(2024,0,7+e);return new Intl.DateTimeFormat(t,{weekday:`long`}).format(n)}static getMonthName(e,t=`long`,n=`en-US`){let r=new Date(2024,e,1);return new Intl.DateTimeFormat(n,{month:t}).format(r)}static parseTimeString(e,t=new Date){let n=new Date(t),[r,i]=e.split(/\s+/),[a,o]=r.split(`:`).map(Number),s=a;return i&&(i.toLowerCase()===`pm`&&a<12?s=a+12:i.toLowerCase()===`am`&&a===12&&(s=0)),n.setHours(s,o||0,0,0),n}},s=class{static createElement(e,t={},n=[]){let r=document.createElement(e);return Object.entries(t).forEach(([e,t])=>{if(e===`className`)r.className=t;else if(e===`style`&&typeof t==`object`)Object.assign(r.style,t);else if(e.startsWith(`data-`))r.setAttribute(e,t);else if(e.startsWith(`on`)&&typeof t==`function`){let n=e.slice(2).toLowerCase();r.addEventListener(n,t)}else r[e]=t}),n.forEach(e=>{typeof e==`string`?r.appendChild(document.createTextNode(e)):e instanceof Node&&r.appendChild(e)}),r}static addEventListeners(e,t){return Object.entries(t).forEach(([t,n])=>{e.addEventListener(t,n)}),()=>{Object.entries(t).forEach(([t,n])=>{e.removeEventListener(t,n)})}}static delegate(e,t,n,r){let i=n=>{let i=n.target.closest(t);i&&e.contains(i)&&r.call(i,n)};return e.addEventListener(n,i),()=>e.removeEventListener(n,i)}static getPosition(e){let t=e.getBoundingClientRect();return{top:t.top+window.scrollY,left:t.left+window.scrollX,bottom:t.bottom+window.scrollY,right:t.right+window.scrollX,width:t.width,height:t.height}}static isInViewport(e,t=0){let n=e.getBoundingClientRect();return n.top>=-t&&n.left>=-t&&n.bottom<=(window.innerHeight||document.documentElement.clientHeight)+t&&n.right<=(window.innerWidth||document.documentElement.clientWidth)+t}static scrollToElement(e,t={}){let{behavior:n=`smooth`,block:r=`start`,inline:i=`nearest`}=t;e.scrollIntoView({behavior:n,block:r,inline:i})}static getStyle(e,t){return window.getComputedStyle(e).getPropertyValue(t)}static setStyles(e,t){Object.assign(e.style,t)}static async animateClass(e,t,n=300){e.classList.add(t),await this.wait(n),e.classList.remove(t)}static waitForAnimation(e,t=`animationend`,n=3e3){return new Promise(r=>{let i=null,a=()=>{i!==null&&clearTimeout(i),e.removeEventListener(t,a),r()};e.addEventListener(t,a),n>0&&(i=setTimeout(a,n))})}static wait(e){return new Promise(t=>setTimeout(t,e))}static parseHTML(e,{sanitize:t=!0}={}){let n=document.createElement(`template`);return n.innerHTML=e.trim(),t&&this._sanitizeNode(n.content),n.content.firstChild}static _sanitizeNode(e){e.querySelectorAll(`script, iframe, object, embed, link, meta, base`).forEach(e=>e.remove());let t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),n=t.nextNode();for(;n;){for(let e of Array.from(n.attributes)){let t=e.name.toLowerCase(),r=e.value.replace(/[\u0000-\u0020]/g,``).toLowerCase();(t.startsWith(`on`)||r.startsWith(`javascript:`)||r.startsWith(`data:text/html`))&&n.removeAttribute(e.name)}n=t.nextNode()}}static escapeHTML(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}static debounce(e,t=250){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>e.apply(this,r),t)}}static throttle(e,t=250){let n;return function(...r){n||(e.apply(this,r),n=!0,setTimeout(()=>n=!1,t))}}static closest(e,t){return e.closest(t)}static parents(e,t){let n=[],r=e.parentElement;for(;r;)r.matches(t)&&n.push(r),r=r.parentElement;return n}static getOuterDimensions(e){let t=window.getComputedStyle(e),n={top:parseInt(t.marginTop),right:parseInt(t.marginRight),bottom:parseInt(t.marginBottom),left:parseInt(t.marginLeft)};return{width:e.offsetWidth+n.left+n.right,height:e.offsetHeight+n.top+n.bottom,margin:n}}static cloneWithEvents(e,t=!0){return e.cloneNode(t)}static trapFocus(e){let t=e.querySelectorAll(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`);if(t.length===0)return e.setAttribute(`tabindex`,`-1`),e.focus(),()=>e.removeAttribute(`tabindex`);let n=t[0],r=t[t.length-1],i=t=>{if(t.key!==`Tab`)return;let i=e.getRootNode().activeElement??document.activeElement;t.shiftKey?i===n&&(r?.focus(),t.preventDefault()):i===r&&(n?.focus(),t.preventDefault())};return e.addEventListener(`keydown`,i),n?.focus(),()=>e.removeEventListener(`keydown`,i)}},c={slds:{"--fc-primary-color":`#0176d3`,"--fc-primary-hover":`#014486`,"--fc-primary-light":`#eef4ff`,"--fc-accent-color":`#0b5cab`,"--fc-text-color":`#181818`,"--fc-text-secondary":`#706e6b`,"--fc-text-light":`#939393`,"--fc-border-color":`#e5e5e5`,"--fc-border-color-hover":`#c9c9c9`,"--fc-background":`#ffffff`,"--fc-background-alt":`#f3f3f3`,"--fc-background-hover":`#f3f3f3`,"--fc-background-active":`#d8e6fe`,"--fc-danger-color":`#ea001e`,"--fc-success-color":`#2e844a`,"--fc-border-radius":`0.25rem`,"--fc-border-radius-sm":`0.125rem`,"--fc-font-family":`'Salesforce Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif`}},l=class{static colors={primary:`#3B82F6`,secondary:`#64748B`,accent:`#F59E0B`,danger:`#EF4444`,warning:`#F97316`,info:`#06B6D4`,success:`#22C55E`,light:`#F8FAFC`,dark:`#0F172A`,white:`#FFFFFF`,gray:{50:`#F8FAFC`,100:`#F1F5F9`,200:`#E2E8F0`,300:`#CBD5E1`,400:`#94A3B8`,500:`#64748B`,600:`#475569`,700:`#334155`,800:`#1E293B`,900:`#0F172A`}};static cssVariables={"--fc-primary-color":`#2563EB`,"--fc-primary-hover":`#1D4ED8`,"--fc-primary-light":`#EFF6FF`,"--fc-text-color":`#111827`,"--fc-text-secondary":`#6B7280`,"--fc-text-light":`#9CA3AF`,"--fc-border-color":`#E5E7EB`,"--fc-border-color-hover":`#D1D5DB`,"--fc-background":`#FFFFFF`,"--fc-background-alt":`#FAFAFA`,"--fc-background-hover":`#F3F4F6`,"--fc-background-active":`#E5E7EB`,"--fc-accent-color":`#F59E0B`,"--fc-danger-color":`#EF4444`,"--fc-success-color":`#10B981`,"--fc-font-family":`Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,"--fc-font-size-xs":`11px`,"--fc-font-size-sm":`12px`,"--fc-font-size-base":`13px`,"--fc-font-size-lg":`15px`,"--fc-font-size-xl":`18px`,"--fc-font-size-2xl":`24px`,"--fc-line-height":`1.4`,"--fc-font-weight-normal":`400`,"--fc-font-weight-medium":`500`,"--fc-font-weight-semibold":`600`,"--fc-font-weight-bold":`700`,"--fc-spacing-xs":`2px`,"--fc-spacing-sm":`6px`,"--fc-spacing-md":`10px`,"--fc-spacing-lg":`14px`,"--fc-spacing-xl":`20px`,"--fc-spacing-2xl":`28px`,"--fc-border-width":`1px`,"--fc-border-radius-sm":`3px`,"--fc-border-radius":`5px`,"--fc-border-radius-lg":`8px`,"--fc-border-radius-full":`9999px`,"--fc-shadow-sm":`0 1px 1px rgba(0,0,0,0.05)`,"--fc-shadow":`0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06)`,"--fc-shadow-md":`0 4px 6px -1px rgba(0, 0, 0, 0.1)`,"--fc-shadow-lg":`0 10px 15px -3px rgba(0, 0, 0, 0.1)`,"--fc-transition-fast":`100ms ease-out`,"--fc-transition":`150ms ease-out`,"--fc-transition-slow":`250ms ease-out`,"--fc-z-dropdown":`1000`,"--fc-z-modal":`2000`,"--fc-z-tooltip":`3000`};static getCSSVariable(e,t=document.documentElement){return getComputedStyle(t).getPropertyValue(e).trim()}static setCSSVariables(e,t=document.documentElement){Object.entries(e).forEach(([e,n])=>{t.style.setProperty(e,n)})}static getBaseStyles(){return`
12
12
  :host {
13
13
  /* Apply CSS variables */
14
14
  ${Object.entries(this.cssVariables).map(([e,t])=>`${e}: ${t};`).join(`
@@ -616,7 +616,7 @@
616
616
  <button class="fc-btn fc-btn-primary" id="save-btn">Save Event</button>
617
617
  </footer>
618
618
  </div>
619
- `}afterRender(){this.modalContent=this.$(`.modal-content`),this.titleInput=this.$(`#event-title`),this.startInput=this.$(`#event-start`),this.endInput=this.$(`#event-end`),this.colorContainer=this.$(`#color-picker`),this.titleGroup=this.$(`#title-group`),this.endGroup=this.$(`#end-group`),this.addListener(this.$(`#close-x`),`click`,()=>this.close()),this.addListener(this.$(`#cancel-btn`),`click`,()=>this.close()),this.addListener(this.$(`#save-btn`),`click`,()=>this.save()),this.colorContainer.querySelectorAll(`.color-btn`).forEach(e=>{this.addListener(e,`click`,e=>{this._formData.color=e.currentTarget.dataset.color,this.updateColorSelection()})}),this.addListener(this,`click`,e=>{e.target===this&&this.close()}),this._keydownListenerAdded||=(this._handleKeyDown=e=>{e.key===`Escape`&&this.hasAttribute(`open`)&&this.close()},window.addEventListener(`keydown`,this._handleKeyDown),!0)}updateColorSelection(){this.colorContainer.querySelectorAll(`.color-btn`).forEach(e=>{let t=e.dataset.color===this._formData.color;e.classList.toggle(`selected`,t),e.setAttribute(`aria-checked`,t?`true`:`false`)})}open(e=new Date){this.hasAttribute(`open`)||this.setAttribute(`open`,``),this.titleGroup.classList.remove(`has-error`),this.endGroup.classList.remove(`has-error`),this._formData.start=e,this._formData.end=new Date(e.getTime()+this.config.defaultDuration*60*1e3),this._formData.title=``,this._formData.color=this.config.colors[0].color,this.startInput&&(this.titleInput.value=``,this.startInput.value=this.formatDateForInput(this._formData.start),this.endInput.value=this.formatDateForInput(this._formData.end),this.updateColorSelection(),this._cleanupFocusTrap&&this._cleanupFocusTrap(),this._cleanupFocusTrap=s.trapFocus(this.modalContent))}close(){this.removeAttribute(`open`),this._cleanupFocusTrap&&=(this._cleanupFocusTrap(),null)}validate(){let e=!0;this.titleGroup.classList.remove(`has-error`),this.endGroup.classList.remove(`has-error`),this.titleInput.value.trim()||(this.titleGroup.classList.add(`has-error`),e=!1);let t=new Date(this.startInput.value);return new Date(this.endInput.value)<=t&&(this.endGroup.classList.add(`has-error`),e=!1),e}save(){if(!this.validate())return;let e={title:this.titleInput.value.trim(),start:new Date(this.startInput.value),end:new Date(this.endInput.value),backgroundColor:this._formData.color};this.emit(`save`,e),this.close()}formatDateForInput(e){let t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}`}unmount(){this._cleanupFocusTrap&&this._cleanupFocusTrap(),this._handleKeyDown&&(window.removeEventListener(`keydown`,this._handleKeyDown),this._handleKeyDown=null,this._keydownListenerAdded=!1)}};customElements.get(`forcecal-event-form`)||customElements.define(`forcecal-event-form`,x);var S=class e extends n{static RENDERERS={month:v,week:y,day:b};static get observedAttributes(){return[`view`,`date`,`locale`,`timezone`,`week-starts-on`,`height`,`theme`]}constructor(){super(),this.stateManager=null,this.currentView=null,this._hasRendered=!1,this._busUnsubscribers=[]}propChanged(e,t,n){if(!(!this.stateManager||t===n))switch(e){case`view`:n&&this.stateManager.setView(n);break;case`date`:{let e=n?new Date(n):null;e&&!isNaN(e.getTime())&&this.stateManager.setDate(e);break}case`locale`:n&&this.stateManager.updateConfig({locale:n});break;case`timezone`:n&&this.stateManager.updateConfig({timeZone:n});break;case`week-starts-on`:{let e=parseInt(n,10);Number.isNaN(e)||this.stateManager.updateConfig({weekStartsOn:e});break}}}initialize(){let e={view:this.getAttribute(`view`)||`month`,date:this.getAttribute(`date`)?new Date(this.getAttribute(`date`)):new Date,locale:this.getAttribute(`locale`)||`en-US`,timeZone:this.getAttribute(`timezone`)||Intl.DateTimeFormat().resolvedOptions().timeZone,weekStartsOn:parseInt(this.getAttribute(`week-starts-on`)||`0`)};this.stateManager=new a(e),this._stateUnsubscribe=this.stateManager.subscribe(this.handleStateChange.bind(this)),this.setupEventListeners()}setupEventListeners(){this._busUnsubscribers.forEach(e=>e()),this._busUnsubscribers=[];let e=this.stateManager.eventBus;this._busUnsubscribers.push(e.on(`navigation:*`,(e,t)=>{this.emit(`calendar-navigate`,{action:t.split(`:`)[1],...e})})),this._busUnsubscribers.push(e.on(`view:changed`,e=>{this.emit(`calendar-view-change`,e)}));let t=(e,t)=>{this.emit(`calendar-event-${e}`,t)};this._busUnsubscribers.push(e.on(`event:add`,e=>{t(`add`,e)})),this._busUnsubscribers.push(e.on(`event:update`,e=>{t(`update`,e)})),this._busUnsubscribers.push(e.on(`event:remove`,e=>{t(`remove`,e)})),this._busUnsubscribers.push(e.on(`event:added`,e=>{this.emit(`calendar-event-added`,e)})),this._busUnsubscribers.push(e.on(`event:updated`,e=>{this.emit(`calendar-event-updated`,e)})),this._busUnsubscribers.push(e.on(`event:deleted`,e=>{this.emit(`calendar-event-deleted`,e)})),this._busUnsubscribers.push(e.on(`date:selected`,e=>{this.emit(`calendar-date-select`,e)}))}handleStateChange(e,t){if(!this._hasRendered)return;let n=e.view!==t?.view,r=e.currentDate?.getTime()!==t?.currentDate?.getTime(),i=e.events!==t?.events,a=e.loading!==t?.loading;if(e.error!==t?.error){this.render();return}if(a){this._updateLoadingState(e.loading);return}n&&(this.currentView=e.view),n?(this._updateTitle(),this._updateViewButtons(),this._switchView()):r?(this._updateTitle(),this._updateViewContent()):i&&this._updateViewContent()}_updateTitle(){let e=this.$(`.fc-title`);if(e){let t=this.stateManager.getState();e.textContent=this.getTitle(t.currentDate,t.view)}}_updateViewButtons(){let e=this.stateManager.getState();this.$$(`[data-view]`).forEach(t=>{let n=t.dataset.view===e.view;t.classList.toggle(`active`,n)})}_switchView(){let t=this.$(`#calendar-view-container`);if(t){this._currentViewInstance&&this._currentViewInstance.cleanup&&this._currentViewInstance.cleanup();try{let n=new(e.RENDERERS[this.currentView]||v)(t,this.stateManager);n._viewType=this.currentView,this._currentViewInstance=n,n.render()}catch(e){console.error(`[ForceCalendar] Error switching view:`,e)}}}_updateViewContent(){this._currentViewInstance&&this._currentViewInstance.render&&this._currentViewInstance.render()}_updateLoadingState(e){let t=this.$(`.fc-loading`),n=this.$(`.fc-view-container`);t&&(t.style.display=e?`flex`:`none`),n&&(n.style.display=e?`none`:`flex`)}mount(){this.currentView=this.stateManager.getView(),super.mount()}loadView(e){!e||this.currentView===e||(this.currentView=e,this._switchView(),this._updateViewButtons(),this._updateTitle())}getStyles(){let e=this.getAttribute(`height`)||`800px`;return`
619
+ `}afterRender(){this.modalContent=this.$(`.modal-content`),this.titleInput=this.$(`#event-title`),this.startInput=this.$(`#event-start`),this.endInput=this.$(`#event-end`),this.colorContainer=this.$(`#color-picker`),this.titleGroup=this.$(`#title-group`),this.endGroup=this.$(`#end-group`),this.addListener(this.$(`#close-x`),`click`,()=>this.close()),this.addListener(this.$(`#cancel-btn`),`click`,()=>this.close()),this.addListener(this.$(`#save-btn`),`click`,()=>this.save()),this.colorContainer.querySelectorAll(`.color-btn`).forEach(e=>{this.addListener(e,`click`,e=>{this._formData.color=e.currentTarget.dataset.color,this.updateColorSelection()})}),this.addListener(this,`click`,e=>{e.target===this&&this.close()}),this._keydownListenerAdded||=(this._handleKeyDown=e=>{e.key===`Escape`&&this.hasAttribute(`open`)&&this.close()},window.addEventListener(`keydown`,this._handleKeyDown),!0)}updateColorSelection(){this.colorContainer.querySelectorAll(`.color-btn`).forEach(e=>{let t=e.dataset.color===this._formData.color;e.classList.toggle(`selected`,t),e.setAttribute(`aria-checked`,t?`true`:`false`)})}open(e=new Date){this.hasAttribute(`open`)||this.setAttribute(`open`,``),this.titleGroup.classList.remove(`has-error`),this.endGroup.classList.remove(`has-error`),this._formData.start=e,this._formData.end=new Date(e.getTime()+this.config.defaultDuration*60*1e3),this._formData.title=``,this._formData.color=this.config.colors[0].color,this.startInput&&(this.titleInput.value=``,this.startInput.value=this.formatDateForInput(this._formData.start),this.endInput.value=this.formatDateForInput(this._formData.end),this.updateColorSelection(),this._cleanupFocusTrap&&this._cleanupFocusTrap(),this._cleanupFocusTrap=s.trapFocus(this.modalContent))}close(){this.removeAttribute(`open`),this._cleanupFocusTrap&&=(this._cleanupFocusTrap(),null)}validate(){let e=!0;this.titleGroup.classList.remove(`has-error`),this.endGroup.classList.remove(`has-error`),this.titleInput.value.trim()||(this.titleGroup.classList.add(`has-error`),e=!1);let t=new Date(this.startInput.value);return new Date(this.endInput.value)<=t&&(this.endGroup.classList.add(`has-error`),e=!1),e}save(){if(!this.validate())return;let e={title:this.titleInput.value.trim(),start:new Date(this.startInput.value),end:new Date(this.endInput.value),backgroundColor:this._formData.color};this.emit(`save`,e),this.close()}formatDateForInput(e){let t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}`}unmount(){this._cleanupFocusTrap&&this._cleanupFocusTrap(),this._handleKeyDown&&(window.removeEventListener(`keydown`,this._handleKeyDown),this._handleKeyDown=null,this._keydownListenerAdded=!1)}};customElements.get(`forcecal-event-form`)||customElements.define(`forcecal-event-form`,x);var S=class e extends n{static RENDERERS={month:v,week:y,day:b};static get observedAttributes(){return[`view`,`date`,`locale`,`timezone`,`week-starts-on`,`height`,`theme`]}constructor(){super(),this.stateManager=null,this.currentView=null,this._hasRendered=!1,this._busUnsubscribers=[],this._pendingEvents=null}propChanged(e,t,n){if(!(!this.stateManager||t===n))switch(e){case`view`:n&&this.stateManager.setView(n);break;case`date`:{let e=n?new Date(n):null;e&&!isNaN(e.getTime())&&this.stateManager.setDate(e);break}case`locale`:n&&this.stateManager.updateConfig({locale:n});break;case`timezone`:n&&this.stateManager.updateConfig({timeZone:n});break;case`week-starts-on`:{let e=parseInt(n,10);Number.isNaN(e)||this.stateManager.updateConfig({weekStartsOn:e});break}}}initialize(){let e={view:this.getAttribute(`view`)||`month`,date:this.getAttribute(`date`)?new Date(this.getAttribute(`date`)):new Date,locale:this.getAttribute(`locale`)||`en-US`,timeZone:this.getAttribute(`timezone`)||Intl.DateTimeFormat().resolvedOptions().timeZone,weekStartsOn:parseInt(this.getAttribute(`week-starts-on`)||`0`)};if(this.stateManager=new a(e),this._stateUnsubscribe=this.stateManager.subscribe(this.handleStateChange.bind(this)),this.setupEventListeners(),this._upgradeProperty(`events`),this._pendingEvents){let e=this._pendingEvents;this._pendingEvents=null,this.stateManager.setEvents(e.events,e.options)}}_upgradeProperty(e){if(Object.prototype.hasOwnProperty.call(this,e)){let t=this[e];delete this[e],this[e]=t}}setupEventListeners(){this._busUnsubscribers.forEach(e=>e()),this._busUnsubscribers=[];let e=this.stateManager.eventBus;this._busUnsubscribers.push(e.on(`navigation:*`,(e,t)=>{this.emit(`calendar-navigate`,{action:t.split(`:`)[1],...e})})),this._busUnsubscribers.push(e.on(`view:changed`,e=>{this.emit(`calendar-view-change`,e)}));let t=(e,t)=>{this.emit(`calendar-event-${e}`,t)};this._busUnsubscribers.push(e.on(`event:add`,e=>{t(`add`,e)})),this._busUnsubscribers.push(e.on(`event:update`,e=>{t(`update`,e)})),this._busUnsubscribers.push(e.on(`event:remove`,e=>{t(`remove`,e)})),this._busUnsubscribers.push(e.on(`event:added`,e=>{this.emit(`calendar-event-added`,e)})),this._busUnsubscribers.push(e.on(`event:updated`,e=>{this.emit(`calendar-event-updated`,e)})),this._busUnsubscribers.push(e.on(`event:deleted`,e=>{this.emit(`calendar-event-deleted`,e)})),this._busUnsubscribers.push(e.on(`events:set`,e=>{this.emit(`calendar-events-set`,e)})),this._busUnsubscribers.push(e.on(`range:changed`,e=>{this.emit(`calendar-range-change`,e)})),this._busUnsubscribers.push(e.on(`date:selected`,e=>{this.emit(`calendar-date-select`,e)}))}handleStateChange(e,t){if(!this._hasRendered)return;let n=e.view!==t?.view,r=e.currentDate?.getTime()!==t?.currentDate?.getTime(),i=e.events!==t?.events,a=e.loading!==t?.loading;if(e.error!==t?.error){this.render();return}if(a){this._updateLoadingState(e.loading);return}n&&(this.currentView=e.view),n?(this._updateTitle(),this._updateViewButtons(),this._switchView()):r?(this._updateTitle(),this._updateViewContent()):i&&this._updateViewContent()}_updateTitle(){let e=this.$(`.fc-title`);if(e){let t=this.stateManager.getState();e.textContent=this.getTitle(t.currentDate,t.view)}}_updateViewButtons(){let e=this.stateManager.getState();this.$$(`[data-view]`).forEach(t=>{let n=t.dataset.view===e.view;t.classList.toggle(`active`,n)})}_switchView(){let t=this.$(`#calendar-view-container`);if(t){this._currentViewInstance&&this._currentViewInstance.cleanup&&this._currentViewInstance.cleanup();try{let n=new(e.RENDERERS[this.currentView]||v)(t,this.stateManager);n._viewType=this.currentView,this._currentViewInstance=n,n.render()}catch(e){console.error(`[ForceCalendar] Error switching view:`,e)}}}_updateViewContent(){this._currentViewInstance&&this._currentViewInstance.render&&this._currentViewInstance.render()}_updateLoadingState(e){let t=this.$(`.fc-loading`),n=this.$(`.fc-view-container`);t&&(t.style.display=e?`flex`:`none`),n&&(n.style.display=e?`none`:`flex`)}mount(){(!this.stateManager||!this.stateManager.state)&&this.initialize(),this._stateUnsubscribe||(this._stateUnsubscribe=this.stateManager.subscribe(this.handleStateChange.bind(this)),this.setupEventListeners()),this.currentView=this.stateManager.getView(),super.mount()}loadView(e){!e||this.currentView===e||(this.currentView=e,this._switchView(),this._updateViewButtons(),this._updateTitle())}getStyles(){let e=this.getAttribute(`height`)||`800px`;return`
620
620
  ${l.getBaseStyles()}
621
621
  ${l.getButtonStyles()}
622
622
  ${l.getGridStyles()}
@@ -1104,7 +1104,7 @@
1104
1104
 
1105
1105
  <forcecal-event-form id="event-modal"></forcecal-event-form>
1106
1106
  </div>
1107
- `}renderView(){return`<div id="calendar-view-container"></div>`}_applyTheme(e){let t=c[e];for(let e of Object.keys(c.slds))t&&t[e]?this.style.setProperty(e,t[e]):this.style.removeProperty(e)}afterRender(){this._applyTheme(this.getAttribute(`theme`));let t=this.$(`#calendar-view-container`);if(t&&this.stateManager&&this.currentView){if(this._currentViewInstance&&this._currentViewInstance._viewType===this.currentView&&t.children.length>0)return;this._currentViewInstance&&(this._currentViewInstance.cleanup&&this._currentViewInstance.cleanup(),this._viewUnsubscribe&&=(this._viewUnsubscribe(),null));try{let n=new(e.RENDERERS[this.currentView]||v)(t,this.stateManager);n._viewType=this.currentView,this._currentViewInstance=n,n.render()}catch(e){console.error(`[ForceCalendar] Error creating/rendering view:`,e)}}this.$$(`[data-action]`).forEach(e=>{this.addListener(e,`click`,this.handleNavigation)}),this.$$(`[data-view]`).forEach(e=>{this.addListener(e,`click`,this.handleViewChange)});let n=this.$(`#event-modal`),r=this.$(`#create-event-btn`);r&&n&&this.addListener(r,`click`,()=>{n.open(new Date)}),this.addListener(this.shadowRoot,`day-click`,e=>{n&&n.open(e.detail.date)}),this.addListener(this.shadowRoot,`range-select`,e=>{this.emit(`calendar-range-select`,e.detail),n&&n.open(e.detail.start)}),n&&this.addListener(n,`save`,e=>{let t=e.detail,n=window.crypto&&typeof window.crypto.randomUUID==`function`?window.crypto.randomUUID():Math.random().toString(36).substring(2,15);this.stateManager.addEvent({id:n,...t})}),this._hasRendered=!0}handleNavigation(e){switch(e.currentTarget.dataset.action){case`today`:this.stateManager.today();break;case`previous`:this.stateManager.previous();break;case`next`:this.stateManager.next();break}}handleViewChange(e){let t=e.currentTarget.dataset.view;this.stateManager.setView(t)}getTitle(e,t){let n=this.stateManager.getState().config.locale;switch(t){case`month`:return o.formatDate(e,`month`,n);case`week`:{let t=o.startOfWeek(e),r=o.endOfWeek(e);return o.formatDateRange(t,r,n)}case`day`:return o.formatDate(e,`long`,n);default:return o.formatDate(e,`month`,n)}}getIcon(e){return{"chevron-left":`
1107
+ `}renderView(){return`<div id="calendar-view-container"></div>`}_applyTheme(e){let t=c[e];for(let e of Object.keys(c.slds))t&&t[e]?this.style.setProperty(e,t[e]):this.style.removeProperty(e)}afterRender(){this._applyTheme(this.getAttribute(`theme`));let t=this.$(`#calendar-view-container`);if(t&&this.stateManager&&this.currentView){if(this._currentViewInstance&&this._currentViewInstance._viewType===this.currentView&&t.children.length>0)return;this._currentViewInstance&&(this._currentViewInstance.cleanup&&this._currentViewInstance.cleanup(),this._viewUnsubscribe&&=(this._viewUnsubscribe(),null));try{let n=new(e.RENDERERS[this.currentView]||v)(t,this.stateManager);n._viewType=this.currentView,this._currentViewInstance=n,n.render()}catch(e){console.error(`[ForceCalendar] Error creating/rendering view:`,e)}}this.$$(`[data-action]`).forEach(e=>{this.addListener(e,`click`,this.handleNavigation)}),this.$$(`[data-view]`).forEach(e=>{this.addListener(e,`click`,this.handleViewChange)});let n=this.$(`#event-modal`),r=this.$(`#create-event-btn`);r&&n&&this.addListener(r,`click`,()=>{n.open(new Date)}),this.addListener(this.shadowRoot,`day-click`,e=>{n&&n.open(e.detail.date)}),this.addListener(this.shadowRoot,`range-select`,e=>{this.emit(`calendar-range-select`,e.detail),n&&n.open(e.detail.start)}),n&&this.addListener(n,`save`,e=>{let t=e.detail,n=window.crypto&&typeof window.crypto.randomUUID==`function`?window.crypto.randomUUID():Math.random().toString(36).substring(2,15);this.stateManager.addEvent({id:n,...t})});let i=!this._hasRendered;if(this._hasRendered=!0,i&&this.stateManager){let e=this.stateManager.getState();this.emit(`calendar-range-change`,{...this.stateManager.getVisibleRange(),view:e.view,date:e.currentDate})}}handleNavigation(e){switch(e.currentTarget.dataset.action){case`today`:this.stateManager.today();break;case`previous`:this.stateManager.previous();break;case`next`:this.stateManager.next();break}}handleViewChange(e){let t=e.currentTarget.dataset.view;this.stateManager.setView(t)}getTitle(e,t){let n=this.stateManager.getState().config.locale;switch(t){case`month`:return o.formatDate(e,`month`,n);case`week`:{let t=o.startOfWeek(e),r=o.endOfWeek(e);return o.formatDateRange(t,r,n)}case`day`:return o.formatDate(e,`long`,n);default:return o.formatDate(e,`month`,n)}}getIcon(e){return{"chevron-left":`
1108
1108
  <svg class="fc-icon" viewBox="0 0 24 24">
1109
1109
  <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
1110
1110
  </svg>
@@ -1116,5 +1116,5 @@
1116
1116
  <svg class="fc-icon" viewBox="0 0 24 24">
1117
1117
  <path d="M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z"/>
1118
1118
  </svg>
1119
- `}[e]||``}addEvent(e){return this.stateManager.addEvent(e)}updateEvent(e,t){return this.stateManager.updateEvent(e,t)}deleteEvent(e){return this.stateManager.deleteEvent(e)}getEvents(){return this.stateManager.getEvents()}setView(e){this.stateManager.setView(e)}setDate(e){this.stateManager.setDate(e)}next(){this.stateManager.next()}previous(){this.stateManager.previous()}today(){this.stateManager.today()}unmount(){this.destroy()}destroy(){this._busUnsubscribers.forEach(e=>e()),this._busUnsubscribers=[],this._stateUnsubscribe&&=(this._stateUnsubscribe(),null),this._currentViewInstance&&this._currentViewInstance.cleanup&&(this._currentViewInstance.cleanup(),this._currentViewInstance=null),this.stateManager&&this.stateManager.destroy(),super.cleanup()}};customElements.get(`forcecal-main`)||customElements.define(`forcecal-main`,S),e.BaseComponent=n,e.BaseViewRenderer=u,e.DOMUtils=s,e.DateUtils=o,e.DayViewRenderer=b,e.EventBus=r,e.ForceCalendar=S,e.MonthViewRenderer=v,e.StateManager=a,e.StyleUtils=l,e.WeekViewRenderer=y,e.eventBus=i});
1119
+ `}[e]||``}addEvent(e){return this.stateManager.addEvent(e)}updateEvent(e,t){return this.stateManager.updateEvent(e,t)}deleteEvent(e){return this.stateManager.deleteEvent(e)}getEvents(){return this.stateManager.getEvents()}setEvents(e,t={}){return this.stateManager?this.stateManager.setEvents(e,t):(this._pendingEvents={events:e?Array.from(e):[],options:t},null)}get events(){return this.stateManager?this.stateManager.getEvents():this._pendingEvents?this._pendingEvents.events:[]}set events(e){this.setEvents(e)}getVisibleRange(){return this.stateManager?this.stateManager.getVisibleRange():null}setView(e){this.stateManager.setView(e)}setDate(e){this.stateManager.setDate(e)}next(){this.stateManager.next()}previous(){this.stateManager.previous()}today(){this.stateManager.today()}unmount(){this._releaseBindings()}destroy(){this._releaseBindings(),this.stateManager&&this.stateManager.destroy()}_releaseBindings(){this._busUnsubscribers.forEach(e=>e()),this._busUnsubscribers=[],this._stateUnsubscribe&&=(this._stateUnsubscribe(),null),this._currentViewInstance&&this._currentViewInstance.cleanup&&this._currentViewInstance.cleanup(),this._currentViewInstance=null,this._hasRendered=!1,super.cleanup()}};customElements.get(`forcecal-main`)||customElements.define(`forcecal-main`,S),e.BaseComponent=n,e.BaseViewRenderer=u,e.DOMUtils=s,e.DateUtils=o,e.DayViewRenderer=b,e.EventBus=r,e.EventForm=x,e.ForceCalendar=S,e.MonthViewRenderer=v,e.StateManager=a,e.StyleUtils=l,e.WeekViewRenderer=y,e.eventBus=i});
1120
1120
  //# sourceMappingURL=force-calendar-interface.umd.js.map