fullcalendar 6.1.15 → 6.1.17

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.17
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:
@@ -2321,9 +2324,10 @@ var FullCalendar = (function (exports) {
2321
2324
  }
2322
2325
 
2323
2326
  const ViewContextType = createContext({}); // for Components
2324
- function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
2327
+ function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, nowManager, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
2325
2328
  return {
2326
2329
  dateEnv,
2330
+ nowManager,
2327
2331
  options: viewOptions,
2328
2332
  pluginHooks,
2329
2333
  emitter,
@@ -2756,36 +2760,9 @@ var FullCalendar = (function (exports) {
2756
2760
  return diffDayAndTime(date0, date1); // returns a duration
2757
2761
  }
2758
2762
 
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
2763
  class DateProfileGenerator {
2786
2764
  constructor(props) {
2787
2765
  this.props = props;
2788
- this.nowDate = getNow(props.nowInput, props.dateEnv);
2789
2766
  this.initHiddenDays();
2790
2767
  }
2791
2768
  /* Date Range Computation
@@ -2870,7 +2847,7 @@ var FullCalendar = (function (exports) {
2870
2847
  buildValidRange() {
2871
2848
  let input = this.props.validRangeInput;
2872
2849
  let simpleInput = typeof input === 'function'
2873
- ? input.call(this.props.calendarApi, this.nowDate)
2850
+ ? input.call(this.props.calendarApi, this.props.dateEnv.toDate(this.props.nowManager.getDateMarker()))
2874
2851
  : input;
2875
2852
  return this.refineRange(simpleInput) ||
2876
2853
  { start: null, end: null }; // completely open-ended
@@ -4762,6 +4739,85 @@ var FullCalendar = (function (exports) {
4762
4739
  // global state
4763
4740
  const interactionSettingsStore = {};
4764
4741
 
4742
+ class NowTimer extends x$1 {
4743
+ constructor(props, context) {
4744
+ super(props, context);
4745
+ this.handleRefresh = () => {
4746
+ let timing = this.computeTiming();
4747
+ if (timing.state.nowDate.valueOf() !== this.state.nowDate.valueOf()) {
4748
+ this.setState(timing.state);
4749
+ }
4750
+ this.clearTimeout();
4751
+ this.setTimeout(timing.waitMs);
4752
+ };
4753
+ this.handleVisibilityChange = () => {
4754
+ if (!document.hidden) {
4755
+ this.handleRefresh();
4756
+ }
4757
+ };
4758
+ this.state = this.computeTiming().state;
4759
+ }
4760
+ render() {
4761
+ let { props, state } = this;
4762
+ return props.children(state.nowDate, state.todayRange);
4763
+ }
4764
+ componentDidMount() {
4765
+ this.setTimeout();
4766
+ this.context.nowManager.addResetListener(this.handleRefresh);
4767
+ // fired tab becomes visible after being hidden
4768
+ document.addEventListener('visibilitychange', this.handleVisibilityChange);
4769
+ }
4770
+ componentDidUpdate(prevProps) {
4771
+ if (prevProps.unit !== this.props.unit) {
4772
+ this.clearTimeout();
4773
+ this.setTimeout();
4774
+ }
4775
+ }
4776
+ componentWillUnmount() {
4777
+ this.clearTimeout();
4778
+ this.context.nowManager.removeResetListener(this.handleRefresh);
4779
+ document.removeEventListener('visibilitychange', this.handleVisibilityChange);
4780
+ }
4781
+ computeTiming() {
4782
+ let { props, context } = this;
4783
+ let unroundedNow = context.nowManager.getDateMarker();
4784
+ let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit);
4785
+ let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit));
4786
+ let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf();
4787
+ // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342)
4788
+ // ensure no longer than a day
4789
+ waitMs = Math.min(1000 * 60 * 60 * 24, waitMs);
4790
+ return {
4791
+ state: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) },
4792
+ waitMs,
4793
+ };
4794
+ }
4795
+ setTimeout(waitMs = this.computeTiming().waitMs) {
4796
+ // NOTE: timeout could take longer than expected if tab sleeps,
4797
+ // which is why we listen to 'visibilitychange'
4798
+ this.timeoutId = setTimeout(() => {
4799
+ // NOTE: timeout could also return *earlier* than expected, and we need to wait 2 ms more
4800
+ // This is why use use same waitMs from computeTiming, so we don't skip an interval while
4801
+ // .setState() is executing
4802
+ const timing = this.computeTiming();
4803
+ this.setState(timing.state, () => {
4804
+ this.setTimeout(timing.waitMs);
4805
+ });
4806
+ }, waitMs);
4807
+ }
4808
+ clearTimeout() {
4809
+ if (this.timeoutId) {
4810
+ clearTimeout(this.timeoutId);
4811
+ }
4812
+ }
4813
+ }
4814
+ NowTimer.contextType = ViewContextType;
4815
+ function buildDayRange(date) {
4816
+ let start = startOfDay(date);
4817
+ let end = addDays(start, 1);
4818
+ return { start, end };
4819
+ }
4820
+
4765
4821
  class CalendarImpl {
4766
4822
  getCurrentData() {
4767
4823
  return this.currentDataManager.getCurrentData();
@@ -4917,7 +4973,7 @@ var FullCalendar = (function (exports) {
4917
4973
  this.unselect();
4918
4974
  this.dispatch({
4919
4975
  type: 'CHANGE_DATE',
4920
- dateMarker: getNow(state.calendarOptions.now, state.dateEnv),
4976
+ dateMarker: state.nowManager.getDateMarker(),
4921
4977
  });
4922
4978
  }
4923
4979
  gotoDate(zonedDateInput) {
@@ -5318,7 +5374,7 @@ var FullCalendar = (function (exports) {
5318
5374
  function getDateMeta(date, todayRange, nowDate, dateProfile) {
5319
5375
  return {
5320
5376
  dow: date.getUTCDay(),
5321
- isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)),
5377
+ isDisabled: Boolean(dateProfile && (!dateProfile.activeRange || !rangeContainsMarker(dateProfile.activeRange, date))),
5322
5378
  isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)),
5323
5379
  isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)),
5324
5380
  isPast: Boolean(nowDate ? (date < nowDate) : todayRange ? (date < todayRange.start) : false),
@@ -6083,7 +6139,13 @@ var FullCalendar = (function (exports) {
6083
6139
  let navLinkAttrs = (!dayMeta.isDisabled && props.colCnt > 1)
6084
6140
  ? buildNavLinkAttrs(this.context, date)
6085
6141
  : {};
6086
- let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta);
6142
+ let publicDate = dateEnv.toDate(date);
6143
+ // workaround for Luxon (and maybe moment) returning prior-days when start-of-day
6144
+ // in DST gap: https://github.com/fullcalendar/fullcalendar/issues/7633
6145
+ if (dateEnv.namedTimeZoneImpl) {
6146
+ publicDate = addMs(publicDate, 3600000); // add an hour
6147
+ }
6148
+ let renderProps = Object.assign(Object.assign(Object.assign({ date: publicDate, view: viewApi }, props.extraRenderProps), { text }), dayMeta);
6087
6149
  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
6150
  'fc-col-header-cell-cushion',
6089
6151
  props.isSticky && 'fc-sticky',
@@ -6122,65 +6184,6 @@ var FullCalendar = (function (exports) {
6122
6184
  }
6123
6185
  }
6124
6186
 
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
6187
  class DayHeader extends BaseComponent {
6185
6188
  constructor() {
6186
6189
  super(...arguments);
@@ -8158,6 +8161,25 @@ var FullCalendar = (function (exports) {
8158
8161
  return viewType;
8159
8162
  }
8160
8163
 
8164
+ function reduceCurrentDate(currentDate, action) {
8165
+ switch (action.type) {
8166
+ case 'CHANGE_DATE':
8167
+ return action.dateMarker;
8168
+ default:
8169
+ return currentDate;
8170
+ }
8171
+ }
8172
+ // should be initialized once and stay constant
8173
+ // this will change too
8174
+ function getInitialDate(options, dateEnv, nowManager) {
8175
+ let initialDateInput = options.initialDate;
8176
+ // compute the initial ambig-timezone date
8177
+ if (initialDateInput != null) {
8178
+ return dateEnv.createMarker(initialDateInput);
8179
+ }
8180
+ return nowManager.getDateMarker();
8181
+ }
8182
+
8161
8183
  function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) {
8162
8184
  switch (action.type) {
8163
8185
  case 'SET_OPTION':
@@ -8667,6 +8689,7 @@ var FullCalendar = (function (exports) {
8667
8689
  endTime: refined.endTime || null,
8668
8690
  startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
8669
8691
  endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null,
8692
+ dateEnv,
8670
8693
  };
8671
8694
  let duration;
8672
8695
  if (refined.duration) {
@@ -8686,7 +8709,7 @@ var FullCalendar = (function (exports) {
8686
8709
  expand(typeData, framingRange, dateEnv) {
8687
8710
  let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
8688
8711
  if (clippedFramingRange) {
8689
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
8712
+ return expandRanges(typeData.daysOfWeek, typeData.startTime, typeData.dateEnv, dateEnv, clippedFramingRange);
8690
8713
  }
8691
8714
  return [];
8692
8715
  },
@@ -8696,7 +8719,7 @@ var FullCalendar = (function (exports) {
8696
8719
  recurringTypes: [recurring],
8697
8720
  eventRefiners: SIMPLE_RECURRING_REFINERS,
8698
8721
  });
8699
- function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
8722
+ function expandRanges(daysOfWeek, startTime, eventDateEnv, calendarDateEnv, framingRange) {
8700
8723
  let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
8701
8724
  let dayMarker = startOfDay(framingRange.start);
8702
8725
  let endMarker = framingRange.end;
@@ -8706,12 +8729,12 @@ var FullCalendar = (function (exports) {
8706
8729
  // if everyday, or this particular day-of-week
8707
8730
  if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
8708
8731
  if (startTime) {
8709
- instanceStart = dateEnv.add(dayMarker, startTime);
8732
+ instanceStart = calendarDateEnv.add(dayMarker, startTime);
8710
8733
  }
8711
8734
  else {
8712
8735
  instanceStart = dayMarker;
8713
8736
  }
8714
- instanceStarts.push(instanceStart);
8737
+ instanceStarts.push(calendarDateEnv.createMarker(eventDateEnv.toDate(instanceStart)));
8715
8738
  }
8716
8739
  dayMarker = addDays(dayMarker, 1);
8717
8740
  }
@@ -8876,6 +8899,49 @@ var FullCalendar = (function (exports) {
8876
8899
  return { year: 'numeric', month: 'long', day: 'numeric' };
8877
8900
  }
8878
8901
 
8902
+ /*
8903
+ TODO: test switching timezones when NO timezone plugin
8904
+ */
8905
+ class CalendarNowManager {
8906
+ constructor() {
8907
+ this.resetListeners = new Set();
8908
+ }
8909
+ handleInput(dateEnv, // will change if timezone setup changed
8910
+ nowInput) {
8911
+ const oldDateEnv = this.dateEnv;
8912
+ if (dateEnv !== oldDateEnv) {
8913
+ if (typeof nowInput === 'function') {
8914
+ this.nowFn = nowInput;
8915
+ }
8916
+ else if (!oldDateEnv) { // first time?
8917
+ this.nowAnchorDate = dateEnv.toDate(nowInput
8918
+ ? dateEnv.createMarker(nowInput)
8919
+ : dateEnv.createNowMarker());
8920
+ this.nowAnchorQueried = Date.now();
8921
+ }
8922
+ this.dateEnv = dateEnv;
8923
+ // not first time? fire reset handlers
8924
+ if (oldDateEnv) {
8925
+ for (const resetListener of this.resetListeners.values()) {
8926
+ resetListener();
8927
+ }
8928
+ }
8929
+ }
8930
+ }
8931
+ getDateMarker() {
8932
+ return this.nowAnchorDate
8933
+ ? this.dateEnv.timestampToMarker(this.nowAnchorDate.valueOf() +
8934
+ (Date.now() - this.nowAnchorQueried))
8935
+ : this.dateEnv.createMarker(this.nowFn());
8936
+ }
8937
+ addResetListener(handler) {
8938
+ this.resetListeners.add(handler);
8939
+ }
8940
+ removeResetListener(handler) {
8941
+ this.resetListeners.delete(handler);
8942
+ }
8943
+ }
8944
+
8879
8945
  // in future refactor, do the redux-style function(state=initial) for initial-state
8880
8946
  // also, whatever is happening in constructor, have it happen in action queue too
8881
8947
  class CalendarDataManager {
@@ -8895,6 +8961,7 @@ var FullCalendar = (function (exports) {
8895
8961
  this.buildEventUiBases = memoize(buildEventUiBases);
8896
8962
  this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours);
8897
8963
  this.buildTitle = memoize(buildTitle);
8964
+ this.nowManager = new CalendarNowManager();
8898
8965
  this.emitter = new Emitter();
8899
8966
  this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this));
8900
8967
  this.currentCalendarOptionsInput = {};
@@ -8910,6 +8977,7 @@ var FullCalendar = (function (exports) {
8910
8977
  };
8911
8978
  this.props = props;
8912
8979
  this.actionRunner.pause();
8980
+ this.nowManager = new CalendarNowManager();
8913
8981
  let dynamicOptionOverrides = {};
8914
8982
  let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi);
8915
8983
  let currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView;
@@ -8919,12 +8987,8 @@ var FullCalendar = (function (exports) {
8919
8987
  props.calendarApi.currentDataManager = this;
8920
8988
  this.emitter.setThisContext(props.calendarApi);
8921
8989
  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
8990
  let calendarContext = {
8991
+ nowManager: this.nowManager,
8928
8992
  dateEnv: optionsData.dateEnv,
8929
8993
  options: optionsData.calendarOptions,
8930
8994
  pluginHooks: optionsData.pluginHooks,
@@ -8933,6 +8997,11 @@ var FullCalendar = (function (exports) {
8933
8997
  emitter: this.emitter,
8934
8998
  getCurrentData: this.getCurrentData,
8935
8999
  };
9000
+ let currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv, this.nowManager);
9001
+ let dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
9002
+ if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) {
9003
+ currentDate = dateProfile.currentRange.start;
9004
+ }
8936
9005
  // needs to be after setThisContext
8937
9006
  for (let callback of optionsData.pluginHooks.contextInit) {
8938
9007
  callback(calendarContext);
@@ -8993,6 +9062,7 @@ var FullCalendar = (function (exports) {
8993
9062
  emitter.setThisContext(props.calendarApi);
8994
9063
  emitter.setOptions(currentViewData.options);
8995
9064
  let calendarContext = {
9065
+ nowManager: this.nowManager,
8996
9066
  dateEnv: optionsData.dateEnv,
8997
9067
  options: optionsData.calendarOptions,
8998
9068
  pluginHooks: optionsData.pluginHooks,
@@ -9060,7 +9130,7 @@ var FullCalendar = (function (exports) {
9060
9130
  let oldData = this.data;
9061
9131
  let optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi);
9062
9132
  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);
9133
+ 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
9134
  let changeHandlers = optionsData.pluginHooks.optionChangeHandlers;
9065
9135
  let oldCalendarOptions = oldData && oldData.calendarOptions;
9066
9136
  let newCalendarOptions = optionsData.calendarOptions;
@@ -9168,8 +9238,10 @@ var FullCalendar = (function (exports) {
9168
9238
  }
9169
9239
  let { refinedOptions, extra } = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides);
9170
9240
  warnUnknownOptions(extra);
9241
+ this.nowManager.handleInput(optionsData.dateEnv, refinedOptions.now);
9171
9242
  let dateProfileGenerator = this.buildDateProfileGenerator({
9172
9243
  dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass,
9244
+ nowManager: this.nowManager,
9173
9245
  duration: viewSpec.duration,
9174
9246
  durationUnit: viewSpec.durationUnit,
9175
9247
  usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime,
@@ -9183,7 +9255,6 @@ var FullCalendar = (function (exports) {
9183
9255
  dateIncrement: refinedOptions.dateIncrement,
9184
9256
  hiddenDays: refinedOptions.hiddenDays,
9185
9257
  weekends: refinedOptions.weekends,
9186
- nowInput: refinedOptions.now,
9187
9258
  validRangeInput: refinedOptions.validRange,
9188
9259
  visibleRangeInput: refinedOptions.visibleRange,
9189
9260
  fixedWeekCount: refinedOptions.fixedWeekCount,
@@ -9587,8 +9658,6 @@ var FullCalendar = (function (exports) {
9587
9658
  render() {
9588
9659
  let { props } = this;
9589
9660
  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
9661
  let viewVGrow = false;
9593
9662
  let viewHeight = '';
9594
9663
  let viewAspectRatio;
@@ -9604,16 +9673,20 @@ var FullCalendar = (function (exports) {
9604
9673
  else {
9605
9674
  viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall
9606
9675
  }
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);
9676
+ 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
9677
  let viewLabelId = (toolbarConfig.header && toolbarConfig.header.hasTitle)
9609
9678
  ? this.state.viewLabelId
9610
9679
  : undefined;
9611
9680
  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)))));
9681
+ y(NowTimer, { unit: "day" }, (nowDate) => {
9682
+ let toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, nowDate, props.viewTitle);
9683
+ return (y(_, null,
9684
+ toolbarConfig.header && (y(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))),
9685
+ y(ViewHarness, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId },
9686
+ this.renderView(props),
9687
+ this.buildAppendContent()),
9688
+ toolbarConfig.footer && (y(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps)))));
9689
+ })));
9617
9690
  }
9618
9691
  componentDidMount() {
9619
9692
  let { props } = this;
@@ -9835,7 +9908,7 @@ var FullCalendar = (function (exports) {
9835
9908
  return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
9836
9909
  }
9837
9910
 
9838
- const version = '6.1.15';
9911
+ const version = '6.1.17';
9839
9912
 
9840
9913
  config.touchMouseIgnoreWait = 500;
9841
9914
  let ignoreMouseDepth = 0;