日历/日期选择器

日历是一个经过触摸优化的组件,提供了处理日期的简单方法。

日历可以用作内联组件或作为覆盖层。平板电脑(iPad)上的覆盖层日历将自动转换为弹出窗口。

日历应用程序方法

让我们来看看与日历相关的 App 方法。

app.calendar.create(parameters)- 创建日历实例。

  • parameters - object。包含日历参数的对象。

该方法返回已创建的日历的实例。

app.calendar.destroy(el)- 销毁日历实例。

  • el - HTMLElementstring(带 CSS 选择器)或 object。要销毁的日历元素或日历实例。

app.calendar.get(el)- 根据 HTML 元素获取日历实例

  • el - HTMLElementstring(带 CSS 选择器)。日历元素。

该方法返回日历的实例。

app.calendar.close(el)- 关闭日历。

  • el - HTMLElementstring(带 CSS 选择器)。要关闭的日历元素。

该方法返回日历的实例。

例如

var calendar = app.calendar.create({
    inputEl: '#calendar-input'
});

日历参数

让我们来看看所有可用日历参数的列表。

参数类型默认描述
localestring

日历区域设置。应为 Intl.DateTimeFormat 接受的正确的区域设置。如果未指定(默认为),它将使用浏览器区域设置。

例如 en-USruenen-US-u-ca-buddhist 等。

valuearray包含最初选定的日期的数组。每个数组项表示所选日期。
disabled日期范围其他已禁用的日期。参数接受所谓的日期范围(见以下详细信息)。
events日期范围

带活动日期。将在日历的那一天用另一个“圆点”标记。参数接受所谓的日期范围(见以下详细信息)。

如果你想表示某天有几个不同的活动,可以使用多种不同颜色的圆点来表示。在这种情况下,你需要将日期范围作为数组传递,其中每个对象都将具有 datecolor 属性,例如。

[
  {
    date: new Date(2018, 4, 11),
    color: '#2196f3',
  },
  // same date but different color, one more dot will be added to this day
  {
    date: new Date(2018, 4, 11),
    color: '#4caf50',
  },
]
rangesClassesarray你想为附加样式添加自定义 CSS 类的日期范围。见以下接受的格式。
formatValuefunction (values)用于设置输入值的函数,应返回新的格式化的字符串值。values 是一个数组,其中每个项表示所选日期。可用于代替 dateFormat 参数来指定自定义格式
monthNamesarrayauto包含完整月份名称的数组。如果是 auto,则将根据指定的 locale(或浏览器区域设置)显示月份名称。
monthNamesShortarrayauto包含缩写月份名称的数组。如果是 auto,则将根据指定的 locale(或浏览器区域设置)显示月份名称。
dayNamesarrayauto包含星期名称的数组。如果是 auto,则将根据指定的 locale(或浏览器区域设置)显示星期名称。
dayNamesShortarrayauto每周短名称数组。如果auto,则它将基于指定的locale(或浏览器 locale)显示日期名称
firstDay数字1每周的第一天。默认为 1 - 星期一
weekendDaysarray[0, 6]包含周末天数的索引编号数组,默认为星期六和星期日
dateFormatstring
对象
未定义

如果未定义,它将基于locale(或浏览器 locale)使用格式。

它可以接受 Intl.DateTimeFormat.options

例如 { month: 'long', day: 'numeric' }

或者您可以使用特殊标记传递字符串,这些可用表达式为

  • yyyy - 4 位年份
  • yy - 2 位年份
  • mm - 2 位月份编号,范围从 01 到 12
  • m - 月份编号,范围从 1 到 12
  • MM - 全名月份
  • M - 月份简称
  • dd - 2 位天数编号,范围从 01 到 31
  • d - 天数编号,范围从 1 到 31
  • DD - 全名星期名称
  • D - 星期简称

timePicker启用时,可以使用以下其他时间表达式

  • HH - 24 小时制 2 位小时(00 - 23)
  • H - 24 小时制小时(0 - 23)
  • hh - 12 小时制 2 位小时(00 - 12)
  • h - 12 小时制小时(0 - 12)
  • :mm - 2 位分钟(00 - 59)
  • :m - 分钟(0 - 59)
  • ss - 2 位秒(00 - 59)
  • s - 秒(0 - 59)
  • A - 大写下午或上午(PM 或 AM)
  • a - 小写下午或上午(pm 或 am)
