fullcalendar 6.1.15 → 6.1.18

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.
package/index.global.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- FullCalendar Standard Bundle v6.1.15
2
+ FullCalendar Standard Bundle v6.1.18
3
3
  Docs & License: https://fullcalendar.io/docs/initialize-globals
4
4
  (c) 2024 Adam Shaw
5
5
  */
@@ -92,7 +92,7 @@ var FullCalendar = (function (exports) {
92
92
  registerStylesRoot(document);
93
93
  }
94
94
 
95
- var css_248z$4 = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,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\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}";
95
+ var css_248z$4 = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,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\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}";
96
96
  injectStyles(css_248z$4);
97
97
 
98
98
  class DelayedRunner {
@@ -973,10 +973,10 @@ var FullCalendar = (function (exports) {
973
973
 
974
974
  const EXTENDED_SETTINGS_AND_SEVERITIES = {
975
975
  week: 3,
976
- separator: 0,
977
- omitZeroMinute: 0,
978
- meridiem: 0,
979
- omitCommas: 0,
976
+ separator: 9,
977
+ omitZeroMinute: 9,
978
+ meridiem: 9,
979
+ omitCommas: 9,
980
980
  };
981
981
  const STANDARD_DATE_PROP_SEVERITIES = {
982
982
  timeZoneName: 7,
@@ -998,22 +998,25 @@ var FullCalendar = (function (exports) {
998
998
  constructor(formatSettings) {
999
999
  let standardDateProps = {};
1000
1000
  let extendedSettings = {};
1001
- let severity = 0;
1001
+ let smallestUnitNum = 9; // the smallest unit in the formatter (9 is a sentinel, beyond max)
1002
1002
  for (let name in formatSettings) {
1003
1003
  if (name in EXTENDED_SETTINGS_AND_SEVERITIES) {
1004
1004
  extendedSettings[name] = formatSettings[name];
1005
- severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name], severity);
1005
+ const severity = EXTENDED_SETTINGS_AND_SEVERITIES[name];
1006
+ if (severity < 9) {
1007
+ smallestUnitNum = Math.min(EXTENDED_SETTINGS_AND_SEVERITIES[name], smallestUnitNum);
1008
+ }
1006
1009
  }
1007
1010
  else {
1008
1011
  standardDateProps[name] = formatSettings[name];
1009
1012
  if (name in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity
1010
- severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name], severity);
1013
+ smallestUnitNum = Math.min(STANDARD_DATE_PROP_SEVERITIES[name], smallestUnitNum);
1011
1014
  }
1012
1015
  }
1013
1016
  }
1014
1017
  this.standardDateProps = standardDateProps;
1015
1018
  this.extendedSettings = extendedSettings;
1016
- this.severity = severity;
1019
+ this.smallestUnitNum = smallestUnitNum;
1017
1020
  this.buildFormattingFunc = memoize(buildFormattingFunc);
1018
1021
  }
1019
1022
  format(date, context) {
@@ -1048,8 +1051,8 @@ var FullCalendar = (function (exports) {
1048
1051
  }
1049
1052
  return full0 + separator + full1;
1050
1053
  }
1051
- getLargestUnit() {
1052
- switch (this.severity) {
1054
+ getSmallestUnit() {
1055
+ switch (this.smallestUnitNum) {
1053
1056
  case 7:
1054
1057
  case 6:
1055
1058
  case 5:
@@ -1762,6 +1765,25 @@ var FullCalendar = (function (exports) {
1762
1765
  if (oldProps === newProps) {
1763
1766
  return true;
1764
1767
  }
1768
+ // if (debug) {
1769
+ // for (let key in newProps) {
1770
+ // if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) {
1771
+ // // equal
1772
+ // } else {
1773
+ // if (debug) {
1774
+ // console.log('prop difference', key, oldProps[key], newProps[key])
1775
+ // }
1776
+ // }
1777
+ // }
1778
+ // // check for props that were omitted in the new
1779
+ // for (let key in oldProps) {
1780
+ // if (!(key in newProps)) {
1781
+ // if (debug) {
1782
+ // console.log('prop absent', key)
1783
+ // }
1784
+ // }
1785
+ // }
1786
+ // }
1765
1787
  for (let key in newProps) {
1766
1788
  if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ;
1767
1789
  else {
@@ -2321,9 +2343,10 @@ var FullCalendar = (function (exports) {
2321
2343
  }
2322
2344
 
2323
2345
  const ViewContextType = createContext({}); // for Components
2324
- function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
2346
+ function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, nowManager, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
2325
2347
  return {
2326
2348
  dateEnv,
2349
+ nowManager,
2327
2350
  options: viewOptions,
2328
2351
  pluginHooks,
2329
2352
  emitter,
@@ -2351,13 +2374,14 @@ var FullCalendar = (function (exports) {
2351
2374
 
2352
2375
  /* eslint max-classes-per-file: off */
2353
2376
  class PureComponent extends x$1 {
2377
+ // debug: boolean
2354
2378
  shouldComponentUpdate(nextProps, nextState) {
2355
- if (this.debug) {
2356
- // eslint-disable-next-line no-console
2357
- console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state));
2358
- }
2359
- return !compareObjs(this.props, nextProps, this.propEquality) ||
2360
- !compareObjs(this.state, nextState, this.stateEquality);
2379
+ const shouldUpdate = !compareObjs(this.props, nextProps, this.propEquality /*, this.debug */) ||
2380
+ !compareObjs(this.state, nextState, this.stateEquality /*, this.debug */);
2381
+ // if (this.debug && shouldUpdate) {
2382
+ // console.log('shouldUpdate!')
2383
+ // }
2384
+ return shouldUpdate;
2361
2385
  }
2362
2386
  // HACK for freakin' React StrictMode
2363
2387
  safeSetState(newState) {
@@ -2597,10 +2621,10 @@ var FullCalendar = (function (exports) {
2597
2621
  let { props, context } = this;
2598
2622
  let { options } = context;
2599
2623
  let renderProps = { view: context.viewApi };
2600
- return (y(ContentContainer, Object.assign({}, props, { elTag: props.elTag || 'div', elClasses: [
2624
+ return (y(ContentContainer, { elRef: props.elRef, elTag: props.elTag || 'div', elAttrs: props.elAttrs, elClasses: [
2601
2625
  ...buildViewClassNames(props.viewSpec),
2602
2626
  ...(props.elClasses || []),
2603
- ], renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children));
2627
+ ], elStyle: props.elStyle, renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }, () => props.children));
2604
2628
  }
2605
2629
  }
2606
2630
  function buildViewClassNames(viewSpec) {
@@ -2756,36 +2780,9 @@ var FullCalendar = (function (exports) {
2756
2780
  return diffDayAndTime(date0, date1); // returns a duration
2757
2781
  }
2758
2782
 
2759
- function reduceCurrentDate(currentDate, action) {
2760
- switch (action.type) {
2761
- case 'CHANGE_DATE':
2762
- return action.dateMarker;
2763
- default:
2764
- return currentDate;
2765
- }
2766
- }
2767
- function getInitialDate(options, dateEnv) {
2768
- let initialDateInput = options.initialDate;
2769
- // compute the initial ambig-timezone date
2770
- if (initialDateInput != null) {
2771
- return dateEnv.createMarker(initialDateInput);
2772
- }
2773
- return getNow(options.now, dateEnv); // getNow already returns unzoned
2774
- }
2775
- function getNow(nowInput, dateEnv) {
2776
- if (typeof nowInput === 'function') {
2777
- nowInput = nowInput();
2778
- }
2779
- if (nowInput == null) {
2780
- return dateEnv.createNowMarker();
2781
- }
2782
- return dateEnv.createMarker(nowInput);
2783
- }
2784
-
2785
2783
  class DateProfileGenerator {
2786
2784
  constructor(props) {
2787
2785
  this.props = props;
2788
- this.nowDate = getNow(props.nowInput, props.dateEnv);
2789
2786
  this.initHiddenDays();
2790
2787
  }
2791
2788
  /* Date Range Computation
@@ -2870,7 +2867,7 @@ var FullCalendar = (function (exports) {
2870
2867
  buildValidRange() {
2871
2868
  let input = this.props.validRangeInput;
2872
2869
  let simpleInput = typeof input === 'function'
2873
- ? input.call(this.props.calendarApi, this.nowDate)
2870
+ ? input.call(this.props.calendarApi, this.props.dateEnv.toDate(this.props.nowManager.getDateMarker()))
2874
2871
  : input;
2875
2872
  return this.refineRange(simpleInput) ||
2876
2873
  { start: null, end: null }; // completely open-ended
@@ -4762,6 +4759,85 @@ var FullCalendar = (function (exports) {
4762
4759
  // global state
4763
4760
  const interactionSettingsStore = {};
4764
4761
 
4762
+ class NowTimer extends x$1 {
4763
+ constructor(props, context) {
4764
+ super(props, context);
4765
+ this.handleRefresh = () => {
4766
+ let timing = this.computeTiming();
4767
+ if (timing.state.nowDate.valueOf() !== this.state.nowDate.valueOf()) {
4768
+ this.setState(timing.state);
4769
+ }
4770
+ this.clearTimeout();
4771
+ this.setTimeout(timing.waitMs);
4772
+ };
4773
+ this.handleVisibilityChange = () => {
4774
+ if (!document.hidden) {
4775
+ this.handleRefresh();
4776
+ }
4777
+ };
4778
+ this.state = this.computeTiming().state;
4779
+ }
4780
+ render() {
4781
+ let { props, state } = this;
4782
+ return props.children(state.nowDate, state.todayRange);
4783
+ }
4784
+ componentDidMount() {
4785
+ this.setTimeout();
4786
+ this.context.nowManager.addResetListener(this.handleRefresh);
4787
+ // fired tab becomes visible after being hidden
4788
+ document.addEventListener('visibilitychange', this.handleVisibilityChange);
4789
+ }
4790
+ componentDidUpdate(prevProps) {
4791
+ if (prevProps.unit !== this.props.unit) {
4792
+ this.clearTimeout();
4793
+ this.setTimeout();
4794
+ }
4795
+ }
4796
+ componentWillUnmount() {
4797
+ this.clearTimeout();
4798
+ this.context.nowManager.removeResetListener(this.handleRefresh);
4799
+ document.removeEventListener('visibilitychange', this.handleVisibilityChange);
4800
+ }
4801
+ computeTiming() {
4802
+ let { props, context } = this;
4803
+ let unroundedNow = context.nowManager.getDateMarker();
4804
+ let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit);
4805
+ let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit));
4806
+ let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf();
4807
+ // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342)
4808
+ // ensure no longer than a day
4809
+ waitMs = Math.min(1000 * 60 * 60 * 24, waitMs);
4810
+ return {
4811
+ state: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) },
4812
+ waitMs,
4813
+ };
4814
+ }
4815
+ setTimeout(waitMs = this.computeTiming().waitMs) {
4816
+ // NOTE: timeout could take longer than expected if tab sleeps,
4817
+ // which is why we listen to 'visibilitychange'
4818
+ this.timeoutId = setTimeout(() => {
4819
+ // NOTE: timeout could also return *earlier* than expected, and we need to wait 2 ms more
4820
+ // This is why use use same waitMs from computeTiming, so we don't skip an interval while
4821
+ // .setState() is executing
4822
+ const timing = this.computeTiming();
4823
+ this.setState(timing.state, () => {
4824
+ this.setTimeout(timing.waitMs);
4825
+ });
4826
+ }, waitMs);
4827
+ }
4828
+ clearTimeout() {
4829
+ if (this.timeoutId) {
4830
+ clearTimeout(this.timeoutId);
4831
+ }
4832
+ }
4833
+ }
4834
+ NowTimer.contextType = ViewContextType;
4835
+ function buildDayRange(date) {
4836
+ let start = startOfDay(date);
4837
+ let end = addDays(start, 1);
4838
+ return { start, end };
4839
+ }
4840
+
4765
4841
  class CalendarImpl {
4766
4842
  getCurrentData() {
4767
4843
  return this.currentDataManager.getCurrentData();
@@ -4917,7 +4993,7 @@ var FullCalendar = (function (exports) {
4917
4993
  this.unselect();
4918
4994
  this.dispatch({
4919
4995
  type: 'CHANGE_DATE',
4920
- dateMarker: getNow(state.calendarOptions.now, state.dateEnv),
4996
+ dateMarker: state.nowManager.getDateMarker(),
4921
4997
  });
4922
4998
  }
4923
4999
  gotoDate(zonedDateInput) {
@@ -5318,7 +5394,7 @@ var FullCalendar = (function (exports) {
5318
5394
  function getDateMeta(date, todayRange, nowDate, dateProfile) {
5319
5395
  return {
5320
5396
  dow: date.getUTCDay(),
5321
- isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)),
5397
+ isDisabled: Boolean(dateProfile && (!dateProfile.activeRange || !rangeContainsMarker(dateProfile.activeRange, date))),
5322
5398
  isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)),
5323
5399
  isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)),
5324
5400
  isPast: Boolean(nowDate ? (date < nowDate) : todayRange ? (date < todayRange.start) : false),
@@ -6083,7 +6159,13 @@ var FullCalendar = (function (exports) {
6083
6159
  let navLinkAttrs = (!dayMeta.isDisabled && props.colCnt > 1)
6084
6160
  ? buildNavLinkAttrs(this.context, date)
6085
6161
  : {};
6086
- let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta);
6162
+ let publicDate = dateEnv.toDate(date);
6163
+ // workaround for Luxon (and maybe moment) returning prior-days when start-of-day
6164
+ // in DST gap: https://github.com/fullcalendar/fullcalendar/issues/7633
6165
+ if (dateEnv.namedTimeZoneImpl) {
6166
+ publicDate = addMs(publicDate, 3600000); // add an hour
6167
+ }
6168
+ let renderProps = Object.assign(Object.assign(Object.assign({ date: publicDate, view: viewApi }, props.extraRenderProps), { text }), dayMeta);
6087
6169
  return (y(ContentContainer, { elTag: "th", elClasses: classNames, elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan, 'data-date': !dayMeta.isDisabled ? formatDayString(date) : undefined }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", customGenerator: options.dayHeaderContent, defaultGenerator: renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContainer) => (y("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && (y(InnerContainer, { elTag: "a", elAttrs: navLinkAttrs, elClasses: [
6088
6170
  'fc-col-header-cell-cushion',
6089
6171
  props.isSticky && 'fc-sticky',
@@ -6122,65 +6204,6 @@ var FullCalendar = (function (exports) {
6122
6204
  }
6123
6205
  }
6124
6206
 
6125
- class NowTimer extends x$1 {
6126
- constructor(props, context) {
6127
- super(props, context);
6128
- this.initialNowDate = getNow(context.options.now, context.dateEnv);
6129
- this.initialNowQueriedMs = new Date().valueOf();
6130
- this.state = this.computeTiming().currentState;
6131
- }
6132
- render() {
6133
- let { props, state } = this;
6134
- return props.children(state.nowDate, state.todayRange);
6135
- }
6136
- componentDidMount() {
6137
- this.setTimeout();
6138
- }
6139
- componentDidUpdate(prevProps) {
6140
- if (prevProps.unit !== this.props.unit) {
6141
- this.clearTimeout();
6142
- this.setTimeout();
6143
- }
6144
- }
6145
- componentWillUnmount() {
6146
- this.clearTimeout();
6147
- }
6148
- computeTiming() {
6149
- let { props, context } = this;
6150
- let unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs);
6151
- let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit);
6152
- let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit));
6153
- let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf();
6154
- // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342)
6155
- // ensure no longer than a day
6156
- waitMs = Math.min(1000 * 60 * 60 * 24, waitMs);
6157
- return {
6158
- currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) },
6159
- nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) },
6160
- waitMs,
6161
- };
6162
- }
6163
- setTimeout() {
6164
- let { nextState, waitMs } = this.computeTiming();
6165
- this.timeoutId = setTimeout(() => {
6166
- this.setState(nextState, () => {
6167
- this.setTimeout();
6168
- });
6169
- }, waitMs);
6170
- }
6171
- clearTimeout() {
6172
- if (this.timeoutId) {
6173
- clearTimeout(this.timeoutId);
6174
- }
6175
- }
6176
- }
6177
- NowTimer.contextType = ViewContextType;
6178
- function buildDayRange(date) {
6179
- let start = startOfDay(date);
6180
- let end = addDays(start, 1);
6181
- return { start, end };
6182
- }
6183
-
6184
6207
  class DayHeader extends BaseComponent {
6185
6208
  constructor() {
6186
6209
  super(...arguments);
@@ -7056,8 +7079,11 @@ var FullCalendar = (function (exports) {
7056
7079
  class EventContainer extends BaseComponent {
7057
7080
  constructor() {
7058
7081
  super(...arguments);
7082
+ // memo
7083
+ this.buildPublicEvent = memoize((context, eventDef, eventInstance) => new EventImpl(context, eventDef, eventInstance));
7059
7084
  this.handleEl = (el) => {
7060
7085
  this.el = el;
7086
+ setRef(this.props.elRef, el);
7061
7087
  if (el) {
7062
7088
  setElSeg(el, this.props.seg);
7063
7089
  }
@@ -7070,7 +7096,7 @@ var FullCalendar = (function (exports) {
7070
7096
  const { eventRange } = seg;
7071
7097
  const { ui } = eventRange;
7072
7098
  const renderProps = {
7073
- event: new EventImpl(context, eventRange.def, eventRange.instance),
7099
+ event: this.buildPublicEvent(context, eventRange.def, eventRange.instance),
7074
7100
  view: context.viewApi,
7075
7101
  timeText: props.timeText,
7076
7102
  textColor: ui.textColor,
@@ -7089,11 +7115,11 @@ var FullCalendar = (function (exports) {
7089
7115
  isDragging: Boolean(props.isDragging),
7090
7116
  isResizing: Boolean(props.isResizing),
7091
7117
  };
7092
- return (y(ContentContainer, Object.assign({}, props /* contains children */, { elRef: this.handleEl, elClasses: [
7118
+ return (y(ContentContainer, { elRef: this.handleEl, elTag: props.elTag, elAttrs: props.elAttrs, elClasses: [
7093
7119
  ...getEventClassNames(renderProps),
7094
7120
  ...seg.eventRange.ui.classNames,
7095
7121
  ...(props.elClasses || []),
7096
- ], renderProps: renderProps, generatorName: "eventContent", customGenerator: options.eventContent, defaultGenerator: props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount })));
7122
+ ], elStyle: props.elStyle, renderProps: renderProps, generatorName: "eventContent", customGenerator: options.eventContent, defaultGenerator: props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount }, props.children));
7097
7123
  }
7098
7124
  componentDidUpdate(prevProps) {
7099
7125
  if (this.el && this.props.seg !== prevProps.seg) {
@@ -7120,6 +7146,9 @@ var FullCalendar = (function (exports) {
7120
7146
  Boolean(eventContentArg.isEndResizable) && (y("div", { className: "fc-event-resizer fc-event-resizer-end" }))))));
7121
7147
  }
7122
7148
  }
7149
+ StandardEvent.addPropsEquality({
7150
+ seg: isPropsEqual,
7151
+ });
7123
7152
  function renderInnerContent$1$1(innerProps) {
7124
7153
  return (y("div", { className: "fc-event-main-frame" },
7125
7154
  innerProps.timeText && (y("div", { className: "fc-event-time" }, innerProps.timeText)),
@@ -7134,7 +7163,7 @@ var FullCalendar = (function (exports) {
7134
7163
  date: context.dateEnv.toDate(props.date),
7135
7164
  view: context.viewApi,
7136
7165
  };
7137
- return (y(ContentContainer, Object.assign({}, props /* includes children */, { elTag: props.elTag || 'div', renderProps: renderProps, generatorName: "nowIndicatorContent", customGenerator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount })));
7166
+ return (y(ContentContainer, { elRef: props.elRef, elTag: props.elTag || 'div', elAttrs: props.elAttrs, elClasses: props.elClasses, elStyle: props.elStyle, renderProps: renderProps, generatorName: "nowIndicatorContent", customGenerator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }, props.children));
7138
7167
  }));
7139
7168
 
7140
7169
  const DAY_NUM_FORMAT = createFormatter({ day: 'numeric' });
@@ -7157,12 +7186,12 @@ var FullCalendar = (function (exports) {
7157
7186
  dateEnv: context.dateEnv,
7158
7187
  monthStartFormat: options.monthStartFormat,
7159
7188
  });
7160
- return (y(ContentContainer, Object.assign({}, props /* includes children */, { elClasses: [
7189
+ return (y(ContentContainer, { elRef: props.elRef, elTag: props.elTag, elAttrs: Object.assign(Object.assign({}, props.elAttrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), elClasses: [
7161
7190
  ...getDayClassNames(renderProps, context.theme),
7162
7191
  ...(props.elClasses || []),
7163
- ], elAttrs: Object.assign(Object.assign({}, props.elAttrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), renderProps: renderProps, generatorName: "dayCellContent", customGenerator: options.dayCellContent, defaultGenerator: props.defaultGenerator, classNameGenerator:
7192
+ ], elStyle: props.elStyle, renderProps: renderProps, generatorName: "dayCellContent", customGenerator: options.dayCellContent, defaultGenerator: props.defaultGenerator, classNameGenerator:
7164
7193
  // don't use custom classNames if disabled
7165
- renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount })));
7194
+ renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount }, props.children));
7166
7195
  }
7167
7196
  }
7168
7197
  function hasCustomDayCellContent(options) {
@@ -7199,7 +7228,7 @@ var FullCalendar = (function (exports) {
7199
7228
  let text = dateEnv.format(date, format);
7200
7229
  let renderProps = { num, text, date };
7201
7230
  return (y(ContentContainer // why isn't WeekNumberContentArg being auto-detected?
7202
- , Object.assign({}, props /* includes children */, { renderProps: renderProps, generatorName: "weekNumberContent", customGenerator: options.weekNumberContent, defaultGenerator: renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount })));
7231
+ , { elRef: props.elRef, elTag: props.elTag, elAttrs: props.elAttrs, elClasses: props.elClasses, elStyle: props.elStyle, renderProps: renderProps, generatorName: "weekNumberContent", customGenerator: options.weekNumberContent, defaultGenerator: renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }, props.children));
7203
7232
  }));
7204
7233
  function renderInner(innerProps) {
7205
7234
  return innerProps.text;
@@ -8158,6 +8187,25 @@ var FullCalendar = (function (exports) {
8158
8187
  return viewType;
8159
8188
  }
8160
8189
 
8190
+ function reduceCurrentDate(currentDate, action) {
8191
+ switch (action.type) {
8192
+ case 'CHANGE_DATE':
8193
+ return action.dateMarker;
8194
+ default:
8195
+ return currentDate;
8196
+ }
8197
+ }
8198
+ // should be initialized once and stay constant
8199
+ // this will change too
8200
+ function getInitialDate(options, dateEnv, nowManager) {
8201
+ let initialDateInput = options.initialDate;
8202
+ // compute the initial ambig-timezone date
8203
+ if (initialDateInput != null) {
8204
+ return dateEnv.createMarker(initialDateInput);
8205
+ }
8206
+ return nowManager.getDateMarker();
8207
+ }
8208
+
8161
8209
  function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) {
8162
8210
  switch (action.type) {
8163
8211
  case 'SET_OPTION':
@@ -8667,6 +8715,7 @@ var FullCalendar = (function (exports) {
8667
8715
  endTime: refined.endTime || null,
8668
8716
  startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
8669
8717
  endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null,
8718
+ dateEnv,
8670
8719
  };
8671
8720
  let duration;
8672
8721
  if (refined.duration) {
@@ -8686,7 +8735,7 @@ var FullCalendar = (function (exports) {
8686
8735
  expand(typeData, framingRange, dateEnv) {
8687
8736
  let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
8688
8737
  if (clippedFramingRange) {
8689
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
8738
+ return expandRanges(typeData.daysOfWeek, typeData.startTime, typeData.dateEnv, dateEnv, clippedFramingRange);
8690
8739
  }
8691
8740
  return [];
8692
8741
  },
@@ -8696,7 +8745,7 @@ var FullCalendar = (function (exports) {
8696
8745
  recurringTypes: [recurring],
8697
8746
  eventRefiners: SIMPLE_RECURRING_REFINERS,
8698
8747
  });
8699
- function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
8748
+ function expandRanges(daysOfWeek, startTime, eventDateEnv, calendarDateEnv, framingRange) {
8700
8749
  let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
8701
8750
  let dayMarker = startOfDay(framingRange.start);
8702
8751
  let endMarker = framingRange.end;
@@ -8706,12 +8755,12 @@ var FullCalendar = (function (exports) {
8706
8755
  // if everyday, or this particular day-of-week
8707
8756
  if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
8708
8757
  if (startTime) {
8709
- instanceStart = dateEnv.add(dayMarker, startTime);
8758
+ instanceStart = calendarDateEnv.add(dayMarker, startTime);
8710
8759
  }
8711
8760
  else {
8712
8761
  instanceStart = dayMarker;
8713
8762
  }
8714
- instanceStarts.push(instanceStart);
8763
+ instanceStarts.push(calendarDateEnv.createMarker(eventDateEnv.toDate(instanceStart)));
8715
8764
  }
8716
8765
  dayMarker = addDays(dayMarker, 1);
8717
8766
  }
@@ -8876,6 +8925,49 @@ var FullCalendar = (function (exports) {
8876
8925
  return { year: 'numeric', month: 'long', day: 'numeric' };
8877
8926
  }
8878
8927
 
8928
+ /*
8929
+ TODO: test switching timezones when NO timezone plugin
8930
+ */
8931
+ class CalendarNowManager {
8932
+ constructor() {
8933
+ this.resetListeners = new Set();
8934
+ }
8935
+ handleInput(dateEnv, // will change if timezone setup changed
8936
+ nowInput) {
8937
+ const oldDateEnv = this.dateEnv;
8938
+ if (dateEnv !== oldDateEnv) {
8939
+ if (typeof nowInput === 'function') {
8940
+ this.nowFn = nowInput;
8941
+ }
8942
+ else if (!oldDateEnv) { // first time?
8943
+ this.nowAnchorDate = dateEnv.toDate(nowInput
8944
+ ? dateEnv.createMarker(nowInput)
8945
+ : dateEnv.createNowMarker());
8946
+ this.nowAnchorQueried = Date.now();
8947
+ }
8948
+ this.dateEnv = dateEnv;
8949
+ // not first time? fire reset handlers
8950
+ if (oldDateEnv) {
8951
+ for (const resetListener of this.resetListeners.values()) {
8952
+ resetListener();
8953
+ }
8954
+ }
8955
+ }
8956
+ }
8957
+ getDateMarker() {
8958
+ return this.nowAnchorDate
8959
+ ? this.dateEnv.timestampToMarker(this.nowAnchorDate.valueOf() +
8960
+ (Date.now() - this.nowAnchorQueried))
8961
+ : this.dateEnv.createMarker(this.nowFn());
8962
+ }
8963
+ addResetListener(handler) {
8964
+ this.resetListeners.add(handler);
8965
+ }
8966
+ removeResetListener(handler) {
8967
+ this.resetListeners.delete(handler);
8968
+ }
8969
+ }
8970
+
8879
8971
  // in future refactor, do the redux-style function(state=initial) for initial-state
8880
8972
  // also, whatever is happening in constructor, have it happen in action queue too
8881
8973
  class CalendarDataManager {
@@ -8895,6 +8987,7 @@ var FullCalendar = (function (exports) {
8895
8987
  this.buildEventUiBases = memoize(buildEventUiBases);
8896
8988
  this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours);
8897
8989
  this.buildTitle = memoize(buildTitle);
8990
+ this.nowManager = new CalendarNowManager();
8898
8991
  this.emitter = new Emitter();
8899
8992
  this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this));
8900
8993
  this.currentCalendarOptionsInput = {};
@@ -8910,6 +9003,7 @@ var FullCalendar = (function (exports) {
8910
9003
  };
8911
9004
  this.props = props;
8912
9005
  this.actionRunner.pause();
9006
+ this.nowManager = new CalendarNowManager();
8913
9007
  let dynamicOptionOverrides = {};
8914
9008
  let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi);
8915
9009
  let currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView;
@@ -8919,12 +9013,8 @@ var FullCalendar = (function (exports) {
8919
9013
  props.calendarApi.currentDataManager = this;
8920
9014
  this.emitter.setThisContext(props.calendarApi);
8921
9015
  this.emitter.setOptions(currentViewData.options);
8922
- let currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv);
8923
- let dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
8924
- if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) {
8925
- currentDate = dateProfile.currentRange.start;
8926
- }
8927
9016
  let calendarContext = {
9017
+ nowManager: this.nowManager,
8928
9018
  dateEnv: optionsData.dateEnv,
8929
9019
  options: optionsData.calendarOptions,
8930
9020
  pluginHooks: optionsData.pluginHooks,
@@ -8933,6 +9023,11 @@ var FullCalendar = (function (exports) {
8933
9023
  emitter: this.emitter,
8934
9024
  getCurrentData: this.getCurrentData,
8935
9025
  };
9026
+ let currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv, this.nowManager);
9027
+ let dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
9028
+ if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) {
9029
+ currentDate = dateProfile.currentRange.start;
9030
+ }
8936
9031
  // needs to be after setThisContext
8937
9032
  for (let callback of optionsData.pluginHooks.contextInit) {
8938
9033
  callback(calendarContext);
@@ -8993,6 +9088,7 @@ var FullCalendar = (function (exports) {
8993
9088
  emitter.setThisContext(props.calendarApi);
8994
9089
  emitter.setOptions(currentViewData.options);
8995
9090
  let calendarContext = {
9091
+ nowManager: this.nowManager,
8996
9092
  dateEnv: optionsData.dateEnv,
8997
9093
  options: optionsData.calendarOptions,
8998
9094
  pluginHooks: optionsData.pluginHooks,
@@ -9060,7 +9156,7 @@ var FullCalendar = (function (exports) {
9060
9156
  let oldData = this.data;
9061
9157
  let optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi);
9062
9158
  let currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides);
9063
- let data = this.data = Object.assign(Object.assign(Object.assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state);
9159
+ let data = this.data = Object.assign(Object.assign(Object.assign({ nowManager: this.nowManager, viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state);
9064
9160
  let changeHandlers = optionsData.pluginHooks.optionChangeHandlers;
9065
9161
  let oldCalendarOptions = oldData && oldData.calendarOptions;
9066
9162
  let newCalendarOptions = optionsData.calendarOptions;
@@ -9168,8 +9264,10 @@ var FullCalendar = (function (exports) {
9168
9264
  }
9169
9265
  let { refinedOptions, extra } = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides);
9170
9266
  warnUnknownOptions(extra);
9267
+ this.nowManager.handleInput(optionsData.dateEnv, refinedOptions.now);
9171
9268
  let dateProfileGenerator = this.buildDateProfileGenerator({
9172
9269
  dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass,
9270
+ nowManager: this.nowManager,
9173
9271
  duration: viewSpec.duration,
9174
9272
  durationUnit: viewSpec.durationUnit,
9175
9273
  usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime,
@@ -9183,7 +9281,6 @@ var FullCalendar = (function (exports) {
9183
9281
  dateIncrement: refinedOptions.dateIncrement,
9184
9282
  hiddenDays: refinedOptions.hiddenDays,
9185
9283
  weekends: refinedOptions.weekends,
9186
- nowInput: refinedOptions.now,
9187
9284
  validRangeInput: refinedOptions.validRange,
9188
9285
  visibleRangeInput: refinedOptions.visibleRange,
9189
9286
  fixedWeekCount: refinedOptions.fixedWeekCount,
@@ -9587,8 +9684,6 @@ var FullCalendar = (function (exports) {
9587
9684
  render() {
9588
9685
  let { props } = this;
9589
9686
  let { toolbarConfig, options } = props;
9590
- let toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, getNow(props.options.now, props.dateEnv), // TODO: use NowTimer????
9591
- props.viewTitle);
9592
9687
  let viewVGrow = false;
9593
9688
  let viewHeight = '';
9594
9689
  let viewAspectRatio;
@@ -9604,16 +9699,20 @@ var FullCalendar = (function (exports) {
9604
9699
  else {
9605
9700
  viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall
9606
9701
  }
9607
- let viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent);
9702
+ let viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.nowManager, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent);
9608
9703
  let viewLabelId = (toolbarConfig.header && toolbarConfig.header.hasTitle)
9609
9704
  ? this.state.viewLabelId
9610
9705
  : undefined;
9611
9706
  return (y(ViewContextType.Provider, { value: viewContext },
9612
- toolbarConfig.header && (y(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))),
9613
- y(ViewHarness, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId },
9614
- this.renderView(props),
9615
- this.buildAppendContent()),
9616
- toolbarConfig.footer && (y(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps)))));
9707
+ y(NowTimer, { unit: "day" }, (nowDate) => {
9708
+ let toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, nowDate, props.viewTitle);
9709
+ return (y(_, null,
9710
+ toolbarConfig.header && (y(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))),
9711
+ y(ViewHarness, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId },
9712
+ this.renderView(props),
9713
+ this.buildAppendContent()),
9714
+ toolbarConfig.footer && (y(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps)))));
9715
+ })));
9617
9716
  }
9618
9717
  componentDidMount() {
9619
9718
  let { props } = this;
@@ -9835,7 +9934,7 @@ var FullCalendar = (function (exports) {
9835
9934
  return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
9836
9935
  }
9837
9936
 
9838
- const version = '6.1.15';
9937
+ const version = '6.1.18';
9839
9938
 
9840
9939
  config.touchMouseIgnoreWait = 500;
9841
9940
  let ignoreMouseDepth = 0;
@@ -12675,7 +12774,7 @@ var FullCalendar = (function (exports) {
12675
12774
  constructor() {
12676
12775
  super(...arguments);
12677
12776
  this.splitBusinessHourSegs = memoize(splitSegsByRow);
12678
- this.splitBgEventSegs = memoize(splitSegsByRow);
12777
+ this.splitBgEventSegs = memoize(splitAllDaySegsByRow);
12679
12778
  this.splitFgEventSegs = memoize(splitSegsByRow);
12680
12779
  this.splitDateSelectionSegs = memoize(splitSegsByRow);
12681
12780
  this.splitEventDrag = memoize(splitInteractionByRow);
@@ -12699,7 +12798,7 @@ var FullCalendar = (function (exports) {
12699
12798
  return (y(NowTimer, { unit: "day" }, (nowDate, todayRange) => (y(_, null, props.cells.map((cells, row) => (y(TableRow, { ref: this.rowRefs.createRef(row), key: cells.length
12700
12799
  ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */
12701
12800
  : row // in case there are no cells (like when resource view is loading)
12702
- , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: props.dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, cellMinHeight: cellMinHeight, forPrint: props.forPrint })))))));
12801
+ , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: props.dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row], fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, cellMinHeight: cellMinHeight, forPrint: props.forPrint })))))));
12703
12802
  }
12704
12803
  componentDidMount() {
12705
12804
  this.registerInteractiveComponent();
@@ -12768,6 +12867,9 @@ var FullCalendar = (function (exports) {
12768
12867
  return { start, end };
12769
12868
  }
12770
12869
  }
12870
+ function splitAllDaySegsByRow(segs, rowCnt) {
12871
+ return splitSegsByRow(segs.filter(isSegAllDay), rowCnt);
12872
+ }
12771
12873
  function isSegAllDay(seg) {
12772
12874
  return seg.eventRange.def.allDay;
12773
12875
  }