表格模态

Sheet Modal 是一种特殊的覆盖类型,类似于 Picker/Calendar 的覆盖层。这种模态允许创建具有自定义内容的自定义覆盖层

Sheet布局

Sheet 布局相当简单:

<body>
  ...
  <!-- Sheet Modal Container -->
  <div class="sheet-modal">
    <!-- Sheet Modal Toolbar, optional -->
    <div class="toolbar">
      <div class="toolbar-inner">
        <div class="left"></div>
        <div class="right">
          <a href="#" class="link sheet-close">Done</a>
        </div>
      </div>
    </div>
    <!-- Sheet Modal Inner -->
    <div class="sheet-modal-inner">
      <!-- Sheet Modal content -->
      <div class="block">
        <p>Integer mollis nulla id nibh elementum finibus...</p>
      </div>
    </div>
  </div>

</body>

Sheet顶部布局

默认情况下,Sheet Modal 从屏幕底部打开。也可以从屏幕顶部打开它。在这种情况下,我们需要向 Sheet 元素添加sheet-modal-top类。在这种情况下,还建议使用底部工具栏:

<!-- Additional "sheet-modal-top" class to open it from top -->
<div class="sheet-modal sheet-modal-top">
  <!-- Bottom toolbar for top sheet -->
  <div class="toolbar toolbar-bottom">
    <div class="toolbar-inner">
      <div class="left"></div>
      <div class="right">
        <a href="#" class="link sheet-close">Done</a>
      </div>
    </div>
  </div>
  <!-- Sheet Modal Inner -->
  <div class="sheet-modal-inner">
    <!-- Sheet Modal content -->
    <div class="block">
      <p>Integer mollis nulla id nibh elementum finibus...</p>
    </div>
  </div>
</div>

Sheet应用方法

让我们看看与 Sheet 相关的 App 方法来处理 Sheet:

app.sheet.create(参数)- 创建 Sheet 实例

  • 参数 - 对象. Sheet 参数对象

方法返回创建的 Sheet 实例

app.sheet.destroy(el)- 销毁 Sheet 实例

  • el - HTMLElement字符串(使用 CSS 选择器) 或对象. 要销毁的 Sheet 元素或 Sheet 实例。

app.sheet.get(el)- 通过 HTML 元素获取 Sheet 实例

  • el - HTMLElement字符串(使用 CSS 选择器)。Sheet 元素。

方法返回 Sheet 实例

app.sheet.open(el, animate)- 打开 Sheet

  • el - HTMLElement字符串(使用 CSS 选择器)。要打开的 Sheet 元素。
  • animate - 布尔值. 使用动画打开 Sheet。

方法返回 Sheet 实例

app.sheet.close(el, animate)- 关闭 Sheet

  • el - HTMLElement字符串(使用 CSS 选择器)。要关闭的 Sheet 元素。
  • animate - 布尔值. 使用动画关闭 Sheet。

方法返回 Sheet 实例

app.sheet.stepOpen(el)- 打开/展开 Sheet 滑动步骤

  • el - HTMLElement字符串(使用 CSS 选择器)。要打开滑动步骤的 Sheet 元素。

方法返回 Sheet 实例

app.sheet.stepClose(el)- 关闭/折叠 Sheet 滑动步骤

  • el - HTMLElement字符串(使用 CSS 选择器)。要关闭滑动步骤的 Sheet 元素。

方法返回 Sheet 实例

app.sheet.stepToggle(el)- 切换(打开或关闭)Sheet 滑动步骤

  • el - HTMLElement字符串(使用 CSS 选择器)。要切换滑动步骤的 Sheet 元素。

方法返回 Sheet 实例

app.sheet.setBreakpoint(el, )- 在特定断点设置/打开 Sheet Modal(从breakpoints数组参数)。同时传递0将关闭 Sheet Modal,传递1将完全打开它

方法返回 Sheet 实例

Sheet参数

