Merge pull request #3723 from xyflow/viewport-portal
Added seperate portal to put dom elements inside the flow
This commit is contained in:
@@ -0,0 +1,19 @@
|
|||||||
|
import type { ReactNode } from 'react';
|
||||||
|
import { createPortal } from 'react-dom';
|
||||||
|
|
||||||
|
import { useStore } from '../../hooks/useStore';
|
||||||
|
import type { ReactFlowState } from '../../types';
|
||||||
|
|
||||||
|
const selector = (s: ReactFlowState) => s.domNode?.querySelector('.react-flow__viewport-portal');
|
||||||
|
|
||||||
|
function ViewportPortal({ children }: { children: ReactNode }) {
|
||||||
|
const viewPortalDiv = useStore(selector);
|
||||||
|
|
||||||
|
if (!viewPortalDiv) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return createPortal(children, viewPortalDiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ViewportPortal;
|
||||||
@@ -174,7 +174,7 @@ const GraphView = ({
|
|||||||
/>
|
/>
|
||||||
</EdgeRenderer>
|
</EdgeRenderer>
|
||||||
<div className="react-flow__edgelabel-renderer" />
|
<div className="react-flow__edgelabel-renderer" />
|
||||||
|
<div className="react-flow__viewport-portal" />
|
||||||
<NodeRenderer
|
<NodeRenderer
|
||||||
nodeTypes={nodeTypes}
|
nodeTypes={nodeTypes}
|
||||||
onNodeClick={onNodeClick}
|
onNodeClick={onNodeClick}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ export { default as BaseEdge } from './components/Edges/BaseEdge';
|
|||||||
export { default as ReactFlowProvider } from './components/ReactFlowProvider';
|
export { default as ReactFlowProvider } from './components/ReactFlowProvider';
|
||||||
export { default as Panel, type PanelProps } from './components/Panel';
|
export { default as Panel, type PanelProps } from './components/Panel';
|
||||||
export { default as EdgeLabelRenderer } from './components/EdgeLabelRenderer';
|
export { default as EdgeLabelRenderer } from './components/EdgeLabelRenderer';
|
||||||
|
export { default as ViewportPortal } from './components/ViewportPortal';
|
||||||
|
|
||||||
export { default as useReactFlow } from './hooks/useReactFlow';
|
export { default as useReactFlow } from './hooks/useReactFlow';
|
||||||
export { default as useUpdateNodeInternals } from './hooks/useUpdateNodeInternals';
|
export { default as useUpdateNodeInternals } from './hooks/useUpdateNodeInternals';
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import portal from '$lib/actions/portal';
|
||||||
|
import { useStore } from '$lib/store';
|
||||||
|
|
||||||
|
type $$Props = {};
|
||||||
|
|
||||||
|
const { domNode } = useStore();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div use:portal={{ target: '.svelte-flow__viewport-portal', domNode: $domNode }}>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export { default as ViewportPortal } from './ViewportPortal.svelte';
|
||||||
@@ -218,6 +218,7 @@
|
|||||||
<slot name="connectionLine" slot="connectionLine" />
|
<slot name="connectionLine" slot="connectionLine" />
|
||||||
</ConnectionLine>
|
</ConnectionLine>
|
||||||
<div class="svelte-flow__edgelabel-renderer" />
|
<div class="svelte-flow__edgelabel-renderer" />
|
||||||
|
<div class="svelte-flow__viewport-portal" />
|
||||||
<NodeRenderer
|
<NodeRenderer
|
||||||
on:nodeclick
|
on:nodeclick
|
||||||
on:nodemouseenter
|
on:nodemouseenter
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export * from '$lib/container/SvelteFlow/types';
|
|||||||
export * from '$lib/container/Panel';
|
export * from '$lib/container/Panel';
|
||||||
export * from '$lib/components/SvelteFlowProvider';
|
export * from '$lib/components/SvelteFlowProvider';
|
||||||
export * from '$lib/components/EdgeLabelRenderer';
|
export * from '$lib/components/EdgeLabelRenderer';
|
||||||
|
export * from '$lib/components/ViewportPortal';
|
||||||
export * from '$lib/components/BaseEdge';
|
export * from '$lib/components/BaseEdge';
|
||||||
export { BezierEdge, StepEdge, SmoothStepEdge, StraightEdge } from '$lib/components/edges';
|
export { BezierEdge, StepEdge, SmoothStepEdge, StraightEdge } from '$lib/components/edges';
|
||||||
export * from '$lib/components/Handle';
|
export * from '$lib/components/Handle';
|
||||||
|
|||||||
@@ -291,6 +291,14 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.xy-flow__viewport-portal {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.xy-flow__minimap {
|
.xy-flow__minimap {
|
||||||
background: var(--xy-minimap-background-color, var(--xy-minimap-background-color-default));
|
background: var(--xy-minimap-background-color, var(--xy-minimap-background-color-default));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user