multiple布尔值false启用后允许选择多个日期/值
rangePicker布尔值false启用后启用范围选择器。与multiple不兼容
rangePickerMinDays数字1rangePicker启用时需要选择的最小天数
rangePickerMaxDays数字0rangePicker启用时可以选择的最大天数。0表示没有最大值
directionstring'horizontal'月份布局方向,可以是“水平”或“垂直”
minDate日期null允许的最小日期
maxDate日期null允许的最大日期
touchMove布尔值true如果启用,则日历月份会在触摸移动期间跟随手指
animate布尔值true启用月份之间的过渡
closeOnSelect布尔值false启用后,用户选择日期时日历将关闭
weekHeader布尔值true启用带有星期短名称的星期标题
monthSelector布尔值true在工具栏中启用月份选择器
monthPicker布尔值true在工具栏中单击月份选择器时启用月份选择器以选择月份
年选择器布尔值true在工具栏中启用年份选取器
年份选择器布尔值true允许在单击工具栏中的年份选取器时选取年份
年份选择器的最小年份数字年份选择器的最小可用年份,默认是今天的减去 100 年
年份选择器的最大年份数字年份选择器的最大可用年份,默认是今天的加上 100 年
时间选取器布尔值false启用时间选取器。
时间选取器格式对象{hour: 'numeric', minute: 'numeric'}

时间选取器中显示的时间格式。它接受 Intl.DateTimeFormat.options

AM/PM 格式取决于所选的指定 locale,或者如果未指定,则取决于浏览器的 locale

时间选取器占位符string选择时间用于显示在时间选取器占位符中的文本。
容器/打开器具体参数
容器元素string
HTMLElement
用于存放生成的日历 HTML 的 CSS 选择器或 HTMLElement 字符串。仅用于内嵌日历
打开在stringauto可以是 autopopover(在弹出框中打开日历)、sheet(在工作表模式中打开)或 customModal(在自定义日历模式覆盖中打开)。auto 会在小屏幕上以工作表模式打开,在大屏幕上以弹出框打开。
工作表推进布尔值false启用日历工作表在打开时将视图推送至后面
工作表滑动以关闭布尔值未定义启用通过滑动关闭日历工作表的能力。未指定时,它将继承应用程序的工作表 swipeToClose 参数
输入元素字符串或 HTMLElement与相关输入元素的 CSS 选择器或 HTMLElement 字符串
滚动到输入布尔值true日历打开时将视口(页面内容)滚动到输入
输入只读布尔值true对指定的输入设置“只读”属性
CSS 类string要设置在日历元素上的额外 CSS 类名
通过外部点击关闭布尔值true如果启用,则单击选取器或相关的输入元素外部将关闭选取器
工具栏布尔值true启用日历工具栏
工具栏关闭文本string完成完成/关闭工具栏按钮的文本
页眉布尔值false启用日历页眉
页眉占位符string选择日期默认日历页眉占位符文本
可路由模态框布尔值false将打开的日历添加到路由器历史记录中,这可以让您通过返回路由器历史记录来关闭日历,并将当前路由设置为日历模态框
网址stringdate/将设置为当前路由的日历模态框网址
视图对象在启用 可路由模态框 时设置路由的视图。默认为 inputEl 的父视图,如果没有找到父视图,则默认为主视图
背景布尔值启用日历背景(后方的半透明暗层)。默认情况下,只有在弹出框中打开日历时才会启用它。
通过背景点击关闭布尔值true启用后,将关闭日历背景单击
渲染函数
renderWeekHeader函数渲染星期标题的函数。 必须返回星期标题 HTML 字符串
renderMonths函数 (date)渲染月份包装器的函数。 必须返回月份容器的完整 HTML 字符串
renderMonth函数 (date, offset)渲染单个月份的函数。 必须返回单个月份的 HTML 字符串
renderMonthSelector函数渲染月份选择器的函数。 必须返回月份选择器的 HTML 字符串
renderYearSelector函数渲染年份选择器的函数。 必须返回年份选择器的 HTML 字符串
renderHeader函数渲染日历标题的函数。 必须返回日历标题的 HTML 字符串
renderToolbar函数渲染工具栏的函数。 必须返回工具栏的 HTML 字符串
render函数渲染整个日历的函数。 必须返回日历的完整 HTML 字符串
事件
on对象

带事件处理程序的对象。例如