现在让我们看看创建 Sheet 需要的可用参数列表:

参数类型默认描述
elHTMLElementSheet 元素。如果你已经在 HTML 中有 Sheet 元素,并想使用这个元素创建新的实例,则很有用
内容字符串完整的 Sheet HTML 布局字符串。如果你想动态创建 Sheet 元素,则很有用
背景遮罩布尔值启用 Sheet 背景层(暗色半透明层)。默认情况下它是true对于 MD 主题和false对于 iOS 主题
backdropElHTMLElement
字符串
自定义背景元素的HTML元素或字符串CSS选择器
backdropUnique布尔值false如果启用,它将为该模态创建唯一的背景元素
scrollToElHTMLElement
字符串
元素的 HTML 元素或字符串(使用 CSS 选择器)。如果指定,则 Sheet 将尝试在打开时滚动页面内容到该元素
closeByBackdropClick布尔值true当启用时,将在背景层点击时关闭
closeByOutsideClick布尔值false当启用时,将在点击其外部时关闭
closeOnEscape布尔值false当启用时,将在按 ESC 键时关闭
animate布尔值trueSheet 是否应该使用动画打开/关闭。可以在.open().close()方法中覆盖。
swipeToClose布尔值falseSheet是否可以用滑动手势关闭
swipeToStep布尔值false当启用时,可以将其分为两种状态:部分打开和完全打开,可以通过滑动控制
swipeHandlerHTMLElement
字符串
如果未传递,则整个Sheet都可以滑动关闭。您可以在此处传递HTML元素或字符串CSS选择器,该元素将用作滑动目标。(必须启用)swipeToCloseswipeToSteppush
push布尔值false当启用时,打开时将视图推到后面。仅在顶部安全区域存在时才有效。也可以通过向Sheet元素添加sheet-modal-push类来启用
breakpointsnumber[][]用作swipeToStep启用滑动断点的替代方法。必须是一个大于0小于1的数字数组,其中0是完全关闭,1是完全打开,例如[0.33, 0.66], [0.5],等等。
backdropBreakpoint数字0定义背景遮罩变为可见的断点。数字从0(理想的是breakpoints数组的最低(第一个)值)到1(默认0)
pushBreakpoint数字0定义何时将视图推到后面(push必须启用)。数字从0(理想的是breakpoints数组的最低(第一个)值)到1(默认0)
containerElHTMLElement
字符串
模态挂载到的元素(默认为应用根元素)
on对象

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

var sheet = app.sheet.create({
  content: '<div class="sheet-modal">...</div>',
  on: {
    opened: function () {
      console.log('Sheet opened')
    }
  }
})

注意,所有以下参数都可以在sheet属性下的全局 App 参数中用于为所有 Sheet 设置默认值。例如:

var app = new Framework7({
  sheet: {
    closeByBackdropClick: false,
  }
});

如果你使用自动初始化的 Sheet Modal(例如,你通过app.sheet.create创建它们),则可以通过data-属性传递所有可用的 Sheet 参数。例如:

<!-- Pass parameters as kebab-case data attributes -->
<div class="sheet-modal" data-close-on-escape="true" data-swipe-to-close="true">
  ...
</div>

Sheet方法和属性

所以要创建 Sheet,我们必须调用:

var sheet = app.sheet.create({ /* parameters */ })

之后我们就有其初始化的实例(如sheet示例中上面的变量)以及有用的方法和属性:

属性
sheet.app链接到全局应用实例
sheet.elSheet HTML 元素
sheet.$el包含 Sheet HTML 元素的 Dom7 实例
sheet.backdropEl背景层 HTML 元素
sheet.$backdropEl包含背景层 HTML 元素的 Dom7 实例
sheet.paramsSheet 参数
sheet.opened指示 Sheet 是否打开的布尔属性
方法
sheet.open(animate)打开 Sheet。其中
  • animate - 布尔值(默认true) - 定义是否应使用动画打开
