@fullcalendar/timeline 7.0.0-beta.1 → 7.0.0-beta.3

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.js CHANGED
@@ -1,4 +1,4 @@
1
- import { config, createFormatter, greatestDurationDenominator, asCleanDays, createDuration, wholeDivideDurations, asRoughMs, addDays, startOfDay, asRoughSeconds, asRoughMinutes, diffWholeDays, isInt, computeVisibleDayRange, padStart, BaseComponent, getDateMeta, ContentContainer, getDayClassNames, getSlotClassNames, watchWidth, setRef, RefMap, afterSize, SegHierarchy, groupIntersectingEntries, buildEventRangeKey, BgEvent, getEventRangeMeta, renderFill, Slicer, intersectRanges, addMs, StandardEvent, MoreLinkContainer, watchHeight, memoize, sortEventSegs, memoizeObjArg, watchSize, buildNavLinkAttrs, NowIndicatorContainer, DateComponent, getIsHeightAuto, getStickyHeaderDates, getStickyFooterScrollbar, NowTimer, rangeContainsMarker, ViewContainer, Scroller, multiplyDuration, injectStyles } from '@fullcalendar/core/internal.js';
1
+ import { config, createFormatter, greatestDurationDenominator, asCleanDays, createDuration, wholeDivideDurations, asRoughMs, addDays, startOfDay, asRoughSeconds, asRoughMinutes, diffWholeDays, isInt, computeVisibleDayRange, padStart, BaseComponent, getDateMeta, ContentContainer, joinClassNames, getDayClassName, getSlotClassName, watchWidth, setRef, RefMap, afterSize, getEventKey, SegHierarchy, groupIntersectingSegs, buildEventRangeKey, BgEvent, getEventRangeMeta, renderFill, Slicer, intersectRanges, addMs, StandardEvent, MoreLinkContainer, watchHeight, memoize, sortEventSegs, memoizeObjArg, watchSize, buildNavLinkAttrs, NowIndicatorContainer, DateComponent, getIsHeightAuto, getStickyHeaderDates, getStickyFooterScrollbar, NowTimer, rangeContainsMarker, ViewContainer, Scroller, multiplyDuration, injectStyles } from '@fullcalendar/core/internal.js';
2
2
  import { createRef, createElement, Fragment, Component } from '@fullcalendar/core/preact.js';
3
3
  import { ScrollerSyncer } from '@fullcalendar/scrollgrid/internal.js';
4
4
 
@@ -448,42 +448,35 @@ class TimelineSlatCell extends BaseComponent {
448
448
  }
449
449
  render() {
450
450
  let { props, context } = this;
451
- let { dateEnv, options, theme } = context;
451
+ let { dateEnv, options } = context;
452
452
  let { date, tDateProfile, isEm } = props;
453
453
  let dateMeta = getDateMeta(props.date, props.todayRange, props.nowDate, props.dateProfile);
454
454
  let renderProps = Object.assign(Object.assign({ date: dateEnv.toDate(props.date) }, dateMeta), { view: context.viewApi });
455
- return (createElement(ContentContainer, { elTag: "div", elClasses: [
456
- 'fc-flex-column',
457
- 'fc-align-start',
458
- 'fc-cell',
459
- 'fc-timeline-slot',
460
- 'fc-timeline-slot-lane',
461
- isEm ? 'fc-timeline-slot-em' : '',
462
- tDateProfile.isTimeScale ? (isInt(dateEnv.countDurationsBetween(// best to do this here?
463
- tDateProfile.normalizedRange.start, props.date, tDateProfile.labelInterval)) ?
464
- 'fc-timeline-slot-major' :
465
- 'fc-timeline-slot-minor') : '',
466
- ...(props.isDay ?
467
- getDayClassNames(dateMeta, theme) :
468
- getSlotClassNames(dateMeta, theme)),
469
- ], elAttrs: {
455
+ return (createElement(ContentContainer, { tag: "div",
456
+ // fc-align-start shrinks width of InnerContent
457
+ // TODO: document this semantic className fc-timeline-slot-em
458
+ className: joinClassNames('fc-timeline-slot', isEm && 'fc-timeline-slot-em', tDateProfile.isTimeScale && (isInt(dateEnv.countDurationsBetween(// best to do this here?
459
+ tDateProfile.normalizedRange.start, props.date, tDateProfile.labelInterval)) ?
460
+ 'fc-timeline-slot-major' :
461
+ 'fc-timeline-slot-minor'), 'fc-timeline-slot-lane fc-cell fc-flex-col fc-align-start', props.borderStart && 'fc-border-s', props.isDay ?
462
+ getDayClassName(dateMeta) :
463
+ getSlotClassName(dateMeta)), attrs: {
470
464
  'data-date': dateEnv.formatIso(date, {
471
465
  omitTimeZoneOffset: true,
472
466
  omitTime: !tDateProfile.isTimeScale,
473
467
  }),
474
- }, elStyle: {
468
+ }, style: {
475
469
  width: props.width,
476
- }, renderProps: renderProps, generatorName: "slotLaneContent", customGenerator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }, (InnerContent) => (createElement("div", { ref: this.innerElRef, className: 'fc-flex-column' },
477
- createElement(InnerContent, { elTag: "div", elClasses: ['fc-cell-inner'] })))));
470
+ }, renderProps: renderProps, generatorName: "slotLaneContent", customGenerator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }, (InnerContent) => (createElement(InnerContent, { tag: "div", className: 'fc-cell-inner', elRef: this.innerElRef }))));
478
471
  }
