Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add and update components, add template section #657

Merged
merged 78 commits into from
Feb 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
1bb1c18
refactor(tooltip-node): break tooltip node into subcomponents
printerscanner Jan 22, 2025
e377f70
chore: remove use-client
printerscanner Jan 22, 2025
5c1c4c2
fix(tooltip-node): fix ref error
printerscanner Jan 22, 2025
6a70084
chore: pass page.tsx data to components tabs
printerscanner Jan 22, 2025
e7ba206
chore(tooltip-node): wrap setTooltipVisible in a callback
printerscanner Jan 22, 2025
6f48c5b
feat(ui-component-viewer): add usage instructions, rename tabs
printerscanner Jan 29, 2025
fb8088d
docs(Components): update tutorial with tooltip-node updates
printerscanner Jan 29, 2025
cddef75
Merge branch 'main' of https://github.com/xyflow/web into tooltip-nod…
printerscanner Jan 30, 2025
95756b1
chore(tooltip): pass selected to base node
printerscanner Jan 30, 2025
25bf4b1
refactor(base-node): adjust component/app code display
printerscanner Jan 30, 2025
10f337d
chore: port node-header updates from workflow builder
printerscanner Feb 3, 2025
304a2b4
refactor(placeholder-node): convert component to new display configur…
printerscanner Feb 3, 2025
50b7e2e
chore: refactor labeled group node component
printerscanner Feb 3, 2025
935f1eb
fix(labeled-group-node): fix linting error
printerscanner Feb 4, 2025
54a7cff
refactor(components): update database scheme node
printerscanner Feb 4, 2025
ac046e1
refactor(components): update annotation node
printerscanner Feb 4, 2025
01630af
fix(datbase-schema-node): linting errors
printerscanner Feb 4, 2025
391918e
fix: linting error
printerscanner Feb 4, 2025
d961d95
refactor(components): simplify labeled handle example
printerscanner Feb 4, 2025
c8144dc
refactor(components): set consistent naming for demo components
printerscanner Feb 4, 2025
86466ed
feat(templates): add pro template category
chrtze Feb 5, 2025
7f6680b
refactor(components): update node header component
printerscanner Feb 5, 2025
271d03a
refactor(components): update templates for new components
printerscanner Feb 5, 2025
486b805
feat(components): add node status indicator component
printerscanner Feb 5, 2025
cd843c8
docs: update status indicator page info
printerscanner Feb 5, 2025
416c5ec
chore(status-indicator): add initial as status option
printerscanner Feb 5, 2025
a04aeea
feat(components): create source handle
printerscanner Feb 6, 2025
c51c513
feat(components): create workflow node, update base handle styling
printerscanner Feb 6, 2025
007aaa4
chore: cleanup baseNode
printerscanner Feb 6, 2025
70e0a41
refactor(components): drop react prefix
printerscanner Feb 6, 2025
c2e6f0c
feat(components): update registry to display index file if there is n…
printerscanner Feb 6, 2025
0368b0c
fix: linting error
printerscanner Feb 6, 2025
753e7c6
feat: fix linting error
printerscanner Feb 6, 2025
4312095
refactor(components): update data edge component
printerscanner Feb 6, 2025
7728feb
feat(components): refactor button edge
printerscanner Feb 6, 2025
28abe5f
refactor(components): refactor animated svg components section
printerscanner Feb 6, 2025
8614406
refactor(components): update zoom select, slider components
printerscanner Feb 6, 2025
75eb79a
refactor(components): clean up button edge component
printerscanner Feb 6, 2025
c2bd19a
refactor(components): update node status indicator
printerscanner Feb 6, 2025
dc2fc7a
refactor(components): update devtools
printerscanner Feb 6, 2025
ada39c2
fix: devtools linting error
printerscanner Feb 6, 2025
c310012
cleanup: consistent naming page.tsx files
printerscanner Feb 6, 2025
7a8cf9f
chore: props cleanup
printerscanner Feb 10, 2025
2c3d30b
chore: refactor labeled-group-node, fix linting errors
printerscanner Feb 10, 2025
a0c7b52
Merge branch 'templates' into tooltip-node-refactor
chrtze Feb 11, 2025
ba85501
feat(templates): change text in pricing table
chrtze Feb 11, 2025
3be0f79
feat(pricing): add templates to all pricing plans
chrtze Feb 12, 2025
244cea1
chore(components): remove tabs in viewer
printerscanner Feb 17, 2025
7076aa0
chore: only compile demo content if there is a demo file
printerscanner Feb 17, 2025
086207f
chore: simplify demo import urls
printerscanner Feb 17, 2025
7ffe238
use a different way to use correct urls
peterkogo Feb 17, 2025
9f7a7d5
Revert "chore: simplify demo import urls"
printerscanner Feb 17, 2025
d6bc4fa
chore: remove demo file from animated svg edge
printerscanner Feb 17, 2025
36491d0
Merge branch 'fix-links' into tooltip-node-refactor
peterkogo Feb 17, 2025
055d071
fix registry url linking
peterkogo Feb 18, 2025
20df85b
fix registry url linking
peterkogo Feb 18, 2025
ab34b0f
fix workflow-node dependency
peterkogo Feb 18, 2025
6ca503f
fix dependency links
peterkogo Feb 18, 2025
a138796
refactor: demo -> component-example, create app-example files
printerscanner Feb 18, 2025
dc9892b
Merge branch 'tooltip-node-refactor' of https://github.com/xyflow/web…
printerscanner Feb 18, 2025
dac46e7
chore(components): wrap demo apps in wrapper with theme switcher
printerscanner Feb 18, 2025
241ff43
chore: cleanup generate registry and initial setup with new configura…
printerscanner Feb 18, 2025
e9925c8
renamed source handle to button handle
peterkogo Feb 18, 2025
e2e4c8d
renamed source handle, clean up
peterkogo Feb 18, 2025
280ce94
improved button handle example
peterkogo Feb 18, 2025
7b06438
Merge branch 'main' into tooltip-node-refactor
printerscanner Feb 18, 2025
516f859
fix: remove vestigial use client references
printerscanner Feb 18, 2025
f50ad52
refactor(data-edge): simplify demo component
printerscanner Feb 18, 2025
2a03b0d
remove workflow node
peterkogo Feb 18, 2025
41d1097
remove workflow node
peterkogo Feb 18, 2025
fc646d1
remove workflow node route
peterkogo Feb 18, 2025
175e5a6
clean up button-handle
peterkogo Feb 24, 2025
2f5792c
Merge branch 'main' into tooltip-node-refactor
chrtze Feb 24, 2025
2ebb896
Merge branch 'tooltip-node-refactor' of github.com:xyflow/web into to…
chrtze Feb 24, 2025
189ed24
change pricing details, add toc to components page
chrtze Feb 24, 2025
30d097f
setup workflow editor page
chrtze Feb 25, 2025
eca4e38
change workflow editor description
chrtze Feb 25, 2025
af3652a
move workflow editor to the top of the sidebar
chrtze Feb 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 19 additions & 31 deletions apps/example-apps/react/tutorials/components/tooltip/App.tsx
Original file line number Diff line number Diff line change
@@ -1,57 +1,45 @@
import React, { useCallback } from 'react';
import {
ReactFlow,
type Node,
type Edge,
type OnConnect,
Position,
addEdge,
useNodesState,
useEdgesState,
} from '@xyflow/react';
import React from 'react';
import { ReactFlow, type Node, Position, useNodesState } from '@xyflow/react';

