@fullcalendar/core 7.0.0-beta.3 → 7.0.0-beta.4

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 (184) hide show
  1. package/index.cjs +54 -45
  2. package/index.global.js +205 -151
  3. package/index.global.min.js +2 -2
  4. package/index.js +56 -47
  5. package/internal-common.cjs +5151 -5106
  6. package/internal-common.d.ts +128 -85
  7. package/internal-common.js +5150 -5106
  8. package/internal.cjs +2 -1
  9. package/internal.d.ts +1 -1
  10. package/internal.js +1 -1
  11. package/locales/af.global.js +1 -1
  12. package/locales/af.global.min.js +1 -1
  13. package/locales/ar-dz.global.js +1 -1
  14. package/locales/ar-dz.global.min.js +1 -1
  15. package/locales/ar-kw.global.js +1 -1
  16. package/locales/ar-kw.global.min.js +1 -1
  17. package/locales/ar-ly.global.js +1 -1
  18. package/locales/ar-ly.global.min.js +1 -1
  19. package/locales/ar-ma.global.js +1 -1
  20. package/locales/ar-ma.global.min.js +1 -1
  21. package/locales/ar-sa.global.js +1 -1
  22. package/locales/ar-sa.global.min.js +1 -1
  23. package/locales/ar-tn.global.js +1 -1
  24. package/locales/ar-tn.global.min.js +1 -1
  25. package/locales/ar.global.js +1 -1
  26. package/locales/ar.global.min.js +1 -1
  27. package/locales/az.global.js +1 -1
  28. package/locales/az.global.min.js +1 -1
  29. package/locales/bg.global.js +1 -1
  30. package/locales/bg.global.min.js +1 -1
  31. package/locales/bn.global.js +1 -1
  32. package/locales/bn.global.min.js +1 -1
  33. package/locales/bs.global.js +1 -1
  34. package/locales/bs.global.min.js +1 -1
  35. package/locales/ca.global.js +1 -1
  36. package/locales/ca.global.min.js +1 -1
  37. package/locales/cs.global.js +1 -1
  38. package/locales/cs.global.min.js +1 -1
  39. package/locales/cy.global.js +1 -1
  40. package/locales/cy.global.min.js +1 -1
  41. package/locales/da.global.js +1 -1
  42. package/locales/da.global.min.js +1 -1
  43. package/locales/de-at.cjs +1 -2
  44. package/locales/de-at.global.js +2 -3
  45. package/locales/de-at.global.min.js +2 -2
  46. package/locales/de-at.js +1 -2
  47. package/locales/de.cjs +1 -2
  48. package/locales/de.global.js +2 -3
  49. package/locales/de.global.min.js +2 -2
  50. package/locales/de.js +1 -2
  51. package/locales/el.global.js +1 -1
  52. package/locales/el.global.min.js +1 -1
  53. package/locales/en-au.global.js +1 -1
  54. package/locales/en-au.global.min.js +1 -1
  55. package/locales/en-gb.global.js +1 -1
  56. package/locales/en-gb.global.min.js +1 -1
  57. package/locales/en-nz.global.js +1 -1
  58. package/locales/en-nz.global.min.js +1 -1
  59. package/locales/eo.global.js +1 -1
  60. package/locales/eo.global.min.js +1 -1
  61. package/locales/es-us.global.js +1 -1
  62. package/locales/es-us.global.min.js +1 -1
  63. package/locales/es.cjs +1 -2
  64. package/locales/es.global.js +2 -3
  65. package/locales/es.global.min.js +2 -2
  66. package/locales/es.js +1 -2
  67. package/locales/et.global.js +1 -1
  68. package/locales/et.global.min.js +1 -1
  69. package/locales/eu.global.js +1 -1
  70. package/locales/eu.global.min.js +1 -1
  71. package/locales/fa.global.js +1 -1
  72. package/locales/fa.global.min.js +1 -1
  73. package/locales/fi.global.js +1 -1
  74. package/locales/fi.global.min.js +1 -1
  75. package/locales/fr-ca.global.js +1 -1
  76. package/locales/fr-ca.global.min.js +1 -1
  77. package/locales/fr-ch.global.js +1 -1
  78. package/locales/fr-ch.global.min.js +1 -1
  79. package/locales/fr.global.js +1 -1
  80. package/locales/fr.global.min.js +1 -1
  81. package/locales/gl.cjs +1 -2
  82. package/locales/gl.global.js +2 -3
  83. package/locales/gl.global.min.js +2 -2
  84. package/locales/gl.js +1 -2
  85. package/locales/he.global.js +1 -1
  86. package/locales/he.global.min.js +1 -1
  87. package/locales/hi.global.js +1 -1
  88. package/locales/hi.global.min.js +1 -1
  89. package/locales/hr.global.js +1 -1
  90. package/locales/hr.global.min.js +1 -1
  91. package/locales/hu.global.js +1 -1
  92. package/locales/hu.global.min.js +1 -1
  93. package/locales/hy-am.global.js +1 -1
  94. package/locales/hy-am.global.min.js +1 -1
  95. package/locales/id.global.js +1 -1
  96. package/locales/id.global.min.js +1 -1
  97. package/locales/is.global.js +1 -1
  98. package/locales/is.global.min.js +1 -1
  99. package/locales/it.global.js +1 -1
  100. package/locales/it.global.min.js +1 -1
  101. package/locales/ja.global.js +1 -1
  102. package/locales/ja.global.min.js +1 -1
  103. package/locales/ka.global.js +1 -1
  104. package/locales/ka.global.min.js +1 -1
  105. package/locales/kk.global.js +1 -1
  106. package/locales/kk.global.min.js +1 -1
  107. package/locales/km.global.js +1 -1
  108. package/locales/km.global.min.js +1 -1
  109. package/locales/ko.global.js +1 -1
  110. package/locales/ko.global.min.js +1 -1
  111. package/locales/ku.global.js +1 -1
  112. package/locales/ku.global.min.js +1 -1
  113. package/locales/lb.global.js +1 -1
  114. package/locales/lb.global.min.js +1 -1
  115. package/locales/lt.global.js +1 -1
  116. package/locales/lt.global.min.js +1 -1
  117. package/locales/lv.global.js +1 -1
  118. package/locales/lv.global.min.js +1 -1
  119. package/locales/mk.global.js +1 -1
  120. package/locales/mk.global.min.js +1 -1
  121. package/locales/ms.global.js +1 -1
  122. package/locales/ms.global.min.js +1 -1
  123. package/locales/nb.global.js +1 -1
  124. package/locales/nb.global.min.js +1 -1
  125. package/locales/ne.global.js +1 -1
  126. package/locales/ne.global.min.js +1 -1
  127. package/locales/nl.global.js +1 -1
  128. package/locales/nl.global.min.js +1 -1
  129. package/locales/nn.global.js +1 -1
  130. package/locales/nn.global.min.js +1 -1
  131. package/locales/pl.global.js +1 -1
  132. package/locales/pl.global.min.js +1 -1
  133. package/locales/pt-br.cjs +1 -2
  134. package/locales/pt-br.global.js +2 -3
  135. package/locales/pt-br.global.min.js +2 -2
  136. package/locales/pt-br.js +1 -2
  137. package/locales/pt.global.js +1 -1
  138. package/locales/pt.global.min.js +1 -1
  139. package/locales/ro.global.js +1 -1
  140. package/locales/ro.global.min.js +1 -1
  141. package/locales/ru.global.js +1 -1
  142. package/locales/ru.global.min.js +1 -1
  143. package/locales/si-lk.global.js +1 -1
  144. package/locales/si-lk.global.min.js +1 -1
  145. package/locales/sk.global.js +1 -1
  146. package/locales/sk.global.min.js +1 -1
  147. package/locales/sl.global.js +1 -1
  148. package/locales/sl.global.min.js +1 -1
  149. package/locales/sm.global.js +1 -1
  150. package/locales/sm.global.min.js +1 -1
  151. package/locales/sq.global.js +1 -1
  152. package/locales/sq.global.min.js +1 -1
  153. package/locales/sr-cyrl.global.js +1 -1
  154. package/locales/sr-cyrl.global.min.js +1 -1
  155. package/locales/sr.global.js +1 -1
  156. package/locales/sr.global.min.js +1 -1
  157. package/locales/sv.cjs +1 -2
  158. package/locales/sv.global.js +2 -3
  159. package/locales/sv.global.min.js +2 -2
  160. package/locales/sv.js +1 -2
  161. package/locales/ta-in.global.js +1 -1
  162. package/locales/ta-in.global.min.js +1 -1
  163. package/locales/th.global.js +1 -1
  164. package/locales/th.global.min.js +1 -1
  165. package/locales/tr.global.js +1 -1
  166. package/locales/tr.global.min.js +1 -1
  167. package/locales/ug.global.js +1 -1
  168. package/locales/ug.global.min.js +1 -1
  169. package/locales/uk.global.js +1 -1
  170. package/locales/uk.global.min.js +1 -1
  171. package/locales/uz-cy.global.js +1 -1
  172. package/locales/uz-cy.global.min.js +1 -1
  173. package/locales/uz.global.js +1 -1
  174. package/locales/uz.global.min.js +1 -1
  175. package/locales/vi.global.js +1 -1
  176. package/locales/vi.global.min.js +1 -1
  177. package/locales/zh-cn.global.js +1 -1
  178. package/locales/zh-cn.global.min.js +1 -1
  179. package/locales/zh-tw.global.js +1 -1
  180. package/locales/zh-tw.global.min.js +1 -1
  181. package/locales-all.global.js +7 -13
  182. package/locales-all.global.min.js +2 -2
  183. package/package.json +1 -1
  184. package/preact.js +1 -1
