more perf impr
This commit is contained in:
@@ -22,6 +22,26 @@
|
||||
children: Snippet;
|
||||
showCloseButton?: boolean;
|
||||
} = $props();
|
||||
|
||||
// Keep the (fixed, layout-viewport-centered) dialog centered within the
|
||||
// VISUAL viewport, so the mobile keyboard shifts it up instead of covering it.
|
||||
let kbShift = $state(0);
|
||||
$effect(() => {
|
||||
const vv = window.visualViewport;
|
||||
if (!vv) return;
|
||||
const update = () => {
|
||||
const visualCenter = vv.offsetTop + vv.height / 2;
|
||||
// negative when the keyboard eats the bottom → moves the dialog up
|
||||
kbShift = Math.min(0, visualCenter - window.innerHeight / 2);
|
||||
};
|
||||
update();
|
||||
vv.addEventListener('resize', update);
|
||||
vv.addEventListener('scroll', update);
|
||||
return () => {
|
||||
vv.removeEventListener('resize', update);
|
||||
vv.removeEventListener('scroll', update);
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<DialogPortal {...portalProps}>
|
||||
@@ -33,6 +53,7 @@
|
||||
'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',
|
||||
className
|
||||
)}
|
||||
style="margin-top:{kbShift}px;transition:margin-top 0.18s ease"
|
||||
{...restProps}
|
||||
>
|
||||
{@render children?.()}
|
||||
|
||||
Reference in New Issue
Block a user