import '@xyflow/react/dist/style.css';

import { TooltipNode } from './components/tooltip-node';
import {
TooltipNode,
TooltipContent,
TooltipTrigger,
} from './components/tooltip-node';

function Tooltip() {
return (
<TooltipNode>
<TooltipContent position={Position.Top}>Hidden Content</TooltipContent>
<TooltipTrigger>Hover</TooltipTrigger>
</TooltipNode>
);
}

const nodeTypes = {
tooltip: TooltipNode,
tooltip: Tooltip,
};

const initialNodes: Node[] = [
{
id: '1',
position: { x: 0, y: 0 },
data: {
label: 'Hover me',
tooltip: {
label: 'Boo!',
position: Position.Bottom,
},
},
data: {},
type: 'tooltip',
},
];

const initialEdges: Edge[] = [];

function Flow() {
const [nodes, , onNodesChange] = useNodesState(initialNodes);
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);

const onConnect: OnConnect = (params) => {
setEdges((edges) => addEdge(params, edges));
};

return (
<div className="h-screen w-screen p-8 bg-gray-50 rounded-xl">
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
nodeTypes={nodeTypes}
onNodesChange={onNodesChange}
fitView
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,41 +1,96 @@
import React, { useState } from 'react';
import React, { createContext, useContext, useState, useCallback } from 'react';
import {
type Node,
type NodeProps,
type NodeToolbarProps,
NodeToolbar,
Handle,
Position,
} from '@xyflow/react';
import { BaseNode } from './base-node';

export type TooltipNodeType = Node<{
label: string;
tooltip?: {
label: string;
position?: NodeToolbarProps['position'];
};
}>;
/* TOOLTIP CONTEXT ---------------------------------------------------------- */

export function TooltipNode({ data, selected }: NodeProps<TooltipNodeType>) {
const [isTooltipVisible, setTooltipVisible] = useState(false);
const TooltipContext = createContext(false);

/* TOOLTIP NODE ------------------------------------------------------------- */

export interface TooltipNodeProps extends Partial<NodeProps> {
children?: React.ReactNode;
}

/**
* A component that wraps a node and provides tooltip visibility context.
*/
export const TooltipNode = React.forwardRef<HTMLDivElement, TooltipNodeProps>(
({ selected, children }, ref) => {
const [isTooltipVisible, setTooltipVisible] = useState(false);

const showTooltip = useCallback(() => setTooltipVisible(true), []);
const hideTooltip = useCallback(() => setTooltipVisible(false), []);

return (
<TooltipContext.Provider value={isTooltipVisible}>
<BaseNode
ref={ref}
onMouseEnter={showTooltip}
onMouseLeave={hideTooltip}
onFocus={showTooltip}
onBlur={hideTooltip}
tabIndex={0}
>
{children}
</BaseNode>
</TooltipContext.Provider>
);
},
);

TooltipNode.displayName = 'TooltipNode';

/* TOOLTIP CONTENT ---------------------------------------------------------- */

export interface TooltipContentProps extends NodeToolbarProps {}

/**
* A component that displays the tooltip content based on visibility context.
*/
export const TooltipContent = React.forwardRef<
HTMLDivElement,
TooltipContentProps
>(({ position, children }, ref) => {
const isTooltipVisible = useContext(TooltipContext);

return (
<BaseNode
onMouseEnter={() => setTooltipVisible(true)}
onMouseLeave={() => setTooltipVisible(false)}
selected={selected}
>
<div ref={ref}>
<NodeToolbar
isVisible={isTooltipVisible || selected}
isVisible={isTooltipVisible}
className="rounded-sm bg-primary p-2 text-primary-foreground"
position={data.tooltip?.position}
tabIndex={1}
position={position}
>
{data.tooltip?.label}
{children}
</NodeToolbar>
<div>{data.label}</div>
<Handle type="target" position={Position.Top} />
<Handle type="source" position={Position.Bottom} />
</BaseNode>
</div>
);
}
});

TooltipContent.displayName = 'TooltipContent';

/* TOOLTIP TRIGGER ---------------------------------------------------------- */

export interface TooltipTriggerProps
extends React.HTMLAttributes<HTMLParagraphElement> {}

/**
* A component that triggers the tooltip visibility.
*/
export const TooltipTrigger = React.forwardRef<
HTMLParagraphElement,
TooltipTriggerProps
>(({ children, ...props }, ref) => {
return (
<div ref={ref} {...props}>
{children}
</div>
);
});

TooltipTrigger.displayName = 'TooltipTrigger';
8 changes: 5 additions & 3 deletions apps/ui-components/app/components/animated-svg-edge/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
"use client";

import AnimatedSvgEdgeApp from "@/registry/components/animated-svg-edge/app-example";
import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/animated-svg-edge/demo";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<Demo />
<AnimatedSvgEdgeApp />
</DemoWrapper>
);
}
9 changes: 6 additions & 3 deletions apps/ui-components/app/components/annotation-node/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"use client";

