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