fullcalendar 6.0.0-beta.4 → 6.0.1

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,6 +1,6 @@
1
1
  /*!
2
- FullCalendar Standard Bundle v6.0.0-beta.4
3
- Docs & License: https://fullcalendar.io/
2
+ FullCalendar Standard Bundle v6.0.1
3
+ Docs & License: https://fullcalendar.io/docs/initialize-globals
4
4
  (c) 2022 Adam Shaw
5
5
  */
6
6
  var FullCalendar = (function (exports) {
@@ -251,8 +251,6 @@ var FullCalendar = (function (exports) {
251
251
  return res;
252
252
  }
253
253
 
254
- const globalLocales = [];
255
-
256
254
  // TODO: new util arrayify?
257
255
  function removeExact(array, exactVal) {
258
256
  let removeCnt = 0;
@@ -689,165 +687,6 @@ var FullCalendar = (function (exports) {
689
687
  contentWidthEl.getBoundingClientRect().width;
690
688
  }
691
689
 
692
- // TODO: easier way to add new hooks? need to update a million things
693
- function createPlugin(input) {
694
- return {
695
- id: guid(),
696
- name: input.name,
697
- premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : undefined,
698
- deps: input.deps || [],
699
- reducers: input.reducers || [],
700
- isLoadingFuncs: input.isLoadingFuncs || [],
701
- contextInit: [].concat(input.contextInit || []),
702
- eventRefiners: input.eventRefiners || {},
703
- eventDefMemberAdders: input.eventDefMemberAdders || [],
704
- eventSourceRefiners: input.eventSourceRefiners || {},
705
- isDraggableTransformers: input.isDraggableTransformers || [],
706
- eventDragMutationMassagers: input.eventDragMutationMassagers || [],
707
- eventDefMutationAppliers: input.eventDefMutationAppliers || [],
708
- dateSelectionTransformers: input.dateSelectionTransformers || [],
709
- datePointTransforms: input.datePointTransforms || [],
710
- dateSpanTransforms: input.dateSpanTransforms || [],
711
- views: input.views || {},
712
- viewPropsTransformers: input.viewPropsTransformers || [],
713
- isPropsValid: input.isPropsValid || null,
714
- externalDefTransforms: input.externalDefTransforms || [],
715
- viewContainerAppends: input.viewContainerAppends || [],
716
- eventDropTransformers: input.eventDropTransformers || [],
717
- componentInteractions: input.componentInteractions || [],
718
- calendarInteractions: input.calendarInteractions || [],
719
- themeClasses: input.themeClasses || {},
720
- eventSourceDefs: input.eventSourceDefs || [],
721
- cmdFormatter: input.cmdFormatter,
722
- recurringTypes: input.recurringTypes || [],
723
- namedTimeZonedImpl: input.namedTimeZonedImpl,
724
- initialView: input.initialView || '',
725
- elementDraggingImpl: input.elementDraggingImpl,
726
- optionChangeHandlers: input.optionChangeHandlers || {},
727
- scrollGridImpl: input.scrollGridImpl || null,
728
- listenerRefiners: input.listenerRefiners || {},
729
- optionRefiners: input.optionRefiners || {},
730
- propSetHandlers: input.propSetHandlers || {},
731
- };
732
- }
733
- function buildPluginHooks(pluginDefs, globalDefs) {
734
- let currentPluginIds = {};
735
- let hooks = {
736
- premiumReleaseDate: undefined,
737
- reducers: [],
738
- isLoadingFuncs: [],
739
- contextInit: [],
740
- eventRefiners: {},
741
- eventDefMemberAdders: [],
742
- eventSourceRefiners: {},
743
- isDraggableTransformers: [],
744
- eventDragMutationMassagers: [],
745
- eventDefMutationAppliers: [],
746
- dateSelectionTransformers: [],
747
- datePointTransforms: [],
748
- dateSpanTransforms: [],
749
- views: {},
750
- viewPropsTransformers: [],
751
- isPropsValid: null,
752
- externalDefTransforms: [],
753
- viewContainerAppends: [],
754
- eventDropTransformers: [],
755
- componentInteractions: [],
756
- calendarInteractions: [],
757
- themeClasses: {},
758
- eventSourceDefs: [],
759
- cmdFormatter: null,
760
- recurringTypes: [],
761
- namedTimeZonedImpl: null,
762
- initialView: '',
763
- elementDraggingImpl: null,
764
- optionChangeHandlers: {},
765
- scrollGridImpl: null,
766
- listenerRefiners: {},
767
- optionRefiners: {},
768
- propSetHandlers: {},
769
- };
770
- function addDefs(defs) {
771
- for (let def of defs) {
772
- const pluginName = def.name;
773
- const currentId = currentPluginIds[pluginName];
774
- if (currentId === undefined) {
775
- currentPluginIds[pluginName] = def.id;
776
- addDefs(def.deps);
777
- hooks = combineHooks(hooks, def);
778
- }
779
- else if (currentId !== def.id) {
780
- // different ID than the one already added
781
- console.warn(`Duplicate plugin '${pluginName}'`);
782
- }
783
- }
784
- }
785
- if (pluginDefs) {
786
- addDefs(pluginDefs);
787
- }
788
- addDefs(globalDefs);
789
- return hooks;
790
- }
791
- function buildBuildPluginHooks() {
792
- let currentOverrideDefs = [];
793
- let currentGlobalDefs = [];
794
- let currentHooks;
795
- return (overrideDefs, globalDefs) => {
796
- if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) {
797
- currentHooks = buildPluginHooks(overrideDefs, globalDefs);
798
- }
799
- currentOverrideDefs = overrideDefs;
800
- currentGlobalDefs = globalDefs;
801
- return currentHooks;
802
- };
803
- }
804
- function combineHooks(hooks0, hooks1) {
805
- return {
806
- premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate),
807
- reducers: hooks0.reducers.concat(hooks1.reducers),
808
- isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs),
809
- contextInit: hooks0.contextInit.concat(hooks1.contextInit),
810
- eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners),
811
- eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders),
812
- eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners),
813
- isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
814
- eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
815
- eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
816
- dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
817
- datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
818
- dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
819
- views: Object.assign(Object.assign({}, hooks0.views), hooks1.views),
820
- viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
821
- isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
822
- externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
823
- viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends),
824
- eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
825
- calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
826
- componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
827
- themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses),
828
- eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
829
- cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
830
- recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
831
- namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
832
- initialView: hooks0.initialView || hooks1.initialView,
833
- elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
834
- optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers),
835
- scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl,
836
- listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners),
837
- optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners),
838
- propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers),
839
- };
840
- }
841
- function compareOptionalDates(date0, date1) {
842
- if (date0 === undefined) {
843
- return date1;
844
- }
845
- if (date1 === undefined) {
846
- return date0;
847
- }
848
- return new Date(Math.max(date0.valueOf(), date1.valueOf()));
849
- }
850
-
851
690
  const DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
852
691
  // Adding
853
692
  function addWeeks(m, n) {
@@ -3547,229 +3386,65 @@ var FullCalendar = (function (exports) {
3547
3386
  return null;
3548
3387
  }
3549
3388
 
3550
- function initEventSources(calendarOptions, dateProfile, context) {
3551
- let activeRange = dateProfile ? dateProfile.activeRange : null;
3552
- return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context);
3553
- }
3554
- function reduceEventSources(eventSources, action, dateProfile, context) {
3555
- let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
3389
+ function reduceEventStore(eventStore, action, eventSources, dateProfile, context) {
3556
3390
  switch (action.type) {
3557
- case 'ADD_EVENT_SOURCES': // already parsed
3558
- return addSources(eventSources, action.sources, activeRange, context);
3559
- case 'REMOVE_EVENT_SOURCE':
3560
- return removeSource(eventSources, action.sourceId);
3391
+ case 'RECEIVE_EVENTS': // raw
3392
+ return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context);
3393
+ case 'ADD_EVENTS': // already parsed, but not expanded
3394
+ return addEvent(eventStore, action.eventStore, // new ones
3395
+ dateProfile ? dateProfile.activeRange : null, context);
3396
+ case 'RESET_EVENTS':
3397
+ return action.eventStore;
3398
+ case 'MERGE_EVENTS': // already parsed and expanded
3399
+ return mergeEventStores(eventStore, action.eventStore);
3561
3400
  case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
3562
3401
  case 'NEXT':
3563
3402
  case 'CHANGE_DATE':
3564
3403
  case 'CHANGE_VIEW_TYPE':
3565
3404
  if (dateProfile) {
3566
- return fetchDirtySources(eventSources, activeRange, context);
3405
+ return expandRecurring(eventStore, dateProfile.activeRange, context);
3567
3406
  }
3568
- return eventSources;
3569
- case 'FETCH_EVENT_SOURCES':
3570
- return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type?
3571
- arrayToHash(action.sourceIds) :
3572
- excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context);
3573
- case 'RECEIVE_EVENTS':
3574
- case 'RECEIVE_EVENT_ERROR':
3575
- return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
3407
+ return eventStore;
3408
+ case 'REMOVE_EVENTS':
3409
+ return excludeSubEventStore(eventStore, action.eventStore);
3410
+ case 'REMOVE_EVENT_SOURCE':
3411
+ return excludeEventsBySourceId(eventStore, action.sourceId);
3576
3412
  case 'REMOVE_ALL_EVENT_SOURCES':
3577
- return {};
3413
+ return filterEventStoreDefs(eventStore, (eventDef) => (!eventDef.sourceId // only keep events with no source id
3414
+ ));
3415
+ case 'REMOVE_ALL_EVENTS':
3416
+ return createEmptyEventStore();
3578
3417
  default:
3579
- return eventSources;
3418
+ return eventStore;
3580
3419
  }
3581
3420
  }
