mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-18 22:33:50 +02:00
fix resizeable
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
<span>{{ t('nav_menu.icon_picker.pick_icon') }}</span>
|
||||
</el-button>
|
||||
</PopoverTrigger>
|
||||
<PopoverContent side="bottom" align="start" class="w-[620px]">
|
||||
<PopoverContent side="bottom" align="start" class="w-155">
|
||||
<div class="icon-picker">
|
||||
<el-input
|
||||
v-model="search"
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
:class="{ 'x-user-badge-hidden': badge.hidden }"
|
||||
loading="lazy" />
|
||||
</PopoverTrigger>
|
||||
<PopoverContent side="bottom" class="w-[300px]">
|
||||
<PopoverContent side="bottom" class="w-75">
|
||||
<img
|
||||
:src="badge.badgeImageUrl"
|
||||
:class="['x-link', 'x-popover-image']"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
v-bind="forwarded"
|
||||
:class="
|
||||
cn(
|
||||
'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
|
||||
'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
|
||||
props.class
|
||||
)
|
||||
">
|
||||
|
||||
@@ -1,37 +1,36 @@
|
||||
<script setup>
|
||||
import { reactiveOmit } from "@vueuse/core";
|
||||
import { ChevronDown } from "lucide-vue-next";
|
||||
import { SelectIcon, SelectTrigger, useForwardProps } from "reka-ui";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { SelectIcon, SelectTrigger, useForwardProps } from 'reka-ui';
|
||||
import { ChevronDown } from 'lucide-vue-next';
|
||||
import { cn } from '@/lib/utils';
|
||||
import { reactiveOmit } from '@vueuse/core';
|
||||
|
||||
const props = defineProps({
|
||||
disabled: { type: Boolean, required: false },
|
||||
reference: { type: null, required: false },
|
||||
asChild: { type: Boolean, required: false },
|
||||
as: { type: null, required: false },
|
||||
class: { type: null, required: false },
|
||||
size: { type: String, required: false, default: "default" },
|
||||
});
|
||||
const props = defineProps({
|
||||
disabled: { type: Boolean, required: false },
|
||||
reference: { type: null, required: false },
|
||||
asChild: { type: Boolean, required: false },
|
||||
as: { type: null, required: false },
|
||||
class: { type: null, required: false },
|
||||
size: { type: String, required: false, default: 'default' }
|
||||
});
|
||||
|
||||
const delegatedProps = reactiveOmit(props, "class", "size");
|
||||
const forwardedProps = useForwardProps(delegatedProps);
|
||||
const delegatedProps = reactiveOmit(props, 'class', 'size');
|
||||
const forwardedProps = useForwardProps(delegatedProps);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<SelectTrigger
|
||||
data-slot="select-trigger"
|
||||
:data-size="size"
|
||||
v-bind="forwardedProps"
|
||||
:class="
|
||||
cn(
|
||||
'border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*=\'text-\'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
|
||||
props.class,
|
||||
)
|
||||
"
|
||||
>
|
||||
<slot />
|
||||
<SelectIcon as-child>
|
||||
<ChevronDown class="size-4 opacity-50" />
|
||||
</SelectIcon>
|
||||
</SelectTrigger>
|
||||
<SelectTrigger
|
||||
data-slot="select-trigger"
|
||||
:data-size="size"
|
||||
v-bind="forwardedProps"
|
||||
:class="
|
||||
cn(
|
||||
'border-input data-placeholder:text-muted-foreground [&_svg:not([class*=\'text-\'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
|
||||
props.class
|
||||
)
|
||||
">
|
||||
<slot />
|
||||
<SelectIcon as-child>
|
||||
<ChevronDown class="size-4 opacity-50" />
|
||||
</SelectIcon>
|
||||
</SelectTrigger>
|
||||
</template>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
data-slot="slider"
|
||||
:class="
|
||||
cn(
|
||||
'relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',
|
||||
'relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',
|
||||
props.class
|
||||
)
|
||||
"
|
||||
|
||||
@@ -22,10 +22,10 @@ export function useAuthenticatedLayoutResizable() {
|
||||
|
||||
const panelGroupRef = ref(null);
|
||||
const navPanelRef = ref(null);
|
||||
const asidePanelRef = ref(null);
|
||||
const navExpandedSize = ref(null);
|
||||
const groupWidth = ref(fallbackWidth);
|
||||
let resizeObserver = null;
|
||||
let windowResizeHandler = null;
|
||||
|
||||
const getGroupWidth = () => {
|
||||
const element = panelGroupRef.value?.$el ?? panelGroupRef.value;
|
||||
@@ -111,11 +111,29 @@ export function useAuthenticatedLayoutResizable() {
|
||||
const resizeNavPanel = (targetSize) =>
|
||||
navPanelRef.value?.resize?.(targetSize);
|
||||
|
||||
const resizeAsidePanel = (targetSize) =>
|
||||
asidePanelRef.value?.resize?.(targetSize);
|
||||
|
||||
const updateGroupWidth = () => {
|
||||
groupWidth.value = getGroupWidth();
|
||||
const width = getGroupWidth();
|
||||
groupWidth.value = width;
|
||||
|
||||
if (isNavCollapsed.value) {
|
||||
resizeNavPanel(navCollapsedSize.value);
|
||||
} else {
|
||||
const targetSize = pxToPercent(navExpandedPx.value, width);
|
||||
navExpandedSize.value = targetSize;
|
||||
resizeNavPanel(targetSize);
|
||||
}
|
||||
|
||||
if (!isSideBarTabShow.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
const storedAsidePx = asideWidth.value;
|
||||
const asideTargetSize =
|
||||
storedAsidePx > 0 ? pxToPercent(storedAsidePx, width, 0) : 0;
|
||||
resizeAsidePanel(asideTargetSize);
|
||||
};
|
||||
|
||||
watch(isNavCollapsed, async (collapsed) => {
|
||||
@@ -144,9 +162,6 @@ export function useAuthenticatedLayoutResizable() {
|
||||
if (element && typeof ResizeObserver !== 'undefined') {
|
||||
resizeObserver = new ResizeObserver(updateGroupWidth);
|
||||
resizeObserver.observe(element);
|
||||
} else if (typeof window !== 'undefined') {
|
||||
windowResizeHandler = updateGroupWidth;
|
||||
window.addEventListener('resize', windowResizeHandler);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -155,15 +170,12 @@ export function useAuthenticatedLayoutResizable() {
|
||||
resizeObserver.disconnect();
|
||||
resizeObserver = null;
|
||||
}
|
||||
if (windowResizeHandler && typeof window !== 'undefined') {
|
||||
window.removeEventListener('resize', windowResizeHandler);
|
||||
windowResizeHandler = null;
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
panelGroupRef,
|
||||
navPanelRef,
|
||||
asidePanelRef,
|
||||
navDefaultSize,
|
||||
navMinSize,
|
||||
navMaxSize,
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
'z-20 [&>div]:-translate-x-1/2'
|
||||
]"></ResizableHandle>
|
||||
<ResizablePanel
|
||||
ref="asidePanelRef"
|
||||
:default-size="asideDefaultSize"
|
||||
:max-size="asideMaxSize"
|
||||
:collapsed-size="0"
|
||||
@@ -110,6 +111,7 @@
|
||||
const {
|
||||
panelGroupRef,
|
||||
navPanelRef,
|
||||
asidePanelRef,
|
||||
navDefaultSize,
|
||||
navMinSize,
|
||||
navMaxSize,
|
||||
|
||||
Reference in New Issue
Block a user