diff --git a/packages/builder/src/App.svelte b/packages/builder/src/App.svelte
index 16156d7af7..0badb1012b 100644
--- a/packages/builder/src/App.svelte
+++ b/packages/builder/src/App.svelte
@@ -1,10 +1,10 @@
+
+{#if visible}
+
+{/if}
+
+
diff --git a/packages/builder/src/components/common/Modal/ModalContainer.svelte b/packages/builder/src/components/common/Modal/ModalContainer.svelte
new file mode 100644
index 0000000000..891df8630b
--- /dev/null
+++ b/packages/builder/src/components/common/Modal/ModalContainer.svelte
@@ -0,0 +1,9 @@
+
+
+
diff --git a/packages/builder/src/components/common/Modal/index.js b/packages/builder/src/components/common/Modal/index.js
new file mode 100644
index 0000000000..bd53a1373b
--- /dev/null
+++ b/packages/builder/src/components/common/Modal/index.js
@@ -0,0 +1,2 @@
+export { default as Modal } from "./Modal.svelte"
+export { default as ModalContainer } from "./ModalContainer.svelte"
diff --git a/packages/builder/src/components/common/Modal/portal.js b/packages/builder/src/components/common/Modal/portal.js
new file mode 100644
index 0000000000..a5070cad7d
--- /dev/null
+++ b/packages/builder/src/components/common/Modal/portal.js
@@ -0,0 +1,14 @@
+export function portal(node, targetNodeOrSelector) {
+ const targetNode =
+ typeof targetNodeOrSelector == "string"
+ ? document.querySelector(targetNodeOrSelector)
+ : targetNodeOrSelector
+ const portalChildren = [...node.children]
+ targetNode.append(...portalChildren)
+
+ return {
+ destroy() {
+ for (const portalChild of portalChildren) portalChild.remove()
+ },
+ }
+}