@fullcalendar/core 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.
Files changed (170) hide show
  1. package/index.cjs +91 -21
  2. package/index.global.js +189 -90
  3. package/index.global.min.js +2 -2
  4. package/index.js +92 -22
  5. package/internal-common.cjs +147 -121
  6. package/internal-common.d.ts +20 -5
  7. package/internal-common.js +148 -119
  8. package/internal.js +1 -1
  9. package/locales/af.global.js +1 -1
  10. package/locales/af.global.min.js +1 -1
  11. package/locales/ar-dz.global.js +1 -1
  12. package/locales/ar-dz.global.min.js +1 -1
  13. package/locales/ar-kw.global.js +1 -1
  14. package/locales/ar-kw.global.min.js +1 -1
  15. package/locales/ar-ly.global.js +1 -1
  16. package/locales/ar-ly.global.min.js +1 -1
  17. package/locales/ar-ma.global.js +1 -1
  18. package/locales/ar-ma.global.min.js +1 -1
  19. package/locales/ar-sa.global.js +1 -1
  20. package/locales/ar-sa.global.min.js +1 -1
  21. package/locales/ar-tn.global.js +1 -1
  22. package/locales/ar-tn.global.min.js +1 -1
  23. package/locales/ar.global.js +1 -1
  24. package/locales/ar.global.min.js +1 -1
  25. package/locales/az.global.js +1 -1
  26. package/locales/az.global.min.js +1 -1
  27. package/locales/bg.global.js +1 -1
  28. package/locales/bg.global.min.js +1 -1
  29. package/locales/bn.global.js +1 -1
  30. package/locales/bn.global.min.js +1 -1
  31. package/locales/bs.global.js +1 -1
  32. package/locales/bs.global.min.js +1 -1
  33. package/locales/ca.global.js +1 -1
  34. package/locales/ca.global.min.js +1 -1
  35. package/locales/cs.global.js +1 -1
  36. package/locales/cs.global.min.js +1 -1
  37. package/locales/cy.global.js +1 -1
  38. package/locales/cy.global.min.js +1 -1
  39. package/locales/da.global.js +1 -1
  40. package/locales/da.global.min.js +1 -1
  41. package/locales/de-at.global.js +1 -1
  42. package/locales/de-at.global.min.js +1 -1
  43. package/locales/de.global.js +1 -1
  44. package/locales/de.global.min.js +1 -1
  45. package/locales/el.global.js +1 -1
  46. package/locales/el.global.min.js +1 -1
  47. package/locales/en-au.global.js +1 -1
  48. package/locales/en-au.global.min.js +1 -1
  49. package/locales/en-gb.global.js +1 -1
  50. package/locales/en-gb.global.min.js +1 -1
  51. package/locales/en-nz.global.js +1 -1
  52. package/locales/en-nz.global.min.js +1 -1
  53. package/locales/eo.global.js +1 -1
  54. package/locales/eo.global.min.js +1 -1
  55. package/locales/es-us.global.js +1 -1
  56. package/locales/es-us.global.min.js +1 -1
  57. package/locales/es.global.js +1 -1
  58. package/locales/es.global.min.js +1 -1
  59. package/locales/et.global.js +1 -1
  60. package/locales/et.global.min.js +1 -1
  61. package/locales/eu.global.js +1 -1
  62. package/locales/eu.global.min.js +1 -1
  63. package/locales/fa.global.js +1 -1
  64. package/locales/fa.global.min.js +1 -1
  65. package/locales/fi.global.js +1 -1
  66. package/locales/fi.global.min.js +1 -1
  67. package/locales/fr-ca.global.js +1 -1
  68. package/locales/fr-ca.global.min.js +1 -1
  69. package/locales/fr-ch.global.js +1 -1
  70. package/locales/fr-ch.global.min.js +1 -1
  71. package/locales/fr.global.js +1 -1
  72. package/locales/fr.global.min.js +1 -1
  73. package/locales/gl.global.js +1 -1
  74. package/locales/gl.global.min.js +1 -1
  75. package/locales/he.global.js +1 -1
  76. package/locales/he.global.min.js +1 -1
  77. package/locales/hi.global.js +1 -1
  78. package/locales/hi.global.min.js +1 -1
  79. package/locales/hr.global.js +1 -1
  80. package/locales/hr.global.min.js +1 -1
  81. package/locales/hu.global.js +1 -1
  82. package/locales/hu.global.min.js +1 -1
  83. package/locales/hy-am.global.js +1 -1
  84. package/locales/hy-am.global.min.js +1 -1
  85. package/locales/id.global.js +1 -1
  86. package/locales/id.global.min.js +1 -1
  87. package/locales/is.global.js +1 -1
  88. package/locales/is.global.min.js +1 -1
  89. package/locales/it.global.js +1 -1
  90. package/locales/it.global.min.js +1 -1
  91. package/locales/ja.global.js +1 -1
  92. package/locales/ja.global.min.js +1 -1
  93. package/locales/ka.global.js +1 -1
  94. package/locales/ka.global.min.js +1 -1
  95. package/locales/kk.global.js +1 -1
  96. package/locales/kk.global.min.js +1 -1
  97. package/locales/km.global.js +1 -1
  98. package/locales/km.global.min.js +1 -1
  99. package/locales/ko.global.js +1 -1
  100. package/locales/ko.global.min.js +1 -1
  101. package/locales/ku.global.js +1 -1
  102. package/locales/ku.global.min.js +1 -1
  103. package/locales/lb.global.js +1 -1
  104. package/locales/lb.global.min.js +1 -1
  105. package/locales/lt.global.js +1 -1
  106. package/locales/lt.global.min.js +1 -1
  107. package/locales/lv.global.js +1 -1
  108. package/locales/lv.global.min.js +1 -1
  109. package/locales/mk.global.js +1 -1
  110. package/locales/mk.global.min.js +1 -1
  111. package/locales/ms.global.js +1 -1
  112. package/locales/ms.global.min.js +1 -1
  113. package/locales/nb.global.js +1 -1
  114. package/locales/nb.global.min.js +1 -1
  115. package/locales/ne.global.js +1 -1
  116. package/locales/ne.global.min.js +1 -1
  117. package/locales/nl.global.js +1 -1
  118. package/locales/nl.global.min.js +1 -1
  119. package/locales/nn.global.js +1 -1
  120. package/locales/nn.global.min.js +1 -1
  121. package/locales/pl.global.js +1 -1
  122. package/locales/pl.global.min.js +1 -1
  123. package/locales/pt-br.global.js +1 -1
  124. package/locales/pt-br.global.min.js +1 -1
  125. package/locales/pt.global.js +1 -1
  126. package/locales/pt.global.min.js +1 -1
  127. package/locales/ro.global.js +1 -1
  128. package/locales/ro.global.min.js +1 -1
  129. package/locales/ru.global.js +1 -1
  130. package/locales/ru.global.min.js +1 -1
  131. package/locales/si-lk.global.js +1 -1
  132. package/locales/si-lk.global.min.js +1 -1
  133. package/locales/sk.global.js +1 -1
  134. package/locales/sk.global.min.js +1 -1
  135. package/locales/sl.global.js +1 -1
  136. package/locales/sl.global.min.js +1 -1
  137. package/locales/sm.global.js +1 -1
  138. package/locales/sm.global.min.js +1 -1
  139. package/locales/sq.global.js +1 -1
  140. package/locales/sq.global.min.js +1 -1
  141. package/locales/sr-cyrl.global.js +1 -1
  142. package/locales/sr-cyrl.global.min.js +1 -1
  143. package/locales/sr.global.js +1 -1
  144. package/locales/sr.global.min.js +1 -1
  145. package/locales/sv.global.js +1 -1
  146. package/locales/sv.global.min.js +1 -1
  147. package/locales/ta-in.global.js +1 -1
  148. package/locales/ta-in.global.min.js +1 -1
  149. package/locales/th.global.js +1 -1
  150. package/locales/th.global.min.js +1 -1
  151. package/locales/tr.global.js +1 -1
  152. package/locales/tr.global.min.js +1 -1
  153. package/locales/ug.global.js +1 -1
  154. package/locales/ug.global.min.js +1 -1
  155. package/locales/uk.global.js +1 -1
  156. package/locales/uk.global.min.js +1 -1
  157. package/locales/uz-cy.global.js +1 -1
  158. package/locales/uz-cy.global.min.js +1 -1
  159. package/locales/uz.global.js +1 -1
  160. package/locales/uz.global.min.js +1 -1
  161. package/locales/vi.global.js +1 -1
  162. package/locales/vi.global.min.js +1 -1
  163. package/locales/zh-cn.global.js +1 -1
  164. package/locales/zh-cn.global.min.js +1 -1
  165. package/locales/zh-tw.global.js +1 -1
  166. package/locales/zh-tw.global.min.js +1 -1
  167. package/locales-all.global.js +1 -1
  168. package/locales-all.global.min.js +1 -1
  169. package/package.json +1 -1
  170. package/preact.js +1 -1
package/index.global.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- FullCalendar Core v6.1.15
2
+ FullCalendar Core v6.1.18
3
3
  Docs & License: https://fullcalendar.io
4
4
  (c) 2024 Adam Shaw
5
5
  */
@@ -86,7 +86,7 @@ var FullCalendar = (function (exports) {
86
86
  registerStylesRoot(document);
87
87
  }
88
88
 
89
- var css_248z = ":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)}";
89
+ var css_248z = ":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)}";
90
90
  injectStyles(css_248z);
91
91
 
92
92
  function removeElement(el) {
@@ -672,6 +672,25 @@ var FullCalendar = (function (exports) {
672
672
  if (oldProps === newProps) {
673
673
  return true;
674
674
  }
675
+ // if (debug) {
676
+ // for (let key in newProps) {
677
+ // if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) {
678
+ // // equal
679
+ // } else {
680
+ // if (debug) {
681
+ // console.log('prop difference', key, oldProps[key], newProps[key])
682
+ // }
683
+ // }
684
+ // }
685
+ // // check for props that were omitted in the new
686
+ // for (let key in oldProps) {
687
+ // if (!(key in newProps)) {
688
+ // if (debug) {
689
+ // console.log('prop absent', key)
690
+ // }
691
+ // }
692
+ // }
693
+ // }
675
694
  for (let key in newProps) {
676
695
  if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ;
677
696
  else {
@@ -1056,10 +1075,10 @@ var FullCalendar = (function (exports) {
1056
1075
 
1057
1076
  const EXTENDED_SETTINGS_AND_SEVERITIES = {
1058
1077
  week: 3,
1059
- separator: 0,
1060
- omitZeroMinute: 0,
1061
- meridiem: 0,
1062
- omitCommas: 0,
1078
+ separator: 9,
1079
+ omitZeroMinute: 9,
1080
+ meridiem: 9,
1081
+ omitCommas: 9,
1063
1082
  };
1064
1083
  const STANDARD_DATE_PROP_SEVERITIES = {
1065
1084
  timeZoneName: 7,
@@ -1081,22 +1100,25 @@ var FullCalendar = (function (exports) {
1081
1100
  constructor(formatSettings) {
1082
1101
  let standardDateProps = {};
1083
1102
  let extendedSettings = {};
1084
- let severity = 0;
1103
+ let smallestUnitNum = 9; // the smallest unit in the formatter (9 is a sentinel, beyond max)
1085
1104
  for (let name in formatSettings) {
1086
1105
  if (name in EXTENDED_SETTINGS_AND_SEVERITIES) {
1087
1106
  extendedSettings[name] = formatSettings[name];
1088
- severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name], severity);
1107
+ const severity = EXTENDED_SETTINGS_AND_SEVERITIES[name];
1108
+ if (severity < 9) {
1109
+ smallestUnitNum = Math.min(EXTENDED_SETTINGS_AND_SEVERITIES[name], smallestUnitNum);
1110
+ }
1089
1111
  }
1090
1112
  else {
1091
1113
  standardDateProps[name] = formatSettings[name];
1092
1114
  if (name in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity
1093
- severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name], severity);
1115
+ smallestUnitNum = Math.min(STANDARD_DATE_PROP_SEVERITIES[name], smallestUnitNum);
1094
1116
  }
1095
1117
  }
1096
1118
  }
1097
1119
  this.standardDateProps = standardDateProps;
1098
1120
  this.extendedSettings = extendedSettings;
1099
- this.severity = severity;
1121
+ this.smallestUnitNum = smallestUnitNum;
1100
1122
  this.buildFormattingFunc = memoize(buildFormattingFunc);
1101
1123
  }
1102
1124
  format(date, context) {
@@ -1131,8 +1153,8 @@ var FullCalendar = (function (exports) {
1131
1153
  }
1132
1154
  return full0 + separator + full1;
1133
1155
  }
1134
- getLargestUnit() {
1135
- switch (this.severity) {
1156
+ getSmallestUnit() {
1157
+ switch (this.smallestUnitNum) {
1136
1158
  case 7:
1137
1159
  case 6:
1138
1160
  case 5:
@@ -2487,7 +2509,7 @@ var FullCalendar = (function (exports) {
2487
2509
  function getDateMeta(date, todayRange, nowDate, dateProfile) {
2488
2510
  return {
2489
2511
  dow: date.getUTCDay(),
2490
- isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)),
2512
+ isDisabled: Boolean(dateProfile && (!dateProfile.activeRange || !rangeContainsMarker(dateProfile.activeRange, date))),
2491
2513
  isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)),
2492
2514
  isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)),
2493
2515
  isPast: Boolean(nowDate ? (date < nowDate) : todayRange ? (date < todayRange.start) : false),
@@ -3138,9 +3160,10 @@ var FullCalendar = (function (exports) {
3138
3160
  }
3139
3161
 
3140
3162
  const ViewContextType = createContext({}); // for Components
3141
- function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
3163
+ function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, nowManager, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
3142
3164
  return {
3143
3165
  dateEnv,
3166
+ nowManager,
3144
3167
  options: viewOptions,
3145
3168
  pluginHooks,
3146
3169
  emitter,
@@ -3168,13 +3191,14 @@ var FullCalendar = (function (exports) {
3168
3191
 
3169
3192
  /* eslint max-classes-per-file: off */
3170
3193
  class PureComponent extends x$1 {
3194
+ // debug: boolean
3171
3195
  shouldComponentUpdate(nextProps, nextState) {
3172
- if (this.debug) {
3173
- // eslint-disable-next-line no-console
3174
- console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state));
3175
- }
3176
- return !compareObjs(this.props, nextProps, this.propEquality) ||
3177
- !compareObjs(this.state, nextState, this.stateEquality);
3196
+ const shouldUpdate = !compareObjs(this.props, nextProps, this.propEquality /*, this.debug */) ||
3197
+ !compareObjs(this.state, nextState, this.stateEquality /*, this.debug */);
3198
+ // if (this.debug && shouldUpdate) {
3199
+ // console.log('shouldUpdate!')
3200
+ // }
3201
+ return shouldUpdate;
3178
3202
  }
3179
3203
  // HACK for freakin' React StrictMode
3180
3204
  safeSetState(newState) {
@@ -3246,36 +3270,9 @@ var FullCalendar = (function (exports) {
3246
3270
  }
3247
3271
  }
3248
3272
 
3249
- function reduceCurrentDate(currentDate, action) {
3250
- switch (action.type) {
3251
- case 'CHANGE_DATE':
3252
- return action.dateMarker;
3253
- default:
3254
- return currentDate;
3255
- }
3256
- }
3257
- function getInitialDate(options, dateEnv) {
3258
- let initialDateInput = options.initialDate;
3259
- // compute the initial ambig-timezone date
3260
- if (initialDateInput != null) {
3261
- return dateEnv.createMarker(initialDateInput);
3262
- }
3263
- return getNow(options.now, dateEnv); // getNow already returns unzoned
3264
- }
3265
- function getNow(nowInput, dateEnv) {
3266
- if (typeof nowInput === 'function') {
3267
- nowInput = nowInput();
3268
- }
3269
- if (nowInput == null) {
3270
- return dateEnv.createNowMarker();
3271
- }
3272
- return dateEnv.createMarker(nowInput);
3273
- }
3274
-
3275
3273
  class DateProfileGenerator {
3276
3274
  constructor(props) {
3277
3275
  this.props = props;
3278
- this.nowDate = getNow(props.nowInput, props.dateEnv);
3279
3276
  this.initHiddenDays();
3280
3277
  }
3281
3278
  /* Date Range Computation
@@ -3360,7 +3357,7 @@ var FullCalendar = (function (exports) {
3360
3357
  buildValidRange() {
3361
3358
  let input = this.props.validRangeInput;
3362
3359
  let simpleInput = typeof input === 'function'
3363
- ? input.call(this.props.calendarApi, this.nowDate)
3360
+ ? input.call(this.props.calendarApi, this.props.dateEnv.toDate(this.props.nowManager.getDateMarker()))
3364
3361
  : input;
3365
3362
  return this.refineRange(simpleInput) ||
3366
3363
  { start: null, end: null }; // completely open-ended
@@ -5405,7 +5402,13 @@ var FullCalendar = (function (exports) {
5405
5402
  let navLinkAttrs = (!dayMeta.isDisabled && props.colCnt > 1)
5406
5403
  ? buildNavLinkAttrs(this.context, date)
5407
5404
  : {};
5408
- let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta);
5405
+ let publicDate = dateEnv.toDate(date);
5406
+ // workaround for Luxon (and maybe moment) returning prior-days when start-of-day
5407
+ // in DST gap: https://github.com/fullcalendar/fullcalendar/issues/7633
5408
+ if (dateEnv.namedTimeZoneImpl) {
5409
+ publicDate = addMs(publicDate, 3600000); // add an hour
5410
+ }
5411
+ let renderProps = Object.assign(Object.assign(Object.assign({ date: publicDate, view: viewApi }, props.extraRenderProps), { text }), dayMeta);
5409
5412
  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: [
5410
5413
  'fc-col-header-cell-cushion',
5411
5414
  props.isSticky && 'fc-sticky',
@@ -5447,9 +5450,20 @@ var FullCalendar = (function (exports) {
5447
5450
  class NowTimer extends x$1 {
5448
5451
  constructor(props, context) {
5449
5452
  super(props, context);
5450
- this.initialNowDate = getNow(context.options.now, context.dateEnv);
5451
- this.initialNowQueriedMs = new Date().valueOf();
5452
- this.state = this.computeTiming().currentState;
5453
+ this.handleRefresh = () => {
5454
+ let timing = this.computeTiming();
5455
+ if (timing.state.nowDate.valueOf() !== this.state.nowDate.valueOf()) {
5456
+ this.setState(timing.state);
5457
+ }
5458
+ this.clearTimeout();
5459
+ this.setTimeout(timing.waitMs);
5460
+ };
5461
+ this.handleVisibilityChange = () => {
5462
+ if (!document.hidden) {
5463
+ this.handleRefresh();
5464
+ }
5465
+ };
5466
+ this.state = this.computeTiming().state;
5453
5467
  }
5454
5468
  render() {
5455
5469
  let { props, state } = this;
@@ -5457,6 +5471,9 @@ var FullCalendar = (function (exports) {
5457
5471
  }
5458
5472
  componentDidMount() {
5459
5473
  this.setTimeout();
5474
+ this.context.nowManager.addResetListener(this.handleRefresh);
5475
+ // fired tab becomes visible after being hidden
5476
+ document.addEventListener('visibilitychange', this.handleVisibilityChange);
5460
5477
  }
5461
5478
  componentDidUpdate(prevProps) {
5462
5479
  if (prevProps.unit !== this.props.unit) {
@@ -5466,10 +5483,12 @@ var FullCalendar = (function (exports) {
5466
5483
  }
5467
5484
  componentWillUnmount() {
5468
5485
  this.clearTimeout();
5486
+ this.context.nowManager.removeResetListener(this.handleRefresh);
5487
+ document.removeEventListener('visibilitychange', this.handleVisibilityChange);
5469
5488
  }
5470
5489
  computeTiming() {
5471
5490
  let { props, context } = this;
5472
- let unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs);
5491
+ let unroundedNow = context.nowManager.getDateMarker();
5473
5492
  let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit);
5474
5493
  let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit));
5475
5494
  let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf();
@@ -5477,16 +5496,20 @@ var FullCalendar = (function (exports) {
5477
5496
  // ensure no longer than a day
5478
5497
  waitMs = Math.min(1000 * 60 * 60 * 24, waitMs);
5479
5498
  return {
5480
- currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) },
5481
- nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) },
5499
+ state: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) },
5482
5500
  waitMs,
5483
5501
  };
5484
5502
  }
5485
- setTimeout() {
5486
- let { nextState, waitMs } = this.computeTiming();
5503
+ setTimeout(waitMs = this.computeTiming().waitMs) {
5504
+ // NOTE: timeout could take longer than expected if tab sleeps,
5505
+ // which is why we listen to 'visibilitychange'
5487
5506
  this.timeoutId = setTimeout(() => {
5488
- this.setState(nextState, () => {
5489
- this.setTimeout();
5507
+ // NOTE: timeout could also return *earlier* than expected, and we need to wait 2 ms more
5508
+ // This is why use use same waitMs from computeTiming, so we don't skip an interval while
5509
+ // .setState() is executing
5510
+ const timing = this.computeTiming();
5511
+ this.setState(timing.state, () => {
5512
+ this.setTimeout(timing.waitMs);
5490
5513
  });
5491
5514
  }, waitMs);
5492
5515
  }
@@ -6619,8 +6642,11 @@ var FullCalendar = (function (exports) {
6619
6642
  class EventContainer extends BaseComponent {
6620
6643
  constructor() {
6621
6644
  super(...arguments);
6645
+ // memo
6646
+ this.buildPublicEvent = memoize((context, eventDef, eventInstance) => new EventImpl(context, eventDef, eventInstance));
6622
6647
  this.handleEl = (el) => {
6623
6648
  this.el = el;
6649
+ setRef(this.props.elRef, el);
6624
6650
  if (el) {
6625
6651
  setElSeg(el, this.props.seg);
6626
6652
  }
@@ -6633,7 +6659,7 @@ var FullCalendar = (function (exports) {
6633
6659
  const { eventRange } = seg;
6634
6660
  const { ui } = eventRange;
6635
6661
  const renderProps = {
6636
- event: new EventImpl(context, eventRange.def, eventRange.instance),
6662
+ event: this.buildPublicEvent(context, eventRange.def, eventRange.instance),
6637
6663
  view: context.viewApi,
6638
6664
  timeText: props.timeText,
6639
6665
  textColor: ui.textColor,
@@ -6652,11 +6678,11 @@ var FullCalendar = (function (exports) {
6652
6678
  isDragging: Boolean(props.isDragging),
6653
6679
  isResizing: Boolean(props.isResizing),
6654
6680
  };
6655
- return (y(ContentContainer, Object.assign({}, props /* contains children */, { elRef: this.handleEl, elClasses: [
6681
+ return (y(ContentContainer, { elRef: this.handleEl, elTag: props.elTag, elAttrs: props.elAttrs, elClasses: [
6656
6682
  ...getEventClassNames(renderProps),
6657
6683
  ...seg.eventRange.ui.classNames,
6658
6684
  ...(props.elClasses || []),
6659
- ], renderProps: renderProps, generatorName: "eventContent", customGenerator: options.eventContent, defaultGenerator: props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount })));
6685
+ ], elStyle: props.elStyle, renderProps: renderProps, generatorName: "eventContent", customGenerator: options.eventContent, defaultGenerator: props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount }, props.children));
6660
6686
  }
6661
6687
  componentDidUpdate(prevProps) {
6662
6688
  if (this.el && this.props.seg !== prevProps.seg) {
@@ -6683,6 +6709,9 @@ var FullCalendar = (function (exports) {
6683
6709
  Boolean(eventContentArg.isEndResizable) && (y("div", { className: "fc-event-resizer fc-event-resizer-end" }))))));
6684
6710
  }
6685
6711
  }
6712
+ StandardEvent.addPropsEquality({
6713
+ seg: isPropsEqual,
6714
+ });
6686
6715
  function renderInnerContent$1(innerProps) {
6687
6716
  return (y("div", { className: "fc-event-main-frame" },
6688
6717
  innerProps.timeText && (y("div", { className: "fc-event-time" }, innerProps.timeText)),
@@ -6697,7 +6726,7 @@ var FullCalendar = (function (exports) {
6697
6726
  date: context.dateEnv.toDate(props.date),
6698
6727
  view: context.viewApi,
6699
6728
  };
6700
- 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 })));
6729
+ 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));
6701
6730
  }));
6702
6731
 
6703
6732
  const DAY_NUM_FORMAT = createFormatter({ day: 'numeric' });
@@ -6720,12 +6749,12 @@ var FullCalendar = (function (exports) {
6720
6749
  dateEnv: context.dateEnv,
6721
6750
  monthStartFormat: options.monthStartFormat,
6722
6751
  });
6723
- return (y(ContentContainer, Object.assign({}, props /* includes children */, { elClasses: [
6752
+ return (y(ContentContainer, { elRef: props.elRef, elTag: props.elTag, elAttrs: Object.assign(Object.assign({}, props.elAttrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), elClasses: [
6724
6753
  ...getDayClassNames(renderProps, context.theme),
6725
6754
  ...(props.elClasses || []),
6726
- ], 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:
6755
+ ], elStyle: props.elStyle, renderProps: renderProps, generatorName: "dayCellContent", customGenerator: options.dayCellContent, defaultGenerator: props.defaultGenerator, classNameGenerator:
6727
6756
  // don't use custom classNames if disabled
6728
- renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount })));
6757
+ renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount }, props.children));
6729
6758
  }
6730
6759
  }
6731
6760
  function hasCustomDayCellContent(options) {
@@ -6762,7 +6791,7 @@ var FullCalendar = (function (exports) {
6762
6791
  let text = dateEnv.format(date, format);
6763
6792
  let renderProps = { num, text, date };
6764
6793
  return (y(ContentContainer // why isn't WeekNumberContentArg being auto-detected?
6765
- , Object.assign({}, props /* includes children */, { renderProps: renderProps, generatorName: "weekNumberContent", customGenerator: options.weekNumberContent, defaultGenerator: renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount })));
6794
+ , { 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));
6766
6795
  }));
6767
6796
  function renderInner(innerProps) {
6768
6797
  return innerProps.text;
@@ -7018,10 +7047,10 @@ var FullCalendar = (function (exports) {
7018
7047
  let { props, context } = this;
7019
7048
  let { options } = context;
7020
7049
  let renderProps = { view: context.viewApi };
7021
- return (y(ContentContainer, Object.assign({}, props, { elTag: props.elTag || 'div', elClasses: [
7050
+ return (y(ContentContainer, { elRef: props.elRef, elTag: props.elTag || 'div', elAttrs: props.elAttrs, elClasses: [
7022
7051
  ...buildViewClassNames(props.viewSpec),
7023
7052
  ...(props.elClasses || []),
7024
- ], renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children));
7053
+ ], elStyle: props.elStyle, renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }, () => props.children));
7025
7054
  }
7026
7055
  }
7027
7056
  function buildViewClassNames(viewSpec) {
@@ -7247,7 +7276,7 @@ var FullCalendar = (function (exports) {
7247
7276
  this.unselect();
7248
7277
  this.dispatch({
7249
7278
  type: 'CHANGE_DATE',
7250
- dateMarker: getNow(state.calendarOptions.now, state.dateEnv),
7279
+ dateMarker: state.nowManager.getDateMarker(),
7251
7280
  });
7252
7281
  }
7253
7282
  gotoDate(zonedDateInput) {
@@ -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
  exports.Calendar = Calendar;
9841
9940
  exports.Internal = internal;