2.4.0 • Published 12 months ago

@douxcode/vue-spring-bottom-sheet v2.4.0

Weekly downloads
-
License
MIT
Repository
github
Last release
12 months ago

Vue Spring Bottom Sheet

vue-spring-bottom-sheet is built on top of motion-v.

šŸ˜Ž Modern and šŸš€ Performant Bottom Sheet for Vue.js

Demo šŸ‘€

npm.ionpm.ionpm.ionpm.io

Installation

npm install @douxcode/vue-spring-bottom-sheet
bun install @douxcode/vue-spring-bottom-sheet

Getting started

Basic usage

<script setup>
import BottomSheet from '@douxcode/vue-spring-bottom-sheet'
import '@douxcode/vue-spring-bottom-sheet/dist/style.css'
import { ref } from 'vue'

const bottomSheet = ref(null)

const open = () => {
  bottomSheet.value.open()
}

const close = () => {
  bottomSheet.value.close()
}
</script>

<template>
  <BottomSheet ref="bottomSheet"> Your awesome content </BottomSheet>
</template>

Basic usage setup + TS

<script setup lang="ts">
import BottomSheet from '@douxcode/vue-spring-bottom-sheet'
import '@douxcode/vue-spring-bottom-sheet/dist/style.css'
import { ref } from 'vue'

const bottomSheet = ref<InstanceType<typeof BottomSheet>>()

/* For vue 3.5+ you can use useTemplateRef() */
const bottomSheet = useTemplateRef('bottomSheet')

const open = () => {
  bottomSheet.value.open()
}

const close = () => {
  bottomSheet.value.close()
}
</script>

<template>
  <BottomSheet ref="bottomSheet"> Your content </BottomSheet>
</template>

Usage with v-model

<script setup lang="ts">
import { ref } from 'vue'

import BottomSheet from '@douxcode/vue-spring-bottom-sheet'
import '@douxcode/vue-spring-bottom-sheet/dist/style.css'

const sheet = ref(false)
</script>

<template>
  <button type="button" @click="sheet = true">Open bottom sheet</button>
  <BottomSheet v-model="sheet"> Your content </BottomSheet>
</template>

Usage in Nuxt 3

For Nuxt 3, just wrap component in <ClientOnly>

<template>
  <ClientOnly>
    <BottomSheet ref="bottomSheet"> Your awesome content </BottomSheet>
  </ClientOnly>
</template>

Slots

<template>
  <BottomSheet ref="bottomSheet">
    <template #header> Header </template>
    <div>Your content</div>
    <template #footer> Footer </template>
  </BottomSheet>
</template>

CSS Custom Properties

--vsbs-backdrop-bg: rgba(0, 0, 0, 0.5);
--vsbs-shadow-color: rgba(89, 89, 89, 0.2);
--vsbs-background: #fff;
--vsbs-border-radius: 16px;
--vsbs-outer-border-color: transparent;
--vsbs-max-width: 640px;
--vsbs-border-color: rgba(46, 59, 66, 0.125);
--vsbs-padding-x: 16px;
--vsbs-handle-background: rgba(0, 0, 0, 0.28);

Props

Prop Definitions

PropTypeDefaultDescription
durationNumber250Animation duration in milliseconds
snapPointsArray<number|string>instinctHeightCustom snapping positions
initialSnapPointNumberminHeightInitial snap point index
blockingBooleantrueBlock interactions with underlying content
canSwipeCloseBooleantrueEnable swipe-to-close gesture
canBackdropCloseBooleantrueAllow closing by tapping backdrop
expandOnContentDragBooleantrueEnable expanding by dragging content
teleprtToString | RendererElementbodyTeleport to a specific element
teleportDeferBooleanfalseDefer teleporting until opened (Vue 3.5+ only)
headerClassString''Set header element class
contentClassString''Set content element class
footerClassString''Set footer element class

Exposed methods

Assuming there is const bottomSheet = ref()

MethodDescriptionExample
openOpens the bottom sheetbottomSheet.value.open()
closeCloses the bottom sheetbottomSheet.value.close()
snapToPointSnaps to an index of snapPointsbottomSheet.value.snapToPoint(1)

Events

EventDescriptionPayload
openedEmitted when sheet finishes opening-
opening-startedEmitted when sheet starts opening-
closedEmitted when sheet finishes closing-
closing-startedEmitted when sheet starts closing-
dragging-upEmitted when user drags sheet upward-
dragging-downEmitted when user drags sheet downward-
instinctHeightEmitted when content height changesheight (number)
snappedEmitted when sheet finishes snappingsnapPointIndex (number)

Acknowledgments

This project was inspired by the following:

2.4.0

12 months ago

2.3.0

1 year ago

2.2.2

1 year ago

2.2.1

1 year ago

2.2.0

1 year ago

2.1.2

1 year ago

2.1.1

1 year ago

2.1.0

1 year ago

2.0.4

1 year ago

2.0.3

1 year ago

2.0.2

1 year ago

2.0.1

1 year ago

2.0.0

1 year ago

1.2.7

1 year ago

1.2.6

1 year ago

1.2.5

1 year ago

1.2.4

1 year ago

1.2.3

1 year ago

1.2.2

1 year ago

1.2.1

1 year ago

1.2.0

1 year ago

1.1.4

1 year ago

1.1.3

1 year ago

1.1.2

1 year ago

1.1.1

1 year ago

1.1.0

1 year ago

1.0.8

1 year ago

1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago