fix: revert addition of as prop

This commit is contained in:
Abbey Yacoe
2025-05-22 16:31:50 +02:00
parent 1fb7a5c98a
commit b310586dfb
5 changed files with 29 additions and 48 deletions
+4 -2
View File
@@ -22,17 +22,19 @@ const initialNodes: Node[] = [
type: 'input', type: 'input',
data: { label: 'A11y Node 1' }, data: { label: 'A11y Node 1' },
position: { x: 250, y: 5 }, position: { x: 250, y: 5 },
className: 'light',
}, },
{ {
id: '2', id: '2',
data: { label: '<ul> Node' }, data: { label: 'Node 2' },
position: { x: 100, y: 100 }, position: { x: 100, y: 100 },
as: 'ul', className: 'light',
}, },
{ {
id: '3', id: '3',
data: { label: 'Node 3' }, data: { label: 'Node 3' },
position: { x: 400, y: 100 }, position: { x: 400, y: 100 },
className: 'light',
}, },
]; ];
@@ -13,10 +13,10 @@
{ {
id: 'A', id: 'A',
position: { x: 0, y: 0 }, position: { x: 0, y: 0 },
data: { label: 'A' }, data: { label: 'A' },
}, },
// You need to explicitly pass the as type { id: 'B', position: { x: -100, y: 150 }, data: { label: 'B' } },
{ id: 'B', position: { x: -100, y: 150 }, data: { label: '<ul> Node' }, as: "ul" as "ul" },
{ id: 'C', position: { x: 100, y: 150 }, data: { label: 'C' } }, { id: 'C', position: { x: 100, y: 150 }, data: { label: 'C' } },
{ id: 'D', position: { x: 0, y: 260 }, data: { label: 'D' } } { id: 'D', position: { x: 0, y: 260 }, data: { label: 'D' } }
]); ]);
@@ -68,15 +68,7 @@ export function NodeWrapper<NodeType extends Node>({
const store = useStoreApi(); const store = useStoreApi();
const hasDimensions = nodeHasDimensions(node); const hasDimensions = nodeHasDimensions(node);
const Tag: keyof JSX.IntrinsicElements = node.as || 'div'; const nodeRef = useNodeObserver({ node, nodeType, hasDimensions, resizeObserver });
const nodeRef = useNodeObserver({
node,
nodeType,
hasDimensions,
resizeObserver,
});
const dragging = useDrag({ const dragging = useDrag({
nodeRef, nodeRef,
disabled: node.hidden || !isDraggable, disabled: node.hidden || !isDraggable,
@@ -168,7 +160,7 @@ export function NodeWrapper<NodeType extends Node>({
}; };
return ( return (
<Tag <div
className={cc([ className={cc([
'react-flow__node', 'react-flow__node',
`react-flow__node-${nodeType}`, `react-flow__node-${nodeType}`,
@@ -185,11 +177,7 @@ export function NodeWrapper<NodeType extends Node>({
dragging, dragging,
}, },
])} ])}
ref={(instance: HTMLElement | null) => { ref={nodeRef}
if (nodeRef && 'current' in nodeRef) {
(nodeRef as React.MutableRefObject<HTMLElement | null>).current = instance;
}
}}
style={{ style={{
zIndex: internals.z, zIndex: internals.z,
transform: `translate(${internals.positionAbsolute.x}px,${internals.positionAbsolute.y}px)`, transform: `translate(${internals.positionAbsolute.x}px,${internals.positionAbsolute.y}px)`,
@@ -200,13 +188,13 @@ export function NodeWrapper<NodeType extends Node>({
}} }}
data-id={id} data-id={id}
data-testid={`rf__node-${id}`} data-testid={`rf__node-${id}`}
onMouseEnter={onMouseEnterHandler as React.MouseEventHandler<HTMLElement>} onMouseEnter={onMouseEnterHandler}
onMouseMove={onMouseMoveHandler as React.MouseEventHandler<HTMLElement>} onMouseMove={onMouseMoveHandler}
onMouseLeave={onMouseLeaveHandler as React.MouseEventHandler<HTMLElement>} onMouseLeave={onMouseLeaveHandler}
onContextMenu={onContextMenuHandler as React.MouseEventHandler<HTMLElement>} onContextMenu={onContextMenuHandler}
onClick={onSelectNodeHandler as React.MouseEventHandler<HTMLElement>} onClick={onSelectNodeHandler}
onDoubleClick={onDoubleClickHandler as React.MouseEventHandler<HTMLElement>} onDoubleClick={onDoubleClickHandler}
onKeyDown={isFocusable ? (onKeyDown as React.KeyboardEventHandler<HTMLElement>) : undefined} onKeyDown={isFocusable ? onKeyDown : undefined}
tabIndex={isFocusable ? 0 : undefined} tabIndex={isFocusable ? 0 : undefined}
role={isFocusable ? 'button' : undefined} role={isFocusable ? 'button' : undefined}
aria-describedby={disableKeyboardA11y ? undefined : `${ARIA_NODE_DESC_KEY}-${rfId}`} aria-describedby={disableKeyboardA11y ? undefined : `${ARIA_NODE_DESC_KEY}-${rfId}`}
@@ -233,6 +221,6 @@ export function NodeWrapper<NodeType extends Node>({
{...nodeDimensions} {...nodeDimensions}
/> />
</Provider> </Provider>
</Tag> </div>
); );
} }
@@ -53,19 +53,15 @@
width, width,
height, height,
dragHandle, dragHandle,
as = 'div',
internals: { internals: {
z: zIndex = 0, z: zIndex = 0,
positionAbsolute: { x: positionX, y: positionY }, positionAbsolute: { x: positionX, y: positionY },
userNode, userNode
} }
} = $derived(node); } = $derived(node);
let { id } = node; let { id } = node;
let Tag = $derived(typeof as === 'string' ? as : 'div');
let draggable = $derived(_draggable ?? store.nodesDraggable); let draggable = $derived(_draggable ?? store.nodesDraggable);
let selectable = $derived(_selectable ?? store.elementsSelectable); let selectable = $derived(_selectable ?? store.elementsSelectable);
let connectable = $derived(_connectable ?? store.nodesConnectable); let connectable = $derived(_connectable ?? store.nodesConnectable);
@@ -78,7 +74,7 @@
let isParent = $derived(isInParentLookup(id)); let isParent = $derived(isInParentLookup(id));
let nodeRef: HTMLElement | null = $state(null); let nodeRef: HTMLDivElement | null = $state(null);
let prevNodeRef: HTMLDivElement | null = null; let prevNodeRef: HTMLDivElement | null = null;
// svelte-ignore state_referenced_locally // svelte-ignore state_referenced_locally
@@ -136,7 +132,7 @@
id, id,
{ {
id, id,
nodeElement: nodeRef as HTMLDivElement, nodeElement: nodeRef,
force: true force: true
} }
] ]
@@ -156,7 +152,7 @@
if (resizeObserver && (!initialized || nodeRef !== prevNodeRef)) { if (resizeObserver && (!initialized || nodeRef !== prevNodeRef)) {
prevNodeRef && resizeObserver.unobserve(prevNodeRef); prevNodeRef && resizeObserver.unobserve(prevNodeRef);
nodeRef && resizeObserver.observe(nodeRef); nodeRef && resizeObserver.observe(nodeRef);
prevNodeRef = nodeRef as HTMLDivElement | null; prevNodeRef = nodeRef;
} }
/* eslint-enable @typescript-eslint/no-unused-expressions */ /* eslint-enable @typescript-eslint/no-unused-expressions */
}); });
@@ -185,7 +181,7 @@
if (elementSelectionKeys.includes(event.key) && selectable) { if (elementSelectionKeys.includes(event.key) && selectable) {
const unselect = event.key === 'Escape'; const unselect = event.key === 'Escape';
store.handleNodeSelection(id, unselect, nodeRef as HTMLDivElement | null); store.handleNodeSelection(id, unselect, nodeRef);
} else if ( } else if (
draggable && draggable &&
node.selected && node.selected &&
@@ -205,8 +201,7 @@
</script> </script>
{#if !hidden} {#if !hidden}
<svelte:element <div
this={Tag}
use:drag={{ use:drag={{
nodeId: id, nodeId: id,
isSelectable: selectable, isSelectable: selectable,
@@ -246,16 +241,16 @@
style={nodeStyle} style={nodeStyle}
onclick={onSelectNodeHandler} onclick={onSelectNodeHandler}
onpointerenter={onnodepointerenter onpointerenter={onnodepointerenter
? (event: PointerEvent) => onnodepointerenter({ node: userNode, event }) ? (event) => onnodepointerenter({ node: userNode, event })
: undefined} : undefined}
onpointerleave={onnodepointerleave onpointerleave={onnodepointerleave
? (event: PointerEvent) => onnodepointerleave({ node: userNode, event }) ? (event) => onnodepointerleave({ node: userNode, event })
: undefined} : undefined}
onpointermove={onnodepointermove onpointermove={onnodepointermove
? (event: PointerEvent) => onnodepointermove({ node: userNode, event }) ? (event) => onnodepointermove({ node: userNode, event })
: undefined} : undefined}
oncontextmenu={onnodecontextmenu oncontextmenu={onnodecontextmenu
? (event: MouseEvent) => onnodecontextmenu({ node: userNode, event }) ? (event) => onnodecontextmenu({ node: userNode, event })
: undefined} : undefined}
onkeydown={focusable ? onKeyDown : undefined} onkeydown={focusable ? onKeyDown : undefined}
tabIndex={focusable ? 0 : undefined} tabIndex={focusable ? 0 : undefined}
@@ -284,5 +279,5 @@
{width} {width}
{height} {height}
/> />
</svelte:element> </div>
{/if} {/if}
-4
View File
@@ -23,10 +23,6 @@ export type NodeBase<
data: NodeData; data: NodeData;
/** Type of node defined in `nodeTypes`. */ /** Type of node defined in `nodeTypes`. */
type?: NodeType; type?: NodeType;
/** Custom element type for rendering the node (e.g., 'div', 'li', etc.).
* @default 'div'
*/
as?: Extract<keyof HTMLElementTagNameMap, 'div' | 'li' | 'ul' | 'ol'>;
/** /**
* Only relevant for default, source, target nodeType. Controls source position. * Only relevant for default, source, target nodeType. Controls source position.
* @example 'right', 'left', 'top', 'bottom' * @example 'right', 'left', 'top', 'bottom'