sheet.close(animate)关闭 Sheet。其中
  • animate - 布尔值(默认true) - 定义是否应使用动画关闭
sheet.stepOpen()打开/展开 Sheet 滑动步骤
sheet.stepClose()关闭/折叠 Sheet 滑动步骤
sheet.stepToggle()切换(打开或关闭)Sheet 滑动步骤
sheet.setSwipeStep()更新步骤位置。当打开时手动修改 Sheet Modal 内容后需要调用
sheet.setBreakpoint()在特定断点设置/打开 Sheet Modal(从breakpoints数组参数)。同时传递0将关闭 Sheet Modal,传递1将完全打开它
sheet.destroy()销毁 Sheet
sheet.on(事件上触发, 处理程序)添加事件处理程序
sheet.once(事件上触发, 处理程序)添加在触发后将被移除的事件处理程序
sheet.off(事件上触发, 处理程序)移除事件处理程序
sheet.off(事件上触发)移除指定事件的所有处理程序
sheet.emit(事件上触发, ...args)在实例上触发事件

可以使用特殊类和数据属性在链接上打开和关闭所需的 Sheet(如果你在 DOM 中有它们):

  • 要打开 Sheet,我们需要向任何 HTML 元素(最好是指针)添加 "sheet-open" 类

  • 要关闭 Sheet,我们需要向任何 HTML 元素(最好是指针)添加 "sheet-close" 类

  • 如果你 DOM 中有多个 Sheet,你需要通过额外的data-sheet=".my-sheet"属性在这个 HTML 元素上指定适当的 Sheet

根据上述说明:

<!-- In data-sheet attribute we specify CSS selector of sheet we need to open -->
<p><a href="#" data-sheet=".my-sheet" class="sheet-open">Open Sheet</a></p>

<!-- And somewhere in DOM -->
<div class="sheet-modal my-sheet">
  <div class="sheet-modal-inner">
    <!-- Link to close sheet -->
    <a class="link sheet-close">Close</a>
  </div>
</div>

滑动步骤

如果你传递swipeToStep参数,则 Sheet 将部分打开,并且可以通过滑动进一步展开。为了使其工作,我们还需要在 Sheet HTML 中定义第一个/初始步骤,以便 Framework7 知道 Sheet 应该打开多少。

为了使其工作,我们需要用<div class="sheet-modal-swipe-step">元素包装初始 Sheet 内容,并在该 Sheet Modal 上设置height:auto

<div class="sheet-modal" style="height: auto">
  <div class="sheet-modal-inner">
    <!-- initial sheet modal content -->
    <div class="sheet-modal-swipe-step">
      ...
    </div>
    <!-- rest of the content that will be opened with extra swipe -->
    ...
  </div>
</div>

对于顶部位置的 Sheet Modal,这个滑动步骤应该在底部:

<div class="sheet-modal sheet-modal-top" style="height: auto">
  <div class="sheet-modal-inner">
    <!-- rest of the content that will be opened with extra swipe -->
    ...
    <!-- initial sheet modal content -->
    <div class="sheet-modal-swipe-step">
      ...
    </div>
  </div>
</div>

Sheet事件

Sheet 将在 Sheet 元素上触发以下 DOM 事件,以及在 App 和 Sheet 实例上触发事件:

DOM 事件

事件Target描述
sheet:openSheet元素<div class="sheet">当 Sheet 开始其打开动画时将触发事件
sheet:openedSheet元素<div class="sheet">Sheet 完成其打开动画后将触发事件
sheet:closeSheet元素<div class="sheet">当Sheet开始关闭动画时将触发事件
sheet:closedSheet元素<div class="sheet">当Sheet完成关闭动画时将触发事件
sheet:stepopenSheet元素<div class="sheet">在Sheet滑动步骤打开/展开时触发事件
sheet:stepcloseSheet元素<div class="sheet">在Sheet滑动步骤关闭/折叠时触发事件
sheet:stepprogressSheet元素<div class="sheet">当Sheet在打开和关闭状态之间的滑动步骤上触发事件。它接收步骤打开进度数字(来自event.detailsheet:beforedestroy01)
sheet:breakpointSheet元素<div class="sheet">当Sheet在打开和关闭状态之间的滑动步骤上触发事件。它接收步骤打开进度数字(来自event.detailsheet:beforedestroy01)
sheet:beforedestroySheet元素<div class="sheet">当Sheet断点改变时将触发事件。它接收当前断点(来自event.detailApp和Sheet实例事件01)

