Sha256: a6db63214fd28c80371ff8294715f7c1120112e58174ca4635e4d7aed8c06e1c

Contents?: true

Size: 1.89 KB

Versions: 10

Compression:

Stored size: 1.89 KB

Contents

<script setup lang="ts">
import { computed, onMounted, onUnmounted, ref } from 'vue'

const props = withDefaults(
  defineProps<{
    align?: 'left' | 'right'
    width?: '48'
    contentClasses?: string
  }>(),
  {
    align: 'right',
    width: '48',
    contentClasses: 'py-1 bg-white dark:bg-gray-700',
  },
)

const closeOnEscape = (e: KeyboardEvent) => {
  if (open.value && e.key === 'Escape') {
    open.value = false
  }
}

onMounted(() => document.addEventListener('keydown', closeOnEscape))
onUnmounted(() => document.removeEventListener('keydown', closeOnEscape))

const widthClass = computed(() => {
  return {
    48: 'w-48',
  }[props.width.toString()]
})

const alignmentClasses = computed(() => {
  if (props.align === 'left') {
    return 'ltr:origin-top-left rtl:origin-top-right start-0'
  } else if (props.align === 'right') {
    return 'ltr:origin-top-right rtl:origin-top-left end-0'
  } else {
    return 'origin-top'
  }
})

const open = ref(false)
</script>

<template>
  <div class="relative">
    <div @click="open = !open">
      <slot name="trigger" />
    </div>

    <!-- Full Screen Dropdown Overlay -->
    <div v-show="open" class="fixed inset-0 z-40" @click="open = false"></div>

    <Transition
      enter-active-class="transition ease-out duration-200"
      enter-from-class="opacity-0 scale-95"
      enter-to-class="opacity-100 scale-100"
      leave-active-class="transition ease-in duration-75"
      leave-from-class="opacity-100 scale-100"
      leave-to-class="opacity-0 scale-95"
    >
      <div
        v-show="open"
        class="absolute z-50 mt-2 rounded-md shadow-lg"
        :class="[widthClass, alignmentClasses]"
        style="display: none"
        @click="open = false"
      >
        <div class="rounded-md ring-1 ring-black ring-opacity-5" :class="contentClasses">
          <slot name="content" />
        </div>
      </div>
    </Transition>
  </div>
</template>

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
kaze-0.18.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.17.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.16.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.15.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.14.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.13.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.12.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.11.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.10.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue
kaze-0.9.0 stubs/inertia-vue-ts/app/javascript/Components/Dropdown.vue