package/index.global.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- FullCalendar Core v7.0.0-beta.3
2
+ FullCalendar Core v7.0.0-beta.4
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{display:flex;flex-direction:column;gap:1.5em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-border,.fc-border-b,.fc-border-e,.fc-border-s,.fc-border-t{border:0 solid var(--fc-border-color)}.fc-border-transparent{border-color:transparent}.fc-border{border-width:1px}.fc-border-t{border-top-width:1px}.fc-border-b{border-bottom-width:1px}.fc-direction-ltr .fc-border-s,.fc-direction-rtl .fc-border-e{border-left-width:1px}.fc-direction-ltr .fc-border-e,.fc-direction-rtl .fc-border-s{border-right-width:1px}.fc-flex-row{display:flex;flex-direction:row}.fc-flex-col{display:flex;flex-direction:column}.fc-grow{flex-grow:1}.fc-basis0,.fc-liquid{flex-basis:0}.fc-liquid{flex-grow:1;min-height:0;min-width:0}.fc-media-screen .fc-print-header,.fc-media-screen .fc-print-root{display:flex;flex-direction:column}.fc-cell{margin:0!important;padding:0!important}.fc-cell-inner{flex-shrink:0;overflow:hidden;white-space:nowrap}.fc-celldivider,.fc-rowdivider{border:0 solid var(--fc-border-color)}.fc-rowdivider{border-width:1px 0}.fc-celldivider{border-width:0 1px}.fc-celldivider,.fc-rowdivider{background:var(--fc-neutral-bg-color)}.fc-celldivider{padding-left:2px}.fc-rowdivider{padding-bottom:2px}.fc-crop{overflow:hidden}.fc-rel{position:relative}.fc-abs{position:absolute}.fc-fill{bottom:0;top:0}.fc-fill,.fc-fill-x{left:0;position:absolute;right:0}.fc-fill-y{bottom:0;position:absolute;top:0}.fc-sticky-t{position:sticky;top:0}.fc-sticky-s{left:0;position:sticky;right:0}.fc-table-header-sticky{background:var(--fc-page-bg-color);position:sticky;top:0;z-index:5}.fc-sticky-footer-scrollbar{bottom:0;position:sticky;z-index:5}.fc-sticky-footer-scrollbar>.fc-scroller{margin-top:-1px}.fc-sticky-footer-scrollbar>.fc-scroller>*{height:1px}.fc-content-box{box-sizing:content-box}.fc-offscreen{left:-10000px;position:absolute}.fc-shaded{background-color:var(--fc-neutral-bg-color)}.fc-filler{opacity:.5}.fc-padding-sm{padding:2px 4px}.fc-padding-md{padding:4px 5px}.fc-padding-lg{padding:8px}.fc-justify-center{justify-content:center}.fc-align-center{align-items:center}.fc-align-start{align-items:flex-start}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-view-outer{position:relative}.fc-view-outer-liquid,.fc-view-outer-static{display:flex;flex-direction:column}.fc-view-outer-liquid,.fc-view-outer-liquid>.fc-view,.fc-view-outer-static>.fc-view{flex-basis:0;flex-grow:1;min-height:0;min-width:0}.fc-view-outer-aspect-ratio>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.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-selected:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.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-event-inner{position:relative;z-index:2}.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-bg-event,.fc-highlight,.fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc-non-business{background:var(--fc-non-business-color)}.fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc-highlight{background:var(--fc-highlight-color)}.fc-day-disabled{background:var(--fc-neutral-bg-color)}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:flex;flex-direction:column;position:relative}.fc-h-event.fc-event-mirror{z-index:3}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-h-event .fc-event-inner{color:var(--fc-event-text-color);display:flex;flex-direction:row}.fc-h-event .fc-event-time,.fc-h-event .fc-event-title{overflow:hidden;white-space:nowrap}.fc-h-event .fc-event-title-outer{display:flex;flex-basis:0;flex-direction:row;flex-grow:1;min-height:0;min-width:0}.fc-h-event .fc-event-title{left:0;position:sticky;right: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-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:6}.fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc-popover-title{margin:0 2px}.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)}.fc-scroller{padding:0!important}.fc-scroller-no-bars{-ms-overflow-style:none;scrollbar-width:none}.fc-scroller-no-bars::-webkit-scrollbar{display:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}@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-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc-button{-webkit-appearance:button}.fc-button:not(:disabled){cursor:pointer}.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-button:hover{text-decoration:none}.fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc-button:disabled{opacity:.65}.fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.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-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:not(:disabled).fc-button-active,.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-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.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-toolbar{align-items:center;display:flex;flex-direction:row;gap:.75em;justify-content:space-between}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc-toolbar-section{display:flex;flex-direction:row;flex-shrink:0;gap:.75em}.fc-toolbar-title{font-size:1.75em;margin:0;white-space:nowrap}";
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{display:flex;flex-direction:column;gap:1.5em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-border,.fc-border-b,.fc-border-e,.fc-border-s,.fc-border-t{border:0 solid var(--fc-border-color)}.fc-border-transparent{border-color:transparent}.fc-border{border-width:1px}.fc-border-t{border-top-width:1px}.fc-border-b{border-bottom-width:1px}.fc-direction-ltr .fc-border-s,.fc-direction-rtl .fc-border-e{border-left-width:1px}.fc-direction-ltr .fc-border-e,.fc-direction-rtl .fc-border-s{border-right-width:1px}.fc-flex-row{display:flex;flex-direction:row}.fc-flex-col{display:flex;flex-direction:column}.fc-grow{flex-grow:1}.fc-basis0,.fc-liquid{flex-basis:0}.fc-liquid{flex-grow:1;min-height:0;min-width:0}.fc-media-screen .fc-print-header,.fc-media-screen .fc-print-root{display:flex;flex-direction:column}.fc-cell{margin:0!important;padding:0!important}.fc-cell-inner{flex-shrink:0;overflow:hidden;white-space:nowrap}.fc-celldivider,.fc-rowdivider{border:0 solid var(--fc-border-color)}.fc-rowdivider{border-width:1px 0}.fc-celldivider{border-width:0 1px}.fc-celldivider,.fc-rowdivider{background:var(--fc-neutral-bg-color)}.fc-celldivider{padding-left:2px}.fc-rowdivider{padding-bottom:2px}.fc-crop{overflow:hidden}.fc-rel{position:relative}.fc-abs{position:absolute}.fc-fill{bottom:0;top:0}.fc-fill,.fc-fill-x{left:0;position:absolute;right:0}.fc-fill-y{bottom:0;position:absolute;top:0}.fc-sticky-t{position:sticky;top:0}.fc-sticky-s{left:0;position:sticky;right:0}.fc-table-header-sticky{background:var(--fc-page-bg-color);position:sticky;top:0;z-index:5}.fc-sticky-footer-scrollbar{bottom:0;position:sticky;z-index:5}.fc-sticky-footer-scrollbar>.fc-scroller{margin-top:-1px}.fc-sticky-footer-scrollbar>.fc-scroller>*{height:1px}.fc-content-box{box-sizing:content-box}.fc-offscreen{left:-10000px;position:absolute}.fc-shaded{background-color:var(--fc-neutral-bg-color)}.fc-filler{opacity:.5}.fc-padding-sm{padding:2px 4px}.fc-padding-md{padding:4px 5px}.fc-padding-lg{padding:8px}.fc-justify-center{justify-content:center}.fc-align-center{align-items:center}.fc-align-start{align-items:flex-start}.fc [data-navlink]{cursor:pointer}.fc [data-navlink]:hover{text-decoration:underline}.fc-view-outer{position:relative}.fc-view-outer-liquid,.fc-view-outer-static{display:flex;flex-direction:column}.fc-view-outer-liquid,.fc-view-outer-liquid>.fc-view,.fc-view-outer-static>.fc-view{flex-basis:0;flex-grow:1;min-height:0;min-width:0}.fc-view-outer-aspect-ratio>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.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-selected:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.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-event-inner{position:relative;z-index:2}.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-bg-event,.fc-highlight,.fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc-non-business{background:var(--fc-non-business-color)}.fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc-highlight{background:var(--fc-highlight-color)}.fc-day-disabled{background:var(--fc-neutral-bg-color)}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:flex;flex-direction:column;position:relative}.fc-h-event.fc-event-mirror{z-index:3}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-h-event .fc-event-inner{color:var(--fc-event-text-color);display:flex;flex-direction:row}.fc-h-event .fc-event-time,.fc-h-event .fc-event-title{overflow:hidden;white-space:nowrap}.fc-h-event .fc-event-title-outer{display:flex;flex-basis:0;flex-direction:row;flex-grow:1;min-height:0;min-width:0}.fc-h-event .fc-event-title{left:0;position:sticky;right: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-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:6}.fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc-popover-title{margin:0 2px}.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)}.fc-scroller{padding:0!important}.fc-scroller-no-bars{-ms-overflow-style:none;scrollbar-width:none}.fc-scroller-no-bars::-webkit-scrollbar{display:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}@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-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc-button{-webkit-appearance:button}.fc-button:not(:disabled){cursor:pointer}.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-button:hover{text-decoration:none}.fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc-button:disabled{opacity:.65}.fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.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-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:not(:disabled).fc-button-active,.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-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.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-toolbar{align-items:center;justify-content:space-between}.fc-toolbar,.fc-toolbar-section{display:flex;flex-direction:row;gap:.75em}.fc-toolbar-section{flex-shrink:0}.fc-toolbar-title{font-size:1.75em;font-weight:700;white-space:nowrap}";
90
90
  injectStyles(css_248z);