App和Sheet实例事件

Sheet实例在自身实例和应用程序实例上发出事件。应用程序实例事件具有相同名称,以popup.

事件参数Target描述
open为前缀表格表格当Sheet开始打开动画时将触发事件。作为参数,事件处理程序接收Sheet实例
sheetOpen表格app
opened表格表格当Sheet完成打开动画时将触发事件。作为参数,事件处理程序接收Sheet实例
sheetOpened表格app
close表格表格当Sheet开始关闭动画时将触发事件。作为参数,事件处理程序接收Sheet实例
sheetClose表格app
closed表格表格当Sheet完成关闭动画时将触发事件。作为参数,事件处理程序接收Sheet实例
sheetClosed表格app
beforeDestroy表格表格在Sheet实例将被销毁之前将触发事件。作为参数,事件处理程序接收Sheet实例
sheetBeforeDestroy表格app
stepOpen表格表格在Sheet滑动步骤打开/展开时触发事件
sheetStepOpen表格app
stepClose表格表格在Sheet滑动步骤关闭/折叠时触发事件
sheetStepClose表格app
stepProgresssheet,progress表格当Sheet在打开和关闭状态之间的滑动步骤上触发事件。它接收步骤打开进度数字(来自progresssheet:beforedestroy01)
sheetStepProgresssheet,progressapp
断点sheet,breakpoint表格在Sheet断点更改时触发事件。作为第二个参数,它接收当前断点(从01)
sheetBreakpointsheet,breakpointapp

CSS 变量

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

:root {
  --f7-sheet-height: 260px;
  --f7-sheet-push-offset: var(--f7-safe-area-top);
}
.ios {
  --f7-sheet-border-radius: 0px;
  --f7-sheet-border-color: var(--f7-bars-border-color);
  --f7-sheet-transition-timing-function: initial;
  --f7-sheet-push-border-radius: 10px;
  --f7-sheet-transition-duration: 300ms;
  --f7-sheet-bg-color: #fff;
}
.ios .dark,
.ios.dark {
  --f7-sheet-bg-color: #202020;
}
.md {
  --f7-sheet-border-radius: 16px;
  --f7-sheet-push-border-radius: 16px;
  --f7-sheet-border-color: transparent;
  --f7-sheet-transition-timing-function: cubic-bezier(0, 0.8, 0.34, 1);
  --f7-sheet-transition-duration: 400ms;
}
.md,
.md .dark,
.md [class*='color-'] {
  --f7-sheet-bg-color: var(--f7-md-surface);
}

示例