var calendar = app.calendar.create({
  ...
  on: {
    opened: function () {
      console.log('Calendar opened')
    }
  }
})

请注意,所有以下参数都可以在calendar属性下的全局 app 参数中使用,以设置所有日历的默认值。 例如

var app = new Framework7({
  calendar: {
    url: 'calendar/',
    dateFormat: 'dd.mm.yyyy',
  }
});

日期范围

日历参数(disabledeventsrangesClasses)中的一些接受所谓的日期范围。 这是指定和覆盖所有可能日期组合的简单方法。

它可以是带有日期的数组,例如

var calendar = app.calendar.create({
    ...
    // Disabled 10th November 2015 and 11th November 2015:
    disabled: [new Date(2015, 10, 10), new Date(2015, 10, 11)],
    ...
});

它可以是自定义函数,您需要在其中返回truefalse

var calendar = app.calendar.create({
    ...
    //Disabled all dates in November 2015
    disabled: function (date) {
        if (date.getFullYear() === 2015 && date.getMonth() === 10) {
            return true;
        }
        else {
            return false;
        }
    },
    ...
});

或者带有fromto属性的对象

var calendar = app.calendar.create({
    ...
    //Disable all dates between 1st October 2015 and 31 December 2015
    disabled: {
        from: new Date(2015, 9, 1),
        to: new Date(2015, 11, 31)
    },
    ...
});

或者带有仅fromto属性的对象

var calendar = app.calendar.create({
    ...
    //Disable everyting since December 2015
    disabled: {
        from: new Date(2015, 11, 1)
    },
    ...
});

或者带有date属性的对象

var calendar = app.calendar.create({
    ...
    // Disabled 1th December 2015
    disabled: {
        date: new Date(2015, 11, 1)
    },
    ...
});

或者带有混合日期和对象的数组

var calendar = app.calendar.create({
    ...
    events: [
        new Date(2015, 9, 1),
        new Date(2015, 9, 5),
        {
            from: new Date(2015, 9, 10),
            to: new Date(2015, 9, 15)
        },
        {
            from: new Date(2015, 9, 20),
            to: new Date(2015, 9, 31)
        },
        {
            date: new Date(2015, 11, 1),
            color: '#ff0000'
        },
        // same date but one more color dot will be added
        {
            date: new Date(2015, 11, 1),
            color: '#00ff00'
        },
    ],
    ...
});

rangesClasses

rangesClasses参数接受具有适合此日期范围的类名的对象数组

var calendar = app.calendar.create({
    ...
    //Add classes for november and october
    rangesClasses: [
        //Add "day-october' class for all october dates
        {
            // string CSS class name for this range in "cssClass" property
            cssClass: 'day-october', //string CSS class
            // Date Range in "range" property
            range: function (date) {
                return date.getMonth() === 9
            }
        },
        //Add "day-holiday" class for 1-10th January 2016
        {
            cssClass: 'day-holiday',
            range: {
                from: new Date(2016, 0, 1),
                to: new Date(2016, 0, 10)
            }
        }
    ],
    ...
});

日历方法和属性

我们初始化日历后,就会在变量中获得其初始化的实例(例如上面示例中的calendar变量),其中包含有帮助的方法和属性