479
472
  componentDidMount() {
480
473
  const innerEl = this.innerElRef.current;
481
- this.detachWidth = watchWidth(innerEl, (width) => {
474
+ this.disconnectInnerWidth = watchWidth(innerEl, (width) => {
482
475
  setRef(this.props.innerWidthRef, width);
483
476
  });
484
477
  }
485
478
  componentWillUnmount() {
486
- this.detachWidth();
479
+ this.disconnectInnerWidth();
487
480
  setRef(this.props.innerWidthRef, null);
488
481
  }
489
482
  }
@@ -509,9 +502,9 @@ class TimelineSlats extends BaseComponent {
509
502
  let { tDateProfile, slotWidth } = props;
510
503
  let { slotDates, isWeekStarts } = tDateProfile;
511
504
  let isDay = !tDateProfile.isTimeScale && !tDateProfile.largeUnit;
512
- return (createElement("div", { className: "fc-timeline-slots fc-fill fc-flex-row" }, slotDates.map((slotDate, i) => {
505
+ return (createElement("div", { className: "fc-timeline-slots fc-fill fc-flex-row", style: { height: props.height } }, slotDates.map((slotDate, i) => {
513
506
  let key = slotDate.toISOString();
514
- return (createElement(TimelineSlatCell, { key: key, date: slotDate, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isEm: isWeekStarts[i], isDay: isDay,
507
+ return (createElement(TimelineSlatCell, { key: key, date: slotDate, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isEm: isWeekStarts[i], isDay: isDay, borderStart: Boolean(i),
515
508
  // ref
516
509
  innerWidthRef: innerWidthRefMap.createRef(key),
517
510
  // dimensions
@@ -545,30 +538,6 @@ function computeDateSnapCoverage$1(date, tDateProfile, dateEnv) {
545
538
  return snapCoverage;
546
539
  }
547
540
  /*
548
- TODO: audit!!!
549
- */
550
- function coordToCss(hcoord, isRtl) {
551
- if (hcoord === null) {
552
- return { left: '', right: '' };
553
- }
554
- if (isRtl) {
555
- return { right: hcoord, left: '' };
556
- }
557
- return { left: hcoord, right: '' };
558
- }
559
- /*
560
- TODO: audit!!!
561
- */
562
- function coordsToCss(hcoords, isRtl) {
563
- if (!hcoords) {
564
- return { left: '', right: '' };
565
- }
566
- if (isRtl) {
567
- return { right: hcoords.start, left: -hcoords.end };
568
- }
569
- return { left: hcoords.start, right: -hcoords.end };
570
- }
571
- /*
572
541
  TODO: DRY up with elsewhere?
573
542
  */
574
543
  function horizontalsToCss(hcoord, isRtl) {
@@ -599,7 +568,8 @@ function createVerticalStyle(props) {
599
568
  };
600
569
  }
601
570
  }
602
- function createHorizontalStyle(props, isRtl) {
571
+ function createHorizontalStyle(// TODO: DRY up?
572
+ props, isRtl) {
603
573
  if (props) {
604
574
  return {
605
575
  [isRtl ? 'right' : 'left']: props.start,
@@ -672,13 +642,13 @@ function computeDateSnapCoverage(date, tDateProfile, dateEnv) {
672
642
  function computeManySegHorizontals(segs, segMinWidth, dateEnv, tDateProfile, slotWidth) {
673
643
  const res = {};
674
644
  for (const seg of segs) {
675
- res[seg.eventRange.instance.instanceId] = computeSegHorizontals(seg, segMinWidth, dateEnv, tDateProfile, slotWidth);
645
+ res[getEventKey(seg)] = computeSegHorizontals(seg, segMinWidth, dateEnv, tDateProfile, slotWidth);
676
646
  }
677
647
  return res;
678
648
  }
679
649
  function computeSegHorizontals(seg, segMinWidth, dateEnv, tDateProfile, slotWidth) {
680
- const startCoord = dateToCoord(seg.start, dateEnv, tDateProfile, slotWidth);
681
- const endCoord = dateToCoord(seg.end, dateEnv, tDateProfile, slotWidth);
650
+ const startCoord = dateToCoord(seg.startDate, dateEnv, tDateProfile, slotWidth);
651
+ const endCoord = dateToCoord(seg.endDate, dateEnv, tDateProfile, slotWidth);
682
652
  let size = endCoord - startCoord;
683
653
  if (segMinWidth) {
684
654
  size = Math.max(size, segMinWidth);
@@ -686,95 +656,58 @@ function computeSegHorizontals(seg, segMinWidth, dateEnv, tDateProfile, slotWidt
686
656
  return { start: startCoord, size };
687
657
  }
688
658
  function computeFgSegPlacements(// mostly horizontals
689
- segs, segHorizontals, segHeights, // keyed by instanceId
690
- strictOrder, maxStackCnt) {
691
- let segEntries = [];
692
- for (let i = 0; i < segs.length; i += 1) {
693
- let seg = segs[i];
694
- let instanceId = seg.eventRange.instance.instanceId;
695
- let height = segHeights.get(instanceId);
696
- let hcoords = segHorizontals[instanceId];
697
- if (height != null && hcoords != null) {
698
- segEntries.push({
699
- index: i,
700
- seg,
701
- span: {
702
- start: hcoords.start,
703
- end: hcoords.start + hcoords.size,
704
- },
705
- thickness: height,
706
- });
659
+ segs, segHorizontals, // TODO: use Map
660
+ segHeights, // keyed by instanceId
661
+ hiddenGroupHeights, strictOrder, maxDepth) {
662
+ const segRanges = [];
663
+ // isn't it true that there will either be ALL hcoords or NONE? can optimize
664
+ for (const seg of segs) {
665
+ const hcoords = segHorizontals[getEventKey(seg)];
666
+ if (hcoords) {
667
+ segRanges.push(Object.assign(Object.assign({}, seg), { start: hcoords.start, end: hcoords.start + hcoords.size }));
707
668
  }
708
669
  }
709
- let hierarchy = new SegHierarchy();
710
- if (strictOrder != null) {
711
- hierarchy.strictOrder = strictOrder;
712
- }
713
- if (maxStackCnt != null) {
714
- hierarchy.maxStackCnt = maxStackCnt;
715
- }
716
- let hiddenEntries = hierarchy.addSegs(segEntries);
717
- let hiddenGroups = groupIntersectingEntries(hiddenEntries);
718
- let hiddenGroupEntries = hiddenGroups.map((hiddenGroup, index) => ({
719
- index: segs.length + index,
720
- segGroup: hiddenGroup,
721
- span: hiddenGroup.span,
722
- thickness: 1, // HACK to ensure it's placed
723
- }));
724
- // add more-links into the hierarchy, but don't limit
725
- hierarchy.maxStackCnt = -1;
726
- hierarchy.addSegs(hiddenGroupEntries);
727
- let visibleRects = hierarchy.toRects();
728
- let segTops = {};
729
- let hiddenGroupTops = {};
730
- for (let rect of visibleRects) {
731
- const { seg, segGroup } = rect;
732
- if (seg) { // regular seg
733
- segTops[seg.eventRange.instance.instanceId] = rect.levelCoord;
734
- }
735
- else { // hiddenGroup
736
- hiddenGroupTops[segGroup.key] = rect.levelCoord;
670
+ const hierarchy = new SegHierarchy(segRanges, (seg) => segHeights.get(getEventKey(seg)), strictOrder, undefined, // maxCoord
671
+ maxDepth);
672
+ const segTops = new Map();
673
+ hierarchy.traverseSegs((seg, segTop) => {
674
+ segTops.set(getEventKey(seg), segTop);
675
+ });
676
+ const { hiddenSegs } = hierarchy;
677
+ let totalHeight = 0;
678
+ for (const segRange of segRanges) {
679
+ const segKey = getEventKey(segRange);
680
+ const segHeight = segHeights.get(segKey);
681
+ const segTop = segTops.get(segKey);
682
+ if (segHeight != null) {
683
+ if (segTop != null) {
684
+ totalHeight = Math.max(totalHeight, segTop + segHeight);
685
+ }
737
686
  }
738
687
  }
688
+ const hiddenGroups = groupIntersectingSegs(hiddenSegs);
689
+ const hiddenGroupTops = new Map();
690
+ // HACK for hiddenGroup findInsertion() call
691
+ hierarchy.strictOrder = true;
692
+ for (const hiddenGroup of hiddenGroups) {
693
+ const { levelCoord: top } = hierarchy.findInsertion(hiddenGroup, 0);
694
+ const hiddenGroupHeight = hiddenGroupHeights.get(hiddenGroup.key) || 0;
695
+ hiddenGroupTops.set(hiddenGroup.key, top);
696
+ totalHeight = Math.max(totalHeight, top + hiddenGroupHeight);
697
+ }
739
698
  return [
740
699
  segTops,
741
- computeMaxBottom(segs, segTops, segHeights),
742
700
  hiddenGroups,
743
701
  hiddenGroupTops,
702
+ totalHeight,
744
703
  ];
745
704
  }
746
- function computeMaxBottom(segs, segTops, segHeights) {
747
- let max = 0;
748
- for (const seg of segs) {
749
- const { instanceId } = seg.eventRange.instance;
750
- const top = segTops[instanceId];
751
- const height = segHeights.get(instanceId);
752
- if (top != null && height != null) {
753
- max = Math.max(max, top + height);
754
- }
755
- }
756
- return max;
757
- }
758
- /*
759
- TODO: converge with computeMaxBottom, but keys are different
760
- */
761
- function computeMoreLinkMaxBottom(hiddenGroups, hiddenGroupTops, hiddenGroupHeights) {
762
- let max = 0;
763
- for (const hiddenGroup of hiddenGroups) {
764
- const top = hiddenGroupTops[hiddenGroup.key];
765
- const height = hiddenGroupHeights.get(hiddenGroup.key);
766
- if (top != null && height != null) {
767
- max = Math.max(max, top + height);
768
- }
769
- }
770
- return max;
771
- }
772
705
 
773
706
  class TimelineLaneBg extends BaseComponent {
774
707
  render() {
775
708
  let { props } = this;
776
709
  let highlightSeg = [].concat(props.eventResizeSegs, props.dateSelectionSegs);
777
- return (createElement("div", { className: "fc-timeline-bg" },
710
+ return (createElement(Fragment, null,
778
711
  this.renderSegs(props.businessHourSegs || [], 'non-business'),
779
712
  this.renderSegs(props.bgEventSegs || [], 'bg-event'),
780
713
  this.renderSegs(highlightSeg, 'highlight')));
@@ -788,7 +721,7 @@ class TimelineLaneBg extends BaseComponent {
788
721
  let segHorizontal = computeSegHorizontals(seg, undefined, dateEnv, tDateProfile, slotWidth);
789
722
  hStyle = horizontalsToCss(segHorizontal, isRtl);
790
723
  }
791
- return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-timeline-bg-harness", style: hStyle }, fillType === 'bg-event' ?
724
+ return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-fill-y", style: hStyle }, fillType === 'bg-event' ?
792
725
  createElement(BgEvent, Object.assign({ eventRange: seg.eventRange, isStart: seg.isStart, isEnd: seg.isEnd }, getEventRangeMeta(seg.eventRange, todayRange, nowDate))) : (renderFill(fillType))));
793
726
  })));
794
727
  }
@@ -805,8 +738,8 @@ class TimelineLaneSlicer extends Slicer {
805
738
  let slicedRange = intersectRanges(normalRange, tDateProfile.normalizedRange);
806
739
  if (slicedRange) {
807
740
  segs.push({
808
- start: slicedRange.start,
809
- end: slicedRange.end,
741
+ startDate: slicedRange.start,
742
+ endDate: slicedRange.end,
810
743
  isStart: slicedRange.start.valueOf() === normalRange.start.valueOf()
811
744
  && isValidDate(slicedRange.start, tDateProfile, dateProfile, dateProfileGenerator),
812
745
  isEnd: slicedRange.end.valueOf() === normalRange.end.valueOf()
@@ -828,13 +761,8 @@ class TimelineEvent extends BaseComponent {
828
761
  render() {
829
762
  let { props, context } = this;
830
763
  let { options } = context;
831
- return (createElement(StandardEvent, Object.assign({}, props, { elClasses: [
832
- 'fc-timeline-event',
833
- 'fc-h-event',
834
- options.eventOverlap === false // TODO: fix bad default
835
- ? 'fc-timeline-event-spacious'
836
- : ''
837
- ], defaultTimeFormat: DEFAULT_TIME_FORMAT, defaultDisplayEventTime: !props.isTimeScale })));
764
+ return (createElement(StandardEvent, Object.assign({}, props, { className: joinClassNames('fc-timeline-event', options.eventOverlap === false // TODO: fix bad default
765
+ && 'fc-timeline-event-spacious', 'fc-h-event'), defaultTimeFormat: DEFAULT_TIME_FORMAT, defaultDisplayEventTime: !props.isTimeScale })));
838
766
  }
839
767
  }
840
768
 
@@ -842,13 +770,13 @@ class TimelineLaneMoreLink extends BaseComponent {
842
770
  render() {
843
771
  let { props } = this;
844
772
  let { hiddenSegs, resourceId, forcedInvisibleMap } = props;
845
- let extraDateSpan = resourceId ? { resourceId } : {};
846
- return (createElement(MoreLinkContainer, { elClasses: ['fc-timeline-more-link'], allDayDate: null, segs: hiddenSegs, hiddenSegs: hiddenSegs, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: extraDateSpan, popoverContent: () => (createElement(Fragment, null, hiddenSegs.map((seg) => {
773
+ let dateSpanProps = resourceId ? { resourceId } : {};
774
+ return (createElement(MoreLinkContainer, { className: 'fc-timeline-more-link', allDayDate: null, segs: hiddenSegs, hiddenSegs: hiddenSegs, dateProfile: props.dateProfile, todayRange: props.todayRange, dateSpanProps: dateSpanProps, popoverContent: () => (createElement(Fragment, null, hiddenSegs.map((seg) => {
847
775
  let { eventRange } = seg;
848
776
  let instanceId = eventRange.instance.instanceId;
849
777
  return (createElement("div", { key: instanceId, style: { visibility: forcedInvisibleMap[instanceId] ? 'hidden' : '' } },
850
778
  createElement(TimelineEvent, Object.assign({ isTimeScale: props.isTimeScale, eventRange: eventRange, isStart: seg.isStart, isEnd: seg.isEnd, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection }, getEventRangeMeta(eventRange, props.todayRange, props.nowDate)))));
851
- }))) }, (InnerContent) => (createElement(InnerContent, { elTag: "div", elClasses: ['fc-timeline-more-link-inner', 'fc-sticky-x'] }))));
779
+ }))) }, (InnerContent) => (createElement(InnerContent, { tag: "div", className: 'fc-timeline-more-link-inner fc-sticky-s' }))));
852
780
  }
853
781
  }
854
782
 
@@ -867,12 +795,12 @@ class TimelineEventHarness extends Component {
867
795
  }
868
796
  componentDidMount() {
869
797
  const rootEl = this.rootElRef.current; // TODO: make dynamic with useEffect
870
- this.detachHeight = watchHeight(rootEl, (height) => {
798
+ this.disconnectHeight = watchHeight(rootEl, (height) => {
871
799
  setRef(this.props.heightRef, height);
872
800
  });
873
801
  }
874
802
  componentWillUnmount() {
875
- this.detachHeight();
803
+ this.disconnectHeight();
876
804
  setRef(this.props.heightRef, null);
877
805
  }
878
806
  }
@@ -905,7 +833,7 @@ class TimelineLane extends BaseComponent {
905
833
  TODO: lots of memoization needed here!
906
834
  */
907
835
  render() {
908
- let { props, context, segHeightRefMap } = this;
836
+ let { props, context, segHeightRefMap, moreLinkHeightRefMap } = this;
909
837
  let { options } = context;
910
838
  let { dateProfile, tDateProfile } = props;
911
839
  let slicedProps = this.slicer.sliceProps(props, dateProfile, tDateProfile.isTimeScale ? null : props.nextDayThreshold, context, // wish we didn't have to pass in the rest of the args...
@@ -917,10 +845,7 @@ class TimelineLane extends BaseComponent {
917
845
  let fgSegHorizontals = props.slotWidth != null
918
846
  ? computeManySegHorizontals(fgSegs, options.eventMinWidth, context.dateEnv, tDateProfile, props.slotWidth)
919
847
  : {};
920
- let [fgSegTops, fgSegsBottom, hiddenGroups, hiddenGroupTops] = computeFgSegPlacements(// verticals
921
- fgSegs, fgSegHorizontals, segHeightRefMap.current, options.eventOrderStrict, options.eventMaxStack);
922
- let moreLinksBottom = computeMoreLinkMaxBottom(hiddenGroups, hiddenGroupTops, this.moreLinkHeightRefMap.current);
923
- let innerHeight = Math.max(moreLinksBottom, fgSegsBottom);
848
+ let [fgSegTops, hiddenGroups, hiddenGroupTops, totalHeight] = computeFgSegPlacements(fgSegs, fgSegHorizontals, segHeightRefMap.current, moreLinkHeightRefMap.current, options.eventOrderStrict, options.eventMaxStack);
924
849
  let forcedInvisibleMap = // TODO: more convenient/DRY
925
850
  (slicedProps.eventDrag ? slicedProps.eventDrag.affectedInstances : null) ||
926
851
  (slicedProps.eventResize ? slicedProps.eventResize.affectedInstances : null) ||
@@ -931,20 +856,18 @@ class TimelineLane extends BaseComponent {
931
856
  bgEventSegs: slicedProps.bgEventSegs, businessHourSegs: slicedProps.businessHourSegs, dateSelectionSegs: slicedProps.dateSelectionSegs, eventResizeSegs: slicedProps.eventResize ? slicedProps.eventResize.segs : [] /* bad new empty array? */,
932
857
  // dimensions
933
858
  slotWidth: props.slotWidth }),
934
- createElement("div", { className: [
935
- 'fc-timeline-events',
936
- 'fc-content-box',
937
- options.eventOverlap === false // TODO: fix bad default
938
- ? 'fc-timeline-events-overlap-disabled'
939
- : 'fc-timeline-events-overlap-enabled'
940
- ].join(' '), style: { height: innerHeight } },
859
+ createElement("div", { className: joinClassNames('fc-timeline-events', options.eventOverlap === false // TODO: fix bad default
860
+ ? 'fc-timeline-events-overlap-disabled'
861
+ : 'fc-timeline-events-overlap-enabled', 'fc-content-box'), style: { height: totalHeight } },
941
862
  this.renderFgSegs(fgSegs, fgSegHorizontals, fgSegTops, forcedInvisibleMap, hiddenGroups, hiddenGroupTops, false, // isDragging
942
863
  false, // isResizing
943
864
  false),
944
865
  this.renderFgSegs(mirrorSegs, props.slotWidth // TODO: memoize
945
866
  ? computeManySegHorizontals(mirrorSegs, options.eventMinWidth, context.dateEnv, tDateProfile, props.slotWidth)
946
867
  : {}, fgSegTops, {}, // forcedInvisibleMap
947
- [], {}, Boolean(slicedProps.eventDrag), Boolean(slicedProps.eventResize), false))));
868
+ [], // hiddenGroups
869
+ new Map(), // hiddenGroupTops
870
+ Boolean(slicedProps.eventDrag), Boolean(slicedProps.eventResize), false))));
948
871
  }
949
872
  renderFgSegs(segs, segHorizontals, segTops, forcedInvisibleMap, hiddenGroups, hiddenGroupTops, isDragging, isResizing, isDateSelecting) {
950
873
  let { props, context, segHeightRefMap, moreLinkHeightRefMap } = this;
@@ -953,18 +876,18 @@ class TimelineLane extends BaseComponent {
953
876
  segs.map((seg) => {
954
877
  const { eventRange } = seg;
955
878
  const { instanceId } = eventRange.instance;
956
- const segTop = segTops[instanceId];
879
+ const segTop = segTops.get(instanceId);
957
880
  const segHorizontal = segHorizontals[instanceId];
958
881
  const isVisible = isMirror ||
959
882
  (segHorizontal && segTop != null && !forcedInvisibleMap[instanceId]);
960
883
  return (createElement(TimelineEventHarness, { key: instanceId, style: Object.assign({ visibility: isVisible ? '' : 'hidden', top: segTop || 0 }, horizontalsToCss(segHorizontal, context.isRtl)), heightRef: isMirror ? undefined : segHeightRefMap.createRef(instanceId) },
961
884
  createElement(TimelineEvent, Object.assign({ isTimeScale: props.tDateProfile.isTimeScale, eventRange: eventRange, isStart: seg.isStart, isEnd: seg.isEnd, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === props.eventSelection /* TODO: bad for mirror? */ }, getEventRangeMeta(eventRange, props.todayRange, props.nowDate)))));
962
885
  }),
963
- hiddenGroups.map((hiddenGroup) => (createElement(TimelineEventHarness, { key: hiddenGroup.key, style: Object.assign({ top: hiddenGroupTops[hiddenGroup.key] || 0 }, horizontalsToCss({
964
- start: hiddenGroup.span.start,
965
- size: hiddenGroup.span.end - hiddenGroup.span.start
886
+ hiddenGroups.map((hiddenGroup) => (createElement(TimelineEventHarness, { key: hiddenGroup.key, style: Object.assign({ top: hiddenGroupTops.get(hiddenGroup.key) || 0 }, horizontalsToCss({
887
+ start: hiddenGroup.start,
888
+ size: hiddenGroup.end - hiddenGroup.start
966
889
  }, context.isRtl)), heightRef: moreLinkHeightRefMap.createRef(hiddenGroup.key) },
967
- createElement(TimelineLaneMoreLink, { hiddenSegs: hiddenGroup.segs /* TODO: make SegGroup generic! */, dateProfile: props.dateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isTimeScale: props.tDateProfile.isTimeScale, eventSelection: props.eventSelection, resourceId: props.resourceId, forcedInvisibleMap: forcedInvisibleMap }))))));
890
+ createElement(TimelineLaneMoreLink, { hiddenSegs: hiddenGroup.segs, dateProfile: props.dateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isTimeScale: props.tDateProfile.isTimeScale, eventSelection: props.eventSelection, resourceId: props.resourceId, forcedInvisibleMap: forcedInvisibleMap }))))));
968
891
  }
969
892
  }
970
893
 
@@ -992,36 +915,21 @@ class TimelineHeaderCell extends BaseComponent {
992
915
  dateEnv: context.dateEnv,
993
916
  viewApi: context.viewApi,
994
917
  });
995
- return (createElement(ContentContainer, { elTag: "div", elClasses: [
996
- 'fc-timeline-slot-label',
997
- 'fc-timeline-slot',
998
- cell.isWeekStart ? 'fc-timeline-slot-em' : '',
999
- 'fc-header-cell',
1000
- 'fc-cell',
1001
- 'fc-flex-column',
1002
- 'fc-justify-center',
1003
- props.isCentered ? 'fc-align-center' : 'fc-align-start',
1004
- ...( // TODO: so slot classnames for week/month/bigger. see note above about rowUnit
1005
- cell.rowUnit === 'time' ?
1006
- getSlotClassNames(dateMeta, context.theme) :
1007
- getDayClassNames(dateMeta, context.theme)),
1008
- ], elAttrs: {
918
+ return (createElement(ContentContainer, { tag: "div", className: joinClassNames('fc-timeline-slot-label fc-timeline-slot', cell.isWeekStart && 'fc-timeline-slot-em', // TODO: document this semantic className
919
+ 'fc-header-cell fc-cell fc-flex-col fc-justify-center', props.borderStart && 'fc-border-s', props.isCentered ? 'fc-align-center' : 'fc-align-start',
920
+ // TODO: so slot classnames for week/month/bigger. see note above about rowUnit
921
+ cell.rowUnit === 'time' ?
922
+ getSlotClassName(dateMeta) :
923
+ getDayClassName(dateMeta)), attrs: {
1009
924
  'data-date': dateEnv.formatIso(cell.date, {
1010
925
  omitTime: !tDateProfile.isTimeScale,
1011
926
  omitTimeZoneOffset: true,
1012
927
  }),
1013
- }, elStyle: {
928
+ }, style: {
1014
929
  width: props.slotWidth != null
1015
930
  ? props.slotWidth * cell.colspan
1016
931
  : undefined,
1017
- }, renderProps: renderProps, generatorName: "slotLabelContent", customGenerator: options.slotLabelContent, defaultGenerator: renderInnerContent, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (createElement("div", { ref: this.innerElRef, className: [
1018
- 'fc-flex-column',
1019
- props.isSticky ? 'fc-sticky-x' : '',
1020
- ].join(' ') },
1021
- createElement(InnerContent, { elTag: "a", elClasses: [
1022
- 'fc-cell-inner',
1023
- 'fc-padding-md',
1024
- ], elAttrs: this.buildCellNavLinkAttrs(context, cell.date, cell.rowUnit) })))));
932
+ }, renderProps: renderProps, generatorName: "slotLabelContent", customGenerator: options.slotLabelContent, defaultGenerator: renderInnerContent, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (createElement(InnerContent, { tag: "a", attrs: this.buildCellNavLinkAttrs(context, cell.date, cell.rowUnit), className: joinClassNames('fc-cell-inner fc-padding-md', props.isSticky && 'fc-sticky-s'), elRef: this.innerElRef }))));
1025
933
  }
1026
934
  componentDidMount() {
1027
935
  const { props } = this;
@@ -1095,13 +1003,14 @@ class TimelineHeaderRow extends BaseComponent {
1095
1003
  const { props, innerWidthRefMap, innerHeightRefMap } = this;
1096
1004
  const isCentered = !(props.tDateProfile.isTimeScale && props.isLastRow);
1097
1005
  const isSticky = !props.isLastRow;
1098
- return (createElement("div", { className: 'fc-row', style: { height: props.height } }, props.cells.map((cell) => {
1006
+ return (createElement("div", { className: joinClassNames('fc-flex-row fc-grow', // TODO: move fc-grow to parent?
1007
+ !props.isLastRow && 'fc-border-b') }, props.cells.map((cell, cellI) => {
1099
1008
  // TODO: make this part of the cell obj?
1100
1009
  // TODO: rowUnit seems wrong sometimes. says 'month' when it should be day
1101
1010
  // TODO: rowUnit is relevant to whole row. put it on a row object, not the cells
1102
1011
  // TODO: use rowUnit to key the Row itself?
1103
1012
  const key = cell.rowUnit + ':' + cell.date.toISOString();
1104
- return (createElement(TimelineHeaderCell, { key: key, cell: cell, rowLevel: props.rowLevel, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, todayRange: props.todayRange, nowDate: props.nowDate, isCentered: isCentered, isSticky: isSticky,
1013
+ return (createElement(TimelineHeaderCell, { key: key, cell: cell, rowLevel: props.rowLevel, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, todayRange: props.todayRange, nowDate: props.nowDate, isCentered: isCentered, isSticky: isSticky, borderStart: Boolean(cellI),
1105
1014
  // refs
1106
1015
  innerWidthRef: innerWidthRefMap.createRef(key), innerHeightRef: innerHeightRefMap.createRef(key),
1107
1016
  // dimensions
@@ -1119,7 +1028,7 @@ class TimelineNowIndicatorLine extends BaseComponent {
1119
1028
  const { props, context } = this;
1120
1029
  return (createElement("div", { className: "fc-timeline-now-indicator-container" },
1121
1030
  createElement(NowIndicatorContainer // TODO: make separate component?
1122
- , { elClasses: ['fc-timeline-now-indicator-line'], elStyle: props.slotWidth != null
1031
+ , { className: 'fc-timeline-now-indicator-line', style: props.slotWidth != null
1123
1032
  ? horizontalCoordToCss(dateToCoord(props.nowDate, context.dateEnv, props.tDateProfile, props.slotWidth), context.isRtl)
1124
1033
  : {}, isAxis: false, date: props.nowDate })));
1125
1034
  }
@@ -1129,7 +1038,7 @@ class TimelineNowIndicatorArrow extends BaseComponent {
1129
1038
  render() {
1130
1039
  const { props, context } = this;
1131
1040
  return (createElement("div", { className: "fc-timeline-now-indicator-container" },
1132
- createElement(NowIndicatorContainer, { elClasses: ['fc-timeline-now-indicator-arrow'], elStyle: props.slotWidth != null
1041
+ createElement(NowIndicatorContainer, { className: 'fc-timeline-now-indicator-arrow', style: props.slotWidth != null
1133
1042
  ? horizontalCoordToCss(dateToCoord(props.nowDate, context.dateEnv, props.tDateProfile, props.slotWidth), context.isRtl)
1134
1043
  : {}, isAxis: true, date: props.nowDate })));
1135
1044
  }
@@ -1162,19 +1071,14 @@ class TimelineView extends DateComponent {
1162
1071
  this.setState({ slotInnerWidth });
1163
1072
  }
1164
1073
  };
1165
- this.handleScrollerWidth = (scrollerWidth) => {
1166
- this.setState({
1167
- scrollerWidth,
1168
- });
1169
- };
1170
- this.handleLeftScrollbarWidth = (leftScrollbarWidth) => {
1074
+ this.handleClientWidth = (clientWidth) => {
1171
1075
  this.setState({
1172
- leftScrollbarWidth
1076
+ clientWidth,
1173
1077
  });
1174
1078
  };
1175
- this.handleRightScrollbarWidth = (rightScrollbarWidth) => {
1079
+ this.handleEndScrollbarWidth = (endScrollbarWidth) => {
1176
1080
  this.setState({
1177
- rightScrollbarWidth
1081
+ endScrollbarWidth
1178
1082
  });
1179
1083
  };
1180
1084
  this.handleTimeScroll = (scrollTime) => {
@@ -1186,7 +1090,7 @@ class TimelineView extends DateComponent {
1186
1090
  if (scrollTime != null && slotWidth != null) {
1187
1091
  let x = timeToCoord(scrollTime, context.dateEnv, props.dateProfile, tDateProfile, slotWidth);
1188
1092
  if (x) {
1189
- x += context.isRtl ? -1 : 1; // overcome border. TODO: DRY this up
1093
+ x += 1; // overcome border. TODO: DRY this up
1190
1094
  }
1191
1095
  this.syncedScroller.scrollTo({ x });
1192
1096
  }
@@ -1219,44 +1123,30 @@ class TimelineView extends DateComponent {
1219
1123
  const stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(options);
1220
1124
  /* table positions */
1221
1125
  const [canvasWidth, slotWidth] = this.computeSlotWidth(tDateProfile.slotCnt, tDateProfile.slotsPerLabel, options.slotMinWidth, state.slotInnerWidth, // is ACTUALLY the label width. rename?
1222
- state.scrollerWidth);
1126
+ state.clientWidth);
1223
1127
  this.slotWidth = slotWidth;
1224
1128
  return (createElement(NowTimer, { unit: timerUnit }, (nowDate, todayRange) => {
1225
1129
  const enableNowIndicator = // TODO: DRY
1226
1130
  options.nowIndicator &&
1227
1131
  slotWidth != null &&
1228
1132
  rangeContainsMarker(props.dateProfile.currentRange, nowDate);
1229
- return (createElement(ViewContainer, { viewSpec: context.viewSpec, elClasses: [
1230
- 'fc-timeline-view',
1231
- 'fc-flex-column',
1232
- 'fc-border',
1233
- ] },
1234
- createElement(Scroller, { horizontal: true, hideScrollbars: true, elClassNames: [
1235
- 'fc-timeline-header',
1236
- 'fc-rowgroup',
1237
- stickyHeaderDates ? 'fc-sticky-header' : '',
1238
- ], ref: this.headerScrollerRef },
1239
- createElement("div", { className: 'fc-rel fc-content-box' // origin for now-indicator
1240
- , style: {
1241
- width: canvasWidth,
1242
- paddingLeft: state.leftScrollbarWidth,
1243
- paddingRight: state.rightScrollbarWidth,
1244
- } },
1245
- createElement("div", null, cellRows.map((cells, rowLevel) => {
1133
+ return (createElement(ViewContainer, { viewSpec: context.viewSpec, className: joinClassNames('fc-timeline fc-border',
1134
+ // HACK for Safari print-mode, where fc-scroller-no-bars won't take effect for
1135
+ // the below Scrollers if they have liquid flex height
1136
+ !props.forPrint && 'fc-flex-col') },
1137
+ createElement(Scroller, { horizontal: true, hideScrollbars: true, className: joinClassNames('fc-timeline-header fc-flex-row fc-border-b', stickyHeaderDates && 'fc-table-header-sticky'), ref: this.headerScrollerRef },
1138
+ createElement("div", {
1139
+ // TODO: DRY
1140
+ className: joinClassNames('fc-rel', // origin for now-indicator
1141
+ canvasWidth == null && 'fc-liquid'), style: { width: canvasWidth } },
1142
+ cellRows.map((cells, rowLevel) => {
1246
1143
  const isLast = rowLevel === cellRows.length - 1;
1247
1144
  return (createElement(TimelineHeaderRow, { key: rowLevel, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange, rowLevel: rowLevel, isLastRow: isLast, cells: cells, slotWidth: slotWidth, innerWidthRef: this.headerRowInnerWidthMap.createRef(rowLevel) }));
1248
- })),
1249
- enableNowIndicator && (
1250
- // TODO: make this positioned WITHIN padding?
1251
- createElement(TimelineNowIndicatorArrow, { tDateProfile: tDateProfile, nowDate: nowDate, slotWidth: slotWidth })))),
1252
- createElement(Scroller, { vertical: verticalScrolling, horizontal: true, elClassNames: [
1253
- 'fc-timeline-body',
1254
- 'fc-rowgroup',
1255
- verticalScrolling ? 'fc-liquid' : '',
1256
- ], ref: this.bodyScrollerRef, widthRef: this.handleScrollerWidth, leftScrollbarWidthRef: this.handleLeftScrollbarWidth, rightScrollbarWidthRef: this.handleRightScrollbarWidth },
1257
- createElement("div", { className: "fc-rel fc-grow", style: {
1258
- width: canvasWidth,
1259
- }, ref: this.handeBodyEl },
1145
+ }),
1146
+ enableNowIndicator && (createElement(TimelineNowIndicatorArrow, { tDateProfile: tDateProfile, nowDate: nowDate, slotWidth: slotWidth }))),
1147
+ Boolean(state.endScrollbarWidth) && (createElement("div", { className: 'fc-border-s fc-filler', style: { minWidth: state.endScrollbarWidth } }))),
1148
+ createElement(Scroller, { vertical: verticalScrolling, horizontal: true, hideScrollbars: props.forPrint, className: joinClassNames('fc-timeline-body fc-flex-col', verticalScrolling && 'fc-liquid'), ref: this.bodyScrollerRef, clientWidthRef: this.handleClientWidth, endScrollbarWidthRef: this.handleEndScrollbarWidth },
1149
+ createElement("div", { className: "fc-rel fc-grow", style: { width: canvasWidth }, ref: this.handeBodyEl },
1260
1150
  createElement(TimelineSlats, { dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange,
1261
1151
  // ref
1262
1152
  innerWidthRef: this.handleBodySlotInnerWidth,
@@ -1349,7 +1239,7 @@ class TimelineView extends DateComponent {
1349
1239
  }
1350
1240
  }
1351
1241
 
1352
- var css_248z = ".fc-timeline-slots{z-index:1}.fc-timeline-slot-minor{border-style:dotted}.fc-timeline-now-indicator-container{bottom:0;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:4}.fc-timeline-now-indicator-arrow,.fc-timeline-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;pointer-events:none;position:absolute;top:0}.fc-timeline-now-indicator-arrow{border-left-color:transparent;border-right-color:transparent;border-width:6px 5px 0;margin:0 -5px}.fc-timeline-now-indicator-line{border-width:0 0 0 1px;bottom:0}.fc-timeline-events{z-index:3}.fc-timeline-events-overlap-enabled{padding-bottom:10px}.fc-timeline-event{border-radius:0;font-size:var(--fc-small-font-size);margin-bottom:1px;z-index:1}.fc-timeline-event.fc-event-mirror{z-index:2}.fc-direction-ltr .fc-timeline-event.fc-event-end{margin-right:1px}.fc-direction-rtl .fc-timeline-event.fc-event-end{margin-left:1px}.fc-timeline-event-spacious{margin-bottom:0;padding-bottom:5px;padding-top:5px}.fc-timeline-event .fc-event-inner{align-items:center;display:flex;flex-direction:row;padding:2px 1px}.fc-timeline-event:not(.fc-event-end) .fc-event-inner:after,.fc-timeline-event:not(.fc-event-start) .fc-event-inner:before{border-color:transparent #000;border-style:solid;border-width:5px;content:\"\";flex-grow:0;flex-shrink:0;height:0;margin:0 1px;opacity:.5;width:0}.fc-direction-ltr .fc-timeline-event:not(.fc-event-start) .fc-event-inner:before,.fc-direction-rtl .fc-timeline-event:not(.fc-event-end) .fc-event-inner:after{border-left:0}.fc-direction-ltr .fc-timeline-event:not(.fc-event-end) .fc-event-inner:after,.fc-direction-rtl .fc-timeline-event:not(.fc-event-start) .fc-event-inner:before{border-right:0}.fc-timeline-event .fc-event-time{font-weight:700}.fc-timeline-event .fc-event-time,.fc-timeline-event .fc-event-title{padding:0 2px}.fc-timeline-more-link{align-items:flex-start;background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;display:flex;flex-direction:column;font-size:var(--fc-small-font-size);padding:1px}.fc-direction-ltr .fc-timeline-more-link{margin-right:1px}.fc-direction-rtl .fc-timeline-more-link{margin-left:1px}.fc-timeline-more-link-inner{padding:2px}.fc-timeline-bg{bottom:0;left:0;position:absolute;right:0;top:0;z-index:2}.fc-timeline-bg .fc-non-business{z-index:1}.fc-timeline-bg .fc-bg-event{z-index:2}.fc-timeline-bg .fc-highlight{z-index:3}.fc-timeline-bg-harness{bottom:0;position:absolute;top:0}";
1242
+ var css_248z = ".fc-timeline-slots{z-index:1}.fc-timeline-events{position:relative;z-index:2}.fc-timeline-slot-minor{border-style:dotted}.fc-timeline-events-overlap-enabled{padding-bottom:10px}.fc-timeline-event{border-radius:0;font-size:var(--fc-small-font-size);margin-bottom:1px}.fc-direction-ltr .fc-timeline-event.fc-event-end{margin-right:1px}.fc-direction-rtl .fc-timeline-event.fc-event-end{margin-left:1px}.fc-timeline-event .fc-event-inner{align-items:center;display:flex;flex-direction:row;padding:2px 1px}.fc-timeline-event-spacious .fc-event-inner{padding-bottom:5px;padding-top:5px}.fc-timeline-event .fc-event-time{font-weight:700}.fc-timeline-event .fc-event-time,.fc-timeline-event .fc-event-title{padding:0 2px}.fc-timeline-event:not(.fc-event-end) .fc-event-inner:after,.fc-timeline-event:not(.fc-event-start) .fc-event-inner:before{border-color:transparent #000;border-style:solid;border-width:5px;content:\"\";flex-grow:0;flex-shrink:0;height:0;margin:0 1px;opacity:.5;width:0}.fc-direction-ltr .fc-timeline-event:not(.fc-event-start) .fc-event-inner:before,.fc-direction-rtl .fc-timeline-event:not(.fc-event-end) .fc-event-inner:after{border-left:0}.fc-direction-ltr .fc-timeline-event:not(.fc-event-end) .fc-event-inner:after,.fc-direction-rtl .fc-timeline-event:not(.fc-event-start) .fc-event-inner:before{border-right:0}.fc-timeline-more-link{align-items:flex-start;background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;display:flex;flex-direction:column;font-size:var(--fc-small-font-size);padding:1px}.fc-direction-ltr .fc-timeline-more-link{margin-right:1px}.fc-direction-rtl .fc-timeline-more-link{margin-left:1px}.fc-timeline-more-link-inner{padding:2px}.fc-timeline-now-indicator-container{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;z-index:4}.fc-timeline-now-indicator-arrow{border-bottom-style:solid;border-bottom-width:0;border-color:var(--fc-now-indicator-color);border-left:5px solid transparent;border-right:5px solid transparent;border-top-style:solid;border-top-width:6px;height:0;margin:0 -5px;position:absolute;top:0;width:0}.fc-timeline-now-indicator-line{border-left:1px solid var(--fc-now-indicator-color);bottom:0;position:absolute;top:0}";
1353
1243
  injectStyles(css_248z);
1354
1244
 
1355
- export { TimelineHeaderRow, TimelineLane, TimelineLaneBg, TimelineLaneSlicer, TimelineNowIndicatorArrow, TimelineNowIndicatorLine, TimelineSlats, TimelineView, buildTimelineDateProfile, computeSlotWidth, coordToCss, coordsToCss, createHorizontalStyle, createVerticalStyle, timeToCoord };
1245
+ export { TimelineHeaderRow, TimelineLane, TimelineLaneBg, TimelineLaneSlicer, TimelineNowIndicatorArrow, TimelineNowIndicatorLine, TimelineSlats, TimelineView, buildTimelineDateProfile, computeSlotWidth, createHorizontalStyle, createVerticalStyle, timeToCoord };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fullcalendar/timeline",
3
- "version": "7.0.0-beta.1",
3
+ "version": "7.0.0-beta.3",
4
4
  "title": "FullCalendar Timeline Plugin",
5
5
  "description": "Display events on a horizontal time axis (without resources)",
6
6
  "keywords": [
@@ -15,11 +15,11 @@
15
15
  ],
16
16
  "homepage": "https://fullcalendar.io/docs/timeline-view-no-resources",
17
17
  "dependencies": {
18
- "@fullcalendar/premium-common": "7.0.0-beta.1",
19
- "@fullcalendar/scrollgrid": "7.0.0-beta.1"
18
+ "@fullcalendar/premium-common": "7.0.0-beta.3",
19
+ "@fullcalendar/scrollgrid": "7.0.0-beta.3"
20
20
  },
21
21
  "peerDependencies": {
22
- "@fullcalendar/core": "7.0.0-beta.1"
22
+ "@fullcalendar/core": "7.0.0-beta.3"
23
23
  },
24
24
  "type": "module",
25
25
  "bugs": "https://fullcalendar.io/reporting-bugs",