2.4.0 • Published 6 months ago

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

Weekly downloads
-
License
MIT
Repository
github
Last release
6 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

6 months ago

2.3.0

7 months ago

2.2.2

7 months ago

2.2.1

7 months ago

2.2.0

7 months ago

2.1.2

8 months ago

2.1.1

8 months ago

2.1.0

8 months ago

2.0.4

8 months ago

2.0.3

8 months ago

2.0.2

9 months ago

2.0.1

9 months ago

2.0.0

9 months ago

1.2.7

9 months ago

1.2.6

10 months ago

1.2.5

10 months ago

1.2.4

11 months ago

1.2.3

11 months ago

1.2.2

11 months ago

1.2.1

11 months ago

1.2.0

11 months ago

1.1.4

11 months ago

1.1.3

11 months ago

1.1.2

11 months ago

1.1.1

11 months ago

1.1.0

12 months ago

1.0.8

12 months ago

1.0.7

12 months ago

1.0.6

12 months ago

1.0.5

12 months ago

1.0.4

12 months ago

1.0.3

12 months ago

1.0.2

12 months ago

1.0.1

12 months ago

1.0.0

12 months ago