属性
calendar.app指向全局应用程序实例的链接
calendar.containerEl日历包装容器 HTML 元素(当内联日历正在使用时)
calendar.$containerEl包含日历包装容器的 HTML 元素的 Dom7 实例(当内联日历正在使用时)
calendar.el日历 HTML 元素
calendar.$el包含日历 HTML 元素的 Dom7 实例
calendar.inputEl日历输入 HTML 元素(在inputEl参数中传递)
calendar.$inputEl包含日历输入 HTML 元素的 Dom7 实例(在inputEl参数中传递)
calendar.value数组,其中每个项目都代表选定的日期
calendar.currentMonth日历视图当前月份。 数字,从011
calendar.currentYear日历视图当前年份。 数字,例如2020
calendar.opened如果日历当前打开,则为true
calendar.inline内部日历正在使用时为true
calendar.cols数组,其中指定了日历列。 每个列也有自己的方法和属性(见下文)
calendar.url日历 URL(在 url 参数中传递)
calendar.view日历视图(在 view 参数中传递)或找到父视图
calendar.params带有初始化参数的对象
calendar.allowTouchMove将此标志设置为 false 以防止在初始化后进行触碰移动交互
方法
calendar.setValue()设置新的选定日期。 是数组,其中每个项都表示选定的日期
calendar.getValue()返回当前日历值
calendar.addValue()将值添加到值数组中。如果启用了多选(带有 multiple: true 参数),则很有用
calendar.update()重新渲染日历。如果您以动态方式添加/更改了值并且需要更新日历布局,则很有用
calendar.nextMonth(持续时间)日历过渡到下一个月,其中 持续时间 以毫秒为单位
calendar.prevMonth(持续时间)日历过渡到前一个月,其中 持续时间 以毫秒为单位
calendar.nextYear()日历过渡到下一年
calendar.prevYear()日历过渡到前一年
calendar.setYearMonth(, , 持续时间)日历过渡到指定的 ,其中 持续时间 以毫秒为单位
calendar.open()打开日历
calendar.close()关闭日历
calendar.destroy()销毁日历实例并删除所有事件
calendar.on(事件, 处理程序)添加事件处理程序
calendar.once(事件, 处理程序)添加事件处理程序,该事件处理程序在触发后将被删除
calendar.off(事件, 处理程序)删除事件处理器
calendar.off(事件)删除指定事件的所有处理程序
calendar.emit(事件, ...参数)触发实例上的事件

日历事件

日历将在日历元素上触发以下 DOM 事件以及在应用程序和日历实例上触发事件

DOM 事件

事件目标描述
calendar:open日历元素<div class="calendar">当日历开始其打开动画时,将触发事件
calendar:opened日历元素<div class="calendar">当日历完成其打开动画后,将触发事件
calendar:close日历元素<div class="calendar">当日历开始其关闭动画时,将触发事件
calendar:closed日历元素<div class="calendar">当日历完成其关闭动画后,将触发事件

应用程序和日历实例事件

日历实例在自身实例和应用程序实例上都发出事件。应用程序实例事件具有相同名称,前缀为 calendar

事件目标参数描述
dayClick日历(日历、dayEl、年、月、日)单击日历日期元素后将触发事件
calendarDayClick应用
change日历(日历、值)当日历值发生改变时,将触发事件
calendarChange应用
monthAdd日历(日历、monthEl)当添加了新的月份 HTML 布局时,将触发事件。如果您需要对添加的 html 元素进行后处理,则很有用
calendarMonthAdd应用
monthYearChangeStart日历(日历、年、月)事件将在过渡到下一个月开始时触发
calendarMonthYearChangeStart应用
monthYearChangeEnd日历(日历、年、月)过渡到下一个月后触发事件
calendarMonthYearChangeEnd应用
init日历(日历)当日历初始化时触发事件
calendarInit应用
open日历(日历)当日历开始其打开动画时触发事件。作为参数,事件处理程序接收日历实例
calendarOpen应用
opened日历(日历)当日历完成其打开动画后触发事件。作为参数,事件处理程序接收日历实例
calendarOpened应用
close日历(日历)当日历开始其关闭动画时触发事件。作为参数,事件处理程序接收日历实例
calendarClose应用
closed日历(日历)当日历完成其关闭动画后触发事件。作为参数,事件处理程序接收日历实例
calendarClosed应用
beforeDestroy日历(日历)当要销毁日历实例之前立即触发事件。作为参数,事件处理程序接收日历实例
calendarBeforeDestroy应用

CSS变量

以下是相关 CSS 变量 (CSS 自定义属性) 的列表。

请注意,带注释的变量默认情况下没有指定,在这种情况下,它们的默认值是多少。

:root {
  --f7-calendar-height: 340px;
  --f7-calendar-sheet-landscape-height: 220px;
  --f7-calendar-popover-width: 320px;
  --f7-calendar-popover-height: 320px;
  --f7-calendar-modal-height: 420px;
  --f7-calendar-modal-max-width: 380px;
  /*
  --f7-calendar-header-bg-color: var(--f7-bars-bg-color);
  --f7-calendar-header-link-color: var(--f7-bars-link-color);
  --f7-calendar-header-text-color: var(--f7-bars-text-color);
  --f7-calendar-footer-bg-color: var(--f7-bars-bg-color);
  --f7-calendar-footer-border-color: var(--f7-bars-border-color);
  --f7-calendar-footer-link-color: var(--f7-bars-link-color);
  --f7-calendar-footer-text-color: var(--f7-bars-text-color);
  */
  --f7-calendar-week-header-bg-color: transparent;
  --f7-calendar-footer-padding: 0 8px;
  --f7-calendar-week-header-font-size: 11px;
  /*
  --f7-calendar-selected-bg-color:  var(--f7-theme-color);
  */
  --f7-calendar-disabled-text-color: #d4d4d4;
  --f7-calendar-event-dot-size: 4px;
  /*
  --f7-calendar-event-bg-color: var(--f7-theme-color);
  */
  /*
  --f7-calendar-picker-selected-text-color: var(--f7-theme-color);
  */
  --f7-calendar-time-selector-height: 28px;
  --f7-calendar-picker-pressed-bg-color: rgba(0, 0, 0, 0.1);
  --f7-calendar-picker-hover-bg-color: rgba(0, 0, 0, 0.03);
  --f7-calendar-time-selector-bg-color: rgba(0, 0, 0, 0.05);
}
:root .dark,
:root.dark {
  --f7-calendar-picker-pressed-bg-color: rgba(255, 255, 255, 0.08);
  --f7-calendar-picker-hover-bg-color: rgba(255, 255, 255, 0.03);
  --f7-calendar-time-selector-bg-color: rgba(255, 255, 255, 0.1);
}
.ios {
  --f7-calendar-selected-text-color: #fff;
  --f7-calendar-header-height: 44px;
  --f7-calendar-header-font-size: 17px;
  --f7-calendar-header-font-weight: 600;
  --f7-calendar-header-padding: 0 8px;
  --f7-calendar-footer-height: 44px;
  --f7-calendar-footer-font-size: 17px;
  --f7-calendar-week-header-height: 18px;
  --f7-calendar-day-font-size: 15px;
  --f7-calendar-day-size: 30px;
  --f7-calendar-picker-font-size: 17px;
  --f7-calendar-time-selector-font-size: 17px;
  --f7-calendar-modal-border-radius: 4px;
  --f7-calendar-modal-box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2),
                                  0px 24px 38px 3px rgba(0, 0, 0, 0.14),
                                  0px 9px 46px 8px rgba(0, 0, 0, 0.12);
  --f7-calendar-prev-next-text-color: #c8c8c8;
  --f7-calendar-sheet-border-color: #929499;
  --f7-calendar-sheet-bg-color: #fff;
  --f7-calendar-week-header-text-color: #5e5e5e;
  --f7-calendar-modal-bg-color: #fff;
  --f7-calendar-day-text-color: #000;
  --f7-calendar-today-text-color: #000;
  --f7-calendar-today-bg-color: #e3e3e3;
}
.ios .dark,
.ios.dark {
  --f7-calendar-prev-next-text-color: #5e5e5e;
  --f7-calendar-sheet-border-color: var(--f7-bars-border-color);
  --f7-calendar-sheet-bg-color: #121212;
  --f7-calendar-week-header-text-color: #aaa;
  --f7-calendar-modal-bg-color: #121212;
  --f7-calendar-day-text-color: #fff;
  --f7-calendar-today-text-color: #fff;
  --f7-calendar-today-bg-color: #333;
}
.md {
  --f7-calendar-sheet-border-color: transparent;
  --f7-calendar-header-height: 64px;
  --f7-calendar-header-font-size: 24px;
  --f7-calendar-header-font-weight: 400;
  --f7-calendar-header-padding: 0 24px;
  --f7-calendar-footer-height: 56px;
  --f7-calendar-footer-font-size: 14px;
  --f7-calendar-week-header-height: 24px;
  --f7-calendar-day-font-size: 14px;
  --f7-calendar-today-bg-color: none;
  --f7-calendar-day-size: 32px;
  --f7-calendar-picker-font-size: 14px;
  --f7-calendar-time-selector-font-size: 14px;
  --f7-calendar-modal-border-radius: 28px;
  --f7-calendar-modal-box-shadow: none;
}
.md,
.md .dark,
.md [class*='color-'] {
  --f7-calendar-sheet-bg-color: var(--f7-md-surface-1);
  --f7-calendar-selected-text-color: var(--f7-md-on-primary);
  --f7-calendar-week-header-text-color: var(--f7-md-on-surface-variant);
  --f7-calendar-day-text-color: var(--f7-md-on-surface);
  --f7-calendar-prev-next-text-color: rgba(var(--f7-md-on-surface-variant-rgb), 0.55);
  --f7-calendar-today-text-color: var(--f7-theme-color);
  --f7-calendar-modal-bg-color: var(--f7-md-surface-1);
}

示例

calendar.html
<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner sliding">
        <div class="title">Calendar</div>
      </div>
    </div>
    <div class="page-content">
      <div class="block">
        <p>Calendar is a touch optimized component that provides an easy way to handle dates.</p>
        <p>Calendar could be used as inline component or as overlay. Overlay Calendar will be automatically converted to
          Popover on tablets (iPad).</p>
      </div>
      <div class="block-title">Default setup</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Your birth date" readonly="readonly" id="demo-calendar-default" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Custom date format</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select date" readonly="readonly" id="demo-calendar-date-format" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Date + Time</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select date and time" readonly="readonly"
                    id="demo-calendar-date-time" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Multiple Values</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select multiple dates" readonly="readonly"
                    id="demo-calendar-multiple" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Range Picker</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select date range" readonly="readonly" id="demo-calendar-range" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Open in Modal</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select date" readonly="readonly" id="demo-calendar-modal" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Calendar Page</div>
      <div class="list list-strong list-outline-ios">
        <ul>
          <li>
            <a href="/calendar-page/" class="item-content item-link">
              <div class="item-inner">
                <div class="item-title">Open Calendar Page</div>
              </div>
            </a>
          </li>
        </ul>
      </div>
      <div class="block-title">Inline with custom toolbar</div>
      <div class="block block-strong no-padding">
        <div id="demo-calendar-inline-container"></div>
      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $f7, $, $on }) => {
    let calendarDefault
    let calendarDateFormat;
    let calendarDateTime;
    let calendarMultiple;
    let calendarRange;
    let calendarModal;
    let calendarInline;
    $on('pageInit', () => {
      // Default
      calendarDefault = $f7.calendar.create({
        inputEl: '#demo-calendar-default',
      });

      // With custom date format
      calendarDateFormat = $f7.calendar.create({
        inputEl: '#demo-calendar-date-format',
        dateFormat: { weekday: 'long', month: 'long', day: '2-digit', year: 'numeric' },
      });

      // Date + Time
      calendarDateTime = $f7.calendar.create({
        inputEl: '#demo-calendar-date-time',
        timePicker: true,
        dateFormat: { month: 'numeric', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric' },
      });

      // With multiple values
      calendarMultiple = $f7.calendar.create({
        inputEl: '#demo-calendar-multiple',
        dateFormat: { month: 'short', day: 'numeric' },
        multiple: true
      });
      // Range Picker
      calendarRange = $f7.calendar.create({
        inputEl: '#demo-calendar-range',
        rangePicker: true
      });
      // Custom modal
      calendarModal = $f7.calendar.create({
        inputEl: '#demo-calendar-modal',
        openIn: 'customModal',
        header: true,
        footer: true,
      });
      // Inline with custom toolbar
      var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
      calendarInline = $f7.calendar.create({
        containerEl: '#demo-calendar-inline-container',
        value: [new Date()],
        renderToolbar: function () {
          return '<div class="toolbar calendar-custom-toolbar no-shadow">' +
            '<div class="toolbar-inner">' +
            '<div class="left">' +
            '<a  class="link icon-only"><i class="icon icon-back"></i></a>' +
            '</div>' +
            '<div class="center"></div>' +
            '<div class="right">' +
            '<a  class="link icon-only"><i class="icon icon-forward"></i></a>' +
            '</div>' +
            '</div>' +
            '</div>';
        },
        on: {
          init: function (c) {
            $('.calendar-custom-toolbar .center').text(monthNames[c.currentMonth] + ', ' + c.currentYear);
            $('.calendar-custom-toolbar .left .link').on('click', function () {
              calendarInline.prevMonth();
            });
            $('.calendar-custom-toolbar .right .link').on('click', function () {
              calendarInline.nextMonth();
            });
          },
          monthYearChangeStart: function (c) {
            $('.calendar-custom-toolbar .center').text(monthNames[c.currentMonth] + ', ' + c.currentYear);
          }
        }
      });
    });
    $on('pageBeforeRemove', () => {
      calendarDefault.destroy();
      calendarDateFormat.destroy();
      calendarDateTime.destroy();
      calendarMultiple.destroy();
      calendarRange.destroy();
      calendarModal.destroy();
      calendarInline.destroy();
    });

    return $render;
  };
</script>