chore(docs): add ContextMenu component page (#128)

This commit is contained in:
Sylvain Marroufin
2023-02-22 12:31:08 +01:00
committed by GitHub
parent 7970aefcb0
commit 63e27f8b4b
4 changed files with 60 additions and 6 deletions

View File

@@ -84,7 +84,7 @@ const sections = [
{ label: 'Forms', links: [{ label: 'Checkbox', to: '/components/Checkbox' }, { label: 'Input', to: '/components/Input' }, { label: 'FormGroup', to: '/components/FormGroup' }, { label: 'Radio', to: '/components/Radio' }, { label: 'Select', to: '/components/Select' }, { label: 'SelectCustom', to: '/components/SelectCustom' }, { label: 'Textarea', to: '/components/Textarea' }, { label: 'Toggle', to: '/components/Toggle' }] }, { label: 'Forms', links: [{ label: 'Checkbox', to: '/components/Checkbox' }, { label: 'Input', to: '/components/Input' }, { label: 'FormGroup', to: '/components/FormGroup' }, { label: 'Radio', to: '/components/Radio' }, { label: 'Select', to: '/components/Select' }, { label: 'SelectCustom', to: '/components/SelectCustom' }, { label: 'Textarea', to: '/components/Textarea' }, { label: 'Toggle', to: '/components/Toggle' }] },
{ label: 'Layout', links: [{ label: 'Card', to: '/components/Card' }, { label: 'Container', to: '/components/Container' }] }, { label: 'Layout', links: [{ label: 'Card', to: '/components/Card' }, { label: 'Container', to: '/components/Container' }] },
{ label: 'Navigation', links: [{ label: 'Pills', to: '/components/Pills' }, { label: 'Tabs', to: '/components/Tabs' }, { label: 'VerticalNavigation', to: '/components/VerticalNavigation' }, { label: 'CommandPalette', to: '/components/CommandPalette' }] }, { label: 'Navigation', links: [{ label: 'Pills', to: '/components/Pills' }, { label: 'Tabs', to: '/components/Tabs' }, { label: 'VerticalNavigation', to: '/components/VerticalNavigation' }, { label: 'CommandPalette', to: '/components/CommandPalette' }] },
{ label: 'Overlays', links: [{ label: 'Modal', to: '/components/Modal' }, { label: 'Notification', to: '/components/Notification' }, { label: 'Popover', to: '/components/Popover' }, { label: 'Slideover', to: '/components/Slideover' }, { label: 'Tooltip', to: '/components/Tooltip' }] } { label: 'Overlays', links: [{ label: 'ContextMenu', to: '/components/ContextMenu' }, { label: 'Modal', to: '/components/Modal' }, { label: 'Notification', to: '/components/Notification' }, { label: 'Popover', to: '/components/Popover' }, { label: 'Slideover', to: '/components/Slideover' }, { label: 'Tooltip', to: '/components/Tooltip' }] }
] ]
</script> </script>

View File

@@ -3,6 +3,13 @@ import nuxtUI from '../src/module'
// https://v3.nuxtjs.org/docs/directory-structure/nuxt.config // https://v3.nuxtjs.org/docs/directory-structure/nuxt.config
export default defineNuxtConfig({ export default defineNuxtConfig({
app: {
head: {
htmlAttrs: {
lang: 'en'
}
}
},
modules: [ modules: [
// @ts-ignore // @ts-ignore
nuxtUI nuxtUI

View File

@@ -56,7 +56,6 @@
v-if="prop.type === 'Boolean'" v-if="prop.type === 'Boolean'"
v-model="prop.value" v-model="prop.value"
:name="prop.key" :name="prop.key"
:label="prop.key"
/> />
<USelect <USelect
v-else-if="prop.values" v-else-if="prop.values"
@@ -121,6 +120,31 @@ const toggle = ref(false)
const modal = ref(false) const modal = ref(false)
const slideover = ref(false) const slideover = ref(false)
const x = ref(0)
const y = ref(0)
const isContextMenuOpen = ref(false)
const virtualElement = ref({ getBoundingClientRect: () => ({}) })
onMounted(() => {
document.addEventListener('mousemove', ({ clientX, clientY }) => {
x.value = clientX
y.value = clientY
})
})
function openContextMenu () {
const top = unref(y)
const left = unref(x)
virtualElement.value.getBoundingClientRect = () => ({
width: 0,
height: 0,
top,
left
})
isContextMenuOpen.value = true
}
const defaultProps = { const defaultProps = {
Button: { Button: {
label: 'Button text' label: 'Button text'
@@ -261,6 +285,31 @@ const defaultProps = {
title: 'Notification title', title: 'Notification title',
callback: 'console.log(\'Timer expired\')' callback: 'console.log(\'Timer expired\')'
}, },
ContextMenu: {
modelValue: isContextMenuOpen,
'onUpdate:modelValue': (v) => { isContextMenuOpen.value = v },
virtualElement,
component: {
name: 'Card',
props: {
variant: 'secondary',
label: 'Open context menu',
onClick: () => { isContextMenuOpen.value = false },
onContextmenu: (e) => {
e?.preventDefault()
openContextMenu()
},
class: 'relative w-[300px] h-[100px]'
}
},
slots: {
default: {
tag: 'div',
html: 'Context menu content',
class: 'rounded border u-border-gray-200 p-2'
}
}
},
Modal: { Modal: {
modelValue: modal, modelValue: modal,
'onUpdate:modelValue': (v) => { modal.value = v }, 'onUpdate:modelValue': (v) => { modal.value = v },

View File

@@ -133,7 +133,7 @@
Context menu: Context menu:
</div> </div>
<UCard ref="contextMenuRef" class="relative" body-class="h-64" @click="isContextMenuOpen = false" @contextmenu.prevent="openContextMenu"> <UCard class="relative" body-class="h-64" @click="isContextMenuOpen = false" @contextmenu.prevent="openContextMenu">
<UContextMenu v-model="isContextMenuOpen" :virtual-element="virtualElement" width-class="w-48"> <UContextMenu v-model="isContextMenuOpen" :virtual-element="virtualElement" width-class="w-48">
<UCard @click.stop> <UCard @click.stop>
Menu Menu
@@ -256,7 +256,7 @@ const { $toast } = useNuxtApp()
const x = ref(0) const x = ref(0)
const y = ref(0) const y = ref(0)
const isContextMenuOpen = ref(false) const isContextMenuOpen = ref(false)
const contextMenuRef = ref(null) const virtualElement = ref({ getBoundingClientRect: () => ({}) })
const commandPaletteGroups = computed(() => ([{ const commandPaletteGroups = computed(() => ([{
key: 'people', key: 'people',
@@ -277,8 +277,6 @@ onMounted(() => {
}) })
}) })
const virtualElement = ref({ getBoundingClientRect: () => ({}) })
function openContextMenu () { function openContextMenu () {
const top = unref(y) const top = unref(y)
const left = unref(x) const left = unref(x)