3582
- function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) {
3583
- let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
3584
- return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context);
3585
- }
3586
- function computeEventSourcesLoading(eventSources) {
3587
- for (let sourceId in eventSources) {
3588
- if (eventSources[sourceId].isFetching) {
3589
- return true;
3421
+ function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) {
3422
+ if (eventSource && // not already removed
3423
+ fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
3424
+ ) {
3425
+ let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context);
3426
+ if (fetchRange) {
3427
+ subset = expandRecurring(subset, fetchRange, context);
3590
3428
  }
3429
+ return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
3591
3430
  }
3592
- return false;
3431
+ return eventStore;
3593
3432
  }
3594
- function addSources(eventSourceHash, sources, fetchRange, context) {
3595
- let hash = {};
3596
- for (let source of sources) {
3597
- hash[source.sourceId] = source;
3433
+ function transformRawEvents(rawEvents, eventSource, context) {
3434
+ let calEachTransform = context.options.eventDataTransform;
3435
+ let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
3436
+ if (sourceEachTransform) {
3437
+ rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
3598
3438
  }
3599
- if (fetchRange) {
3600
- hash = fetchDirtySources(hash, fetchRange, context);
3439
+ if (calEachTransform) {
3440
+ rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
3601
3441
  }
3602
- return Object.assign(Object.assign({}, eventSourceHash), hash);
3603
- }
3604
- function removeSource(eventSourceHash, sourceId) {
3605
- return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId);
3606
- }
3607
- function fetchDirtySources(sourceHash, fetchRange, context) {
3608
- return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context);
3442
+ return rawEvents;
3609
3443
  }
3610
- function isSourceDirty(eventSource, fetchRange, context) {
3611
- if (!doesSourceNeedRange(eventSource, context)) {
3612
- return !eventSource.latestFetchId;
3613
- }
3614
- return !context.options.lazyFetching ||
3615
- !eventSource.fetchRange ||
3616
- eventSource.isFetching || // always cancel outdated in-progress fetches
3617
- fetchRange.start < eventSource.fetchRange.start ||
3618
- fetchRange.end > eventSource.fetchRange.end;
3619
- }
3620
- function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) {
3621
- let nextSources = {};
3622
- for (let sourceId in prevSources) {
3623
- let source = prevSources[sourceId];
3624
- if (sourceIdHash[sourceId]) {
3625
- nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context);
3626
- }
3627
- else {
3628
- nextSources[sourceId] = source;
3629
- }
3630
- }
3631
- return nextSources;
3632
- }
3633
- function fetchSource(eventSource, fetchRange, isRefetch, context) {
3634
- let { options, calendarApi } = context;
3635
- let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId];
3636
- let fetchId = guid();
3637
- sourceDef.fetch({
3638
- eventSource,
3639
- range: fetchRange,
3640
- isRefetch,
3641
- context,
3642
- }, (res) => {
3643
- let { rawEvents } = res;
3644
- if (options.eventSourceSuccess) {
3645
- rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents;
3646
- }
3647
- if (eventSource.success) {
3648
- rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents;
3649
- }
3650
- context.dispatch({
3651
- type: 'RECEIVE_EVENTS',
3652
- sourceId: eventSource.sourceId,
3653
- fetchId,
3654
- fetchRange,
3655
- rawEvents,
3656
- });
3657
- }, (error) => {
3658
- let errorHandled = false;
3659
- if (options.eventSourceFailure) {
3660
- options.eventSourceFailure.call(calendarApi, error);
3661
- errorHandled = true;
3662
- }
3663
- if (eventSource.failure) {
3664
- eventSource.failure(error);
3665
- errorHandled = true;
3666
- }
3667
- if (!errorHandled) {
3668
- console.warn(error.message, error);
3669
- }
3670
- context.dispatch({
3671
- type: 'RECEIVE_EVENT_ERROR',
3672
- sourceId: eventSource.sourceId,
3673
- fetchId,
3674
- fetchRange,
3675
- error,
3676
- });
3677
- });
3678
- return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId });
3679
- }
3680
- function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
3681
- let eventSource = sourceHash[sourceId];
3682
- if (eventSource && // not already removed
3683
- fetchId === eventSource.latestFetchId) {
3684
- return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) });
3685
- }
3686
- return sourceHash;
3687
- }
3688
- function excludeStaticSources(eventSources, context) {
3689
- return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context));
3690
- }
3691
- function parseInitialSources(rawOptions, context) {
3692
- let refiners = buildEventSourceRefiners(context);
3693
- let rawSources = [].concat(rawOptions.eventSources || []);
3694
- let sources = []; // parsed
3695
- if (rawOptions.initialEvents) {
3696
- rawSources.unshift(rawOptions.initialEvents);
3697
- }
3698
- if (rawOptions.events) {
3699
- rawSources.unshift(rawOptions.events);
3700
- }
3701
- for (let rawSource of rawSources) {
3702
- let source = parseEventSource(rawSource, context, refiners);
3703
- if (source) {
3704
- sources.push(source);
3705
- }
3706
- }
3707
- return sources;
3708
- }
3709
- function doesSourceNeedRange(eventSource, context) {
3710
- let defs = context.pluginHooks.eventSourceDefs;
3711
- return !defs[eventSource.sourceDefId].ignoreRange;
3712
- }
3713
-
3714
- function reduceEventStore(eventStore, action, eventSources, dateProfile, context) {
3715
- switch (action.type) {
3716
- case 'RECEIVE_EVENTS': // raw
3717
- return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context);
3718
- case 'ADD_EVENTS': // already parsed, but not expanded
3719
- return addEvent(eventStore, action.eventStore, // new ones
3720
- dateProfile ? dateProfile.activeRange : null, context);
3721
- case 'RESET_EVENTS':
3722
- return action.eventStore;
3723
- case 'MERGE_EVENTS': // already parsed and expanded
3724
- return mergeEventStores(eventStore, action.eventStore);
3725
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
3726
- case 'NEXT':
3727
- case 'CHANGE_DATE':
3728
- case 'CHANGE_VIEW_TYPE':
3729
- if (dateProfile) {
3730
- return expandRecurring(eventStore, dateProfile.activeRange, context);
3731
- }
3732
- return eventStore;
3733
- case 'REMOVE_EVENTS':
3734
- return excludeSubEventStore(eventStore, action.eventStore);
3735
- case 'REMOVE_EVENT_SOURCE':
3736
- return excludeEventsBySourceId(eventStore, action.sourceId);
3737
- case 'REMOVE_ALL_EVENT_SOURCES':
3738
- return filterEventStoreDefs(eventStore, (eventDef) => (!eventDef.sourceId // only keep events with no source id
3739
- ));
3740
- case 'REMOVE_ALL_EVENTS':
3741
- return createEmptyEventStore();
3742
- default:
3743
- return eventStore;
3744
- }
3745
- }
3746
- function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) {
3747
- if (eventSource && // not already removed
3748
- fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
3749
- ) {
3750
- let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context);
3751
- if (fetchRange) {
3752
- subset = expandRecurring(subset, fetchRange, context);
3753
- }
3754
- return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
3755
- }
3756
- return eventStore;
3757
- }
3758
- function transformRawEvents(rawEvents, eventSource, context) {
3759
- let calEachTransform = context.options.eventDataTransform;
3760
- let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
3761
- if (sourceEachTransform) {
3762
- rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
3763
- }
3764
- if (calEachTransform) {
3765
- rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
3766
- }
3767
- return rawEvents;
3768
- }
3769
- function transformEachRawEvent(rawEvents, func) {
3770
- let refinedEvents;
3771
- if (!func) {
3772
- refinedEvents = rawEvents;
3444
+ function transformEachRawEvent(rawEvents, func) {
3445
+ let refinedEvents;
3446
+ if (!func) {
3447
+ refinedEvents = rawEvents;
3773
3448
  }
3774
3449
  else {
3775
3450
  refinedEvents = [];
@@ -3894,25 +3569,6 @@ var FullCalendar = (function (exports) {
3894
3569
  return rawDefs;
3895
3570
  }
3896
3571
 
3897
- let eventSourceDef$2 = {
3898
- ignoreRange: true,
3899
- parseMeta(refined) {
3900
- if (Array.isArray(refined.events)) {
3901
- return refined.events;
3902
- }
3903
- return null;
3904
- },
3905
- fetch(arg, successCallback) {
3906
- successCallback({
3907
- rawEvents: arg.eventSource.meta,
3908
- });
3909
- },
3910
- };
3911
- const arrayEventSourcePlugin = createPlugin({
3912
- name: 'array-event-source',
3913
- eventSourceDefs: [eventSourceDef$2],
3914
- });
3915
-
3916
3572
  function triggerDateSelect(selection, pev, context) {
3917
3573
  context.emitter.trigger('select', Object.assign(Object.assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view }));
3918
3574
  }
@@ -4798,24 +4454,6 @@ var FullCalendar = (function (exports) {
4798
4454
  }
4799
4455
  }
4800
4456
 
4801
- let eventSourceDef$1 = {
4802
- parseMeta(refined) {
4803
- if (typeof refined.events === 'function') {
4804
- return refined.events;
4805
- }
4806
- return null;
4807
- },
4808
- fetch(arg, successCallback, errorCallback) {
4809
- const { dateEnv } = arg.context;
4810
- const func = arg.eventSource.meta;
4811
- unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback);
4812
- },
4813
- };
4814
- const funcEventSourcePlugin = createPlugin({
4815
- name: 'func-event-source',
4816
- eventSourceDefs: [eventSourceDef$1],
4817
- });
4818
-
4819
4457
  class JsonRequestError extends Error {
4820
4458
  constructor(message, response) {
4821
4459
  super(message);
@@ -4851,232 +4489,18 @@ var FullCalendar = (function (exports) {
4851
4489
  });
4852
4490
  }
4853
4491
 
4854
- const JSON_FEED_EVENT_SOURCE_REFINERS = {
4855
- method: String,
4856
- extraParams: identity,
4857
- startParam: String,
4858
- endParam: String,
4859
- timeZoneParam: String,
4860
- };
4861
-
4862
- let eventSourceDef = {
4863
- parseMeta(refined) {
4864
- if (refined.url && (refined.format === 'json' || !refined.format)) {
4865
- return {
4866
- url: refined.url,
4867
- format: 'json',
4868
- method: (refined.method || 'GET').toUpperCase(),
4869
- extraParams: refined.extraParams,
4870
- startParam: refined.startParam,
4871
- endParam: refined.endParam,
4872
- timeZoneParam: refined.timeZoneParam,
4873
- };
4874
- }
4875
- return null;
4876
- },
4877
- fetch(arg, successCallback, errorCallback) {
4878
- const { meta } = arg.eventSource;
4879
- const requestParams = buildRequestParams(meta, arg.range, arg.context);
4880
- requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => {
4881
- successCallback({ rawEvents, response });
4882
- }, errorCallback);
4883
- },
4884
- };
4885
- const jsonFeedEventSourcePlugin = createPlugin({
4886
- name: 'json-event-source',
4887
- eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS,
4888
- eventSourceDefs: [eventSourceDef],
4889
- });
4890
- function buildRequestParams(meta, range, context) {
4891
- let { dateEnv, options } = context;
4892
- let startParam;
4893
- let endParam;
4894
- let timeZoneParam;
4895
- let customRequestParams;
4896
- let params = {};
4897
- startParam = meta.startParam;
4898
- if (startParam == null) {
4899
- startParam = options.startParam;
4900
- }
4901
- endParam = meta.endParam;
4902
- if (endParam == null) {
4903
- endParam = options.endParam;
4492
+ let canVGrowWithinCell;
4493
+ function getCanVGrowWithinCell() {
4494
+ if (canVGrowWithinCell == null) {
4495
+ canVGrowWithinCell = computeCanVGrowWithinCell();
4904
4496
  }
4905
- timeZoneParam = meta.timeZoneParam;
4906
- if (timeZoneParam == null) {
4907
- timeZoneParam = options.timeZoneParam;
4908
- }
4909
- // retrieve any outbound GET/POST data from the options
4910
- if (typeof meta.extraParams === 'function') {
4911
- // supplied as a function that returns a key/value object
4912
- customRequestParams = meta.extraParams();
4913
- }
4914
- else {
4915
- // probably supplied as a straight key/value object
4916
- customRequestParams = meta.extraParams || {};
4917
- }
4918
- Object.assign(params, customRequestParams);
4919
- params[startParam] = dateEnv.formatIso(range.start);
4920
- params[endParam] = dateEnv.formatIso(range.end);
4921
- if (dateEnv.timeZone !== 'local') {
4922
- params[timeZoneParam] = dateEnv.timeZone;
4923
- }
4924
- return params;
4925
- }
4926
-
4927
- const SIMPLE_RECURRING_REFINERS = {
4928
- daysOfWeek: identity,
4929
- startTime: createDuration,
4930
- endTime: createDuration,
4931
- duration: createDuration,
4932
- startRecur: identity,
4933
- endRecur: identity,
4934
- };
4935
-
4936
- let recurring = {
4937
- parse(refined, dateEnv) {
4938
- if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) {
4939
- let recurringData = {
4940
- daysOfWeek: refined.daysOfWeek || null,
4941
- startTime: refined.startTime || null,
4942
- endTime: refined.endTime || null,
4943
- startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
4944
- endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null,
4945
- };
4946
- let duration;
4947
- if (refined.duration) {
4948
- duration = refined.duration;
4949
- }
4950
- if (!duration && refined.startTime && refined.endTime) {
4951
- duration = subtractDurations(refined.endTime, refined.startTime);
4952
- }
4953
- return {
4954
- allDayGuess: Boolean(!refined.startTime && !refined.endTime),
4955
- duration,
4956
- typeData: recurringData, // doesn't need endTime anymore but oh well
4957
- };
4958
- }
4959
- return null;
4960
- },
4961
- expand(typeData, framingRange, dateEnv) {
4962
- let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
4963
- if (clippedFramingRange) {
4964
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
4965
- }
4966
- return [];
4967
- },
4968
- };
4969
- const simpleRecurringEventsPlugin = createPlugin({
4970
- name: 'simple-recurring-event',
4971
- recurringTypes: [recurring],
4972
- eventRefiners: SIMPLE_RECURRING_REFINERS,
4973
- });
4974
- function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
4975
- let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
4976
- let dayMarker = startOfDay(framingRange.start);
4977
- let endMarker = framingRange.end;
4978
- let instanceStarts = [];
4979
- while (dayMarker < endMarker) {
4980
- let instanceStart;
4981
- // if everyday, or this particular day-of-week
4982
- if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
4983
- if (startTime) {
4984
- instanceStart = dateEnv.add(dayMarker, startTime);
4985
- }
4986
- else {
4987
- instanceStart = dayMarker;
4988
- }
4989
- instanceStarts.push(instanceStart);
4990
- }
4991
- dayMarker = addDays(dayMarker, 1);
4992
- }
4993
- return instanceStarts;
4994
- }
4995
-
4996
- const changeHandlerPlugin = createPlugin({
4997
- name: 'change-handler',
4998
- optionChangeHandlers: {
4999
- events(events, context) {
5000
- handleEventSources([events], context);
5001
- },
5002
- eventSources: handleEventSources,
5003
- },
5004
- });
5005
- /*
5006
- BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out
5007
- */
5008
- function handleEventSources(inputs, context) {
5009
- let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources);
5010
- let newInputs = [];
5011
- for (let input of inputs) {
5012
- let inputFound = false;
5013
- for (let i = 0; i < unfoundSources.length; i += 1) {
5014
- if (unfoundSources[i]._raw === input) {
5015
- unfoundSources.splice(i, 1); // delete
5016
- inputFound = true;
5017
- break;
5018
- }
5019
- }
5020
- if (!inputFound) {
5021
- newInputs.push(input);
5022
- }
5023
- }
5024
- for (let unfoundSource of unfoundSources) {
5025
- context.dispatch({
5026
- type: 'REMOVE_EVENT_SOURCE',
5027
- sourceId: unfoundSource.sourceId,
5028
- });
5029
- }
5030
- for (let newInput of newInputs) {
5031
- context.calendarApi.addEventSource(newInput);
5032
- }
5033
- }
5034
-
5035
- function handleDateProfile(dateProfile, context) {
5036
- context.emitter.trigger('datesSet', Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi }));
5037
- }
5038
-
5039
- function handleEventStore(eventStore, context) {
5040
- let { emitter } = context;
5041
- if (emitter.hasHandlers('eventsSet')) {
5042
- emitter.trigger('eventsSet', buildEventApis(eventStore, context));
5043
- }
5044
- }
5045
-
5046
- /*
5047
- this array is exposed on the root namespace so that UMD plugins can add to it.
5048
- see the rollup-bundles script.
5049
- */
5050
- const globalPlugins = [
5051
- arrayEventSourcePlugin,
5052
- funcEventSourcePlugin,
5053
- jsonFeedEventSourcePlugin,
5054
- simpleRecurringEventsPlugin,
5055
- changeHandlerPlugin,
5056
- createPlugin({
5057
- name: 'misc',
5058
- isLoadingFuncs: [
5059
- (state) => computeEventSourcesLoading(state.eventSources),
5060
- ],
5061
- propSetHandlers: {
5062
- dateProfile: handleDateProfile,
5063
- eventStore: handleEventStore,
5064
- },
5065
- }),
5066
- ];
5067
-
5068
- let canVGrowWithinCell;
5069
- function getCanVGrowWithinCell() {
5070
- if (canVGrowWithinCell == null) {
5071
- canVGrowWithinCell = computeCanVGrowWithinCell();
5072
- }
5073
- return canVGrowWithinCell;
5074
- }
5075
- function computeCanVGrowWithinCell() {
5076
- // for SSR, because this function is call immediately at top-level
5077
- // TODO: just make this logic execute top-level, immediately, instead of doing lazily
5078
- if (typeof document === 'undefined') {
5079
- return true;
4497
+ return canVGrowWithinCell;
4498
+ }
4499
+ function computeCanVGrowWithinCell() {
4500
+ // for SSR, because this function is call immediately at top-level
4501
+ // TODO: just make this logic execute top-level, immediately, instead of doing lazily
4502
+ if (typeof document === 'undefined') {
4503
+ return true;
5080
4504
  }
5081
4505
  let el = document.createElement('div');
5082
4506
  el.style.position = 'absolute';
@@ -7975,8 +7399,6 @@ var FullCalendar = (function (exports) {
7975
7399
  getStickyFooterScrollbar: getStickyFooterScrollbar,
7976
7400
  getStickyHeaderDates: getStickyHeaderDates,
7977
7401
  getUniqueDomId: getUniqueDomId,
7978
- globalLocales: globalLocales,
7979
- globalPlugins: globalPlugins,
7980
7402
  greatestDurationDenominator: greatestDurationDenominator,
7981
7403
  groupIntersectingEntries: groupIntersectingEntries,
7982
7404
  guid: guid,
@@ -8043,9 +7465,11 @@ var FullCalendar = (function (exports) {
8043
7465
  wholeDivideDurations: wholeDivideDurations
8044
7466
  };
8045
7467
 
8046
- var css_248z$3 = "\n/*\nfor css vars only.\nthese values are automatically known in all stylesheets.\nthe :root statement itself is only included in the common stylesheet.\nthis file is not processed by postcss when imported into the postcss-custom-properties plugin,\nso only write standard css!\n\nNOTE: for old browsers, will need to restart watcher after changing a variable\n*/\n\n:root {\n --fc-small-font-size: .85em;\n --fc-page-bg-color: #fff;\n --fc-neutral-bg-color: rgba(208, 208, 208, 0.3);\n --fc-neutral-text-color: #808080;\n --fc-border-color: #ddd;\n\n --fc-button-text-color: #fff;\n --fc-button-bg-color: #2C3E50;\n --fc-button-border-color: #2C3E50;\n --fc-button-hover-bg-color: #1e2b37;\n --fc-button-hover-border-color: #1a252f;\n --fc-button-active-bg-color: #1a252f;\n --fc-button-active-border-color: #151e27;\n\n --fc-event-bg-color: #3788d8;\n --fc-event-border-color: #3788d8;\n --fc-event-text-color: #fff;\n --fc-event-selected-overlay-color: rgba(0, 0, 0, 0.25);\n\n --fc-more-link-bg-color: #d0d0d0;\n --fc-more-link-text-color: inherit;\n\n --fc-event-resizer-thickness: 8px;\n --fc-event-resizer-dot-total-width: 8px;\n --fc-event-resizer-dot-border-width: 1px;\n\n --fc-non-business-color: rgba(215, 215, 215, 0.3);\n --fc-bg-event-color: rgb(143, 223, 130);\n --fc-bg-event-opacity: 0.3;\n --fc-highlight-color: rgba(188, 232, 241, 0.3);\n --fc-today-bg-color: rgba(255, 220, 40, 0.15);\n --fc-now-indicator-color: red;\n}\n\n/* classes attached to <body> */\n\n/* TODO: make fc-event selector work when calender in shadow DOM */\n\n.fc-not-allowed,\n.fc-not-allowed .fc-event { /* override events' custom cursors */\n cursor: not-allowed;\n}\n\n/* TODO: not attached to body. attached to specific els. move */\n\n.fc-unselectable {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n.fc {\n /* layout of immediate children */\n display: flex;\n flex-direction: column;\n\n font-size: 1em\n}\n.fc,\n .fc *,\n .fc *:before,\n .fc *:after {\n box-sizing: border-box;\n }\n.fc table {\n border-collapse: collapse;\n border-spacing: 0;\n font-size: 1em; /* normalize cross-browser */\n }\n.fc th {\n text-align: center;\n }\n.fc th,\n .fc td {\n vertical-align: top;\n padding: 0;\n }\n.fc a[data-navlink] {\n cursor: pointer;\n }\n.fc a[data-navlink]:hover {\n text-decoration: underline;\n }\n.fc-direction-ltr {\n direction: ltr;\n text-align: left;\n}\n.fc-direction-rtl {\n direction: rtl;\n text-align: right;\n}\n.fc-theme-standard td,\n .fc-theme-standard th {\n border: 1px solid var(--fc-border-color);\n }\n/* for FF, which doesn't expand a 100% div within a table cell. use absolute positioning */\n/* inner-wrappers are responsible for being absolute */\n/* TODO: best place for this? */\n.fc-liquid-hack td,\n .fc-liquid-hack th {\n position: relative;\n }\n\n@font-face {\n font-family: 'fcicons';\n src: url(\"data:application/x-font-ttf;charset=utf-8;base64,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\") format('truetype');\n font-weight: normal;\n font-style: normal;\n}\n\n.fc-icon {\n /* added for fc */\n display: inline-block;\n width: 1em;\n height: 1em;\n text-align: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: 'fcicons' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.fc-icon-chevron-left:before {\n content: \"\\e900\";\n}\n\n.fc-icon-chevron-right:before {\n content: \"\\e901\";\n}\n\n.fc-icon-chevrons-left:before {\n content: \"\\e902\";\n}\n\n.fc-icon-chevrons-right:before {\n content: \"\\e903\";\n}\n\n.fc-icon-minus-square:before {\n content: \"\\e904\";\n}\n\n.fc-icon-plus-square:before {\n content: \"\\e905\";\n}\n\n.fc-icon-x:before {\n content: \"\\e906\";\n}\n/*\nLots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css\n\nThese styles only apply when the standard-theme is activated.\nWhen it's NOT activated, the fc-button classes won't even be in the DOM.\n*/\n.fc {\n\n /* reset */\n\n}\n.fc .fc-button {\n border-radius: 0;\n overflow: visible;\n text-transform: none;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n }\n.fc .fc-button:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n }\n.fc .fc-button {\n -webkit-appearance: button;\n }\n.fc .fc-button:not(:disabled) {\n cursor: pointer;\n }\n.fc .fc-button::-moz-focus-inner {\n padding: 0;\n border-style: none;\n }\n.fc {\n\n /* theme */\n\n}\n.fc .fc-button {\n display: inline-block;\n font-weight: 400;\n text-align: center;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.4em 0.65em;\n font-size: 1em;\n line-height: 1.5;\n border-radius: 0.25em;\n }\n.fc .fc-button:hover {\n text-decoration: none;\n }\n.fc .fc-button:focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);\n }\n.fc .fc-button:disabled {\n opacity: 0.65;\n }\n.fc {\n\n /* \"primary\" coloring */\n\n}\n.fc .fc-button-primary {\n color: var(--fc-button-text-color);\n background-color: var(--fc-button-bg-color);\n border-color: var(--fc-button-border-color);\n }\n.fc .fc-button-primary:hover {\n color: var(--fc-button-text-color);\n background-color: var(--fc-button-hover-bg-color);\n border-color: var(--fc-button-hover-border-color);\n }\n.fc .fc-button-primary:disabled { /* not DRY */\n color: var(--fc-button-text-color);\n background-color: var(--fc-button-bg-color);\n border-color: var(--fc-button-border-color); /* overrides :hover */\n }\n.fc .fc-button-primary:focus {\n box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);\n }\n.fc .fc-button-primary:not(:disabled):active,\n .fc .fc-button-primary:not(:disabled).fc-button-active {\n color: var(--fc-button-text-color);\n background-color: var(--fc-button-active-bg-color);\n border-color: var(--fc-button-active-border-color);\n }\n.fc .fc-button-primary:not(:disabled):active:focus,\n .fc .fc-button-primary:not(:disabled).fc-button-active:focus {\n box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);\n }\n.fc {\n\n /* icons within buttons */\n\n}\n.fc .fc-button .fc-icon {\n vertical-align: middle;\n font-size: 1.5em; /* bump up the size (but don't make it bigger than line-height of button, which is 1.5em also) */\n }\n.fc .fc-button-group {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n }\n.fc .fc-button-group > .fc-button {\n position: relative;\n flex: 1 1 auto;\n }\n.fc .fc-button-group > .fc-button:hover {\n z-index: 1;\n }\n.fc .fc-button-group > .fc-button:focus,\n .fc .fc-button-group > .fc-button:active,\n .fc .fc-button-group > .fc-button.fc-button-active {\n z-index: 1;\n }\n.fc-direction-ltr .fc-button-group > .fc-button:not(:first-child) {\n margin-left: -1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n.fc-direction-ltr .fc-button-group > .fc-button:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n.fc-direction-rtl .fc-button-group > .fc-button:not(:first-child) {\n margin-right: -1px;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n.fc-direction-rtl .fc-button-group > .fc-button:not(:last-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n.fc .fc-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n.fc .fc-toolbar.fc-header-toolbar {\n margin-bottom: 1.5em;\n }\n.fc .fc-toolbar.fc-footer-toolbar {\n margin-top: 1.5em;\n }\n.fc .fc-toolbar-title {\n font-size: 1.75em;\n margin: 0;\n }\n.fc-direction-ltr .fc-toolbar > * > :not(:first-child) {\n margin-left: .75em; /* space between */\n }\n.fc-direction-rtl .fc-toolbar > * > :not(:first-child) {\n margin-right: .75em; /* space between */\n }\n.fc-direction-rtl .fc-toolbar-ltr { /* when the toolbar-chunk positioning system is explicitly left-to-right */\n flex-direction: row-reverse;\n }\n.fc .fc-scroller {\n -webkit-overflow-scrolling: touch;\n position: relative; /* for abs-positioned elements within */\n }\n.fc .fc-scroller-liquid {\n height: 100%;\n }\n.fc .fc-scroller-liquid-absolute {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n }\n.fc .fc-scroller-harness {\n position: relative;\n overflow: hidden;\n direction: ltr;\n /* hack for chrome computing the scroller's right/left wrong for rtl. undone below... */\n /* TODO: demonstrate in codepen */\n }\n.fc .fc-scroller-harness-liquid {\n height: 100%;\n }\n.fc-direction-rtl .fc-scroller-harness > .fc-scroller { /* undo above hack */\n direction: rtl;\n }\n.fc-theme-standard .fc-scrollgrid {\n border: 1px solid var(--fc-border-color); /* bootstrap does this. match */\n }\n.fc .fc-scrollgrid,\n .fc .fc-scrollgrid table { /* all tables (self included) */\n width: 100%; /* because tables don't normally do this */\n table-layout: fixed;\n }\n.fc .fc-scrollgrid table { /* inner tables */\n border-top-style: hidden;\n border-left-style: hidden;\n border-right-style: hidden;\n }\n.fc .fc-scrollgrid {\n\n border-collapse: separate;\n border-right-width: 0;\n border-bottom-width: 0;\n\n }\n.fc .fc-scrollgrid-liquid {\n height: 100%;\n }\n.fc .fc-scrollgrid-section { /* a <tr> */\n height: 1px /* better than 0, for firefox */\n\n }\n.fc .fc-scrollgrid-section > td {\n height: 1px; /* needs a height so inner div within grow. better than 0, for firefox */\n }\n.fc .fc-scrollgrid-section table {\n height: 1px;\n /* for most browsers, if a height isn't set on the table, can't do liquid-height within cells */\n /* serves as a min-height. harmless */\n }\n.fc .fc-scrollgrid-section-liquid > td {\n height: 100%; /* better than `auto`, for firefox */\n }\n.fc .fc-scrollgrid-section > * {\n border-top-width: 0;\n border-left-width: 0;\n }\n.fc .fc-scrollgrid-section-header > *,\n .fc .fc-scrollgrid-section-footer > * {\n border-bottom-width: 0;\n }\n.fc .fc-scrollgrid-section-body table,\n .fc .fc-scrollgrid-section-footer table {\n border-bottom-style: hidden; /* head keeps its bottom border tho */\n }\n.fc {\n\n /* stickiness */\n\n}\n.fc .fc-scrollgrid-section-sticky > * {\n background: var(--fc-page-bg-color);\n position: sticky;\n z-index: 3; /* TODO: var */\n /* TODO: box-shadow when sticking */\n }\n.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky > * {\n top: 0; /* because border-sharing causes a gap at the top */\n /* TODO: give safari -1. has bug */\n }\n.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky > * {\n bottom: 0; /* known bug: bottom-stickiness doesn't work in safari */\n }\n.fc .fc-scrollgrid-sticky-shim { /* for horizontal scrollbar */\n height: 1px; /* needs height to create scrollbars */\n margin-bottom: -1px;\n }\n.fc-sticky { /* no .fc wrap because used as child of body */\n position: sticky;\n}\n.fc .fc-view-harness {\n flex-grow: 1; /* because this harness is WITHIN the .fc's flexbox */\n position: relative;\n }\n.fc {\n\n /* when the harness controls the height, make the view liquid */\n\n}\n.fc .fc-view-harness-active > .fc-view {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n.fc .fc-col-header-cell-cushion {\n display: inline-block; /* x-browser for when sticky (when multi-tier header) */\n padding: 2px 4px;\n }\n.fc .fc-bg-event,\n .fc .fc-non-business,\n .fc .fc-highlight {\n /* will always have a harness with position:relative/absolute, so absolutely expand */\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n.fc .fc-non-business {\n background: var(--fc-non-business-color);\n }\n.fc .fc-bg-event {\n background: var(--fc-bg-event-color);\n opacity: var(--fc-bg-event-opacity)\n }\n.fc .fc-bg-event .fc-event-title {\n margin: .5em;\n font-size: var(--fc-small-font-size);\n font-style: italic;\n }\n.fc .fc-highlight {\n background: var(--fc-highlight-color);\n }\n.fc .fc-cell-shaded,\n .fc .fc-day-disabled {\n background: var(--fc-neutral-bg-color);\n }\n/* link resets */\n/* ---------------------------------------------------------------------------------------------------- */\na.fc-event,\na.fc-event:hover {\n text-decoration: none;\n}\n/* cursor */\n.fc-event[href],\n.fc-event.fc-event-draggable {\n cursor: pointer;\n}\n/* event text content */\n/* ---------------------------------------------------------------------------------------------------- */\n.fc-event .fc-event-main {\n position: relative;\n z-index: 2;\n }\n/* dragging */\n/* ---------------------------------------------------------------------------------------------------- */\n.fc-event-dragging:not(.fc-event-selected) { /* MOUSE */\n opacity: 0.75;\n }\n.fc-event-dragging.fc-event-selected { /* TOUCH */\n box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3);\n }\n/* resizing */\n/* ---------------------------------------------------------------------------------------------------- */\n/* (subclasses should hone positioning for touch and non-touch) */\n.fc-event .fc-event-resizer {\n display: none;\n position: absolute;\n z-index: 4;\n }\n.fc-event:hover, /* MOUSE */\n.fc-event-selected { /* TOUCH */\n\n}\n.fc-event:hover .fc-event-resizer, .fc-event-selected .fc-event-resizer {\n display: block;\n }\n.fc-event-selected .fc-event-resizer {\n border-radius: calc(var(--fc-event-resizer-dot-total-width) / 2);\n border-width: var(--fc-event-resizer-dot-border-width);\n width: var(--fc-event-resizer-dot-total-width);\n height: var(--fc-event-resizer-dot-total-width);\n border-style: solid;\n border-color: inherit;\n background: var(--fc-page-bg-color)\n\n /* expand hit area */\n\n }\n.fc-event-selected .fc-event-resizer:before {\n content: '';\n position: absolute;\n top: -20px;\n left: -20px;\n right: -20px;\n bottom: -20px;\n }\n/* selecting (always TOUCH) */\n/* OR, focused by tab-index */\n/* (TODO: maybe not the best focus-styling for .fc-daygrid-dot-event) */\n/* ---------------------------------------------------------------------------------------------------- */\n.fc-event-selected,\n.fc-event:focus {\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2)\n\n /* expand hit area (subclasses should expand) */\n\n}\n.fc-event-selected:before, .fc-event:focus:before {\n content: \"\";\n position: absolute;\n z-index: 3;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n.fc-event-selected,\n.fc-event:focus {\n\n /* dimmer effect */\n\n}\n.fc-event-selected:after, .fc-event:focus:after {\n content: \"\";\n background: var(--fc-event-selected-overlay-color);\n position: absolute;\n z-index: 1;\n\n /* assume there's a border on all sides. overcome it. */\n /* sometimes there's NOT a border, in which case the dimmer will go over */\n /* an adjacent border, which looks fine. */\n top: -1px;\n left: -1px;\n right: -1px;\n bottom: -1px;\n }\n/*\nA HORIZONTAL event\n*/\n.fc-h-event { /* allowed to be top-level */\n display: block;\n border: 1px solid var(--fc-event-border-color);\n background-color: var(--fc-event-bg-color)\n\n}\n.fc-h-event .fc-event-main {\n color: var(--fc-event-text-color);\n }\n.fc-h-event .fc-event-main-frame {\n display: flex; /* for make fc-event-title-container expand */\n }\n.fc-h-event .fc-event-time {\n max-width: 100%; /* clip overflow on this element */\n overflow: hidden;\n }\n.fc-h-event .fc-event-title-container { /* serves as a container for the sticky cushion */\n flex-grow: 1;\n flex-shrink: 1;\n min-width: 0; /* important for allowing to shrink all the way */\n }\n.fc-h-event .fc-event-title {\n display: inline-block; /* need this to be sticky cross-browser */\n vertical-align: top; /* for not messing up line-height */\n left: 0; /* for sticky */\n right: 0; /* for sticky */\n max-width: 100%; /* clip overflow on this element */\n overflow: hidden;\n }\n.fc-h-event.fc-event-selected:before {\n /* expand hit area */\n top: -10px;\n bottom: -10px;\n }\n/* adjust border and border-radius (if there is any) for non-start/end */\n.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),\n.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n border-left-width: 0;\n}\n.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),\n.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-right-width: 0;\n}\n/* resizers */\n.fc-h-event:not(.fc-event-selected) .fc-event-resizer {\n top: 0;\n bottom: 0;\n width: var(--fc-event-resizer-thickness);\n}\n.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,\n.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end {\n cursor: w-resize;\n left: calc(-0.5 * var(--fc-event-resizer-thickness));\n}\n.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,\n.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start {\n cursor: e-resize;\n right: calc(-0.5 * var(--fc-event-resizer-thickness));\n}\n/* resizers for TOUCH */\n.fc-h-event.fc-event-selected .fc-event-resizer {\n top: 50%;\n margin-top: calc(-0.5 * var(--fc-event-resizer-dot-total-width));\n}\n.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,\n.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end {\n left: calc(-0.5 * var(--fc-event-resizer-dot-total-width));\n}\n.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,\n.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start {\n right: calc(-0.5 * var(--fc-event-resizer-dot-total-width));\n}\n.fc .fc-popover {\n position: absolute;\n z-index: 9999;\n box-shadow: 0 2px 6px rgba(0,0,0,.15);\n }\n.fc .fc-popover-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 3px 4px;\n }\n.fc .fc-popover-title {\n margin: 0 2px;\n }\n.fc .fc-popover-close {\n cursor: pointer;\n opacity: 0.65;\n font-size: 1.1em;\n }\n.fc-theme-standard .fc-popover {\n border: 1px solid var(--fc-border-color);\n background: var(--fc-page-bg-color);\n }\n.fc-theme-standard .fc-popover-header {\n background: var(--fc-neutral-bg-color);\n }\n";
7468
+ var css_248z$3 = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{border-style:none;padding:0}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}";
8047
7469
  injectStyles(css_248z$3);
8048
7470
 
7471
+ const globalLocales = [];
7472
+
8049
7473
  const MINIMAL_RAW_EN_LOCALE = {
8050
7474
  code: 'en',
8051
7475
  week: {
@@ -8139,89 +7563,248 @@ var FullCalendar = (function (exports) {
8139
7563
  };
8140
7564
  }
8141
7565
 
8142
- class StandardTheme extends Theme {
8143
- }
8144
- StandardTheme.prototype.classes = {
8145
- root: 'fc-theme-standard',
8146
- tableCellShaded: 'fc-cell-shaded',
8147
- buttonGroup: 'fc-button-group',
8148
- button: 'fc-button fc-button-primary',
8149
- buttonActive: 'fc-button-active',
8150
- };
8151
- StandardTheme.prototype.baseIconClass = 'fc-icon';
8152
- StandardTheme.prototype.iconClasses = {
8153
- close: 'fc-icon-x',
8154
- prev: 'fc-icon-chevron-left',
8155
- next: 'fc-icon-chevron-right',
8156
- prevYear: 'fc-icon-chevrons-left',
8157
- nextYear: 'fc-icon-chevrons-right',
8158
- };
8159
- StandardTheme.prototype.rtlIconClasses = {
8160
- prev: 'fc-icon-chevron-right',
8161
- next: 'fc-icon-chevron-left',
8162
- prevYear: 'fc-icon-chevrons-right',
8163
- nextYear: 'fc-icon-chevrons-left',
8164
- };
8165
- StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly
8166
- StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
8167
- StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
8168
-
8169
- function compileViewDefs(defaultConfigs, overrideConfigs) {
8170
- let hash = {};
8171
- let viewType;
8172
- for (viewType in defaultConfigs) {
8173
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
8174
- }
8175
- for (viewType in overrideConfigs) {
8176
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
8177
- }
8178
- return hash;
8179
- }
8180
- function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
8181
- if (hash[viewType]) {
8182
- return hash[viewType];
8183
- }
8184
- let viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
8185
- if (viewDef) {
8186
- hash[viewType] = viewDef;
8187
- }
8188
- return viewDef;
8189
- }
8190
- function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
8191
- let defaultConfig = defaultConfigs[viewType];
8192
- let overrideConfig = overrideConfigs[viewType];
8193
- let queryProp = (name) => ((defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
8194
- ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null));
8195
- let theComponent = queryProp('component');
8196
- let superType = queryProp('superType');
8197
- let superDef = null;
8198
- if (superType) {
8199
- if (superType === viewType) {
8200
- throw new Error('Can\'t have a custom view type that references itself');
8201
- }
8202
- superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
8203
- }
8204
- if (!theComponent && superDef) {
8205
- theComponent = superDef.component;
8206
- }
8207
- if (!theComponent) {
8208
- return null; // don't throw a warning, might be settings for a single-unit view
8209
- }
7566
+ // TODO: easier way to add new hooks? need to update a million things
7567
+ function createPlugin(input) {
8210
7568
  return {
8211
- type: viewType,
8212
- component: theComponent,
8213
- defaults: Object.assign(Object.assign({}, (superDef ? superDef.defaults : {})), (defaultConfig ? defaultConfig.rawOptions : {})),
8214
- overrides: Object.assign(Object.assign({}, (superDef ? superDef.overrides : {})), (overrideConfig ? overrideConfig.rawOptions : {})),
8215
- };
8216
- }
8217
-
8218
- function parseViewConfigs(inputs) {
8219
- return mapHash(inputs, parseViewConfig);
8220
- }
8221
- function parseViewConfig(input) {
8222
- let rawOptions = typeof input === 'function' ?
8223
- { component: input } :
8224
- input;
7569
+ id: guid(),
7570
+ name: input.name,
7571
+ premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : undefined,
7572
+ deps: input.deps || [],
7573
+ reducers: input.reducers || [],
7574
+ isLoadingFuncs: input.isLoadingFuncs || [],
7575
+ contextInit: [].concat(input.contextInit || []),
7576
+ eventRefiners: input.eventRefiners || {},
7577
+ eventDefMemberAdders: input.eventDefMemberAdders || [],
7578
+ eventSourceRefiners: input.eventSourceRefiners || {},
7579
+ isDraggableTransformers: input.isDraggableTransformers || [],
7580
+ eventDragMutationMassagers: input.eventDragMutationMassagers || [],
7581
+ eventDefMutationAppliers: input.eventDefMutationAppliers || [],
7582
+ dateSelectionTransformers: input.dateSelectionTransformers || [],
7583
+ datePointTransforms: input.datePointTransforms || [],
7584
+ dateSpanTransforms: input.dateSpanTransforms || [],
7585
+ views: input.views || {},
7586
+ viewPropsTransformers: input.viewPropsTransformers || [],
7587
+ isPropsValid: input.isPropsValid || null,
7588
+ externalDefTransforms: input.externalDefTransforms || [],
7589
+ viewContainerAppends: input.viewContainerAppends || [],
7590
+ eventDropTransformers: input.eventDropTransformers || [],
7591
+ componentInteractions: input.componentInteractions || [],
7592
+ calendarInteractions: input.calendarInteractions || [],
7593
+ themeClasses: input.themeClasses || {},
7594
+ eventSourceDefs: input.eventSourceDefs || [],
7595
+ cmdFormatter: input.cmdFormatter,
7596
+ recurringTypes: input.recurringTypes || [],
7597
+ namedTimeZonedImpl: input.namedTimeZonedImpl,
7598
+ initialView: input.initialView || '',
7599
+ elementDraggingImpl: input.elementDraggingImpl,
7600
+ optionChangeHandlers: input.optionChangeHandlers || {},
7601
+ scrollGridImpl: input.scrollGridImpl || null,
7602
+ listenerRefiners: input.listenerRefiners || {},
7603
+ optionRefiners: input.optionRefiners || {},
7604
+ propSetHandlers: input.propSetHandlers || {},
7605
+ };
7606
+ }
7607
+ function buildPluginHooks(pluginDefs, globalDefs) {
7608
+ let currentPluginIds = {};
7609
+ let hooks = {
7610
+ premiumReleaseDate: undefined,
7611
+ reducers: [],
7612
+ isLoadingFuncs: [],
7613
+ contextInit: [],
7614
+ eventRefiners: {},
7615
+ eventDefMemberAdders: [],
7616
+ eventSourceRefiners: {},
7617
+ isDraggableTransformers: [],
7618
+ eventDragMutationMassagers: [],
7619
+ eventDefMutationAppliers: [],
7620
+ dateSelectionTransformers: [],
7621
+ datePointTransforms: [],
7622
+ dateSpanTransforms: [],
7623
+ views: {},
7624
+ viewPropsTransformers: [],
7625
+ isPropsValid: null,
7626
+ externalDefTransforms: [],
7627
+ viewContainerAppends: [],
7628
+ eventDropTransformers: [],
7629
+ componentInteractions: [],
7630
+ calendarInteractions: [],
7631
+ themeClasses: {},
7632
+ eventSourceDefs: [],
7633
+ cmdFormatter: null,
7634
+ recurringTypes: [],
7635
+ namedTimeZonedImpl: null,
7636
+ initialView: '',
7637
+ elementDraggingImpl: null,
7638
+ optionChangeHandlers: {},
7639
+ scrollGridImpl: null,
7640
+ listenerRefiners: {},
7641
+ optionRefiners: {},
7642
+ propSetHandlers: {},
7643
+ };
7644
+ function addDefs(defs) {
7645
+ for (let def of defs) {
7646
+ const pluginName = def.name;
7647
+ const currentId = currentPluginIds[pluginName];
7648
+ if (currentId === undefined) {
7649
+ currentPluginIds[pluginName] = def.id;
7650
+ addDefs(def.deps);
7651
+ hooks = combineHooks(hooks, def);
7652
+ }
7653
+ else if (currentId !== def.id) {
7654
+ // different ID than the one already added
7655
+ console.warn(`Duplicate plugin '${pluginName}'`);
7656
+ }
7657
+ }
7658
+ }
7659
+ if (pluginDefs) {
7660
+ addDefs(pluginDefs);
7661
+ }
7662
+ addDefs(globalDefs);
7663
+ return hooks;
7664
+ }
7665
+ function buildBuildPluginHooks() {
7666
+ let currentOverrideDefs = [];
7667
+ let currentGlobalDefs = [];
7668
+ let currentHooks;
7669
+ return (overrideDefs, globalDefs) => {
7670
+ if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) {
7671
+ currentHooks = buildPluginHooks(overrideDefs, globalDefs);
7672
+ }
7673
+ currentOverrideDefs = overrideDefs;
7674
+ currentGlobalDefs = globalDefs;
7675
+ return currentHooks;
7676
+ };
7677
+ }
7678
+ function combineHooks(hooks0, hooks1) {
7679
+ return {
7680
+ premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate),
7681
+ reducers: hooks0.reducers.concat(hooks1.reducers),
7682
+ isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs),
7683
+ contextInit: hooks0.contextInit.concat(hooks1.contextInit),
7684
+ eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners),
7685
+ eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders),
7686
+ eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners),
7687
+ isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
7688
+ eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
7689
+ eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
7690
+ dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
7691
+ datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
7692
+ dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
7693
+ views: Object.assign(Object.assign({}, hooks0.views), hooks1.views),
7694
+ viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
7695
+ isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
7696
+ externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
7697
+ viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends),
7698
+ eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
7699
+ calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
7700
+ componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
7701
+ themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses),
7702
+ eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
7703
+ cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
7704
+ recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
7705
+ namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
7706
+ initialView: hooks0.initialView || hooks1.initialView,
7707
+ elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
7708
+ optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers),
7709
+ scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl,
7710
+ listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners),
7711
+ optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners),
7712
+ propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers),
7713
+ };
7714
+ }
7715
+ function compareOptionalDates(date0, date1) {
7716
+ if (date0 === undefined) {
7717
+ return date1;
7718
+ }
7719
+ if (date1 === undefined) {
7720
+ return date0;
7721
+ }
7722
+ return new Date(Math.max(date0.valueOf(), date1.valueOf()));
7723
+ }
7724
+
7725
+ class StandardTheme extends Theme {
7726
+ }
7727
+ StandardTheme.prototype.classes = {
7728
+ root: 'fc-theme-standard',
7729
+ tableCellShaded: 'fc-cell-shaded',
7730
+ buttonGroup: 'fc-button-group',
7731
+ button: 'fc-button fc-button-primary',
7732
+ buttonActive: 'fc-button-active',
7733
+ };
7734
+ StandardTheme.prototype.baseIconClass = 'fc-icon';
7735
+ StandardTheme.prototype.iconClasses = {
7736
+ close: 'fc-icon-x',
7737
+ prev: 'fc-icon-chevron-left',
7738
+ next: 'fc-icon-chevron-right',
7739
+ prevYear: 'fc-icon-chevrons-left',
7740
+ nextYear: 'fc-icon-chevrons-right',
7741
+ };
7742
+ StandardTheme.prototype.rtlIconClasses = {
7743
+ prev: 'fc-icon-chevron-right',
7744
+ next: 'fc-icon-chevron-left',
7745
+ prevYear: 'fc-icon-chevrons-right',
7746
+ nextYear: 'fc-icon-chevrons-left',
7747
+ };
7748
+ StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly
7749
+ StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
7750
+ StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
7751
+
7752
+ function compileViewDefs(defaultConfigs, overrideConfigs) {
7753
+ let hash = {};
7754
+ let viewType;
7755
+ for (viewType in defaultConfigs) {
7756
+ ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
7757
+ }
7758
+ for (viewType in overrideConfigs) {
7759
+ ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
7760
+ }
7761
+ return hash;
7762
+ }
7763
+ function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
7764
+ if (hash[viewType]) {
7765
+ return hash[viewType];
7766
+ }
7767
+ let viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
7768
+ if (viewDef) {
7769
+ hash[viewType] = viewDef;
7770
+ }
7771
+ return viewDef;
7772
+ }
7773
+ function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
7774
+ let defaultConfig = defaultConfigs[viewType];
7775
+ let overrideConfig = overrideConfigs[viewType];
7776
+ let queryProp = (name) => ((defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
7777
+ ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null));
7778
+ let theComponent = queryProp('component');
7779
+ let superType = queryProp('superType');
7780
+ let superDef = null;
7781
+ if (superType) {
7782
+ if (superType === viewType) {
7783
+ throw new Error('Can\'t have a custom view type that references itself');
7784
+ }
7785
+ superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
7786
+ }
7787
+ if (!theComponent && superDef) {
7788
+ theComponent = superDef.component;
7789
+ }
7790
+ if (!theComponent) {
7791
+ return null; // don't throw a warning, might be settings for a single-unit view
7792
+ }
7793
+ return {
7794
+ type: viewType,
7795
+ component: theComponent,
7796
+ defaults: Object.assign(Object.assign({}, (superDef ? superDef.defaults : {})), (defaultConfig ? defaultConfig.rawOptions : {})),
7797
+ overrides: Object.assign(Object.assign({}, (superDef ? superDef.overrides : {})), (overrideConfig ? overrideConfig.rawOptions : {})),
7798
+ };
7799
+ }
7800
+
7801
+ function parseViewConfigs(inputs) {
7802
+ return mapHash(inputs, parseViewConfig);
7803
+ }
7804
+ function parseViewConfig(input) {
7805
+ let rawOptions = typeof input === 'function' ?
7806
+ { component: input } :
7807
+ input;
8225
7808
  let { component } = rawOptions;
8226
7809
  if (rawOptions.content) {
8227
7810
  component = createViewHookComponent(rawOptions);
@@ -8343,29 +7926,193 @@ var FullCalendar = (function (exports) {
8343
7926
  default:
8344
7927
  return dynamicOptionOverrides;
8345
7928
  }
8346
- }
8347
-
8348
- function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) {
8349
- let dp;
8350
- switch (action.type) {
8351
- case 'CHANGE_VIEW_TYPE':
8352
- return dateProfileGenerator.build(action.dateMarker || currentDate);
8353
- case 'CHANGE_DATE':
8354
- return dateProfileGenerator.build(action.dateMarker);
8355
- case 'PREV':
8356
- dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate);
8357
- if (dp.isValid) {
8358
- return dp;
8359
- }
8360
- break;
8361
- case 'NEXT':
8362
- dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate);
8363
- if (dp.isValid) {
8364
- return dp;
8365
- }
8366
- break;
7929
+ }
7930
+
7931
+ function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) {
7932
+ let dp;
7933
+ switch (action.type) {
7934
+ case 'CHANGE_VIEW_TYPE':
7935
+ return dateProfileGenerator.build(action.dateMarker || currentDate);
7936
+ case 'CHANGE_DATE':
7937
+ return dateProfileGenerator.build(action.dateMarker);
7938
+ case 'PREV':
7939
+ dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate);
7940
+ if (dp.isValid) {
7941
+ return dp;
7942
+ }
7943
+ break;
7944
+ case 'NEXT':
7945
+ dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate);
7946
+ if (dp.isValid) {
7947
+ return dp;
7948
+ }
7949
+ break;
7950
+ }
7951
+ return currentDateProfile;
7952
+ }
7953
+
7954
+ function initEventSources(calendarOptions, dateProfile, context) {
7955
+ let activeRange = dateProfile ? dateProfile.activeRange : null;
7956
+ return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context);
7957
+ }
7958
+ function reduceEventSources(eventSources, action, dateProfile, context) {
7959
+ let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
7960
+ switch (action.type) {
7961
+ case 'ADD_EVENT_SOURCES': // already parsed
7962
+ return addSources(eventSources, action.sources, activeRange, context);
7963
+ case 'REMOVE_EVENT_SOURCE':
7964
+ return removeSource(eventSources, action.sourceId);
7965
+ case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
7966
+ case 'NEXT':
7967
+ case 'CHANGE_DATE':
7968
+ case 'CHANGE_VIEW_TYPE':
7969
+ if (dateProfile) {
7970
+ return fetchDirtySources(eventSources, activeRange, context);
7971
+ }
7972
+ return eventSources;
7973
+ case 'FETCH_EVENT_SOURCES':
7974
+ return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type?
7975
+ arrayToHash(action.sourceIds) :
7976
+ excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context);
7977
+ case 'RECEIVE_EVENTS':
7978
+ case 'RECEIVE_EVENT_ERROR':
7979
+ return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
7980
+ case 'REMOVE_ALL_EVENT_SOURCES':
7981
+ return {};
7982
+ default:
7983
+ return eventSources;
7984
+ }
7985
+ }
7986
+ function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) {
7987
+ let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
7988
+ return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context);
7989
+ }
7990
+ function computeEventSourcesLoading(eventSources) {
7991
+ for (let sourceId in eventSources) {
7992
+ if (eventSources[sourceId].isFetching) {
7993
+ return true;
7994
+ }
7995
+ }
7996
+ return false;
7997
+ }
7998
+ function addSources(eventSourceHash, sources, fetchRange, context) {
7999
+ let hash = {};
8000
+ for (let source of sources) {
8001
+ hash[source.sourceId] = source;
8002
+ }
8003
+ if (fetchRange) {
8004
+ hash = fetchDirtySources(hash, fetchRange, context);
8005
+ }
8006
+ return Object.assign(Object.assign({}, eventSourceHash), hash);
8007
+ }
8008
+ function removeSource(eventSourceHash, sourceId) {
8009
+ return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId);
8010
+ }
8011
+ function fetchDirtySources(sourceHash, fetchRange, context) {
8012
+ return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context);
8013
+ }
8014
+ function isSourceDirty(eventSource, fetchRange, context) {
8015
+ if (!doesSourceNeedRange(eventSource, context)) {
8016
+ return !eventSource.latestFetchId;
8017
+ }
8018
+ return !context.options.lazyFetching ||
8019
+ !eventSource.fetchRange ||
8020
+ eventSource.isFetching || // always cancel outdated in-progress fetches
8021
+ fetchRange.start < eventSource.fetchRange.start ||
8022
+ fetchRange.end > eventSource.fetchRange.end;
8023
+ }
8024
+ function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) {
8025
+ let nextSources = {};
8026
+ for (let sourceId in prevSources) {
8027
+ let source = prevSources[sourceId];
8028
+ if (sourceIdHash[sourceId]) {
8029
+ nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context);
8030
+ }
8031
+ else {
8032
+ nextSources[sourceId] = source;
8033
+ }
8034
+ }
8035
+ return nextSources;
8036
+ }
8037
+ function fetchSource(eventSource, fetchRange, isRefetch, context) {
8038
+ let { options, calendarApi } = context;
8039
+ let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId];
8040
+ let fetchId = guid();
8041
+ sourceDef.fetch({
8042
+ eventSource,
8043
+ range: fetchRange,
8044
+ isRefetch,
8045
+ context,
8046
+ }, (res) => {
8047
+ let { rawEvents } = res;
8048
+ if (options.eventSourceSuccess) {
8049
+ rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents;
8050
+ }
8051
+ if (eventSource.success) {
8052
+ rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents;
8053
+ }
8054
+ context.dispatch({
8055
+ type: 'RECEIVE_EVENTS',
8056
+ sourceId: eventSource.sourceId,
8057
+ fetchId,
8058
+ fetchRange,
8059
+ rawEvents,
8060
+ });
8061
+ }, (error) => {
8062
+ let errorHandled = false;
8063
+ if (options.eventSourceFailure) {
8064
+ options.eventSourceFailure.call(calendarApi, error);
8065
+ errorHandled = true;
8066
+ }
8067
+ if (eventSource.failure) {
8068
+ eventSource.failure(error);
8069
+ errorHandled = true;
8070
+ }
8071
+ if (!errorHandled) {
8072
+ console.warn(error.message, error);
8073
+ }
8074
+ context.dispatch({
8075
+ type: 'RECEIVE_EVENT_ERROR',
8076
+ sourceId: eventSource.sourceId,
8077
+ fetchId,
8078
+ fetchRange,
8079
+ error,
8080
+ });
8081
+ });
8082
+ return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId });
8083
+ }
8084
+ function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
8085
+ let eventSource = sourceHash[sourceId];
8086
+ if (eventSource && // not already removed
8087
+ fetchId === eventSource.latestFetchId) {
8088
+ return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) });
8089
+ }
8090
+ return sourceHash;
8091
+ }
8092
+ function excludeStaticSources(eventSources, context) {
8093
+ return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context));
8094
+ }
8095
+ function parseInitialSources(rawOptions, context) {
8096
+ let refiners = buildEventSourceRefiners(context);
8097
+ let rawSources = [].concat(rawOptions.eventSources || []);
8098
+ let sources = []; // parsed
8099
+ if (rawOptions.initialEvents) {
8100
+ rawSources.unshift(rawOptions.initialEvents);
8101
+ }
8102
+ if (rawOptions.events) {
8103
+ rawSources.unshift(rawOptions.events);
8367
8104
  }
8368
- return currentDateProfile;
8105
+ for (let rawSource of rawSources) {
8106
+ let source = parseEventSource(rawSource, context, refiners);
8107
+ if (source) {
8108
+ sources.push(source);
8109
+ }
8110
+ }
8111
+ return sources;
8112
+ }
8113
+ function doesSourceNeedRange(eventSource, context) {
8114
+ let defs = context.pluginHooks.eventSourceDefs;
8115
+ return !defs[eventSource.sourceDefId].ignoreRange;
8369
8116
  }
8370
8117
 
8371
8118
  function reduceDateSelection(currentSelection, action) {
@@ -8518,41 +8265,292 @@ var FullCalendar = (function (exports) {
8518
8265
  ], calendarButtonText[buttonName]);
8519
8266
  }
8520
8267
  }
8521
- return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint };
8522
- })));
8523
- return { widgets, viewsWithButtons, hasTitle };
8524
- }
8525
-
8526
- // always represents the current view. otherwise, it'd need to change value every time date changes
8527
- class ViewImpl {
8528
- constructor(type, getCurrentData, dateEnv) {
8529
- this.type = type;
8530
- this.getCurrentData = getCurrentData;
8531
- this.dateEnv = dateEnv;
8532
- }
8533
- get calendar() {
8534
- return this.getCurrentData().calendarApi;
8535
- }
8536
- get title() {
8537
- return this.getCurrentData().viewTitle;
8538
- }
8539
- get activeStart() {
8540
- return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);
8541
- }
8542
- get activeEnd() {
8543
- return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);
8268
+ return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint };
8269
+ })));
8270
+ return { widgets, viewsWithButtons, hasTitle };
8271
+ }
8272
+
8273
+ // always represents the current view. otherwise, it'd need to change value every time date changes
8274
+ class ViewImpl {
8275
+ constructor(type, getCurrentData, dateEnv) {
8276
+ this.type = type;
8277
+ this.getCurrentData = getCurrentData;
8278
+ this.dateEnv = dateEnv;
8279
+ }
8280
+ get calendar() {
8281
+ return this.getCurrentData().calendarApi;
8282
+ }
8283
+ get title() {
8284
+ return this.getCurrentData().viewTitle;
8285
+ }
8286
+ get activeStart() {
8287
+ return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);
8288
+ }
8289
+ get activeEnd() {
8290
+ return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);
8291
+ }
8292
+ get currentStart() {
8293
+ return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start);
8294
+ }
8295
+ get currentEnd() {
8296
+ return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end);
8297
+ }
8298
+ getOption(name) {
8299
+ return this.getCurrentData().options[name]; // are the view-specific options
8300
+ }
8301
+ }
8302
+
8303
+ let eventSourceDef$2 = {
8304
+ ignoreRange: true,
8305
+ parseMeta(refined) {
8306
+ if (Array.isArray(refined.events)) {
8307
+ return refined.events;
8308
+ }
8309
+ return null;
8310
+ },
8311
+ fetch(arg, successCallback) {
8312
+ successCallback({
8313
+ rawEvents: arg.eventSource.meta,
8314
+ });
8315
+ },
8316
+ };
8317
+ const arrayEventSourcePlugin = createPlugin({
8318
+ name: 'array-event-source',
8319
+ eventSourceDefs: [eventSourceDef$2],
8320
+ });
8321
+
8322
+ let eventSourceDef$1 = {
8323
+ parseMeta(refined) {
8324
+ if (typeof refined.events === 'function') {
8325
+ return refined.events;
8326
+ }
8327
+ return null;
8328
+ },
8329
+ fetch(arg, successCallback, errorCallback) {
8330
+ const { dateEnv } = arg.context;
8331
+ const func = arg.eventSource.meta;
8332
+ unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback);
8333
+ },
8334
+ };
8335
+ const funcEventSourcePlugin = createPlugin({
8336
+ name: 'func-event-source',
8337
+ eventSourceDefs: [eventSourceDef$1],
8338
+ });
8339
+
8340
+ const JSON_FEED_EVENT_SOURCE_REFINERS = {
8341
+ method: String,
8342
+ extraParams: identity,
8343
+ startParam: String,
8344
+ endParam: String,
8345
+ timeZoneParam: String,
8346
+ };
8347
+
8348
+ let eventSourceDef = {
8349
+ parseMeta(refined) {
8350
+ if (refined.url && (refined.format === 'json' || !refined.format)) {
8351
+ return {
8352
+ url: refined.url,
8353
+ format: 'json',
8354
+ method: (refined.method || 'GET').toUpperCase(),
8355
+ extraParams: refined.extraParams,
8356
+ startParam: refined.startParam,
8357
+ endParam: refined.endParam,
8358
+ timeZoneParam: refined.timeZoneParam,
8359
+ };
8360
+ }
8361
+ return null;
8362
+ },
8363
+ fetch(arg, successCallback, errorCallback) {
8364
+ const { meta } = arg.eventSource;
8365
+ const requestParams = buildRequestParams(meta, arg.range, arg.context);
8366
+ requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => {
8367
+ successCallback({ rawEvents, response });
8368
+ }, errorCallback);
8369
+ },
8370
+ };
8371
+ const jsonFeedEventSourcePlugin = createPlugin({
8372
+ name: 'json-event-source',
8373
+ eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS,
8374
+ eventSourceDefs: [eventSourceDef],
8375
+ });
8376
+ function buildRequestParams(meta, range, context) {
8377
+ let { dateEnv, options } = context;
8378
+ let startParam;
8379
+ let endParam;
8380
+ let timeZoneParam;
8381
+ let customRequestParams;
8382
+ let params = {};
8383
+ startParam = meta.startParam;
8384
+ if (startParam == null) {
8385
+ startParam = options.startParam;
8386
+ }
8387
+ endParam = meta.endParam;
8388
+ if (endParam == null) {
8389
+ endParam = options.endParam;
8390
+ }
8391
+ timeZoneParam = meta.timeZoneParam;
8392
+ if (timeZoneParam == null) {
8393
+ timeZoneParam = options.timeZoneParam;
8394
+ }
8395
+ // retrieve any outbound GET/POST data from the options
8396
+ if (typeof meta.extraParams === 'function') {
8397
+ // supplied as a function that returns a key/value object
8398
+ customRequestParams = meta.extraParams();
8399
+ }
8400
+ else {
8401
+ // probably supplied as a straight key/value object
8402
+ customRequestParams = meta.extraParams || {};
8403
+ }
8404
+ Object.assign(params, customRequestParams);
8405
+ params[startParam] = dateEnv.formatIso(range.start);
8406
+ params[endParam] = dateEnv.formatIso(range.end);
8407
+ if (dateEnv.timeZone !== 'local') {
8408
+ params[timeZoneParam] = dateEnv.timeZone;
8409
+ }
8410
+ return params;
8411
+ }
8412
+
8413
+ const SIMPLE_RECURRING_REFINERS = {
8414
+ daysOfWeek: identity,
8415
+ startTime: createDuration,
8416
+ endTime: createDuration,
8417
+ duration: createDuration,
8418
+ startRecur: identity,
8419
+ endRecur: identity,
8420
+ };
8421
+
8422
+ let recurring = {
8423
+ parse(refined, dateEnv) {
8424
+ if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) {
8425
+ let recurringData = {
8426
+ daysOfWeek: refined.daysOfWeek || null,
8427
+ startTime: refined.startTime || null,
8428
+ endTime: refined.endTime || null,
8429
+ startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
8430
+ endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null,
8431
+ };
8432
+ let duration;
8433
+ if (refined.duration) {
8434
+ duration = refined.duration;
8435
+ }
8436
+ if (!duration && refined.startTime && refined.endTime) {
8437
+ duration = subtractDurations(refined.endTime, refined.startTime);
8438
+ }
8439
+ return {
8440
+ allDayGuess: Boolean(!refined.startTime && !refined.endTime),
8441
+ duration,
8442
+ typeData: recurringData, // doesn't need endTime anymore but oh well
8443
+ };
8444
+ }
8445
+ return null;
8446
+ },
8447
+ expand(typeData, framingRange, dateEnv) {
8448
+ let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
8449
+ if (clippedFramingRange) {
8450
+ return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
8451
+ }
8452
+ return [];
8453
+ },
8454
+ };
8455
+ const simpleRecurringEventsPlugin = createPlugin({
8456
+ name: 'simple-recurring-event',
8457
+ recurringTypes: [recurring],
8458
+ eventRefiners: SIMPLE_RECURRING_REFINERS,
8459
+ });
8460
+ function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
8461
+ let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
8462
+ let dayMarker = startOfDay(framingRange.start);
8463
+ let endMarker = framingRange.end;
8464
+ let instanceStarts = [];
8465
+ while (dayMarker < endMarker) {
8466
+ let instanceStart;
8467
+ // if everyday, or this particular day-of-week
8468
+ if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
8469
+ if (startTime) {
8470
+ instanceStart = dateEnv.add(dayMarker, startTime);
8471
+ }
8472
+ else {
8473
+ instanceStart = dayMarker;
8474
+ }
8475
+ instanceStarts.push(instanceStart);
8476
+ }
8477
+ dayMarker = addDays(dayMarker, 1);
8478
+ }
8479
+ return instanceStarts;
8480
+ }
8481
+
8482
+ const changeHandlerPlugin = createPlugin({
8483
+ name: 'change-handler',
8484
+ optionChangeHandlers: {
8485
+ events(events, context) {
8486
+ handleEventSources([events], context);
8487
+ },
8488
+ eventSources: handleEventSources,
8489
+ },
8490
+ });
8491
+ /*
8492
+ BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out
8493
+ */
8494
+ function handleEventSources(inputs, context) {
8495
+ let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources);
8496
+ let newInputs = [];
8497
+ for (let input of inputs) {
8498
+ let inputFound = false;
8499
+ for (let i = 0; i < unfoundSources.length; i += 1) {
8500
+ if (unfoundSources[i]._raw === input) {
8501
+ unfoundSources.splice(i, 1); // delete
8502
+ inputFound = true;
8503
+ break;
8504
+ }
8505
+ }
8506
+ if (!inputFound) {
8507
+ newInputs.push(input);
8508
+ }
8544
8509
  }
