94 lines
7.0 KiB
HTML
94 lines
7.0 KiB
HTML
<div x-data="{
|
|
contextMenuOpen: false,
|
|
contextMenuToggle: function(event) {
|
|
this.contextMenuOpen = true;
|
|
event.preventDefault();
|
|
this.$refs.contextmenu.classList.add('opacity-0');
|
|
let that = this;
|
|
$nextTick(function(){
|
|
that.calculateContextMenuPosition(event);
|
|
that.calculateSubMenuPosition(event);
|
|
that.$refs.contextmenu.classList.remove('opacity-0');
|
|
});
|
|
},
|
|
calculateContextMenuPosition (clickEvent) {
|
|
if(window.innerHeight < clickEvent.clientY + this.$refs.contextmenu.offsetHeight){
|
|
this.$refs.contextmenu.style.top = (window.innerHeight - this.$refs.contextmenu.offsetHeight) + 'px';
|
|
} else {
|
|
this.$refs.contextmenu.style.top = clickEvent.clientY + 'px';
|
|
}
|
|
if(window.innerWidth < clickEvent.clientX + this.$refs.contextmenu.offsetWidth){
|
|
this.$refs.contextmenu.style.left = (clickEvent.clientX - this.$refs.contextmenu.offsetWidth) + 'px';
|
|
} else {
|
|
this.$refs.contextmenu.style.left = clickEvent.clientX + 'px';
|
|
}
|
|
},
|
|
calculateSubMenuPosition (clickEvent) {
|
|
let submenus = document.querySelectorAll('[data-submenu]');
|
|
let contextMenuWidth = this.$refs.contextmenu.offsetWidth;
|
|
for(let i = 0; i < submenus.length; i++){
|
|
if(window.innerWidth < (clickEvent.clientX + contextMenuWidth + submenus[i].offsetWidth)){
|
|
submenus[i].classList.add('left-0', '-translate-x-full');
|
|
submenus[i].classList.remove('right-0', 'translate-x-full');
|
|
} else {
|
|
submenus[i].classList.remove('left-0', '-translate-x-full');
|
|
submenus[i].classList.add('right-0', 'translate-x-full');
|
|
}
|
|
if(window.innerHeight < (submenus[i].previousElementSibling.getBoundingClientRect().top + submenus[i].offsetHeight)){
|
|
let heightDifference = (window.innerHeight - submenus[i].previousElementSibling.getBoundingClientRect().top) - submenus[i].offsetHeight;
|
|
submenus[i].style.top = heightDifference + 'px';
|
|
} else {
|
|
submenus[i].style.top = '';
|
|
}
|
|
}
|
|
}
|
|
}"
|
|
x-init="
|
|
$watch('contextMenuOpen', function(value){
|
|
if(value === true){ document.body.classList.add('overflow-hidden') }
|
|
else { document.body.classList.remove('overflow-hidden') }
|
|
});
|
|
window.addEventListener('resize', function(event) { contextMenuOpen = false; });
|
|
"
|
|
@contextmenu="contextMenuToggle(event)" class="relative z-50 flex h-[150px] w-[300px] text-sm items-center justify-center rounded-md border border-neutral-300 border-dashed text-neutral-800"">
|
|
|
|
<span class="cursor-default text-neutral-400">Right click here</span>
|
|
|
|
<template x-teleport="body">
|
|
<div x-show="contextMenuOpen" @click.away="contextMenuOpen=false" x-ref="contextmenu" class="z-50 min-w-[8rem] text-neutral-800 rounded-md border border-neutral-200/70 bg-white text-sm fixed p-1 shadow-md w-64" x-cloak>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none group items-center rounded px-2 py-1.5 hover:bg-neutral-100 outline-none pl-8 data-[disabled]:opacity-50 data-[disabled]:pointer-events-none">
|
|
<span>New Folder</span>
|
|
<span class="ml-auto text-xs tracking-widest text-neutral-400 group-hover:text-neutral-600">⌘N</span>
|
|
</div>
|
|
<div class="h-px my-1 -mx-1 bg-neutral-200"></div>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none group items-center rounded px-2 py-1.5 hover:bg-neutral-100 outline-none pl-8 data-[disabled]:opacity-50 data-[disabled]:pointer-events-none">
|
|
<span>Get Info</span>
|
|
<span class="ml-auto text-xs tracking-widest text-neutral-400 group-hover:text-neutral-600">⌘I</span>
|
|
</div>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none group items-center rounded px-2 py-1.5 hover:bg-neutral-100 outline-none pl-8 data-[disabled]:opacity-50 data-[disabled]:pointer-events-none">
|
|
<span>Change Background...</span>
|
|
</div>
|
|
<div class="h-px my-1 -mx-1 bg-neutral-200"></div>
|
|
<div class="relative group">
|
|
<div class="flex cursor-default select-none items-center rounded px-2 hover:bg-neutral-100 py-1.5 outline-none pl-8">
|
|
<span>Sort By</span>
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-4 h-4 ml-auto"><polyline points="9 18 15 12 9 6"></polyline></svg>
|
|
</div>
|
|
<div data-submenu class="absolute top-0 right-0 invisible mr-1 duration-200 ease-out translate-x-full opacity-0 group-hover:mr-0 group-hover:visible group-hover:opacity-100">
|
|
<div class="z-50 min-w-[8rem] overflow-hidden rounded-md border bg-white p-1 shadow-md animate-in slide-in-from-left-1 w-48">
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none items-center rounded px-2 py-1.5 hover:bg-neutral-100 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50">Kind</div>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none items-center rounded px-2 py-1.5 hover:bg-neutral-100 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50">Date Last Opened</div>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none items-center rounded px-2 py-1.5 hover:bg-neutral-100 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50">Date Added</div>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none items-center rounded px-2 py-1.5 hover:bg-neutral-100 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50">Date Modified</div>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none items-center rounded px-2 py-1.5 hover:bg-neutral-100 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50">Date Created</div>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none items-center rounded px-2 py-1.5 hover:bg-neutral-100 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50">Tags</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div @click="contextMenuOpen=false" class="relative flex cursor-default select-none group items-center rounded px-2 py-1.5 hover:bg-neutral-100 outline-none pl-8 data-[disabled]:opacity-50 data-[disabled]:pointer-events-none">
|
|
<span>Show View Options</span>
|
|
<span class="ml-auto text-xs tracking-widest text-neutral-400 group-hover:text-neutral-600">⌘R</span>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</div> |