Merge pull request #3723 from xyflow/viewport-portal
Added seperate portal to put dom elements inside the flow
This commit is contained in:
19
packages/react/src/components/ViewportPortal/index.tsx
Normal file
19
packages/react/src/components/ViewportPortal/index.tsx
Normal file
@@ -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>
|
||||
<div className="react-flow__edgelabel-renderer" />
|
||||
|
||||
<div className="react-flow__viewport-portal" />
|
||||
<NodeRenderer
|
||||
nodeTypes={nodeTypes}
|
||||
onNodeClick={onNodeClick}
|
||||
|
||||
@@ -10,6 +10,7 @@ export { default as BaseEdge } from './components/Edges/BaseEdge';
|
||||
export { default as ReactFlowProvider } from './components/ReactFlowProvider';
|
||||
export { default as Panel, type PanelProps } from './components/Panel';
|
||||
export { default as EdgeLabelRenderer } from './components/EdgeLabelRenderer';
|
||||
export { default as ViewportPortal } from './components/ViewportPortal';
|
||||
|
||||
export { default as useReactFlow } from './hooks/useReactFlow';
|
||||
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" />
|
||||
</ConnectionLine>
|
||||
<div class="svelte-flow__edgelabel-renderer" />
|
||||
<div class="svelte-flow__viewport-portal" />
|
||||
<NodeRenderer
|
||||
on:nodeclick
|
||||
on:nodemouseenter
|
||||
|
||||
@@ -6,6 +6,7 @@ export * from '$lib/container/SvelteFlow/types';
|
||||
export * from '$lib/container/Panel';
|
||||
export * from '$lib/components/SvelteFlowProvider';
|
||||
export * from '$lib/components/EdgeLabelRenderer';
|
||||
export * from '$lib/components/ViewportPortal';
|
||||
export * from '$lib/components/BaseEdge';
|
||||
export { BezierEdge, StepEdge, SmoothStepEdge, StraightEdge } from '$lib/components/edges';
|
||||
export * from '$lib/components/Handle';
|
||||
|
||||
@@ -291,6 +291,14 @@
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.xy-flow__viewport-portal {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.xy-flow__minimap {
|
||||
background: var(--xy-minimap-background-color, var(--xy-minimap-background-color-default));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user