sheet-modal.html
<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner sliding">
        <div class="title">Sheet Modal</div>
      </div>
    </div>
    <div class="page-content">
      <div class="block block-strong-ios block-outline-ios">
        <p>Sheet Modals slide up from the bottom (or down from the top) of the screen to reveal more content. Such
          modals allow to create custom overlays with custom content.</p>
        <p class="grid grid-cols-2 grid-gap">
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet">Open Sheet</a>
          <a class="button button-fill" @click=${createSheet}>Dynamic Sheet</a>
        </p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-top">Top Sheet</a>
        </p>
      </div>

      <div class="block-title">Push View</div>
      <div class="block block-strong-ios block-outline-ios">
        <p>Sheet can push view behind on open. By default it has effect only when <code>safe-area-inset-top</code> is
          more than
          zero (iOS fullscreen webapp or iOS cordova app)</p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-push">Sheet Push</a>
        </p>
      </div>

      <div class="block-title">Swipeable Sheet</div>
      <div class="block block-strong-ios block-outline-ios">
        <p>Sheet modal can be closed with swipe to top (for top Sheet) or bottom (for default Bottom sheet):</p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-swipe-to-close">Swipe To Close</a>
        </p>
        <p>Also there is swipe-step that can be set on Sheet modal to expand it with swipe:</p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-swipe-to-step">Swipe To Step</a>
        </p>

        <p>In addition to "swipe step" there is a support for position breakpoints (multiple steps):</p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-breakpoints">Breakpoints</a>
        </p>
      </div>

    </div>


    <div class="sheet-modal demo-sheet">
      <div class="toolbar">
        <div class="toolbar-inner">
          <div class="left"></div>
          <div class="right">
            <a class="link sheet-close">Close</a>
          </div>
        </div>
      </div>
      <div class="sheet-modal-inner">
        <div class="page-content">
          <div class="block">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae ducimus dolorum ipsa aliquid accusamus
              perferendis laboriosam delectus numquam minima animi, libero illo in tempora harum sequi corporis alias ex
              adipisci.</p>
            <p>Sunt magni enim saepe quasi aspernatur delectus consectetur fugiat necessitatibus qui sed, similique quis
              facere tempora, laudantium quae expedita ea, aperiam dolores. Aut deserunt soluta alias magnam.
              Consequatur, nisi, enim.</p>
            <p>Eaque maiores ducimus, impedit unde culpa qui, explicabo accusamus, non vero corporis voluptatibus
              similique odit ab. Quaerat quasi consectetur quidem libero? Repudiandae adipisci vel voluptatum, autem
              libero minus dignissimos repellat.</p>
            <p>Iusto, est corrupti! Totam minus voluptas natus esse possimus nobis, delectus veniam expedita sapiente ut
              cum reprehenderit aliquid odio amet praesentium vero temporibus obcaecati beatae aspernatur incidunt,
              perferendis voluptates doloribus?</p>
            <p>Illum id laborum tempore, doloribus culpa labore ex iusto odit. Quibusdam consequuntur totam nam
              obcaecati, enim cumque nobis, accusamus, quos voluptates, voluptatibus sapiente repellendus nesciunt
              praesentium velit ipsa illo iusto.</p>
          </div>
        </div>
      </div>
    </div>
    <div class="sheet-modal sheet-modal-top demo-sheet-top">
      <div class="toolbar toolbar-bottom">
        <div class="toolbar-inner">
          <div class="left"></div>
          <div class="right">
            <a class="link sheet-close">Close</a>
          </div>
        </div>
      </div>
      <div class="sheet-modal-inner">
        <div class="page-content">
          <div class="block">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae ducimus dolorum ipsa aliquid accusamus
              perferendis laboriosam delectus numquam minima animi, libero illo in tempora harum sequi corporis alias ex
              adipisci.</p>
            <p>Sunt magni enim saepe quasi aspernatur delectus consectetur fugiat necessitatibus qui sed, similique quis
              facere tempora, laudantium quae expedita ea, aperiam dolores. Aut deserunt soluta alias magnam.
              Consequatur, nisi, enim.</p>
            <p>Eaque maiores ducimus, impedit unde culpa qui, explicabo accusamus, non vero corporis voluptatibus
              similique odit ab. Quaerat quasi consectetur quidem libero? Repudiandae adipisci vel voluptatum, autem
              libero minus dignissimos repellat.</p>
            <p>Iusto, est corrupti! Totam minus voluptas natus esse possimus nobis, delectus veniam expedita sapiente ut
              cum reprehenderit aliquid odio amet praesentium vero temporibus obcaecati beatae aspernatur incidunt,
              perferendis voluptates doloribus?</p>
            <p>Illum id laborum tempore, doloribus culpa labore ex iusto odit. Quibusdam consequuntur totam nam
              obcaecati, enim cumque nobis, accusamus, quos voluptates, voluptatibus sapiente repellendus nesciunt
              praesentium velit ipsa illo iusto.</p>
          </div>
        </div>
      </div>
    </div>

    <div class="sheet-modal demo-sheet-push">
      <div class="toolbar">
        <div class="toolbar-inner">
          <div class="left"></div>
          <div class="right">
            <a class="link sheet-close">Close</a>
          </div>
        </div>
      </div>
      <div class="sheet-modal-inner">
        <div class="page-content">
          <div class="block">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae ducimus dolorum ipsa aliquid accusamus
              perferendis laboriosam delectus numquam minima animi, libero illo in tempora harum sequi corporis alias ex
              adipisci.</p>
            <p>Sunt magni enim saepe quasi aspernatur delectus consectetur fugiat necessitatibus qui sed, similique quis
              facere tempora, laudantium quae expedita ea, aperiam dolores. Aut deserunt soluta alias magnam.
              Consequatur, nisi, enim.</p>
            <p>Eaque maiores ducimus, impedit unde culpa qui, explicabo accusamus, non vero corporis voluptatibus
              similique odit ab. Quaerat quasi consectetur quidem libero? Repudiandae adipisci vel voluptatum, autem
              libero minus dignissimos repellat.</p>
            <p>Iusto, est corrupti! Totam minus voluptas natus esse possimus nobis, delectus veniam expedita sapiente ut
              cum reprehenderit aliquid odio amet praesentium vero temporibus obcaecati beatae aspernatur incidunt,
              perferendis voluptates doloribus?</p>
            <p>Illum id laborum tempore, doloribus culpa labore ex iusto odit. Quibusdam consequuntur totam nam
              obcaecati, enim cumque nobis, accusamus, quos voluptates, voluptatibus sapiente repellendus nesciunt
              praesentium velit ipsa illo iusto.</p>
          </div>
        </div>
      </div>
    </div>

    <div class="sheet-modal demo-sheet-swipe-to-close" style="height:auto">
      <div class="sheet-modal-inner">
        <div class="swipe-handler"></div>
        <div class="page-content">
          <div class="block-title block-title-large">Hello!</div>
          <div class="block">
            <p>Eaque maiores ducimus, impedit unde culpa qui, explicabo accusamus, non vero corporis voluptatibus
              similique odit ab. Quaerat quasi consectetur quidem libero? Repudiandae adipisci vel voluptatum, autem
              libero minus dignissimos repellat.</p>
            <p>Iusto, est corrupti! Totam minus voluptas natus esse possimus nobis, delectus veniam expedita sapiente ut
              cum reprehenderit aliquid odio amet praesentium vero temporibus obcaecati beatae aspernatur incidunt,
              perferendis voluptates doloribus?</p>
          </div>
        </div>
      </div>
    </div>

    <div class="sheet-modal demo-sheet-swipe-to-step" style="height:auto">
      <div class="sheet-modal-inner">
        <div class="swipe-handler"></div>
        <div class="sheet-modal-swipe-step">
          <div class="display-flex padding justify-content-space-between align-items-center">
            <div style="font-size: 18px"><b>Total:</b></div>
            <div style="font-size: 22px"><b>$500</b></div>
          </div>
          <div class="padding-horizontal padding-bottom">
            <a class="button button-large button-fill">Make Payment</a>
            <div class="margin-top text-align-center">Swipe up for more details</div>
          </div>
        </div>
        <div class="block-title block-title-medium margin-top">Your order:</div>
        <div class="list no-hairlines">
          <ul>
            <li class="item-content">
              <div class="item-inner">
                <div class="item-title">Item 1</div>
                <div class="item-after"><b>$200</b></div>
              </div>
            </li>
            <li class="item-content">
              <div class="item-inner">
                <div class="item-title">Item 2</div>
                <div class="item-after"><b>$180</b></div>
              </div>
            </li>
            <li class="item-content">
              <div class="item-inner">
                <div class="item-title">Delivery</div>
                <div class="item-after"><b>$120</b></div>
              </div>
            </li>
          </ul>
        </div>

      </div>
    </div>

    <div class="sheet-modal demo-sheet-breakpoints" style="height:auto">
      <div class="sheet-modal-inner">
        <div class="swipe-handler" style="background-color: transparent;"></div>
        <div style="display: flex; align-items: center; justify-content: center; height: 20vh;">
          Section 1</div>
        <div style="display: flex; align-items: center; justify-content: center; height: 20vh;">
          Section 2</div>
        <div style="display: flex; align-items: center; justify-content: center; height: 20vh;">
          Section 3</div>

      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $f7, $on }) => {
    let sheet;
    let sheetPush;
    let sheetSwipeToClose;
    let sheetSwipeToStep;
    let sheetBreakpoints;

    const toggleSwipeStep = () => {
      sheetSwipeToStep.stepToggle();
    }
    const createSheet = () => {
      // Create sheet modal
      if (!sheet) {
        sheet = $f7.sheet.create({
          content: '\
            <div class="sheet-modal">\
              <div class="toolbar">\
                <div class="toolbar-inner justify-content-flex-end">\
                  <a  class="link sheet-close">Close</a>\
                </div>\
              </div>\
              <div class="sheet-modal-inner">\
                <div class="page-content">\
                  <div class="block">\
                    <p>This sheet modal was created dynamically</p>\
                    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse faucibus mauris leo, eu bibendum neque congue non. Ut leo mauris, eleifend eu commodo a, egestas ac urna. Maecenas in lacus faucibus, viverra ipsum pulvinar, molestie arcu. Etiam lacinia venenatis dignissim. Suspendisse non nisl semper tellus malesuada suscipit eu et eros. Nulla eu enim quis quam elementum vulputate. Mauris ornare consequat nunc viverra pellentesque. Aenean semper eu massa sit amet aliquam. Integer et neque sed libero mollis elementum at vitae ligula. Vestibulum pharetra sed libero sed porttitor. Suspendisse a faucibus lectus.</p>\
                  </div>\
                </div>\
              </div>\
            </div>\
          '
        });
      }
      // Close inline sheet
      if ($('.demo-sheet.modal-in').length > 0) $f7.sheet.close('.demo-sheet');
      // Open it
      sheet.open();
    }

    $on('pageInit', () => {
      sheetPush = $f7.sheet.create({
        el: '.demo-sheet-push',
        push: true,
        backdrop: true,
      });
      sheetSwipeToClose = $f7.sheet.create({
        el: '.demo-sheet-swipe-to-close',
        swipeToClose: true,
        push: true,
        backdrop: true,
      });
      sheetSwipeToStep = $f7.sheet.create({
        el: '.demo-sheet-swipe-to-step',
        swipeToClose: true,
        swipeToStep: true,
        push: true,
        backdrop: true,
      });
      sheetBreakpoints = $f7.sheet.create({
        el: '.demo-sheet-breakpoints',
        swipeToClose: true,
        breakpoints: [0.33, 0.66],
        backdrop: true,
        backdropBreakpoint: 0.66,
        push: true,
        pushBreakpoint: 0.66,
      });
    });
    $on('pageBeforeOut', () => {
      // Close opened sheets on page out
      $f7.sheet.close();
    });
    $on('pageBeforeRemove', () => {


      // Destroy sheet modal when page removed
      if (sheet) sheet.destroy();
      if (sheetPush) sheetPush.destroy();
      if (sheetSwipeToClose) sheetSwipeToClose.destroy();
      if (sheetSwipeToStep) sheetSwipeToStep.destroy();
      if (sheetBreakpoints) sheetBreakpoints.destroy();
    });

    return $render;
  };

</script>