8545
- get currentStart() {
8546
- return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start);
8510
+ for (let unfoundSource of unfoundSources) {
8511
+ context.dispatch({
8512
+ type: 'REMOVE_EVENT_SOURCE',
8513
+ sourceId: unfoundSource.sourceId,
8514
+ });
8547
8515
  }
8548
- get currentEnd() {
8549
- return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end);
8516
+ for (let newInput of newInputs) {
8517
+ context.calendarApi.addEventSource(newInput);
8550
8518
  }
8551
- getOption(name) {
8552
- return this.getCurrentData().options[name]; // are the view-specific options
8519
+ }
8520
+
8521
+ function handleDateProfile(dateProfile, context) {
8522
+ context.emitter.trigger('datesSet', Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi }));
8523
+ }
8524
+
8525
+ function handleEventStore(eventStore, context) {
8526
+ let { emitter } = context;
8527
+ if (emitter.hasHandlers('eventsSet')) {
8528
+ emitter.trigger('eventsSet', buildEventApis(eventStore, context));
8553
8529
  }
8554
8530
  }
8555
8531
 
8532
+ /*
8533
+ this array is exposed on the root namespace so that UMD plugins can add to it.
8534
+ see the rollup-bundles script.
8535
+ */
8536
+ const globalPlugins = [
8537
+ arrayEventSourcePlugin,
8538
+ funcEventSourcePlugin,
8539
+ jsonFeedEventSourcePlugin,
8540
+ simpleRecurringEventsPlugin,
8541
+ changeHandlerPlugin,
8542
+ createPlugin({
8543
+ name: 'misc',
8544
+ isLoadingFuncs: [
8545
+ (state) => computeEventSourcesLoading(state.eventSources),
8546
+ ],
8547
+ propSetHandlers: {
8548
+ dateProfile: handleDateProfile,
8549
+ eventStore: handleEventStore,
8550
+ },
8551
+ }),
8552
+ ];
8553
+
8556
8554
  class TaskRunner {
8557
8555
  constructor(runTaskOption, drainedOption) {
8558
8556
  this.runTaskOption = runTaskOption;
@@ -9571,7 +9569,7 @@ var FullCalendar = (function (exports) {
9571
9569
  return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
9572
9570
  }
9573
9571
 
9574
- const version = '6.0.0-beta.4';
9572
+ const version = '6.0.1';
9575
9573
 
9576
9574
  config.touchMouseIgnoreWait = 500;
9577
9575
  let ignoreMouseDepth = 0;
@@ -11668,6 +11666,87 @@ var FullCalendar = (function (exports) {
11668
11666
  listenerRefiners: LISTENER_REFINERS,
11669
11667
  });
11670
11668
 
11669
+ /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
11670
+ ----------------------------------------------------------------------------------------------------------------------*/
11671
+ // It is a manager for a Table subcomponent, which does most of the heavy lifting.
11672
+ // It is responsible for managing width/height.
11673
+ class TableView extends DateComponent {
11674
+ constructor() {
11675
+ super(...arguments);
11676
+ this.headerElRef = y();
11677
+ }
11678
+ renderSimpleLayout(headerRowContent, bodyContent) {
11679
+ let { props, context } = this;
11680
+ let sections = [];
11681
+ let stickyHeaderDates = getStickyHeaderDates(context.options);
11682
+ if (headerRowContent) {
11683
+ sections.push({
11684
+ type: 'header',
11685
+ key: 'header',
11686
+ isSticky: stickyHeaderDates,
11687
+ chunk: {
11688
+ elRef: this.headerElRef,
11689
+ tableClassName: 'fc-col-header',
11690
+ rowContent: headerRowContent,
11691
+ },
11692
+ });
11693
+ }
11694
+ sections.push({
11695
+ type: 'body',
11696
+ key: 'body',
11697
+ liquid: true,
11698
+ chunk: { content: bodyContent },
11699
+ });
11700
+ return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
11701
+ h(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections })));
11702
+ }
11703
+ renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) {
11704
+ let ScrollGrid = this.context.pluginHooks.scrollGridImpl;
11705
+ if (!ScrollGrid) {
11706
+ throw new Error('No ScrollGrid implementation');
11707
+ }
11708
+ let { props, context } = this;
11709
+ let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options);
11710
+ let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options);
11711
+ let sections = [];
11712
+ if (headerRowContent) {
11713
+ sections.push({
11714
+ type: 'header',
11715
+ key: 'header',
11716
+ isSticky: stickyHeaderDates,
11717
+ chunks: [{
11718
+ key: 'main',
11719
+ elRef: this.headerElRef,
11720
+ tableClassName: 'fc-col-header',
11721
+ rowContent: headerRowContent,
11722
+ }],
11723
+ });
11724
+ }
11725
+ sections.push({
11726
+ type: 'body',
11727
+ key: 'body',
11728
+ liquid: true,
11729
+ chunks: [{
11730
+ key: 'main',
11731
+ content: bodyContent,
11732
+ }],
11733
+ });
11734
+ if (stickyFooterScrollbar) {
11735
+ sections.push({
11736
+ type: 'footer',
11737
+ key: 'footer',
11738
+ isSticky: true,
11739
+ chunks: [{
11740
+ key: 'main',
11741
+ content: renderScrollShim,
11742
+ }],
11743
+ });
11744
+ }
11745
+ return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
11746
+ h(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })));
11747
+ }
11748
+ }
11749
+
11671
11750
  function splitSegsByRow(segs, rowCnt) {
11672
11751
  let byRow = [];
11673
11752
  for (let i = 0; i < rowCnt; i += 1) {
@@ -12057,6 +12136,11 @@ var FullCalendar = (function (exports) {
12057
12136
  maxContentHeight: null,
12058
12137
  eventInstanceHeights: {},
12059
12138
  };
12139
+ this.handleResize = (isForced) => {
12140
+ if (isForced) {
12141
+ this.updateSizing(true); // isExternal=true
12142
+ }
12143
+ };
12060
12144
  }
12061
12145
  render() {
12062
12146
  let { props, state, context } = this;
@@ -12088,11 +12172,15 @@ var FullCalendar = (function (exports) {
12088
12172
  }
12089
12173
  componentDidMount() {
12090
12174
  this.updateSizing(true);
12175
+ this.context.addResizeHandler(this.handleResize);
12091
12176
  }
12092
12177
  componentDidUpdate(prevProps, prevState) {
12093
12178
  let currentProps = this.props;
12094
12179
  this.updateSizing(!isPropsEqual(prevProps, currentProps));
12095
12180
  }
12181
+ componentWillUnmount() {
12182
+ this.context.removeResizeHandler(this.handleResize);
12183
+ }
12096
12184
  getHighlightSegs() {
12097
12185
  let { props } = this;
12098
12186
  if (props.eventDrag && props.eventDrag.segs.length) { // messy check
@@ -12376,87 +12464,6 @@ var FullCalendar = (function (exports) {
12376
12464
  }
12377
12465
  }
12378
12466
 
12379
- /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
12380
- ----------------------------------------------------------------------------------------------------------------------*/
12381
- // It is a manager for a Table subcomponent, which does most of the heavy lifting.
12382
- // It is responsible for managing width/height.
12383
- class TableView extends DateComponent {
12384
- constructor() {
12385
- super(...arguments);
12386
- this.headerElRef = y();
12387
- }
12388
- renderSimpleLayout(headerRowContent, bodyContent) {
12389
- let { props, context } = this;
12390
- let sections = [];
12391
- let stickyHeaderDates = getStickyHeaderDates(context.options);
12392
- if (headerRowContent) {
12393
- sections.push({
12394
- type: 'header',
12395
- key: 'header',
12396
- isSticky: stickyHeaderDates,
12397
- chunk: {
12398
- elRef: this.headerElRef,
12399
- tableClassName: 'fc-col-header',
12400
- rowContent: headerRowContent,
12401
- },
12402
- });
12403
- }
12404
- sections.push({
12405
- type: 'body',
12406
- key: 'body',
12407
- liquid: true,
12408
- chunk: { content: bodyContent },
12409
- });
12410
- return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
12411
- h(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections })));
12412
- }
12413
- renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) {
12414
- let ScrollGrid = this.context.pluginHooks.scrollGridImpl;
12415
- if (!ScrollGrid) {
12416
- throw new Error('No ScrollGrid implementation');
12417
- }
12418
- let { props, context } = this;
12419
- let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options);
12420
- let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options);
12421
- let sections = [];
12422
- if (headerRowContent) {
12423
- sections.push({
12424
- type: 'header',
12425
- key: 'header',
12426
- isSticky: stickyHeaderDates,
12427
- chunks: [{
12428
- key: 'main',
12429
- elRef: this.headerElRef,
12430
- tableClassName: 'fc-col-header',
12431
- rowContent: headerRowContent,
12432
- }],
12433
- });
12434
- }
12435
- sections.push({
12436
- type: 'body',
12437
- key: 'body',
12438
- liquid: true,
12439
- chunks: [{
12440
- key: 'main',
12441
- content: bodyContent,
12442
- }],
12443
- });
12444
- if (stickyFooterScrollbar) {
12445
- sections.push({
12446
- type: 'footer',
12447
- key: 'footer',
12448
- isSticky: true,
12449
- chunks: [{
12450
- key: 'main',
12451
- content: renderScrollShim,
12452
- }],
12453
- });
12454
- }
12455
- return (h(ViewContainer$1, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
12456
- h(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })));
12457
- }
12458
- }
12459
-
12460
12467
  class DayTableView extends TableView {
12461
12468
  constructor() {
12462
12469
  super(...arguments);
@@ -12508,7 +12515,7 @@ var FullCalendar = (function (exports) {
12508
12515
  }
12509
12516
  }
12510
12517
 
12511
- var css_248z$2 = "\n:root {\n --fc-daygrid-event-dot-width: 8px;\n}\n\n/* help things clear margins of inner content */\n\n.fc-daygrid-day-frame,\n.fc-daygrid-day-events,\n.fc-daygrid-event-harness { /* for event top/bottom margins */\n}\n\n.fc-daygrid-day-frame:before, .fc-daygrid-day-events:before, .fc-daygrid-event-harness:before {\n content: \"\";\n clear: both;\n display: table; }\n\n.fc-daygrid-day-frame:after, .fc-daygrid-day-events:after, .fc-daygrid-event-harness:after {\n content: \"\";\n clear: both;\n display: table; }\n\n.fc .fc-daygrid-body { /* a <div> that wraps the table */\n position: relative;\n z-index: 1; /* container inner z-index's because <tr>s can't do it */\n }\n\n.fc .fc-daygrid-day.fc-day-today {\n background-color: var(--fc-today-bg-color);\n }\n\n.fc .fc-daygrid-day-frame {\n position: relative;\n min-height: 100%; /* seems to work better than `height` because sets height after rows/cells naturally do it */\n }\n\n.fc {\n\n /* cell top */\n\n}\n\n.fc .fc-daygrid-day-top {\n display: flex;\n flex-direction: row-reverse;\n }\n\n.fc .fc-day-other .fc-daygrid-day-top {\n opacity: 0.3;\n }\n\n.fc {\n\n /* day number (within cell top) */\n\n}\n\n.fc .fc-daygrid-day-number {\n position: relative;\n z-index: 4;\n padding: 4px;\n }\n\n.fc {\n\n /* event container */\n\n}\n\n.fc .fc-daygrid-day-events {\n margin-top: 1px; /* needs to be margin, not padding, so that available cell height can be computed */\n }\n\n.fc {\n\n /* positioning for balanced vs natural */\n\n}\n\n.fc .fc-daygrid-body-balanced .fc-daygrid-day-events {\n position: absolute;\n left: 0;\n right: 0;\n }\n\n.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events {\n position: relative; /* for containing abs positioned event harnesses */\n min-height: 2em; /* in addition to being a min-height during natural height, equalizes the heights a little bit */\n }\n\n.fc .fc-daygrid-body-natural { /* can coexist with -unbalanced */\n }\n\n.fc .fc-daygrid-body-natural .fc-daygrid-day-events {\n margin-bottom: 1em;\n }\n\n.fc {\n\n /* event harness */\n\n}\n\n.fc .fc-daygrid-event-harness {\n position: relative;\n }\n\n.fc .fc-daygrid-event-harness-abs {\n position: absolute;\n top: 0; /* fallback coords for when cannot yet be computed */\n left: 0; /* */\n right: 0; /* */\n }\n\n.fc .fc-daygrid-bg-harness {\n position: absolute;\n top: 0;\n bottom: 0;\n }\n\n.fc {\n\n /* bg content */\n\n}\n\n.fc .fc-daygrid-day-bg .fc-non-business { z-index: 1 }\n\n.fc .fc-daygrid-day-bg .fc-bg-event { z-index: 2 }\n\n.fc .fc-daygrid-day-bg .fc-highlight { z-index: 3 }\n\n.fc {\n\n /* events */\n\n}\n\n.fc .fc-daygrid-event {\n z-index: 6;\n margin-top: 1px;\n }\n\n.fc .fc-daygrid-event.fc-event-mirror {\n z-index: 7;\n }\n\n.fc {\n\n /* cell bottom (within day-events) */\n\n}\n\n.fc .fc-daygrid-day-bottom {\n font-size: .85em;\n padding: 2px 3px 0\n }\n\n.fc .fc-daygrid-day-bottom:before {\n content: \"\";\n clear: both;\n display: table; }\n\n.fc .fc-daygrid-more-link {\n position: relative;\n z-index: 4;\n cursor: pointer;\n }\n\n.fc {\n\n /* week number (within frame) */\n\n}\n\n.fc .fc-daygrid-week-number {\n position: absolute;\n z-index: 5;\n top: 0;\n padding: 2px;\n min-width: 1.5em;\n text-align: center;\n background-color: var(--fc-neutral-bg-color);\n color: var(--fc-neutral-text-color);\n }\n\n.fc {\n\n /* popover */\n\n}\n\n.fc .fc-more-popover .fc-popover-body {\n min-width: 220px;\n padding: 10px;\n }\n\n.fc-direction-ltr .fc-daygrid-event.fc-event-start,\n.fc-direction-rtl .fc-daygrid-event.fc-event-end {\n margin-left: 2px;\n}\n\n.fc-direction-ltr .fc-daygrid-event.fc-event-end,\n.fc-direction-rtl .fc-daygrid-event.fc-event-start {\n margin-right: 2px;\n}\n\n.fc-direction-ltr .fc-daygrid-week-number {\n left: 0;\n border-radius: 0 0 3px 0;\n }\n\n.fc-direction-rtl .fc-daygrid-week-number {\n right: 0;\n border-radius: 0 0 0 3px;\n }\n\n.fc-liquid-hack .fc-daygrid-day-frame {\n position: static; /* will cause inner absolute stuff to expand to <td> */\n }\n.fc-daygrid-event { /* make root-level, because will be dragged-and-dropped outside of a component root */\n position: relative; /* for z-indexes assigned later */\n white-space: nowrap;\n border-radius: 3px; /* dot event needs this to when selected */\n font-size: var(--fc-small-font-size);\n}\n/* --- the rectangle (\"block\") style of event --- */\n.fc-daygrid-block-event .fc-event-time {\n font-weight: bold;\n }\n.fc-daygrid-block-event .fc-event-time,\n .fc-daygrid-block-event .fc-event-title {\n padding: 1px;\n }\n/* --- the dot style of event --- */\n.fc-daygrid-dot-event {\n display: flex;\n align-items: center;\n padding: 2px 0\n\n}\n.fc-daygrid-dot-event .fc-event-title {\n flex-grow: 1;\n flex-shrink: 1;\n min-width: 0; /* important for allowing to shrink all the way */\n overflow: hidden;\n font-weight: bold;\n }\n.fc-daygrid-dot-event:hover,\n .fc-daygrid-dot-event.fc-event-mirror {\n background: rgba(0, 0, 0, 0.1);\n }\n.fc-daygrid-dot-event.fc-event-selected:before {\n /* expand hit area */\n top: -10px;\n bottom: -10px;\n }\n.fc-daygrid-event-dot { /* the actual dot */\n margin: 0 4px;\n box-sizing: content-box;\n width: 0;\n height: 0;\n border: calc(var(--fc-daygrid-event-dot-width) / 2) solid var(--fc-event-border-color);\n border-radius: calc(var(--fc-daygrid-event-dot-width) / 2);\n}\n/* --- spacing between time and title --- */\n.fc-direction-ltr .fc-daygrid-event .fc-event-time {\n margin-right: 3px;\n }\n.fc-direction-rtl .fc-daygrid-event .fc-event-time {\n margin-left: 3px;\n }\n";
12518
+ var css_248z$2 = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .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:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.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-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.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;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.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-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}";
12512
12519
  injectStyles(css_248z$2);
12513
12520
 
12514
12521
  var index$2 = createPlugin({
@@ -13677,7 +13684,7 @@ var FullCalendar = (function (exports) {
13677
13684
  allDaySlot: Boolean,
13678
13685
  };
13679
13686
 
13680
- var css_248z$1 = "\n/*\nA VERTICAL event\n*/\n\n.fc-v-event { /* allowed to be top-level */\n display: block;\n border: 1px solid var(--fc-event-border-color);\n background-color: var(--fc-event-bg-color)\n\n}\n\n.fc-v-event .fc-event-main {\n color: var(--fc-event-text-color);\n height: 100%;\n }\n\n.fc-v-event .fc-event-main-frame {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n.fc-v-event .fc-event-time {\n flex-grow: 0;\n flex-shrink: 0;\n max-height: 100%;\n overflow: hidden;\n }\n\n.fc-v-event .fc-event-title-container { /* a container for the sticky cushion */\n flex-grow: 1;\n flex-shrink: 1;\n min-height: 0; /* important for allowing to shrink all the way */\n }\n\n.fc-v-event .fc-event-title { /* will have fc-sticky on it */\n top: 0;\n bottom: 0;\n max-height: 100%; /* clip overflow */\n overflow: hidden;\n }\n\n.fc-v-event:not(.fc-event-start) {\n border-top-width: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n.fc-v-event:not(.fc-event-end) {\n border-bottom-width: 0;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n.fc-v-event.fc-event-selected:before {\n /* expand hit area */\n left: -10px;\n right: -10px;\n }\n\n.fc-v-event {\n\n /* resizer (mouse AND touch) */\n\n}\n\n.fc-v-event .fc-event-resizer-start {\n cursor: n-resize;\n }\n\n.fc-v-event .fc-event-resizer-end {\n cursor: s-resize;\n }\n\n.fc-v-event {\n\n /* resizer for MOUSE */\n\n}\n\n.fc-v-event:not(.fc-event-selected) .fc-event-resizer {\n height: var(--fc-event-resizer-thickness);\n left: 0;\n right: 0;\n }\n\n.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start {\n top: calc(var(--fc-event-resizer-thickness) / -2);\n }\n\n.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end {\n bottom: calc(var(--fc-event-resizer-thickness) / -2);\n }\n\n.fc-v-event {\n\n /* resizer for TOUCH (when event is \"selected\") */\n\n}\n\n.fc-v-event.fc-event-selected .fc-event-resizer {\n left: 50%;\n margin-left: calc(var(--fc-event-resizer-dot-total-width) / -2);\n }\n\n.fc-v-event.fc-event-selected .fc-event-resizer-start {\n top: calc(var(--fc-event-resizer-dot-total-width) / -2);\n }\n\n.fc-v-event.fc-event-selected .fc-event-resizer-end {\n bottom: calc(var(--fc-event-resizer-dot-total-width) / -2);\n }\n.fc .fc-timegrid .fc-daygrid-body { /* the all-day daygrid within the timegrid view */\n z-index: 2; /* put above the timegrid-body so that more-popover is above everything. TODO: better solution */\n }\n.fc .fc-timegrid-divider {\n padding: 0 0 2px; /* browsers get confused when you set height. use padding instead */\n }\n.fc .fc-timegrid-body {\n position: relative;\n z-index: 1; /* scope the z-indexes of slots and cols */\n min-height: 100%; /* fill height always, even when slat table doesn't grow */\n }\n.fc .fc-timegrid-axis-chunk { /* for advanced ScrollGrid */\n position: relative /* offset parent for now-indicator-container */\n\n }\n.fc .fc-timegrid-axis-chunk > table {\n position: relative;\n z-index: 1; /* above the now-indicator-container */\n }\n.fc .fc-timegrid-slots {\n position: relative;\n z-index: 1;\n }\n.fc .fc-timegrid-slot { /* a <td> */\n height: 1.5em;\n border-bottom: 0 /* each cell owns its top border */\n }\n.fc .fc-timegrid-slot:empty:before {\n content: '\\00a0'; /* make sure there's at least an empty space to create height for height syncing */\n }\n.fc .fc-timegrid-slot-minor {\n border-top-style: dotted;\n }\n.fc .fc-timegrid-slot-label-cushion {\n display: inline-block;\n white-space: nowrap;\n }\n.fc .fc-timegrid-slot-label {\n vertical-align: middle; /* vertical align the slots */\n }\n.fc {\n\n\n /* slots AND axis cells (top-left corner of view including the \"all-day\" text) */\n\n}\n.fc .fc-timegrid-axis-cushion,\n .fc .fc-timegrid-slot-label-cushion {\n padding: 0 4px;\n }\n.fc {\n\n\n /* axis cells (top-left corner of view including the \"all-day\" text) */\n /* vertical align is more complicated, uses flexbox */\n\n}\n.fc .fc-timegrid-axis-frame-liquid {\n height: 100%; /* will need liquid-hack in FF */\n }\n.fc .fc-timegrid-axis-frame {\n overflow: hidden;\n display: flex;\n align-items: center; /* vertical align */\n justify-content: flex-end; /* horizontal align. matches text-align below */\n }\n.fc .fc-timegrid-axis-cushion {\n max-width: 60px; /* limits the width of the \"all-day\" text */\n flex-shrink: 0; /* allows text to expand how it normally would, regardless of constrained width */\n }\n.fc-direction-ltr .fc-timegrid-slot-label-frame {\n text-align: right;\n }\n.fc-direction-rtl .fc-timegrid-slot-label-frame {\n text-align: left;\n }\n.fc-liquid-hack .fc-timegrid-axis-frame-liquid {\n height: auto;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n.fc .fc-timegrid-col.fc-day-today {\n background-color: var(--fc-today-bg-color);\n }\n.fc .fc-timegrid-col-frame {\n min-height: 100%; /* liquid-hack is below */\n position: relative;\n }\n.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame {\n height: auto;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n.fc-media-screen .fc-timegrid-cols {\n position: absolute; /* no z-index. children will decide and go above slots */\n top: 0;\n left: 0;\n right: 0;\n bottom: 0\n }\n.fc-media-screen .fc-timegrid-cols > table {\n height: 100%;\n }\n.fc-media-screen .fc-timegrid-col-bg,\n .fc-media-screen .fc-timegrid-col-events,\n .fc-media-screen .fc-timegrid-now-indicator-container {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n }\n.fc {\n\n /* bg */\n\n}\n.fc .fc-timegrid-col-bg {\n z-index: 2; /* TODO: kill */\n }\n.fc .fc-timegrid-col-bg .fc-non-business { z-index: 1 }\n.fc .fc-timegrid-col-bg .fc-bg-event { z-index: 2 }\n.fc .fc-timegrid-col-bg .fc-highlight { z-index: 3 }\n.fc .fc-timegrid-bg-harness {\n position: absolute; /* top/bottom will be set by JS */\n left: 0;\n right: 0;\n }\n.fc {\n\n /* fg events */\n /* (the mirror segs are put into a separate container with same classname, */\n /* and they must be after the normal seg container to appear at a higher z-index) */\n\n}\n.fc .fc-timegrid-col-events {\n z-index: 3;\n /* child event segs have z-indexes that are scoped within this div */\n }\n.fc {\n\n /* now indicator */\n\n}\n.fc .fc-timegrid-now-indicator-container {\n bottom: 0;\n overflow: hidden; /* don't let overflow of lines/arrows cause unnecessary scrolling */\n /* z-index is set on the individual elements */\n }\n.fc-direction-ltr .fc-timegrid-col-events {\n margin: 0 2.5% 0 2px;\n }\n.fc-direction-rtl .fc-timegrid-col-events {\n margin: 0 2px 0 2.5%;\n }\n.fc-timegrid-event-harness {\n position: absolute /* top/left/right/bottom will all be set by JS */\n}\n.fc-timegrid-event-harness > .fc-timegrid-event {\n position: absolute; /* absolute WITHIN the harness */\n top: 0; /* for when not yet positioned */\n bottom: 0; /* \" */\n left: 0;\n right: 0;\n }\n.fc-timegrid-event-harness-inset .fc-timegrid-event,\n.fc-timegrid-event.fc-event-mirror,\n.fc-timegrid-more-link {\n box-shadow: 0px 0px 0px 1px var(--fc-page-bg-color);\n}\n.fc-timegrid-event,\n.fc-timegrid-more-link { /* events need to be root */\n font-size: var(--fc-small-font-size);\n border-radius: 3px;\n}\n.fc-timegrid-event { /* events need to be root */\n margin-bottom: 1px /* give some space from bottom */\n}\n.fc-timegrid-event .fc-event-main {\n padding: 1px 1px 0;\n }\n.fc-timegrid-event .fc-event-time {\n white-space: nowrap;\n font-size: var(--fc-small-font-size);\n margin-bottom: 1px;\n }\n.fc-timegrid-event-short .fc-event-main-frame {\n flex-direction: row;\n overflow: hidden;\n }\n.fc-timegrid-event-short .fc-event-time:after {\n content: '\\00a0-\\00a0'; /* dash surrounded by non-breaking spaces */\n }\n.fc-timegrid-event-short .fc-event-title {\n font-size: var(--fc-small-font-size)\n }\n.fc-timegrid-more-link { /* does NOT inherit from fc-timegrid-event */\n position: absolute;\n z-index: 9999; /* hack */\n color: var(--fc-more-link-text-color);\n background: var(--fc-more-link-bg-color);\n cursor: pointer;\n margin-bottom: 1px; /* match space below fc-timegrid-event */\n}\n.fc-timegrid-more-link-inner { /* has fc-sticky */\n padding: 3px 2px;\n top: 0;\n}\n.fc-direction-ltr .fc-timegrid-more-link {\n right: 0;\n }\n.fc-direction-rtl .fc-timegrid-more-link {\n left: 0;\n }\n.fc {\n\n /* line */\n\n}\n.fc .fc-timegrid-now-indicator-line {\n position: absolute;\n z-index: 4;\n left: 0;\n right: 0;\n border-style: solid;\n border-color: var(--fc-now-indicator-color);\n border-width: 1px 0 0;\n }\n.fc {\n\n /* arrow */\n\n}\n.fc .fc-timegrid-now-indicator-arrow {\n position: absolute;\n z-index: 4;\n margin-top: -5px; /* vertically center on top coordinate */\n border-style: solid;\n border-color: var(--fc-now-indicator-color);\n }\n.fc-direction-ltr .fc-timegrid-now-indicator-arrow {\n left: 0;\n\n /* triangle pointing right. TODO: mixin */\n border-width: 5px 0 5px 6px;\n border-top-color: transparent;\n border-bottom-color: transparent;\n }\n.fc-direction-rtl .fc-timegrid-now-indicator-arrow {\n right: 0;\n\n /* triangle pointing left. TODO: mixin */\n border-width: 5px 6px 5px 0;\n border-top-color: transparent;\n border-bottom-color: transparent;\n }\n";
13687
+ var css_248z$1 = ".fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:\"\\00a0\"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:\"\\00a0-\\00a0\"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}";
13681
13688
  injectStyles(css_248z$1);
13682
13689
 
13683
13690
  var index$1 = createPlugin({
@@ -13976,7 +13983,7 @@ var FullCalendar = (function (exports) {
13976
13983
  return input === false ? null : createFormatter(input);
13977
13984
  }
13978
13985
 
13979
- var css_248z = "\n:root {\n --fc-list-event-dot-width: 10px;\n --fc-list-event-hover-bg-color: #f5f5f5;\n}\n\n.fc-theme-standard .fc-list {\n border: 1px solid var(--fc-border-color);\n }\n\n.fc {\n\n /* message when no events */\n\n}\n\n.fc .fc-list-empty {\n background-color: var(--fc-neutral-bg-color);\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center; /* vertically aligns fc-list-empty-inner */\n }\n\n.fc .fc-list-empty-cushion {\n margin: 5em 0;\n }\n.fc {\n\n /* table within the scroller */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-table {\n width: 100%;\n border-style: hidden; /* kill outer border on theme */\n }\n.fc .fc-list-table tr > * {\n border-left: 0;\n border-right: 0;\n }\n.fc .fc-list-sticky .fc-list-day > * { /* the cells */\n position: sticky;\n top: 0;\n background: var(--fc-page-bg-color); /* for when headers are styled to be transparent and sticky */\n }\n.fc {\n\n /* only exists for aria reasons, hide for non-screen-readers */\n\n}\n.fc .fc-list-table thead {\n position: absolute;\n left: -10000px;\n }\n.fc {\n\n /* the table's border-style:hidden gets confused by hidden thead. force-hide top border of first cell */\n\n}\n.fc .fc-list-table tbody > tr:first-child th {\n border-top: 0;\n }\n.fc .fc-list-table th {\n padding: 0; /* uses an inner-wrapper instead... */\n }\n.fc .fc-list-table td,\n .fc .fc-list-day-cushion {\n padding: 8px 14px;\n }\n.fc {\n\n\n /* date heading rows */\n /* ---------------------------------------------------------------------------------------------------- */\n\n}\n.fc .fc-list-day-cushion:after {\n content: \"\";\n clear: both;\n display: table; /* clear floating */\n }\n.fc-theme-standard .fc-list-day-cushion {\n background-color: var(--fc-neutral-bg-color);\n }\n.fc-direction-ltr .fc-list-day-text,\n.fc-direction-rtl .fc-list-day-side-text {\n float: left;\n}\n.fc-direction-ltr .fc-list-day-side-text,\n.fc-direction-rtl .fc-list-day-text {\n float: right;\n}\n/* make the dot closer to the event title */\n.fc-direction-ltr .fc-list-table .fc-list-event-graphic { padding-right: 0 }\n.fc-direction-rtl .fc-list-table .fc-list-event-graphic { padding-left: 0 }\n.fc .fc-list-event.fc-event-forced-url {\n cursor: pointer; /* whole row will seem clickable */\n }\n.fc .fc-list-event:hover td {\n background-color: var(--fc-list-event-hover-bg-color);\n }\n.fc {\n\n /* shrink certain cols */\n\n}\n.fc .fc-list-event-graphic,\n .fc .fc-list-event-time {\n white-space: nowrap;\n width: 1px;\n }\n.fc .fc-list-event-dot {\n display: inline-block;\n box-sizing: content-box;\n width: 0;\n height: 0;\n border: calc(var(--fc-list-event-dot-width) / 2) solid var(--fc-event-border-color);\n border-radius: calc(var(--fc-list-event-dot-width) / 2);\n }\n.fc {\n\n /* reset <a> styling */\n\n}\n.fc .fc-list-event-title a {\n color: inherit;\n text-decoration: none;\n }\n.fc {\n\n /* underline link when hovering over any part of row */\n\n}\n.fc .fc-list-event.fc-event-forced-url:hover a {\n text-decoration: underline;\n }\n";
13986
+ var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}";
13980
13987
  injectStyles(css_248z);
13981
13988
 
13982
13989
  var index = createPlugin({
@@ -14022,6 +14029,8 @@ var FullCalendar = (function (exports) {
14022
14029
  exports.createPlugin = createPlugin;
14023
14030
  exports.formatDate = formatDate;
14024
14031
  exports.formatRange = formatRange;
14032
+ exports.globalLocales = globalLocales;
14033
+ exports.globalPlugins = globalPlugins;
14025
14034
  exports.sliceEvents = sliceEvents;
14026
14035
  exports.version = version;
14027
14036