@fullcalendar/daygrid 7.0.0-beta.3 → 7.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.global.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- FullCalendar Day Grid Plugin v7.0.0-beta.3
2
+ FullCalendar Day Grid Plugin v7.0.0-rc.0
3
3
  Docs & License: https://fullcalendar.io/docs/month-view
4
4
  (c) 2024 Adam Shaw
5
5
  */
@@ -33,10 +33,15 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
33
33
  function buildDateRowConfig(dates, datesRepDistinctDays, dateProfile, todayRange, dayHeaderFormat, // TODO: rename to dateHeaderFormat?
34
34
  context, colSpan) {
35
35
  return {
36
+ isDateRow: true,
36
37
  renderConfig: buildDateRenderConfig(context),
37
38
  dataConfigs: buildDateDataConfigs(dates, datesRepDistinctDays, dateProfile, todayRange, dayHeaderFormat, context, colSpan)
38
39
  };
39
40
  }
41
+ /*
42
+ For header cells: how to connect w/ custom rendering
43
+ Applies to all cells in a row
44
+ */
40
45
  function buildDateRenderConfig(context) {
41
46
  const { options } = context;
42
47
  return {
@@ -47,23 +52,38 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
47
52
  willUnmount: options.dayHeaderWillUnmount,
48
53
  };
49
54
  }
55
+ const dowDates = [];
56
+ for (let dow = 0; dow < 7; dow++) {
57
+ dowDates.push(internal$1.addDays(new Date(259200000), dow)); // start with Sun, 04 Jan 1970 00:00:00 GMT)
58
+ }
59
+ /*
60
+ For header cells: data
61
+ */
50
62
  function buildDateDataConfigs(dates, datesRepDistinctDays, dateProfile, todayRange, dayHeaderFormat, // TODO: rename to dateHeaderFormat?
51
- context, colSpan = 1, keyPrefix = '') {
63
+ context, colSpan = 1, keyPrefix = '', extraRenderProps = {}, // TODO
64
+ extraAttrs = {}, // TODO
65
+ className = '') {
52
66
  const { dateEnv, viewApi, options } = context;
53
67
  return datesRepDistinctDays
54
68
  ? dates.map((date) => {
55
69
  const dateMeta = internal$1.getDateMeta(date, todayRange, null, dateProfile);
56
70
  const text = dateEnv.format(date, dayHeaderFormat);
57
- const renderProps = Object.assign(Object.assign({}, dateMeta), { date: dateEnv.toDate(date), view: viewApi, text });
58
- const isNavLink = options.navLinks && !dateMeta.isDisabled;
71
+ const renderProps = Object.assign(Object.assign(Object.assign({}, dateMeta), { date: dateEnv.toDate(date), view: viewApi, text }), extraRenderProps);
72
+ const isNavLink = options.navLinks && !dateMeta.isDisabled &&
73
+ dates.length > 1; // don't show navlink to day if only one day
74
+ const fullDateStr = internal$1.buildDateStr(context, date);
75
+ // for DayGridHeaderCell
59
76
  return {
60
77
  key: keyPrefix + date.toUTCString(),
61
78
  renderProps,
62
- attrs: { 'data-date': !dateMeta.isDisabled ? internal$1.formatDayString(date) : undefined },
63
- innerAttrs: isNavLink ? internal$1.buildNavLinkAttrs(context, date) : {},
79
+ attrs: Object.assign(Object.assign(Object.assign({ 'aria-label': fullDateStr }, (dateMeta.isToday ? { 'aria-current': 'date' } : {})), { 'data-date': internal$1.formatDayString(date) }), extraAttrs),
80
+ // for navlink
81
+ innerAttrs: isNavLink
82
+ ? internal$1.buildNavLinkAttrs(context, date, undefined, fullDateStr)
83
+ : { 'aria-hidden': true },
64
84
  colSpan,
65
85
  isNavLink,
66
- className: internal$1.getDayClassName(dateMeta),
86
+ className: internal$1.joinClassNames(className, internal$1.getDayClassName(dateMeta)),
67
87
  };
68
88
  })
69
89
  : dates.map((date) => {
@@ -78,13 +98,19 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
78
98
  isOther: false,
79
99
  };
80
100
  const text = dateEnv.format(normDate, dayHeaderFormat);
81
- const renderProps = Object.assign(Object.assign({}, dayMeta), { date, view: viewApi, text });
101
+ const renderProps = Object.assign(Object.assign(Object.assign({}, dayMeta), { date: dowDates[dow], view: viewApi, text }), extraRenderProps);
102
+ const fullWeekDayStr = dateEnv.format(normDate, WEEKDAY_FORMAT);
103
+ // for DayGridHeaderCell
82
104
  return {
83
105
  key: keyPrefix + String(dow),
84
106
  renderProps,
85
- innerAttrs: { 'aria-label': dateEnv.format(normDate, WEEKDAY_FORMAT) },
107
+ attrs: Object.assign({ 'aria-label': fullWeekDayStr }, extraAttrs),
108
+ // NOT a navlink
109
+ innerAttrs: {
110
+ 'aria-hidden': true, // label already on cell
111
+ },
86
112
  colSpan,
87
- className: internal$1.getDayClassName(dayMeta),
113
+ className: internal$1.joinClassNames(className, internal$1.getDayClassName(dayMeta)),
88
114
  };
89
115
  });
90
116
  }
@@ -168,8 +194,8 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
168
194
  /* slicedStart = */ undefined,
169
195
  /* slicedEnd = */ undefined, props.isStart, props.isEnd, context,
170
196
  /* defaultDisplayEventTime = */ true, props.defaultDisplayEventEnd);
