From 527ac4b0b8a12bda7c1064599f2c158f5f2d833a Mon Sep 17 00:00:00 2001 From: abdel Date: Fri, 7 Nov 2025 05:59:19 +0800 Subject: [PATCH 1/4] feat: add portal prop to dialog and drawer components; update popover components for portal handling --- src/lib/components/dialog/dialog-root.svelte | 6 ++- src/lib/components/drawer/drawer-root.svelte | 4 +- src/lib/components/popover/bond.svelte.ts | 2 + .../components/popover/popover-arrow.svelte | 8 +--- .../components/popover/popover-content.svelte | 47 ++++++++----------- .../components/popover/popover-root.svelte | 22 ++------- .../components/popover/popover-trigger.svelte | 13 +---- 7 files changed, 35 insertions(+), 67 deletions(-) diff --git a/src/lib/components/dialog/dialog-root.svelte b/src/lib/components/dialog/dialog-root.svelte index 2756221..c237f5a 100644 --- a/src/lib/components/dialog/dialog-root.svelte +++ b/src/lib/components/dialog/dialog-root.svelte @@ -5,6 +5,7 @@ > = HtmlAtomProps & { open?: boolean; disabled?: boolean; + portal?: string; factory?: (props: DialogBondProps) => DialogBond; children?: Snippet<[{ dialog: DialogBond }]>; }; @@ -24,6 +25,7 @@ open = $bindable(false), disabled = false, as = 'dialog' as E, + portal = undefined, factory = _factory, onmount = undefined, ondestroy = undefined, @@ -95,7 +97,7 @@ {as} {bond} preset="dialog" - portal="root.l1" + portal={portal ?? 'root.l1'} class={[ 'border-border pointer-events-auto fixed top-0 left-0 flex h-full w-full items-center justify-center bg-neutral-900/10 opacity-0', !open && 'pointer-events-none', @@ -116,7 +118,7 @@ {...rootProps} > - + {@render children?.({ dialog: bond })} diff --git a/src/lib/components/drawer/drawer-root.svelte b/src/lib/components/drawer/drawer-root.svelte index a1a8e3f..a1e0058 100644 --- a/src/lib/components/drawer/drawer-root.svelte +++ b/src/lib/components/drawer/drawer-root.svelte @@ -15,6 +15,7 @@ > & { open?: boolean; disabled?: boolean; + portal?: string; onclose?: (event: Event, bond: DrawerBond) => void; factory?: Factory; }; @@ -38,6 +39,7 @@ class: klass = '', as = 'dialog', disabled = false, + portal = undefined, onclose = undefined, onmount = undefined, ondestroy = undefined, @@ -92,7 +94,7 @@ = Record - export type PopoverArrowProps< - E extends keyof HTMLElementTagNameMap = 'div', - B extends Base = Base - > = HtmlAtomProps; - - - - - @@ -15,6 +15,7 @@ import { PortalsBond } from './portals'; import { RootBond } from '$svelte-atoms/core/components/root/bond.svelte'; import { port } from './utils'; + import type { PortalBond } from '.'; type Element = HtmlElementType; @@ -24,9 +25,14 @@ const portalsBond = PortalsBond.get(); const rootBond = RootBond.get(); - const portalBond = $derived( - portalsBond?.state?.get(portal!) ?? rootBond?.state?.getPortal(portal!) - ); + const portalBond = $derived.by(() => { + if (typeof portal === 'string') { + return portalsBond?.state?.get(portal!) ?? rootBond?.state?.getPortal(portal!); + } + + return portal; + }); + const targetElement = $derived(portalBond?.targetElement); function _port(node: HTMLElement) { diff --git a/src/lib/components/root/root.svelte b/src/lib/components/root/root.svelte index e401b60..5cdd0f0 100644 --- a/src/lib/components/root/root.svelte +++ b/src/lib/components/root/root.svelte @@ -114,7 +114,7 @@ {/if} - + {@render children?.()} From ef5032a7b4b6a1d84e87c6e5da435e9449898679 Mon Sep 17 00:00:00 2001 From: abdel Date: Fri, 7 Nov 2025 06:13:26 +0800 Subject: [PATCH 4/4] fix: update children prop type in SlideoverRootProps and adjust ActivePortal usage --- src/lib/components/drawer/drawer-root.svelte | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lib/components/drawer/drawer-root.svelte b/src/lib/components/drawer/drawer-root.svelte index 2930c09..ad2dbfb 100644 --- a/src/lib/components/drawer/drawer-root.svelte +++ b/src/lib/components/drawer/drawer-root.svelte @@ -7,7 +7,7 @@ > = Override< HtmlAtomProps, { - children?: Snippet<[{ slideover: DrawerBond }]>; + children?: Snippet<[{ drawer: DrawerBond }]>; initial?: (node: HTMLElement, bond: DrawerBond) => void; enter?: (node: HTMLElement, bond: DrawerBond) => TransitionFunction<'dialog'>; exit?: (node: HTMLElement, bond: DrawerBond) => TransitionFunction<'dialog'>; @@ -30,7 +30,7 @@ import Teleport from '$svelte-atoms/core/components/portal/teleport.svelte'; import type { HtmlAtomProps, Base } from '$svelte-atoms/core/components/atom'; import { DrawerBond, DrawerBondState, type DrawerBondProps } from './bond.svelte'; - import type { PortalBond } from '../portal'; + import { ActivePortal, type PortalBond } from '../portal'; type Element = HTMLElementTagNameMap[E]; @@ -112,5 +112,7 @@ animate={animate?.bind(bond.state)} {...rootProps} > - {@render children?.({ drawer: bond })} + + {@render children?.({ drawer: bond })} +