import AnnotationNodeApp from "@/registry/components/annotation-node/app-example";

import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/annotation-node/demo";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<Demo />
<AnnotationNodeApp />
</DemoWrapper>
);
}
25 changes: 4 additions & 21 deletions apps/ui-components/app/components/base-handle/page.tsx
Original file line number Diff line number Diff line change
@@ -1,30 +1,13 @@
"use client";

import { Background, ReactFlow } from "@xyflow/react";
import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/base-handle/demo";

const defaultNodes = [
{
id: "1",
position: { x: 200, y: 200 },
data: {},
type: "customNode",
},
];
import BaseHandleApp from "@/registry/components/base-handle/app-example";

const nodeTypes = {
customNode: Demo,
};
import DemoWrapper from "@/components/demo-wrapper";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<div className="h-full w-full">
<ReactFlow defaultNodes={defaultNodes} nodeTypes={nodeTypes} fitView>
<Background />
</ReactFlow>
</div>
<BaseHandleApp />
</DemoWrapper>
);
}
9 changes: 6 additions & 3 deletions apps/ui-components/app/components/base-node/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"use client";

import BaseNodeApp from "@/registry/components/base-node/app-example";

import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/base-node/demo";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<Demo />
<BaseNodeApp />
</DemoWrapper>
);
}
9 changes: 6 additions & 3 deletions apps/ui-components/app/components/button-edge/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"use client";