171
- let anchorAttrs = internal$1.getEventRangeAnchorAttrs(eventRange, context);
172
- return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { tag: anchorAttrs ? 'a' : 'div', attrs: anchorAttrs, className: 'fc-daygrid-dot-event fc-daygrid-event', defaultGenerator: renderInnerContent, timeText: timeText, isResizing: false, isDateSelecting: false })));
197
+ let [tag, attrs] = internal$1.getEventTagAndAttrs(eventRange, context);
198
+ return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { tag: tag, attrs: attrs, className: 'fc-daygrid-dot-event fc-daygrid-event', defaultGenerator: renderInnerContent, timeText: timeText, isResizing: false, isDateSelecting: false })));
173
199
  }
174
200
  }
175
201
  function renderInnerContent(renderProps) {
@@ -203,9 +229,34 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
203
229
  class DayGridCell extends internal$1.DateComponent {
204
230
  constructor() {
205
231
  super(...arguments);
232
+ // memo
233
+ this.getDateMeta = internal$1.memoize(internal$1.getDateMeta);
206
234
  // ref
207
235
  this.rootElRef = preact.createRef();
208
- this.bodyElRef = preact.createRef();
236
+ this.handleBodyEl = (bodyEl) => {
237
+ if (this.disconnectBodyHeight) {
238
+ this.disconnectBodyHeight();
239
+ this.disconnectBodyHeight = undefined;
240
+ internal$1.setRef(this.props.headerHeightRef, null);
241
+ internal$1.setRef(this.props.mainHeightRef, null);
242
+ }
243
+ if (bodyEl) {
244
+ // we want to fire on ANY size change, because we do more advanced stuff
245
+ this.disconnectBodyHeight = internal$1.watchSize(bodyEl, (_bodyWidth, bodyHeight) => {
246
+ const { props } = this;
247
+ const mainRect = bodyEl.getBoundingClientRect();
248
+ const rootRect = this.rootElRef.current.getBoundingClientRect();
249
+ const headerHeight = mainRect.top - rootRect.top;
250
+ if (!internal$1.isDimsEqual(this.headerHeight, headerHeight)) {
251
+ this.headerHeight = headerHeight;
252
+ internal$1.setRef(props.headerHeightRef, headerHeight);
253
+ }
254
+ if (props.fgLiquidHeight) {
255
+ internal$1.setRef(props.mainHeightRef, bodyHeight);
256
+ }
257
+ });
258
+ }
259
+ };
209
260
  }
210
261
  render() {
211
262
  let { props, context } = this;
@@ -213,38 +264,28 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
213
264
  // TODO: memoize this
214
265
  const isMonthStart = props.showDayNumber &&
215
266
  shouldDisplayMonthStart(props.date, props.dateProfile.currentRange, dateEnv);
216
- return (preact.createElement(internal$1.DayCellContainer, { tag: "div", className: internal$1.joinClassNames(props.className, 'fc-daygrid-day fc-flex-col', props.borderStart && 'fc-border-s', props.width != null ? '' : 'fc-liquid'), attrs: Object.assign(Object.assign({}, props.attrs), { role: 'gridcell' }), style: {
267
+ const dateMeta = this.getDateMeta(props.date, props.todayRange, null, props.dateProfile);
268
+ const baseClassName = internal$1.joinClassNames('fc-daygrid-day', props.borderStart && 'fc-border-s', props.width != null ? '' : 'fc-liquid', 'fc-flex-col');
269
+ if (dateMeta.isDisabled) {
270
+ return (preact.createElement("div", { role: 'gridcell', "aria-disabled": true, className: internal$1.joinClassNames(baseClassName, 'fc-day-disabled'), style: {
271
+ width: props.width
272
+ } }));
273
+ }
274
+ const hasDayNumber = props.showDayNumber || internal$1.hasCustomDayCellContent(options);
275
+ const isNavLink = options.navLinks;
276
+ const fullDateStr = internal$1.buildDateStr(context, props.date);
277
+ return (preact.createElement(internal$1.DayCellContainer, { tag: "div", className: internal$1.joinClassNames(baseClassName, props.className), attrs: Object.assign(Object.assign({}, props.attrs), { role: 'gridcell', 'aria-label': fullDateStr }), style: {
217
278
  width: props.width
218
- }, elRef: this.rootElRef, renderProps: props.renderProps, defaultGenerator: renderTopInner, date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, isMonthStart: isMonthStart }, (InnerContent, renderProps) => (preact.createElement(preact.Fragment, null,
219
- !renderProps.isDisabled && (props.showDayNumber || internal$1.hasCustomDayCellContent(options)) && (preact.createElement("div", { className: "fc-daygrid-day-header" },
220
- preact.createElement(InnerContent, { tag: "a", attrs: internal$1.buildNavLinkAttrs(context, props.date), className: internal$1.joinClassNames('fc-daygrid-day-number', isMonthStart && 'fc-daygrid-month-start') }))),
221
- preact.createElement("div", { className: internal$1.joinClassNames('fc-daygrid-day-body', props.isTall && 'fc-daygrid-day-body-tall', props.fgLiquidHeight ? 'fc-liquid' : 'fc-grow'), ref: this.bodyElRef },
279
+ }, elRef: this.rootElRef, renderProps: props.renderProps, defaultGenerator: renderTopInner, date: props.date, dateMeta: dateMeta, showDayNumber: props.showDayNumber, isMonthStart: isMonthStart }, (InnerContent) => (preact.createElement(preact.Fragment, null,
280
+ hasDayNumber && (preact.createElement("div", { className: "fc-daygrid-day-header" },
281
+ preact.createElement(InnerContent, { tag: 'div', attrs: isNavLink
282
+ ? internal$1.buildNavLinkAttrs(context, props.date, undefined, fullDateStr)
283
+ : { 'aria-hidden': true } // label already on cell
284
+ , className: internal$1.joinClassNames('fc-daygrid-day-number', isMonthStart && 'fc-daygrid-month-start') }))),
285
+ preact.createElement("div", { className: internal$1.joinClassNames('fc-daygrid-day-body', props.isTall && 'fc-daygrid-day-body-tall', props.fgLiquidHeight ? 'fc-liquid' : 'fc-grow'), ref: this.handleBodyEl },
222
286
  preact.createElement("div", { className: 'fc-daygrid-day-events', style: { height: props.fgHeight } }, props.fg),
223
287
  preact.createElement(DayGridMoreLink, { isBlock: props.isCompact, allDayDate: props.date, segs: props.segs, hiddenSegs: props.hiddenSegs, alignElRef: this.rootElRef, alignParentTop: props.showDayNumber ? '[role=row]' : '.fc-view', dateSpanProps: props.dateSpanProps, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))))));
224
288
  }
225
- componentDidMount() {
226
- const bodyEl = this.bodyElRef.current;
227
- // we want to fire on ANY size change, because we do more advanced stuff
228
- this.disconnectBodyHeight = internal$1.watchSize(bodyEl, (_bodyWidth, bodyHeight) => {
229
- const { props } = this;
230
- const mainRect = bodyEl.getBoundingClientRect();
231
- const rootRect = this.rootElRef.current.getBoundingClientRect();
232
- const headerHeight = mainRect.top - rootRect.top;
233
- if (!internal$1.isDimsEqual(this.headerHeight, headerHeight)) {
234
- this.headerHeight = headerHeight;
235
- internal$1.setRef(props.headerHeightRef, headerHeight);
236
- }
237
- if (props.fgLiquidHeight) {
238
- internal$1.setRef(props.mainHeightRef, bodyHeight);
239
- }
240
- });
241
- }
242
- componentWillUnmount() {
243
- this.disconnectBodyHeight();
244
- const { props } = this;
245
- internal$1.setRef(props.headerHeightRef, null);
246
- internal$1.setRef(props.mainHeightRef, null);
247
- }
248
289
  }
249
290
  // Utils
250
291
  // -------------------------------------------------------------------------------------------------
@@ -472,10 +513,10 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
472
513
  // Hit Element
473
514
  // -------------------------------------------------------------------------------------------------
474
515
  function getRowEl(rootEl, row) {
475
- return rootEl.querySelectorAll(':scope > [role=row]')[row];
516
+ return rootEl.querySelectorAll('[role=row]')[row];
476
517
  }
477
518
  function getCellEl(rowEl, col) {
478
- return rowEl.querySelectorAll(':scope > [role=gridcell]')[col];
519
+ return rowEl.querySelectorAll('[role=gridcell]')[col];
479
520
  }
480
521
  // Header Formatting
481
522
  // -------------------------------------------------------------------------------------------------
@@ -568,14 +609,21 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
568
609
  (props.eventDrag && props.eventDrag.affectedInstances) ||
569
610
  (props.eventResize && props.eventResize.affectedInstances) ||
570
611
  {};
571
- return (preact.createElement("div", { role: 'row' // TODO: audit this for all scenarios
572
- , className: internal$1.joinClassNames('fc-flex-row fc-rel', props.className), style: {
573
- minHeight: props.minHeight,
612
+ const isNavLink = options.navLinks;
613
+ const fullWeekStr = internal$1.buildDateStr(context, weekDate, 'week');
614
+ return (preact.createElement("div", { role: props.role /* !!! */, "aria-label": props.role === 'row' // HACK
615
+ ? fullWeekStr
616
+ : undefined // can't have label on non-role div
617
+ , className: internal$1.joinClassNames('fc-daygrid-row', props.forPrint && 'fc-daygrid-row-print', 'fc-flex-row fc-rel', props.className), style: {
618
+ 'flex-basis': props.basis,
574
619
  }, ref: this.handleRootEl },
620
+ props.showWeekNumbers && (preact.createElement(internal$1.WeekNumberContainer, { tag: 'div', attrs: Object.assign(Object.assign({}, (isNavLink
621
+ ? internal$1.buildNavLinkAttrs(context, weekDate, 'week', fullWeekStr, /* isTabbable = */ false)
622
+ : {})), { 'role': undefined, 'aria-hidden': true }), className: 'fc-daygrid-week-number', date: weekDate, defaultFormat: DEFAULT_WEEK_NUM_FORMAT })),
575
623
  this.renderFillSegs(props.businessHourSegs, 'non-business'),
576
624
  this.renderFillSegs(props.bgEventSegs, 'bg-event'),
577
625
  this.renderFillSegs(highlightSegs, 'highlight'),
578
- preact.createElement("div", { className: 'fc-flex-row fc-liquid fc-rel' }, props.cells.map((cell, col) => {
626
+ props.cells.map((cell, col) => {
579
627
  const normalFgNodes = this.renderFgSegs(maxMainTop, renderableSegsByCol[col], segTops, props.todayRange, forcedInvisibleMap);
580
628
  return (preact.createElement(DayGridCell, { key: cell.key, dateProfile: props.dateProfile, todayRange: props.todayRange, date: cell.date, showDayNumber: props.showDayNumbers, isCompact: props.isCompact, isTall: props.isTall, borderStart: Boolean(col),
581
629
  // content
@@ -586,8 +634,7 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
586
634
  fgHeight: heightsByCol[col], width: props.colWidth,
587
635
  // refs
588
636
  headerHeightRef: headerHeightRefMap.createRef(cell.key), mainHeightRef: mainHeightRefMap.createRef(cell.key) }));
589
- })),
590
- props.showWeekNumbers && (preact.createElement(internal$1.WeekNumberContainer, { tag: "a", attrs: internal$1.buildNavLinkAttrs(context, weekDate, 'week'), className: 'fc-daygrid-week-number', date: weekDate, defaultFormat: DEFAULT_WEEK_NUM_FORMAT })),
637
+ }),
591
638
  this.renderFgSegs(maxMainTop, mirrorSegs, segTops, props.todayRange, {}, // forcedInvisibleMap
592
639
  Boolean(props.eventDrag), Boolean(props.eventResize), false)));
593
640
  }
@@ -747,30 +794,22 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
747
794
  let eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt);
748
795
  let isHeightAuto = internal$1.getIsHeightAuto(options);
749
796
  let rowHeightsRedistribute = !props.forPrint && !isHeightAuto;
750
- let [rowMinHeight, isCompact] = computeRowHeight(props.visibleWidth, rowCnt, isHeightAuto, props.forPrint, options);
751
- return (preact.createElement("div", { className: internal$1.joinClassNames(
797
+ let rowBasis = computeRowBasis(props.visibleWidth, rowCnt, isHeightAuto, options);
798
+ let isCompact = computeRowIsCompact(props.visibleWidth, options);
799
+ return (preact.createElement("div", { role: 'rowgroup', className: internal$1.joinClassNames(
752
800
  // HACK for Safari. Can't do break-inside:avoid with flexbox items, likely b/c it's not standard:
753
801
  // https://stackoverflow.com/a/60256345
754
- !props.forPrint && 'fc-flex-col', props.className), style: { width: props.width }, ref: this.handleRootEl }, props.cellRows.map((cells, row) => (preact.createElement(DayGridRow, { key: cells[0].key, dateProfile: props.dateProfile, todayRange: props.todayRange, cells: cells, showDayNumbers: rowCnt > 1, showWeekNumbers: options.weekNumbers, forPrint: props.forPrint, isCompact: isCompact,
802
+ !props.forPrint && 'fc-flex-col', props.className), style: { width: props.width }, ref: this.handleRootEl }, props.cellRows.map((cells, row) => (preact.createElement(DayGridRow, { key: cells[0].key, role: 'row', dateProfile: props.dateProfile, todayRange: props.todayRange, cells: cells, showDayNumbers: rowCnt > 1, showWeekNumbers: rowCnt > 1 && options.weekNumbers, forPrint: props.forPrint, isCompact: isCompact,
755
803
  // if not auto-height, distribute height of container somewhat evently to rows
756
- // (treat all as zero, distribute height, then ensure min-heights -- the inner content height)
757
- className: internal$1.joinClassNames(rowHeightsRedistribute && 'fc-grow fc-basis0', rowCnt > 1 && 'fc-break-inside-avoid', // don't avoid breaks for single tall row
804
+ className: internal$1.joinClassNames(rowHeightsRedistribute && 'fc-grow', rowCnt > 1 && 'fc-break-inside-avoid', // don't avoid breaks for single tall row
758
805
  row < rowCnt - 1 && 'fc-border-b'),
759
806
  // content
760
807
  fgEventSegs: fgEventSegsByRow[row], bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* HACK */, businessHourSegs: businessHourSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventSelection: props.eventSelection, eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows,
761
808
  // dimensions
762
- colWidth: props.colWidth, minHeight: rowMinHeight,
809
+ colWidth: props.colWidth, basis: rowBasis,
763
810
  // refs
764
811
  heightRef: rowHeightRefMap.createRef(cells[0].key) })))));
765
812
  }
766
- componentDidMount() {
767
- this.disconnectWidth = internal$1.watchWidth(this.rootEl, (width) => {
768
- this.setState({ width });
769
- });
770
- }
771
- componentWillUnmount() {
772
- this.disconnectWidth();
773
- }
774
813
  // Hit System
775
814
  // -----------------------------------------------------------------------------------------------
776
815
  queryHit(positionLeft, positionTop, elWidth) {
@@ -787,8 +826,7 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
787
826
  start: cellStartDate,
788
827
  end: cellEndDate,
789
828
  }, allDay: true }, cell.dateSpanProps),
790
- // HACK. TODO: This is expensive to do every hit-query
791
- dayEl: getCellEl(getRowEl(this.rootEl, row), col),
829
+ getDayEl: () => getCellEl(getRowEl(this.rootEl, row), col),
792
830
  rect: {
793
831
  left,
794
832
  right,
@@ -804,27 +842,35 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
804
842
  function isSegAllDay(seg) {
805
843
  return seg.eventRange.def.allDay;
806
844
  }
807
- function computeRowHeight(visibleWidth, // should INCLUDE any scrollbar width to avoid oscillation
808
- rowCnt, isHeightAuto, forPrint, options) {
845
+ /*
846
+ Amount of height a row should consume prior to expanding
847
+ We don't want to use min-height with flexbox because we leverage min-height:auto,
848
+ which yields value based on natural height of events
849
+ */
850
+ function computeRowBasis(visibleWidth, // should INCLUDE any scrollbar width to avoid oscillation
851
+ rowCnt, isHeightAuto, options) {
809
852
  if (visibleWidth != null) {
810
853
  // ensure a consistent row min-height modelled after a month with 6 rows respecting aspectRatio
811
854
  // will result in same minHeight regardless of weekends, dayMinWidth, height:auto
812
- const rowMinHeight = visibleWidth / options.aspectRatio / 6;
813
- return [
814
- forPrint
815
- // special-case for print, which condenses whole-page width without notifying
816
- // this is value that looks natural on paper for portrait/landscape
817
- ? '6em'
818
- // don't give minHeight when single-month non-auto-height
819
- // TODO: better way to detect this with DateProfile?
820
- : (rowCnt > 6 || isHeightAuto)
821
- ? rowMinHeight
822
- : undefined,
823
- // isCompact?: just before most lone +more links hit bottom of cell
824
- rowMinHeight < 70,
825
- ];
855
+ const rowBasis = visibleWidth / options.aspectRatio / 6;
856
+ // don't give minHeight when single-month non-auto-height
857
+ // TODO: better way to detect this with DateProfile?
858
+ return (rowCnt > 6 || isHeightAuto) ? rowBasis : 0;
826
859
  }
827
- return [undefined, false];
860
+ return 0;
861
+ }
862
+ /*
863
+ Infers cell height based on overall width
864
+ */
865
+ function computeRowIsCompact(visibleWidth, // should INCLUDE any scrollbar width to avoid oscillation
866
+ options) {
867
+ if (visibleWidth != null) {
868
+ // ensure a consistent row min-height modelled after a month with 6 rows respecting aspectRatio
869
+ // will result in same minHeight regardless of weekends, dayMinWidth, height:auto
870
+ const rowBasis = visibleWidth / options.aspectRatio / 6;
871
+ return rowBasis < 70;
872
+ }
873
+ return false;
828
874
  }
829
875
 
830
876
  class DayGridHeaderCell extends internal$1.BaseComponent {
@@ -848,14 +894,16 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
848
894
  render() {
849
895
  const { props } = this;
850
896
  const { renderConfig, dataConfig } = props;
851
- return (preact.createElement(internal$1.ContentContainer, { tag: 'div', attrs: dataConfig.attrs, className: internal$1.joinClassNames(dataConfig.className, 'fc-header-cell fc-cell fc-flex-col fc-align-center', props.borderStart && 'fc-border-s', !props.isSticky && 'fc-crop', props.colWidth == null && 'fc-liquid'), style: {
897
+ // HACK
898
+ const isDisabled = dataConfig.renderProps.isDisabled;
899
+ return (preact.createElement(internal$1.ContentContainer, { tag: 'div', attrs: Object.assign({ role: 'columnheader', 'aria-colspan': dataConfig.colSpan }, dataConfig.attrs), className: internal$1.joinClassNames('fc-header-cell fc-cell fc-flex-col fc-align-center', props.borderStart && 'fc-border-s', !props.isSticky && 'fc-crop', props.colWidth == null && 'fc-liquid', dataConfig.className), style: {
852
900
  width: props.colWidth != null
853
901
  ? props.colWidth * (dataConfig.colSpan || 1)
854
902
  : undefined,
855
903
  }, renderProps: dataConfig.renderProps, generatorName: renderConfig.generatorName, customGenerator: renderConfig.customGenerator, defaultGenerator: internal$1.renderText, classNameGenerator:
856
904
  // don't use custom classNames if disabled
857
905
  // TODO: make DRY with DayCellContainer
858
- dataConfig.renderProps.isDisabled ? undefined : renderConfig.classNameGenerator, didMount: renderConfig.didMount, willUnmount: renderConfig.willUnmount }, (InnerContainer) => (!dataConfig.renderProps.isDisabled && (preact.createElement(InnerContainer, { tag: dataConfig.isNavLink ? 'a' : 'div', attrs: dataConfig.innerAttrs, className: internal$1.joinClassNames('fc-cell-inner fc-flex-col fc-padding-sm', props.isSticky && 'fc-sticky-s'), elRef: this.handleInnerEl })))));
906
+ isDisabled ? undefined : renderConfig.classNameGenerator, didMount: renderConfig.didMount, willUnmount: renderConfig.willUnmount }, (InnerContainer) => (preact.createElement(InnerContainer, { tag: 'div', attrs: dataConfig.innerAttrs, className: internal$1.joinClassNames('fc-cell-inner fc-flex-col fc-padding-sm', props.isSticky && 'fc-sticky-s'), elRef: this.handleInnerEl }))));
859
907
  }
860
908
  }
861
909
 
@@ -880,7 +928,10 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
880
928
  }
881
929
  render() {
882
930
  const { props } = this;
883
- return (preact.createElement("div", { role: 'row', className: internal$1.joinClassNames('fc-flex-row fc-content-box', props.className), style: { height: props.height } }, props.dataConfigs.map((dataConfig, cellI) => (preact.createElement(DayGridHeaderCell, { key: dataConfig.key, renderConfig: props.renderConfig, dataConfig: dataConfig, isSticky: props.isSticky, borderStart: Boolean(cellI), colWidth: props.colWidth, innerHeightRef: props.innerHeightRef })))));
931
+ return (preact.createElement("div", { role: props.role /* !!! */, "aria-rowindex": props.rowIndex != null ? 1 + props.rowIndex : undefined, className: internal$1.joinClassNames('fc-flex-row fc-content-box', props.className), style: { height: props.height } }, props.dataConfigs.map((dataConfig, cellI) => (preact.createElement(DayGridHeaderCell, { key: dataConfig.key, renderConfig: props.renderConfig, dataConfig: dataConfig, isSticky: props.isSticky, borderStart: Boolean(cellI), colWidth: props.colWidth, innerHeightRef: props.innerHeightRef })))));
932
+ }
933
+ componentWillUnmount() {
934
+ internal$1.setRef(this.props.innerHeightRef, null);
884
935
  }
885
936
  }
886
937
 
@@ -890,9 +941,9 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
890
941
  class DayGridHeader extends internal$1.BaseComponent {
891
942
  render() {
892
943
  const { props } = this;
893
- return (preact.createElement("div", { className: internal$1.joinClassNames(props.className, 'fc-flex-col', props.width == null && 'fc-liquid'), style: {
944
+ return (preact.createElement("div", { role: 'rowgroup', className: internal$1.joinClassNames(props.className, 'fc-flex-col', props.width == null && 'fc-liquid'), style: {
894
945
  width: props.width
895
- } }, props.headerTiers.map((rowConfig, tierNum) => (preact.createElement(DayGridHeaderRow, Object.assign({}, rowConfig, { key: tierNum, className: tierNum ? 'fc-border-t' : '', colWidth: props.colWidth }))))));
946
+ } }, props.headerTiers.map((rowConfig, tierNum) => (preact.createElement(DayGridHeaderRow, Object.assign({}, rowConfig, { key: tierNum, role: 'row', className: tierNum ? 'fc-border-t' : '', colWidth: props.colWidth }))))));
896
947
  }
897
948
  }
898
949
 
@@ -902,37 +953,39 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
902
953
  this.handleScroller = (scroller) => {
903
954
  internal$1.setRef(this.props.scrollerRef, scroller);
904
955
  };
956
+ this.handleTotalWidth = (totalWidth) => {
957
+ this.setState({ totalWidth });
958
+ };
905
959
  this.handleClientWidth = (clientWidth) => {
906
960
  this.setState({ clientWidth });
907
961
  };
908
- this.handleEndScrollbarWidth = (endScrollbarWidth) => {
909
- this.setState({ endScrollbarWidth });
910
- };
911
962
  }
912
963
  render() {
913
964
  const { props, state, context } = this;
914
965
  const { options } = context;
966
+ const { totalWidth, clientWidth } = state;
967
+ const endScrollbarWidth = (totalWidth != null && clientWidth != null)
968
+ ? totalWidth - clientWidth
969
+ : undefined;
915
970
  const verticalScrollbars = !props.forPrint && !internal$1.getIsHeightAuto(options);
916
971
  const stickyHeaderDates = !props.forPrint && internal$1.getStickyHeaderDates(options);
917
972
  return (preact.createElement(preact.Fragment, null,
918
973
  options.dayHeaders && (preact.createElement("div", { className: internal$1.joinClassNames(props.forPrint ? 'fc-print-header' : 'fc-flex-row', // col for print, row for screen
919
- 'fc-border-b') },
920
- preact.createElement(DayGridHeader, { headerTiers: props.headerTiers, className: internal$1.joinClassNames('fc-daygrid-header', stickyHeaderDates && 'fc-table-header-sticky') }),
921
- Boolean(state.endScrollbarWidth) && (preact.createElement("div", { className: 'fc-border-s fc-filler', style: { minWidth: state.endScrollbarWidth } })))),
922
- preact.createElement(internal$1.Scroller, { vertical: verticalScrollbars, clientWidthRef: this.handleClientWidth, endScrollbarWidthRef: this.handleEndScrollbarWidth, className: internal$1.joinClassNames('fc-daygrid-body',
974
+ stickyHeaderDates && 'fc-table-header-sticky', 'fc-border-b') },
975
+ preact.createElement(DayGridHeader, { headerTiers: props.headerTiers, className: 'fc-daygrid-header' }),
976
+ Boolean(endScrollbarWidth) && (preact.createElement("div", { className: 'fc-border-s fc-filler', style: { minWidth: endScrollbarWidth } })))),
977
+ preact.createElement(internal$1.Scroller, { vertical: verticalScrollbars, className: internal$1.joinClassNames('fc-daygrid-body',
923
978
  // HACK for Safari. Can't do break-inside:avoid with flexbox items, likely b/c it's not standard:
924
979
  // https://stackoverflow.com/a/60256345
925
- !props.forPrint && 'fc-flex-col', verticalScrollbars && 'fc-liquid'), ref: this.handleScroller },
980
+ !props.forPrint && 'fc-flex-col', verticalScrollbars && 'fc-liquid'), ref: this.handleScroller, clientWidthRef: this.handleClientWidth },
926
981
  preact.createElement(DayGridRows, { dateProfile: props.dateProfile, todayRange: props.todayRange, cellRows: props.cellRows, forPrint: props.forPrint, isHitComboAllowed: props.isHitComboAllowed, className: 'fc-grow', dayMaxEvents: props.forPrint ? undefined : options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows,
927
982
  // content
928
983
  fgEventSegs: props.fgEventSegs, bgEventSegs: props.bgEventSegs, businessHourSegs: props.businessHourSegs, dateSelectionSegs: props.dateSelectionSegs, eventDrag: props.eventDrag, eventResize: props.eventResize, eventSelection: props.eventSelection,
929
984
  // dimensions
930
- visibleWidth: // TODO: DRY
931
- state.clientWidth != null && state.endScrollbarWidth != null
932
- ? state.clientWidth + state.endScrollbarWidth
933
- : undefined,
985
+ visibleWidth: totalWidth,
934
986
  // refs
935
- rowHeightRefMap: props.rowHeightRefMap }))));
987
+ rowHeightRefMap: props.rowHeightRefMap })),
988
+ preact.createElement(internal$1.Ruler, { widthRef: this.handleTotalWidth })));
936
989
  }
937
990
  }
938
991
 
@@ -944,43 +997,45 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
944
997
  this.footerScrollerRef = preact.createRef();
945
998
  // Sizing
946
999
  // -----------------------------------------------------------------------------------------------
1000
+ this.handleTotalWidth = (totalWidth) => {
1001
+ this.setState({ totalWidth });
1002
+ };
947
1003
  this.handleClientWidth = (clientWidth) => {
948
1004
  this.setState({ clientWidth });
949
1005
  };
950
- this.handleEndScrollbarWidth = (endScrollbarWidth) => {
951
- this.setState({ endScrollbarWidth });
952
- };
953
1006
  }
954
1007
  render() {
955
1008
  const { props, state, context } = this;
956
1009
  const { options } = context;
1010
+ const { totalWidth, clientWidth } = state;
1011
+ const endScrollbarWidth = (totalWidth != null && clientWidth != null)
1012
+ ? totalWidth - clientWidth
1013
+ : undefined;
957
1014
  const verticalScrollbars = !props.forPrint && !internal$1.getIsHeightAuto(options);
958
1015
  const stickyHeaderDates = !props.forPrint && internal$1.getStickyHeaderDates(options);
959
1016
  const stickyFooterScrollbar = !props.forPrint && internal$1.getStickyFooterScrollbar(options);
960
1017
  const colCnt = props.cellRows[0].length;
961
- const [canvasWidth, colWidth] = computeColWidth(colCnt, props.dayMinWidth, state.clientWidth);
1018
+ const [canvasWidth, colWidth] = computeColWidth(colCnt, props.dayMinWidth, clientWidth);
962
1019
  return (preact.createElement(preact.Fragment, null,
963
- options.dayHeaders && (preact.createElement("div", { className: 'fc-print-header' },
964
- preact.createElement(internal$1.Scroller, { horizontal: true, hideScrollbars: true, className: internal$1.joinClassNames('fc-daygrid-header fc-flex-row fc-border-b', stickyHeaderDates && 'fc-table-header-sticky'), ref: this.headerScrollerRef },
1020
+ options.dayHeaders && (preact.createElement("div", { className: internal$1.joinClassNames('fc-print-header', stickyHeaderDates && 'fc-table-header-sticky') },
1021
+ preact.createElement(internal$1.Scroller, { horizontal: true, hideScrollbars: true, className: 'fc-daygrid-header fc-flex-row fc-border-b', ref: this.headerScrollerRef },
965
1022
  preact.createElement(DayGridHeader, { headerTiers: props.headerTiers, colWidth: colWidth, width: canvasWidth }),
966
- Boolean(state.endScrollbarWidth) && (preact.createElement("div", { className: 'fc-border-s fc-filler', style: { minWidth: state.endScrollbarWidth } }))))),
1023
+ Boolean(endScrollbarWidth) && (preact.createElement("div", { className: 'fc-border-s fc-filler', style: { minWidth: endScrollbarWidth } }))))),
967
1024
  preact.createElement(internal$1.Scroller, { vertical: verticalScrollbars, horizontal: true, hideScrollbars: stickyFooterScrollbar ||
968
1025
  props.forPrint // prevents blank space in print-view on Safari
969
1026
  , className: internal$1.joinClassNames('fc-daygrid-body',
970
1027
  // HACK for Safari. Can't do break-inside:avoid with flexbox items, likely b/c it's not standard:
971
1028
  // https://stackoverflow.com/a/60256345
972
- !props.forPrint && 'fc-flex-col', verticalScrollbars && 'fc-liquid'), ref: this.bodyScrollerRef, clientWidthRef: this.handleClientWidth, endScrollbarWidthRef: this.handleEndScrollbarWidth },
1029
+ !props.forPrint && 'fc-flex-col', verticalScrollbars && 'fc-liquid'), ref: this.bodyScrollerRef, clientWidthRef: this.handleClientWidth },
973
1030
  preact.createElement(DayGridRows, { dateProfile: props.dateProfile, todayRange: props.todayRange, cellRows: props.cellRows, forPrint: props.forPrint, isHitComboAllowed: props.isHitComboAllowed, className: 'fc-grow', dayMaxEvents: props.forPrint ? undefined : options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows,
974
1031
  // content
975
1032
  fgEventSegs: props.fgEventSegs, bgEventSegs: props.bgEventSegs, businessHourSegs: props.businessHourSegs, dateSelectionSegs: props.dateSelectionSegs, eventDrag: props.eventDrag, eventResize: props.eventResize, eventSelection: props.eventSelection,
976
1033
  // dimensions
977
- colWidth: colWidth, width: canvasWidth, visibleWidth: // TODO: DRY
978
- state.clientWidth != null && state.endScrollbarWidth != null
979
- ? state.clientWidth + state.endScrollbarWidth
980
- : undefined,
1034
+ colWidth: colWidth, width: canvasWidth, visibleWidth: totalWidth,
981
1035
  // refs
982
1036
  rowHeightRefMap: props.rowHeightRefMap })),
983
- Boolean(stickyFooterScrollbar) && (preact.createElement(internal$1.StickyFooterScrollbar, { canvasWidth: canvasWidth, scrollerRef: this.footerScrollerRef }))));
1037
+ Boolean(stickyFooterScrollbar) && (preact.createElement(internal$1.FooterScrollbar, { isSticky: true, canvasWidth: canvasWidth, scrollerRef: this.footerScrollerRef })),
1038
+ preact.createElement(internal$1.Ruler, { widthRef: this.handleTotalWidth })));
984
1039
  }