91
91
 
92
92
  // Stops a mouse/touch event from doing it's native browser action
@@ -1417,6 +1417,7 @@ var FullCalendar = (function (exports) {
1417
1417
  allDayContent: identity,
1418
1418
  allDayDidMount: identity,
1419
1419
  allDayWillUnmount: identity,
1420
+ timedText: String,
1420
1421
  slotMinWidth: Number,
1421
1422
  navLinks: Boolean,
1422
1423
  eventTimeFormat: createFormatter,
@@ -1447,10 +1448,11 @@ var FullCalendar = (function (exports) {
1447
1448
  // only used by list-view, but languages define the value, so we need it in base options
1448
1449
  noEventsText: String,
1449
1450
  viewHint: identity,
1451
+ viewChangeHint: String,
1450
1452
  navLinkHint: identity,
1451
1453
  closeHint: String,
1452
- timeHint: String,
1453
- eventHint: String,
1454
+ eventsHint: String,
1455
+ headingLevel: Number,
1454
1456
  moreLinkClick: identity,
1455
1457
  moreLinkClassNames: identity,
1456
1458
  moreLinkContent: identity,
@@ -1515,6 +1517,7 @@ var FullCalendar = (function (exports) {
1515
1517
  eventMinWidth: 30,
1516
1518
  eventShortHeight: 30,
1517
1519
  monthStartFormat: { month: 'long', day: 'numeric' },
1520
+ headingLevel: 2, // like H2
1518
1521
  };
1519
1522
  // calendar listeners
1520
1523
  // ------------------
@@ -2392,14 +2395,14 @@ var FullCalendar = (function (exports) {
2392
2395
  };
2393
2396
  }
2394
2397
  function getDayClassName(meta) {
2395
- return joinClassNames('fc-day', `fc-day-${DAY_IDS[meta.dow]}`, meta.isDisabled
2398
+ return joinClassNames('fc-day', meta.isDisabled
2396
2399
  ? 'fc-day-disabled'
2397
- : joinClassNames(meta.isToday && 'fc-day-today', meta.isPast && 'fc-day-past', meta.isFuture && 'fc-day-future', meta.isOther && 'fc-day-other'));
2400
+ : joinClassNames(`fc-day-${DAY_IDS[meta.dow]}`, meta.isToday && 'fc-day-today', meta.isPast && 'fc-day-past', meta.isFuture && 'fc-day-future', meta.isOther && 'fc-day-other'));
2398
2401
  }
2399
2402
  function getSlotClassName(meta) {
2400
- return joinClassNames('fc-slot', `fc-slot-${DAY_IDS[meta.dow]}`, meta.isDisabled
2403
+ return joinClassNames('fc-slot', meta.isDisabled
2401
2404
  ? 'fc-slot-disabled'
2402
- : joinClassNames(meta.isToday && 'fc-slot-today', meta.isPast && 'fc-slot-past', meta.isFuture && 'fc-slot-future'));
2405
+ : joinClassNames(`fc-slot-${DAY_IDS[meta.dow]}`, meta.isToday && 'fc-slot-today', meta.isPast && 'fc-slot-past', meta.isFuture && 'fc-slot-future'));
2403
2406
  }
2404
2407
 
2405
2408
  function isDimsEqual(v0, v1) {
@@ -2777,29 +2780,32 @@ var FullCalendar = (function (exports) {
2777
2780
 
2778
2781
  const DAY_FORMAT = createFormatter({ year: 'numeric', month: 'long', day: 'numeric' });
2779
2782
  const WEEK_FORMAT = createFormatter({ week: 'long' });
2780
- function buildNavLinkAttrs(context, dateMarker, viewType = 'day', isTabbable = true) {
2783
+ function buildDateStr(context, dateMarker, viewType = 'day') {
2784
+ return context.dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT);
2785
+ }
2786
+ /*
2787
+ Assumes navLinks enabled
2788
+ Always hidden to screen readers. Do not point aria-labelledby at this. Use aria-label instead.
2789
+ */
2790
+ function buildNavLinkAttrs(context, dateMarker, viewType = 'day', dateStr = buildDateStr(context, dateMarker, viewType), isTabbable = true) {
2781
2791
  const { dateEnv, options, calendarApi } = context;
2782
- let dateStr = dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT);
2783
- if (options.navLinks) {
2784
- let zonedDate = dateEnv.toDate(dateMarker);
2785
- const handleInteraction = (ev) => {
2786
- let customAction = viewType === 'day' ? options.navLinkDayClick :
2787
- viewType === 'week' ? options.navLinkWeekClick : null;
2788
- if (typeof customAction === 'function') {
2789
- customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev);
2790
- }
2791
- else {
2792
- if (typeof customAction === 'string') {
2793
- viewType = customAction;
2794
- }
2795
- calendarApi.zoomTo(dateMarker, viewType);
2792
+ const zonedDate = dateEnv.toDate(dateMarker);
2793
+ const handleInteraction = (ev) => {
2794
+ let customAction = viewType === 'day' ? options.navLinkDayClick :
2795
+ viewType === 'week' ? options.navLinkWeekClick : null;
2796
+ if (typeof customAction === 'function') {
2797
+ customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev);
2798
+ }
2799
+ else {
2800
+ if (typeof customAction === 'string') {
2801
+ viewType = customAction;
2796
2802
  }
2797
- };
2798
- return Object.assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, (isTabbable
2799
- ? createAriaClickAttrs(handleInteraction)
2800
- : { onClick: handleInteraction }));
2801
- }
2802
- return { 'aria-label': dateStr };
2803
+ calendarApi.zoomTo(dateMarker, viewType);
2804
+ }
2805
+ };
2806
+ return Object.assign({ 'role': 'link', 'aria-label': formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, (isTabbable
2807
+ ? createAriaClickAttrs(handleInteraction)
2808
+ : { onClick: handleInteraction }));
2803
2809
  }
2804
2810
 
2805
2811
  let _isRtlScrollbarOnLeft = null;
@@ -3346,7 +3352,7 @@ var FullCalendar = (function (exports) {
3346
3352
  isValidDateDownEl(el) {
3347
3353
  return !el.closest('.fc-event:not(.fc-bg-event)') &&
3348
3354
  !el.closest('.fc-more-link') && // a "more.." link
3349
- !el.closest('a[data-navlink]') && // a clickable nav link
3355
+ !el.closest('[data-navlink]') && // a clickable nav link
3350
3356
  !el.closest('.fc-popover'); // hack
3351
3357
  }
3352
3358
  }
@@ -4427,11 +4433,11 @@ var FullCalendar = (function (exports) {
4427
4433
  : `${eventRange.def.defId}:${eventRange.range.start.toISOString()}`;
4428
4434
  // inverse-background events don't have specific instances. TODO: better solution
4429
4435
  }
4430
- function getEventRangeAnchorAttrs(eventRange, context) {
4436
+ function getEventTagAndAttrs(eventRange, context) {
4431
4437
  let { def, instance } = eventRange;
4432
4438
  let { url } = def;
4433
4439
  if (url) {
4434
- return { href: url };
4440
+ return ['a', { href: url }];
4435
4441
  }
4436
4442
  let { emitter, options } = context;
4437
4443
  let { eventInteractive } = options;
@@ -4441,10 +4447,11 @@ var FullCalendar = (function (exports) {
4441
4447
  eventInteractive = Boolean(emitter.hasHandlers('eventClick'));
4442
4448
  }
4443
4449
  }
4450
+ let attrs;
4444
4451
  // mock what happens in EventClicking
4445
4452
  if (eventInteractive) {
4446
4453
  // only attach keyboard-related handlers because click handler is already done in EventClicking
4447
- return createAriaKeyboardAttrs((ev) => {
4454
+ attrs = createAriaKeyboardAttrs((ev) => {
4448
4455
  emitter.trigger('eventClick', {
4449
4456
  el: ev.target,
4450
4457
  event: new EventImpl(context, def, instance),
@@ -4452,7 +4459,9 @@ var FullCalendar = (function (exports) {
4452
4459
  view: context.viewApi,
4453
4460
  });
4454
4461
  });
4462
+ attrs = Object.assign({ role: 'button' }, attrs);
4455
4463
  }
4464
+ return ['div', attrs];
4456
4465
  }
4457
4466
 
4458
4467
  const STANDARD_PROPS = {
@@ -5522,12 +5531,11 @@ var FullCalendar = (function (exports) {
5522
5531
  }
5523
5532
  }
5524
5533
 
5525
- const WHEEL_EVENT_NAMES = 'wheel mousewheel DomMouseScroll MozMousePixelScroll'.split(' ');
5526
5534
  /*
5527
5535
  Fires:
5528
- - scrollStart (always user)
5529
- - scroll
5530
- - scrollEnd (always user)
5536
+ - scrollStart: (isUser) => void
5537
+ - scroll: (isUser) => void
5538
+ - scrollEnd: (isUser) => void
5531
5539
 
5532
5540
  NOTE: detection is complicated (w/ touch and wheel) because ScrollerSyncer needs to know about it,
5533
5541
  but are we sure we can't just ignore programmatic scrollTo() calls with a flag? and determine the
@@ -5537,81 +5545,107 @@ var FullCalendar = (function (exports) {
5537
5545
  constructor(el) {
5538
5546
  this.el = el;
5539
5547
  this.emitter = new Emitter();
5540
- this.isScrolling = false;
5541
- this.isTouching = false; // user currently has finger down?
5542
- this.isRecentlyWheeled = false;
5543
- this.isRecentlyScrolled = false;
5544
- this.wheelWaiter = new DelayedRunner(this._handleWheelWaited.bind(this));
5545
- this.scrollWaiter = new DelayedRunner(this._handleScrollWaited.bind(this));
5548
+ this.isScroll = false;
5549
+ this.isScrollRecent = false;
5550
+ this.isWheelRecent = false;
5551
+ this.isMouseDown = false; // user currently has mouse down?
5552
+ this.isTouchDown = false; // user currently has finger down?
5553
+ // accumulated during scroll
5554
+ this.isMouse = false;
5555
+ this.isTouch = false;
5556
+ this.isWheel = false;
5546
5557
  // Handlers
5547
5558
  // ----------------------------------------------------------------------------------------------
5548
5559
  this.handleScroll = () => {
5549
5560
  this.startScroll();
5550
- this.emitter.trigger('scroll', this.isRecentlyWheeled, this.isTouching);
5551
- this.isRecentlyScrolled = true;
5561
+ this.emitter.trigger('scroll', this.getIsUser());
5562
+ this.isScrollRecent = true;
5563
+ if (this.isMouseDown) {
5564
+ this.isMouse = true;
5565
+ }
5566
+ if (this.isTouchDown) {
5567
+ this.isTouch = true;
5568
+ }
5569
+ if (this.isWheelRecent) {
5570
+ this.isWheel = true;
5571
+ }
5552
5572
  this.scrollWaiter.request(500);
5553
5573
  };
5554
- // will fire *before* the scroll event is fired (might not cause a scroll)
5574
+ this.handleScrollWait = () => {
5575
+ this.isScrollRecent = false;
5576
+ // only end the scroll if not currently touching.
5577
+ // if touching, the scrolling will end later, on touchend.
5578
+ if (!this.isTouchDown) {
5579
+ this.endScroll();
5580
+ }
5581
+ };
5582
+ // will fire *before* the scroll event is fired (might not cause a scroll!)
5555
5583
  this.handleWheel = () => {
5556
- this.isRecentlyWheeled = true;
5584
+ this.isWheelRecent = true;
5557
5585
  this.wheelWaiter.request(500);
5558
5586
  };
5559
- // will fire *before* the scroll event is fired (might not cause a scroll)
5587
+ this.handleWheelWait = () => {
5588
+ this.isWheelRecent = false;
5589
+ };
5590
+ this.handleMouseDown = () => {
5591
+ this.isMouseDown = true;
5592
+ };
5593
+ this.handleMouseUp = () => {
5594
+ this.isMouseDown = false;
5595
+ };
5596
+ // will fire *before* the scroll event is fired (might not cause a scroll!)
5560
5597
  this.handleTouchStart = () => {
5561
- this.isTouching = true;
5598
+ this.isTouchDown = true;
5562
5599
  };
5563
5600
  this.handleTouchEnd = () => {
5564
- this.isTouching = false;
5601
+ this.isTouchDown = false;
5565
5602
  // if the user ended their touch, and the scroll area wasn't moving,
5566
- // we consider this to be the end of the scroll.
5567
- if (!this.isRecentlyScrolled) {
5568
- this.endScroll(); // won't fire if already ended
5603
+ // we consider this to be the end of the scroll
5604
+ // otherwise, wait for inertia to finish and handleScrollWait to fire
5605
+ if (!this.isScrollRecent) {
5606
+ this.endScroll();
5569
5607
  }
5570
5608
  };
5609
+ this.wheelWaiter = new DelayedRunner(this.handleWheelWait);
5610
+ this.scrollWaiter = new DelayedRunner(this.handleScrollWait);
5571
5611
  el.addEventListener('scroll', this.handleScroll);
5612
+ el.addEventListener('wheel', this.handleWheel, { passive: true });
5613
+ el.addEventListener('mousedown', this.handleMouseDown);
5614
+ el.addEventListener('mouseup', this.handleMouseUp);
5572
5615
  el.addEventListener('touchstart', this.handleTouchStart, { passive: true });
5573
5616
  el.addEventListener('touchend', this.handleTouchEnd);
5574
- for (let eventName of WHEEL_EVENT_NAMES) {
5575
- el.addEventListener(eventName, this.handleWheel, { passive: true });
5576
- }
5577
5617
  }
5578
5618
  destroy() {
5579
5619
  let { el } = this;
5580
5620
  el.removeEventListener('scroll', this.handleScroll);
5621
+ el.removeEventListener('wheel', this.handleWheel, { passive: true });
5622
+ el.removeEventListener('mousedown', this.handleMouseDown);
5623
+ el.removeEventListener('mouseup', this.handleMouseUp);
5581
5624
  el.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
5582
5625
  el.removeEventListener('touchend', this.handleTouchEnd);
5583
- for (let eventName of WHEEL_EVENT_NAMES) {
5584
- el.removeEventListener(eventName, this.handleWheel, { passive: true });
5585
- }
5586
5626
  }
5587
5627
  // Start / Stop
5588
5628
  // ----------------------------------------------------------------------------------------------
5589
5629
  startScroll() {
5590
- if (!this.isScrolling) {
5591
- this.isScrolling = true;
5592
- this.emitter.trigger('scrollStart', this.isRecentlyWheeled, this.isTouching);
5630
+ if (!this.isScroll) {
5631
+ this.isScroll = true;
5632
+ this.emitter.trigger('scrollStart', this.getIsUser());
5593
5633
  }
5594
5634
  }
5595
5635
  endScroll() {
5596
- if (this.isScrolling) {
5597
- this.emitter.trigger('scrollEnd');
5598
- this.isScrolling = false;
5599
- this.isRecentlyScrolled = true;
5600
- this.isRecentlyWheeled = false;
5601
- this.scrollWaiter.clear();
5602
- this.wheelWaiter.clear();
5603
- }
5604
- }
5605
- _handleScrollWaited() {
5606
- this.isRecentlyScrolled = false;
5607
- // only end the scroll if not currently touching.
5608
- // if touching, the scrolling will end later, on touchend.
5609
- if (!this.isTouching) {
5610
- this.endScroll(); // won't fire if already ended
5636
+ if (this.isScroll) { // extra protection because might be called publicly
5637
+ this.scrollWaiter.clear(); // (same)
5638
+ this.wheelWaiter.clear(); // (same)
5639
+ this.isScroll = false;
5640
+ this.isWheelRecent = false;
5641
+ this.emitter.trigger('scrollEnd', this.getIsUser());
5642
+ this.isMouse = false;
5643
+ this.isTouch = false;
5644
+ this.isWheel = false;
5611
5645
  }
5612
5646
  }
5613
- _handleWheelWaited() {
5614
- this.isRecentlyWheeled = false;
5647
+ getIsUser() {
5648
+ return this.isWheel || this.isMouse || this.isTouch;
5615
5649
  }
5616
5650
  }
5617
5651
 
@@ -6603,11 +6637,11 @@ var FullCalendar = (function (exports) {
6603
6637
  const timeFormat = options.eventTimeFormat || props.defaultTimeFormat;
6604
6638
  const timeText = buildEventRangeTimeText(timeFormat, eventRange, // just for def/instance
6605
6639
  props.slicedStart, props.slicedEnd, props.isStart, props.isEnd, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd);
6606
- const anchorAttrs = getEventRangeAnchorAttrs(eventRange, context);
6607
- return (_(EventContainer, Object.assign({}, props /* includes elRef */, { tag: anchorAttrs ? 'a' : 'div', style: {
6640
+ const [tag, attrs] = getEventTagAndAttrs(eventRange, context);
6641
+ return (_(EventContainer, Object.assign({}, props /* includes elRef */, { tag: tag, style: {
6608
6642
  borderColor: eventRange.ui.borderColor,
6609
6643
  backgroundColor: eventRange.ui.backgroundColor,
6610
- }, attrs: anchorAttrs, defaultGenerator: renderInnerContent$1, timeText: timeText }), (InnerContent, eventContentArg) => (_(k$1, null,
6644
+ }, attrs: attrs, defaultGenerator: renderInnerContent$1, timeText: timeText }), (InnerContent, eventContentArg) => (_(k$1, null,
6611
6645
  _(InnerContent, { tag: "div", className: 'fc-event-inner', style: { color: eventContentArg.textColor } }),
6612
6646
  Boolean(eventContentArg.isStartResizable) && (_("div", { className: "fc-event-resizer fc-event-resizer-start" })),
6613
6647
  Boolean(eventContentArg.isEndResizable) && (_("div", { className: "fc-event-resizer fc-event-resizer-end" }))))));
@@ -6641,8 +6675,7 @@ var FullCalendar = (function (exports) {
6641
6675
  let { options } = context;
6642
6676
  let renderProps = this.refineRenderProps({
6643
6677
  date: props.date,
6644
- dateProfile: props.dateProfile,
6645
- todayRange: props.todayRange,
6678
+ dateMeta: props.dateMeta,
6646
6679
  isMonthStart: props.isMonthStart || false,
6647
6680
  showDayNumber: props.showDayNumber,
6648
6681
  renderProps: props.renderProps,
@@ -6650,20 +6683,16 @@ var FullCalendar = (function (exports) {
6650
6683
  dateEnv: context.dateEnv,
6651
6684
  monthStartFormat: options.monthStartFormat,
6652
6685
  });
6653
- return (_(ContentContainer, Object.assign({}, props /* includes children */, { className: joinClassNames(props.className, getDayClassName(renderProps)), attrs: Object.assign(Object.assign({}, props.attrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), renderProps: renderProps, generatorName: "dayCellContent", customGenerator: options.dayCellContent, defaultGenerator: props.defaultGenerator, classNameGenerator:
6654
- // don't use custom classNames if disabled
6655
- // TODO: make DRY with DayGridHeaderCell
6656
- renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount })));
6686
+ return (_(ContentContainer, Object.assign({}, props /* includes children */, { className: joinClassNames(props.className, getDayClassName(renderProps)), attrs: Object.assign(Object.assign(Object.assign({}, props.attrs), { 'data-date': formatDayString(props.date) }), (renderProps.isToday ? { 'aria-current': 'date' } : {})), renderProps: renderProps, generatorName: "dayCellContent", customGenerator: options.dayCellContent, defaultGenerator: props.defaultGenerator, classNameGenerator: options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount })));
6657
6687
  }
6658
6688
  }
6659
6689
  function hasCustomDayCellContent(options) {
6660
6690
  return Boolean(options.dayCellContent || hasCustomRenderingHandler('dayCellContent', options));
6661
6691
  }
6662
6692
  function refineRenderProps(raw) {
6663
- let { date, dateEnv, dateProfile, isMonthStart } = raw;
6664
- let dayMeta = getDateMeta(date, raw.todayRange, null, dateProfile);
6693
+ let { date, dateEnv, isMonthStart } = raw;
6665
6694
  let dayNumberText = raw.showDayNumber ? (dateEnv.format(date, isMonthStart ? raw.monthStartFormat : DAY_NUM_FORMAT)) : '';
6666
- return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { isMonthStart,
6695
+ return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, raw.dateMeta), { isMonthStart,
6667
6696
  dayNumberText }), raw.renderProps);
6668
6697
  }
6669
6698
 
@@ -6697,9 +6726,10 @@ var FullCalendar = (function (exports) {
6697
6726
  class Popover extends BaseComponent {
6698
6727
  constructor() {
6699
6728
  super(...arguments);
6700
- this.state = {
6701
- titleId: getUniqueDomId(),
6702
- };
6729
+ this.closeRef = m$1();
6730
+ this.focusStartRef = m$1();
6731
+ this.focusEndRef = m$1();
6732
+ this.titleId = getUniqueDomId();
6703
6733
  this.handleRootEl = (el) => {
6704
6734
  this.rootEl = el;
6705
6735
  if (this.props.elRef) {
@@ -6711,15 +6741,17 @@ var FullCalendar = (function (exports) {
6711
6741
  // only hide the popover if the click happened outside the popover
6712
6742
  const target = getEventTargetViaRoot(ev);
6713
6743
  if (!this.rootEl.contains(target)) {
6714
- this.handleCloseClick();
6744
+ this.handleClose();
6715
6745
  }
6716
6746
  };
6717
6747
  this.handleDocumentKeyDown = (ev) => {
6718
6748
  if (ev.key === 'Escape') {
6719
- this.handleCloseClick();
6749
+ this.handleClose();
6720
6750
  }
6721
6751
  };
6722
- this.handleCloseClick = () => {
6752
+ // for many different close techniques
6753
+ // cannot accept params because might receive a browser Event
6754
+ this.handleClose = () => {
6723
6755
  let { onClose } = this.props;
6724
6756
  if (onClose) {
6725
6757
  onClose();
@@ -6728,21 +6760,28 @@ var FullCalendar = (function (exports) {
6728
6760
  }
6729
6761
  render() {
6730
6762
  let { theme, options } = this.context;
6731
- let { props, state } = this;
6732
- return j(_("div", Object.assign({}, props.attrs, { id: props.id, className: joinClassNames(props.className, 'fc-popover', theme.getClassName('popover')), "aria-labelledby": state.titleId, ref: this.handleRootEl }),
6763
+ let { props } = this;
6764
+ return j(_("div", Object.assign({}, props.attrs, { id: props.id, role: 'dialog', "aria-labelledby": this.titleId, className: joinClassNames(props.className, 'fc-popover', theme.getClassName('popover')), ref: this.handleRootEl }),
6765
+ _("div", { tabIndex: 0, style: { outline: 'none' }, ref: this.focusStartRef }),
6733
6766
  _("div", { className: 'fc-popover-header ' + theme.getClassName('popoverHeader') },
6734
- _("span", { className: "fc-popover-title", id: state.titleId }, props.title),
6735
- _("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })),
6736
- _("div", { className: 'fc-popover-body ' + theme.getClassName('popoverContent') }, props.children)), props.parentEl);
6767
+ _("span", { className: "fc-popover-title", id: this.titleId }, props.title),
6768
+ _("span", Object.assign({ role: 'button', "aria-label": options.closeHint, className: 'fc-popover-close ' + theme.getIconClass('close') }, createAriaClickAttrs(this.handleClose), { ref: this.closeRef }))),
6769
+ _("div", { className: 'fc-popover-body ' + theme.getClassName('popoverContent') }, props.children),
6770
+ _("div", { tabIndex: 0, style: { outline: 'none' }, ref: this.focusEndRef })), props.parentEl);
6737
6771
  }
6738
6772
  componentDidMount() {
6739
6773
  document.addEventListener('mousedown', this.handleDocumentMouseDown);
6740
6774
  document.addEventListener('keydown', this.handleDocumentKeyDown);
6775
+ this.focusStartRef.current.addEventListener('focus', this.handleClose);
6776
+ this.focusEndRef.current.addEventListener('focus', this.handleClose);
6777
+ this.closeRef.current.focus({ preventScroll: true });
6741
6778
  this.updateSize();
6742
6779
  }
6743
6780
  componentWillUnmount() {
6744
6781
  document.removeEventListener('mousedown', this.handleDocumentMouseDown);
6745
6782
  document.removeEventListener('keydown', this.handleDocumentKeyDown);
6783
+ this.focusStartRef.current.removeEventListener('focus', this.handleClose);
6784
+ this.focusEndRef.current.removeEventListener('focus', this.handleClose);
6746
6785
  }
6747
6786
  updateSize() {
6748
6787
  let { isRtl } = this.context;
@@ -6789,8 +6828,10 @@ var FullCalendar = (function (exports) {
6789
6828
  let { options, dateEnv } = this.context;
6790
6829
  let { props } = this;
6791
6830
  let { startDate, todayRange, dateProfile } = props;
6831
+ // TODO: memoize?
6832
+ let detaMeta = getDateMeta(startDate, todayRange, null, dateProfile);
6792
6833
  let title = dateEnv.format(startDate, options.dayPopoverFormat);
6793
- return (_(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateProfile: dateProfile, todayRange: todayRange }, (InnerContent, renderProps, attrs) => (_(Popover, { elRef: attrs.ref, id: props.id, title: title, attrs: attrs /* TODO: make these time-based when not whole-day? */, className: joinClassNames(attrs.className, // TODO: solve SignalLike type problem
6834
+ return (_(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateMeta: detaMeta }, (InnerContent, renderProps, attrs) => (_(Popover, { elRef: attrs.ref, id: props.id, title: title, attrs: attrs /* TODO: make these time-based when not whole-day? */, className: joinClassNames(attrs.className, // TODO: solve SignalLike type problem
6794
6835
  'fc-more-popover'), parentEl: props.parentEl, alignEl: props.alignEl, alignParentTop: props.alignParentTop, onClose: props.onClose },
6795
6836
  hasCustomDayCellContent(options) && (_(InnerContent, { tag: "div", className: 'fc-more-popover-misc' })),
6796
6837
  props.children))));
@@ -6864,6 +6905,9 @@ var FullCalendar = (function (exports) {
6864
6905
  }
6865
6906
  };
6866
6907
  this.handlePopoverClose = () => {
6908
+ if (this.linkEl) { // was null sometimes when initiating drag-n-drop would hide the popover
6909
+ this.linkEl.focus();
6910
+ }
6867
6911
  this.setState({ isPopoverOpen: false });
6868
6912
  };
6869
6913
  }
@@ -6885,7 +6929,7 @@ var FullCalendar = (function (exports) {
6885
6929
  view: viewApi,
6886
6930
  };
6887
6931
  return (_(k$1, null,
6888
- Boolean(moreCnt) && (_(ContentContainer, { tag: props.tag || 'a', elRef: this.handleLinkEl, className: joinClassNames(props.className, 'fc-more-link'), style: props.style, attrs: Object.assign(Object.assign(Object.assign({}, props.attrs), createAriaClickAttrs(this.handleClick)), { title: hint, 'aria-expanded': state.isPopoverOpen, 'aria-controls': state.isPopoverOpen ? state.popoverId : '' }), renderProps: renderProps, generatorName: "moreLinkContent", customGenerator: options.moreLinkContent, defaultGenerator: props.defaultGenerator || renderMoreLinkInner, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children)),
6932
+ Boolean(moreCnt) && (_(ContentContainer, { tag: 'div', elRef: this.handleLinkEl, className: joinClassNames(props.className, 'fc-more-link'), style: props.style, attrs: Object.assign(Object.assign(Object.assign({}, props.attrs), createAriaClickAttrs(this.handleClick)), { title: hint, 'role': 'button', 'aria-haspopup': 'dialog', 'aria-expanded': state.isPopoverOpen, 'aria-controls': state.isPopoverOpen ? state.popoverId : undefined }), renderProps: renderProps, generatorName: "moreLinkContent", customGenerator: options.moreLinkContent, defaultGenerator: props.defaultGenerator || renderMoreLinkInner, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children)),
6889
6933
  state.isPopoverOpen && (_(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, dateSpanProps: props.dateSpanProps, parentEl: this.parentEl, alignEl: props.alignElRef ?
6890
6934
  props.alignElRef.current :
6891
6935
  this.linkEl, alignParentTop: props.alignParentTop, forceTimed: props.forceTimed, onClose: this.handlePopoverClose }, props.popoverContent()))));
@@ -6924,7 +6968,7 @@ var FullCalendar = (function (exports) {
6924
6968
  let { props, context } = this;
6925
6969
  let { options } = context;
6926
6970
  let renderProps = { view: context.viewApi };
6927
- return (_(ContentContainer, Object.assign({}, props, { tag: props.tag || 'div', className: joinClassNames(props.className, buildViewClassName(props.viewSpec)), renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children));
6971
+ return (_(ContentContainer, Object.assign({}, props, { tag: props.tag || 'div', attrs: props.attrs, className: joinClassNames(props.className, buildViewClassName(props.viewSpec)), renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children));
6928
6972
  }
6929
6973
  }
6930
6974
  function buildViewClassName(viewSpec) {
@@ -7504,6 +7548,7 @@ var FullCalendar = (function (exports) {
7504
7548
  watchHeight: watchHeight,
7505
7549
  afterSize: afterSize,
7506
7550
  buildNavLinkAttrs: buildNavLinkAttrs,
7551
+ buildDateStr: buildDateStr,
7507
7552
  preventDefault: preventDefault,
7508
7553
  whenTransitionDone: whenTransitionDone,
7509
7554
  computeInnerRect: computeInnerRect,
@@ -7571,7 +7616,7 @@ var FullCalendar = (function (exports) {
7571
7616
  sortEventSegs: sortEventSegs,
7572
7617
  getEventRangeMeta: getEventRangeMeta,
7573
7618
  buildEventRangeKey: buildEventRangeKey,
7574
- getEventRangeAnchorAttrs: getEventRangeAnchorAttrs,
7619
+ getEventTagAndAttrs: getEventTagAndAttrs,
7575
7620
  getEventKey: getEventKey,
7576
7621
  DayTableModel: DayTableModel,
7577
7622
  Scroller: Scroller,
@@ -7644,9 +7689,9 @@ var FullCalendar = (function (exports) {
7644
7689
  weekText: 'W',
7645
7690
  weekTextLong: 'Week',
7646
7691
  closeHint: 'Close',
7647
- timeHint: 'Time',
7648
- eventHint: 'Event',
7692
+ eventsHint: 'Events',
7649
7693
  allDayText: 'all-day',
7694
+ timedText: 'timed',
7650
7695
  moreLinkText: 'more',
7651
7696
  noEventsText: 'No events to display',
7652
7697
  };
@@ -7661,7 +7706,7 @@ var FullCalendar = (function (exports) {
7661
7706
  ? 'Today'
7662
7707
  : `This ${buttonText}`;
7663
7708
  },
7664
- }, viewHint: '$0 view', navLinkHint: 'Go to $0', moreLinkHint(eventCnt) {
7709
+ }, viewHint: '$0 view', viewChangeHint: 'Change view', navLinkHint: 'Go to $0', moreLinkHint(eventCnt) {
7665
7710
  return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
7666
7711
  } });
7667
7712
  function organizeRawLocales(explicitRawLocales) {
@@ -8333,17 +8378,25 @@ var FullCalendar = (function (exports) {
8333
8378
  return { header, footer };
8334
8379
  }
8335
8380
  function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) {
8336
- let sectionWidgets = {};
8381
+ let isRtl = calendarOptions.direction === 'rtl';
8337
8382
  let viewsWithButtons = [];
8338
8383
  let hasTitle = false;
8339
- for (let sectionName in sectionStrHash) {
8340
- let sectionStr = sectionStrHash[sectionName];
8384
+ function processSectionStr(sectionStr) {
8341
8385
  let sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi);
8342
- sectionWidgets[sectionName] = sectionRes.widgets;
8343
8386
  viewsWithButtons.push(...sectionRes.viewsWithButtons);
8344
8387
  hasTitle = hasTitle || sectionRes.hasTitle;
8388
+ return sectionRes.widgets;
8345
8389
  }
8346
- return { sectionWidgets, viewsWithButtons, hasTitle };
8390
+ const sectionWidgets = {
8391
+ start: processSectionStr(sectionStrHash[isRtl ? 'right' : 'left'] || sectionStrHash.start || ''),
8392
+ center: processSectionStr(sectionStrHash.center || ''),
8393
+ end: processSectionStr(sectionStrHash[isRtl ? 'left' : 'right'] || sectionStrHash.end || ''),
8394
+ };
8395
+ return {
8396
+ sectionWidgets,
8397
+ viewsWithButtons,
8398
+ hasTitle,
8399
+ };
8347
8400
  }
8348
8401
  /*
8349
8402
  BAD: querying icons and text here. should be done at render time
@@ -8371,6 +8424,7 @@ var FullCalendar = (function (exports) {
8371
8424
  let buttonIcon; // only one of these will be set
8372
8425
  let buttonText; // "
8373
8426
  let buttonHint;
8427
+ let isView = false;
8374
8428
  // ^ for the title="" attribute, for accessibility
8375
8429
  if ((customButtonProps = calendarCustomButtons[buttonName])) {
8376
8430
  buttonClick = (ev) => {
@@ -8384,6 +8438,7 @@ var FullCalendar = (function (exports) {
8384
8438
  buttonHint = customButtonProps.hint || customButtonProps.text;
8385
8439
  }
8386
8440
  else if ((viewSpec = viewSpecs[buttonName])) {
8441
+ isView = true;
8387
8442
  viewsWithButtons.push(buttonName);
8388
8443
  buttonClick = () => {
8389
8444
  calendarApi.changeView(buttonName);
@@ -8421,7 +8476,7 @@ var FullCalendar = (function (exports) {
8421
8476
  ], calendarButtonText[buttonName]);
8422
8477
  }
8423
8478
  }
8424
- return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint };
8479
+ return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint, isView };
8425
8480
  })));
8426
8481
  return { widgets, viewsWithButtons, hasTitle };
8427
8482
  }
@@ -9245,27 +9300,41 @@ var FullCalendar = (function (exports) {
9245
9300
  }, ...children);
9246
9301
  }
9247
9302
  renderWidgetGroup(widgetGroup) {
9248
- let { props } = this;
9249
- let { theme } = this.context;
9303
+ let { props, context } = this;
9304
+ let { options, theme } = context;
9250
9305
  let children = [];
9251
9306
  let isOnlyButtons = true;
9307
+ let isOnlyView = true;
9308
+ for (const widget of widgetGroup) {
9309
+ const { buttonName, isView } = widget;
9310
+ if (buttonName === 'title') {
9311
+ isOnlyButtons = false;
9312
+ }
9313
+ else if (!isView) {
9314
+ isOnlyView = false;
9315
+ }
9316
+ }
9252
9317
  for (let widget of widgetGroup) {
9253
9318
  let { buttonName, buttonClick, buttonText, buttonIcon, buttonHint } = widget;
9254
9319
  if (buttonName === 'title') {
9255
- isOnlyButtons = false;
9256
- children.push(_("h2", { className: "fc-toolbar-title" }, props.title));
9320
+ children.push(_("div", { role: 'heading', "aria-level": options.headingLevel, id: props.titleId, className: 'fc-toolbar-title' }, props.title));
9257
9321
  }
9258
9322
  else {
9259
9323
  let isPressed = buttonName === props.activeButton;
9260
9324
  let isDisabled = (!props.isTodayEnabled && buttonName === 'today') ||
9261
9325
  (!props.isPrevEnabled && buttonName === 'prev') ||
9262
9326
  (!props.isNextEnabled && buttonName === 'next');
9263
- children.push(_("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: joinClassNames(`fc-${buttonName}-button`, theme.getClassName('button'), isPressed && theme.getClassName('buttonActive')), onClick: buttonClick }, buttonText || (buttonIcon ? _("span", { className: buttonIcon, role: "img" }) : '')));
9327
+ children.push(_("button", Object.assign({ type: "button", disabled: isDisabled }, ((isOnlyButtons && isOnlyView)
9328
+ ? { 'role': 'tab', 'aria-selected': isPressed }
9329
+ : { 'aria-pressed': isPressed }), { "aria-label": typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, className: joinClassNames(`fc-${buttonName}-button`, theme.getClassName('button'), isPressed && theme.getClassName('buttonActive')), onClick: buttonClick }), buttonText || (buttonIcon ? _("span", { className: buttonIcon, "aria-hidden": true }) : '')));
9264
9330
  }
9265
9331
  }
9266
9332
  if (children.length > 1) {
9267
- let groupClassName = (isOnlyButtons && theme.getClassName('buttonGroup')) || '';
9268
- return _('div', { className: groupClassName }, ...children);
9333
+ return _('div', {
9334
+ role: (isOnlyButtons && isOnlyView) ? 'tablist' : undefined,
9335
+ 'aria-label': (isOnlyButtons && isOnlyView) ? options.viewChangeHint : undefined,
9336
+ className: isOnlyButtons ? theme.getClassName('buttonGroup') : undefined,
9337
+ }, ...children);
9269
9338
  }
9270
9339
  return children[0];
9271
9340
  }
@@ -9274,33 +9343,15 @@ var FullCalendar = (function (exports) {
9274
9343
  class Toolbar extends BaseComponent {
9275
9344
  render() {
9276
9345
  let { model, className } = this.props;
9277
- let forceLtr = false;
9278
- let startContent;
9279
- let endContent;
9280
- let sectionWidgets = model.sectionWidgets;
9281
- let centerContent = sectionWidgets.center;
9282
- if (sectionWidgets.left) {
9283
- forceLtr = true;
9284
- startContent = sectionWidgets.left;
9285
- }
9286
- else {
9287
- startContent = sectionWidgets.start;
9288
- }
9289
- if (sectionWidgets.right) {
9290
- forceLtr = true;
9291
- endContent = sectionWidgets.right;
9292
- }
9293
- else {
9294
- endContent = sectionWidgets.end;
9295
- }
9296
- return (_("div", { className: joinClassNames(className, 'fc-toolbar', forceLtr && 'fc-toolbar-ltr') },
9297
- this.renderSection('start', startContent || []),
9298
- this.renderSection('center', centerContent || []),
9299
- this.renderSection('end', endContent || [])));
9346
+ let { sectionWidgets } = model;
9347
+ return (_("div", { className: joinClassNames(className, 'fc-toolbar') },
9348
+ this.renderSection('start', sectionWidgets.start),
9349
+ this.renderSection('center', sectionWidgets.center),
9350
+ this.renderSection('end', sectionWidgets.end)));
9300
9351
  }
9301
9352
  renderSection(key, widgetGroups) {
9302
9353
  let { props } = this;
9303
- return (_(ToolbarSection, { key: key, name: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled }));
9354
+ return (_(ToolbarSection, { key: key, name: key, widgetGroups: widgetGroups, title: props.title, titleId: props.titleId, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled }));
9304
9355
  }
9305
9356
  }
9306
9357
 
@@ -9399,6 +9450,7 @@ var FullCalendar = (function (exports) {
9399
9450
  this.buildViewPropTransformers = memoize(buildViewPropTransformers);
9400
9451
  this.buildToolbarProps = memoize(buildToolbarProps);
9401
9452
  this.interactionsStore = {};
9453
+ this.viewTitleId = getUniqueDomId();
9402
9454
  // Component Registration
9403
9455
  // -----------------------------------------------------------------------------------------------------------------
9404
9456
  this.registerInteractiveComponent = (component, settingsInput) => {
@@ -9449,9 +9501,9 @@ var FullCalendar = (function (exports) {
9449
9501
  }
9450
9502
  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);
9451
9503
  return (_(ViewContextType.Provider, { value: viewContext },
9452
- toolbarConfig.header && (_(Toolbar, Object.assign({ className: "fc-header-toolbar", model: toolbarConfig.header }, toolbarProps))),
9504
+ toolbarConfig.header && (_(Toolbar, Object.assign({ className: "fc-header-toolbar", model: toolbarConfig.header, titleId: this.viewTitleId }, toolbarProps))),
9453
9505
  _(ViewHarness, { height: viewHeight, heightLiquid: viewHeightLiquid, aspectRatio: viewAspectRatio },
9454
- this.renderView(props),
9506
+ this.renderView(props, toolbarProps.title),
9455
9507
  this.buildAppendContent()),
9456
9508
  toolbarConfig.footer && (_(Toolbar, Object.assign({ className: "fc-footer-toolbar", model: toolbarConfig.footer }, toolbarProps)))));
9457
9509
  }
@@ -9484,9 +9536,9 @@ var FullCalendar = (function (exports) {
9484
9536
  let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props));
9485
9537
  return _(k$1, {}, ...children);
9486
9538
  }
9487
- renderView(props) {
9539
+ renderView(props, title) {
9488
9540
  let { pluginHooks } = props;
9489
- let { viewSpec } = props;
9541
+ let { viewSpec, toolbarConfig } = props;
9490
9542
  let viewProps = {
9491
9543
  dateProfile: props.dateProfile,
9492
9544
  businessHours: props.businessHours,
@@ -9497,6 +9549,8 @@ var FullCalendar = (function (exports) {
9497
9549
  eventDrag: props.eventDrag,
9498
9550
  eventResize: props.eventResize,
9499
9551
  forPrint: props.forPrint,
9552
+ labelId: toolbarConfig.header && toolbarConfig.header.hasTitle ? this.viewTitleId : undefined,
9553
+ labelStr: toolbarConfig.header && toolbarConfig.header.hasTitle ? undefined : title,
9500
9554
  };
9501
9555
  let transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers);
9502
9556
  for (let transformer of transformers) {
@@ -9674,7 +9728,7 @@ var FullCalendar = (function (exports) {
9674
9728
  return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
9675
9729
  }
9676
9730
 
9677
- const version = '7.0.0-beta.3';
9731
+ const version = '7.0.0-beta.4';
9678
9732
 
9679
9733
  exports.Calendar = Calendar;
9680
9734
  exports.Internal = internal;