import ButtonEdgeApp from "@/registry/components/button-edge/app-example";

import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/button-edge/demo";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<Demo />
<ButtonEdgeApp />
</DemoWrapper>
);
}
12 changes: 12 additions & 0 deletions apps/ui-components/app/components/button-handle/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"use client";

import ButtonHandleApp from "@/registry/components/button-handle/app-example";
import DemoWrapper from "@/components/demo-wrapper";

export default function Page() {
return (
<DemoWrapper>
<ButtonHandleApp />
</DemoWrapper>
);
}
9 changes: 6 additions & 3 deletions apps/ui-components/app/components/data-edge/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"use client";

import DataEdgeApp from "@/registry/components/data-edge/app-example";

import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/data-edge/demo";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<Demo />
<DataEdgeApp />
</DemoWrapper>
);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"use client";

import DatabaseSchemaNodeApp from "@/registry/components/database-schema-node/app-example";

import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/database-schema-node/demo";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<Demo />
<DatabaseSchemaNodeApp />
</DemoWrapper>
);
}
9 changes: 6 additions & 3 deletions apps/ui-components/app/components/devtools/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"use client";

import DevtoolsApp from "@/registry/components/devtools/app-example";

import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/devtools/demo";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<Demo />
<DevtoolsApp />
</DemoWrapper>
);
}
9 changes: 6 additions & 3 deletions apps/ui-components/app/components/labeled-group-node/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
"use client";

import LabeledGroupNodeApp from "@/registry/components/labeled-group-node/app-example";

import DemoWrapper from "@/components/demo-wrapper";
import Demo from "@/registry/components/labeled-group-node/demo";

export default function DemoPage() {
export default function Page() {
return (
<DemoWrapper>
<Demo />
<LabeledGroupNodeApp />
</DemoWrapper>
);
}
Loading