985
1040
  // Lifecycle
986
1041
  // -----------------------------------------------------------------------------------------------
@@ -1035,21 +1090,29 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
1035
1090
  }
1036
1091
  }
1037
1092
  };
1038
- this.clearScroll = () => {
1039
- this.scrollDate = null;
1093
+ this.handleScrollEnd = (isUser) => {
1094
+ if (isUser) {
1095
+ this.scrollDate = null;
1096
+ }
1040
1097
  };
1041
1098
  }
1042
1099
  render() {
1043
1100
  const { props, context } = this;
1044
1101
  const { options } = context;
1045
1102
  const commonLayoutProps = Object.assign(Object.assign({}, props), { scrollerRef: this.scrollerRef, rowHeightRefMap: this.rowHeightRefMap });
1046
- return (preact.createElement(internal$1.ViewContainer, { viewSpec: context.viewSpec, className: internal$1.joinClassNames(props.className, 'fc-print-root fc-border') }, options.dayMinWidth ? (preact.createElement(DayGridLayoutPannable, Object.assign({}, commonLayoutProps, { dayMinWidth: options.dayMinWidth }))) : (preact.createElement(DayGridLayoutNormal, Object.assign({}, commonLayoutProps)))));
1103
+ return (preact.createElement(internal$1.ViewContainer, { viewSpec: context.viewSpec, attrs: {
1104
+ role: 'grid',
1105
+ 'aria-rowcount': props.headerTiers.length + props.cellRows.length,
1106
+ 'aria-colcount': props.cellRows[0].length,
1107
+ 'aria-labelledby': props.labelId,
1108
+ 'aria-label': props.labelStr,
1109
+ }, className: internal$1.joinClassNames(props.className, 'fc-print-root fc-border') }, options.dayMinWidth ? (preact.createElement(DayGridLayoutPannable, Object.assign({}, commonLayoutProps, { dayMinWidth: options.dayMinWidth }))) : (preact.createElement(DayGridLayoutNormal, Object.assign({}, commonLayoutProps)))));
1047
1110
  }
1048
1111
  // Lifecycle
1049
1112
  // -----------------------------------------------------------------------------------------------
1050
1113
  componentDidMount() {
1051
1114
  this.resetScroll();
1052
- this.scrollerRef.current.addScrollEndListener(this.clearScroll);
1115
+ this.scrollerRef.current.addScrollEndListener(this.handleScrollEnd);
1053
1116
  }
1054
1117
  componentDidUpdate(prevProps) {
1055
1118
  if (prevProps.dateProfile !== this.props.dateProfile && this.context.options.scrollTimeReset) {
@@ -1057,14 +1120,13 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
1057
1120
  }
1058
1121
  }
1059
1122
  componentWillUnmount() {
1060
- this.scrollerRef.current.removeScrollEndListener(this.clearScroll);
1123
+ this.scrollerRef.current.removeScrollEndListener(this.handleScrollEnd);
1061
1124
  }
1062
1125
  // Scrolling
1063
1126
  // -----------------------------------------------------------------------------------------------
1064
1127
  resetScroll() {
1065
1128
  this.scrollDate = this.props.dateProfile.currentDate;
1066
1129
  this.updateScrollY();
1067
- // updateScrollX
1068
1130
  const scroller = this.scrollerRef.current;
1069
1131
  scroller.scrollTo({ x: 0 });
1070
1132
  }
@@ -1089,7 +1151,7 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
1089
1151
  const slicedProps = this.slicer.sliceProps(props, props.dateProfile, options.nextDayThreshold, context, dayTableModel);
1090
1152
  return (preact.createElement(internal$1.NowTimer, { unit: "day" }, (nowDate, todayRange) => {
1091
1153
  const headerTiers = this.buildDateRowConfigs(dayTableModel.headerDates, datesRepDistinctDays, props.dateProfile, todayRange, dayHeaderFormat, context);
1092
- return (preact.createElement(DayGridLayout, { dateProfile: props.dateProfile, todayRange: todayRange, cellRows: dayTableModel.cellRows, forPrint: props.forPrint, className: 'fc-daygrid',
1154
+ return (preact.createElement(DayGridLayout, { labelId: props.labelId, labelStr: props.labelStr, dateProfile: props.dateProfile, todayRange: todayRange, cellRows: dayTableModel.cellRows, forPrint: props.forPrint, className: 'fc-daygrid',
1093
1155
  // header content
1094
1156
  headerTiers: headerTiers,
1095
1157
  // body content
@@ -1136,7 +1198,7 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
1136
1198
  return { start, end };
1137
1199
  }
1138
1200
 
1139
- var css_248z = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc-daygrid-day-header{display:flex;flex-direction:row-reverse}.fc-day-other .fc-daygrid-day-header{opacity:.3}.fc-daygrid-day-number{padding:4px;position:relative}.fc-daygrid-month-start{font-size:1.1em;font-weight:700}.fc-daygrid-day-body{display:flex;flex-direction:column;margin-bottom:1px}.fc-daygrid-day-body-tall{margin-bottom:1em;min-height:2em}.fc-daygrid-day-body:only-child{margin-top:2px}.fc-daygrid-more-link{border-radius:3px;cursor:pointer;font-size:var(--fc-small-font-size);margin:0 2px 1px;max-width:100%;overflow:hidden;padding:2px;position:relative;white-space:nowrap}.fc-daygrid-more-link:hover{background-color:rgba(0,0,0,.1)}.fc-daygrid-more-link-button{align-self:flex-start}.fc-daygrid-more-link-block{border:1px solid var(--fc-event-border-color);padding:1px}.fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0}.fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);margin-bottom:1px}.fc-media-print .fc-daygrid-event{overflow:hidden!important;white-space:nowrap!important}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.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-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;direction:row;display:flex;padding:2px 0;position:relative;z-index:2}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-daygrid-dot-event .fc-event-time,.fc-daygrid-dot-event .fc-event-title{overflow:hidden;white-space:nowrap}.fc-daygrid-dot-event .fc-event-title{flex-basis:0;flex-grow:1;font-weight:700;min-height:0;min-width:0}";
1201
+ var css_248z = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-row-print{min-height:6em}.fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc-daygrid-day-header{display:flex;flex-direction:row-reverse}.fc-day-other .fc-daygrid-day-header{opacity:.3}.fc-daygrid-day-number{padding:4px;position:relative}.fc-daygrid-month-start{font-size:1.1em;font-weight:700}.fc-daygrid-day-body{display:flex;flex-direction:column;margin-bottom:1px}.fc-daygrid-day-body-tall{margin-bottom:1em;min-height:2em}.fc-daygrid-day-body:only-child{margin-top:2px}.fc-daygrid-more-link{border-radius:3px;cursor:pointer;font-size:var(--fc-small-font-size);margin:0 2px 1px;max-width:100%;overflow:hidden;padding:2px;position:relative;white-space:nowrap}.fc-daygrid-more-link:hover{background-color:rgba(0,0,0,.1)}.fc-daygrid-more-link-button{align-self:flex-start}.fc-daygrid-more-link-block{border:1px solid var(--fc-event-border-color);padding:1px}.fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:1}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px}.fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);margin-bottom:1px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.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-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;direction:row;display:flex;padding:2px 0;position:relative}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-daygrid-dot-event .fc-event-time,.fc-daygrid-dot-event .fc-event-title{overflow:hidden;white-space:nowrap}.fc-media-print .fc-daygrid-dot-event .fc-event-time,.fc-media-print .fc-daygrid-dot-event .fc-event-title{overflow:hidden!important;white-space:nowrap!important}.fc-daygrid-dot-event .fc-event-title{flex-basis:0;flex-grow:1;font-weight:700;min-height:0;min-width:0}";
1140
1202
  internal$1.injectStyles(css_248z);
1141
1203
 
1142
1204
  var plugin = core.createPlugin({
@@ -1180,7 +1242,8 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
1180
1242
  buildDateDataConfigs: buildDateDataConfigs,
1181
1243
  createDayHeaderFormatter: createDayHeaderFormatter,
1182
1244
  DayGridLayout: DayGridLayout,
1183
- computeRowHeight: computeRowHeight,
1245
+ computeRowBasis: computeRowBasis,
1246
+ computeRowIsCompact: computeRowIsCompact,
1184
1247
  DayGridRow: DayGridRow,
1185
1248
  DayGridRows: DayGridRows,
1186
1249
  buildDayTableModel: buildDayTableModel,