diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..dcdc02e1
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+website/* linguist-documentation
+example/* linguist-documentation
diff --git a/README.md b/README.md
index 53f8bb05..2ddb7d73 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
- 
+
+
+## ✨ React Flow has a [new website](https://reactflow.dev) ✨
# React Flow
@@ -130,6 +132,12 @@ const BasicFlow = () => ;
- `deleteKeyCode`: default: `8` (delete)
- `selectionKeyCode`: default: `16` (shift)
+**Typescript:** The interface of the ReactFlow Prop Types are exported as `ReactFlowProps`. You can use it in your code as follows:
+
+```javascript
+import { ReactFlowProps } from 'react-flow-renderer';
+```
+
## React Flow Instance
You can receive a `reactFlowInstance` by using the `onLoad` callback:
@@ -271,6 +279,8 @@ const targetHandleWithValidation = (
- `style`: css properties
- `className`: additional class name
+**Typescript:** The interface of the Handle Prop Types are exported as `HandleProps`.
+
### Validation
The handle receives the additional class names `connecting` when the connection line is above the handle and `valid` if the connection is valid. You can find an example which uses these classes [here](/example/src/Validation/index.js).
@@ -412,6 +422,8 @@ const FlowWithBackground = () => (
- `style`: css properties
- `className`: additional class name
+**Typescript:** The interface of the Background Prop Types are exported as `BackgroundProps`.
+
## MiniMap
You can use the mini map plugin by passing it as a children to the `ReactFlow` component:
@@ -445,6 +457,8 @@ const FlowWithMiniMap = () => (
- `style`: css properties
- `className`: additional class name
+**Typescript:** The interface of the MiniMap Prop Types are exported as `MiniMapProps`.
+
## Controls
The control panel contains a zoom-in, zoom-out, fit-view and a lock/unlock button. You can use it by passing it as a children to the `ReactFlow` component:
@@ -471,6 +485,8 @@ const FlowWithControls = () => (
- `style`: css properties
- `className`: additional class name
+**Typescript:** The interface of the Controls Prop Types are exported as `ControlProps`.
+
## ReactFlowProvider
If you need access to the internal state and action of React Flow outside of the `ReactFlow` component you can wrap it with the `ReactFlowProvider` component:
@@ -510,8 +526,8 @@ The React Flow wrapper has the className `react-flow`. If you want to change the
### Used Class Names
* `.react-flow` - Outer container
-* `.react-flow__renderer` - Inner container
-* `.react-flow__zoompane` - Zoom & pan pane
+* `.react-flow__renderer` - Flow container, used for zooming and panning
+* `.react-flow__pane` - Background Pane for click and wheel events, previously `.react-flow__zoompane`
* `.react-flow__selectionpane` - Selection pane
* `.react-flow__selection` - User selection
* `.react-flow__edges` - Edges wrapper
diff --git a/cypress/integration/flow/basic.spec.js b/cypress/integration/flow/basic.spec.js
index 27e27b56..2d39054f 100644
--- a/cypress/integration/flow/basic.spec.js
+++ b/cypress/integration/flow/basic.spec.js
@@ -119,7 +119,7 @@ describe('Basic Flow Rendering', () => {
// for d3 we have to pass the window to the event
// https://github.com/cypress-io/cypress/issues/3441
cy.window().then((win) => {
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.trigger('mousedown', 'topLeft', { which: 1, view: win })
.trigger('mousemove', 'bottomLeft')
.trigger('mouseup', { force: true, view: win })
@@ -133,7 +133,7 @@ describe('Basic Flow Rendering', () => {
it('zooms the pane', () => {
const styleBeforeZoom = Cypress.$('.react-flow__nodes').css('transform');
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.trigger('wheel', 'topLeft', { deltaY: -200 })
.then(() => {
const styleAfterZoom = Cypress.$('.react-flow__nodes').css('transform');
diff --git a/cypress/integration/flow/controls.spec.js b/cypress/integration/flow/controls.spec.js
index 3975fadb..98e0def9 100644
--- a/cypress/integration/flow/controls.spec.js
+++ b/cypress/integration/flow/controls.spec.js
@@ -36,7 +36,7 @@ describe('Controls Testing', () => {
// for d3 we have to pass the window to the event
// https://github.com/cypress-io/cypress/issues/3441
cy.window().then((win) => {
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.trigger('mousedown', 'topLeft', { which: 1, view: win })
.trigger('mousemove', 'bottomLeft')
.trigger('mouseup', { force: true, view: win })
diff --git a/cypress/integration/flow/empty.spec.js b/cypress/integration/flow/empty.spec.js
index 300dc850..52c32b16 100644
--- a/cypress/integration/flow/empty.spec.js
+++ b/cypress/integration/flow/empty.spec.js
@@ -16,6 +16,8 @@ describe('Empty Flow Rendering', () => {
.trigger('mousedown', 'topLeft', { which: 1, force: true })
.trigger('mousemove', 'bottomLeft', { which: 1 })
.trigger('mouseup', 'bottomLeft', { force: true });
+
+ cy.get('body').type('{shift}', { release: true });
});
it('renders an empty mini map', () => {
diff --git a/cypress/integration/flow/interaction.spec.js b/cypress/integration/flow/interaction.spec.js
index 8846aade..5810c485 100644
--- a/cypress/integration/flow/interaction.spec.js
+++ b/cypress/integration/flow/interaction.spec.js
@@ -52,7 +52,7 @@ describe('Interaction Flow Rendering', () => {
it('tries to zoom by scroll', () => {
const styleBeforeZoom = Cypress.$('.react-flow__nodes').css('transform');
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.dblclick()
.then(() => {
const styleAfterZoom = Cypress.$('.react-flow__nodes').css('transform');
@@ -63,7 +63,7 @@ describe('Interaction Flow Rendering', () => {
it('tries to zoom by double click', () => {
const styleBeforeZoom = Cypress.$('.react-flow__nodes').css('transform');
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.trigger('wheel', 'topLeft', { deltaY: -200 })
.then(() => {
const styleAfterZoom = Cypress.$('.react-flow__nodes').css('transform');
@@ -122,7 +122,7 @@ describe('Interaction Flow Rendering', () => {
it('zooms by scroll', () => {
const styleBeforeZoom = Cypress.$('.react-flow__nodes').css('transform');
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.trigger('wheel', 'topLeft', { deltaY: 200 })
.then(() => {
const styleAfterZoom = Cypress.$('.react-flow__nodes').css('transform');
@@ -137,7 +137,7 @@ describe('Interaction Flow Rendering', () => {
it('zooms by double click', () => {
const styleBeforeZoom = Cypress.$('.react-flow__nodes').css('transform');
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.dblclick()
.then(() => {
const styleAfterZoom = Cypress.$('.react-flow__nodes').css('transform');
diff --git a/cypress/integration/flow/minimap.spec.js b/cypress/integration/flow/minimap.spec.js
index 1ce5bb5a..c9235ea8 100644
--- a/cypress/integration/flow/minimap.spec.js
+++ b/cypress/integration/flow/minimap.spec.js
@@ -19,7 +19,7 @@ describe('Minimap Testing', () => {
const viewBoxBeforeZoom = Cypress.$('.react-flow__minimap').attr('viewBox');
const maskPathBeforeZoom = Cypress.$('.react-flow__minimap-mask').attr('d');
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.trigger('wheel', 'topLeft', { deltaY: -200 })
.then(() => {
const viewBoxAfterZoom = Cypress.$('.react-flow__minimap').attr('viewBox');
@@ -53,7 +53,7 @@ describe('Minimap Testing', () => {
// for d3 we have to pass the window to the event
// https://github.com/cypress-io/cypress/issues/3441
cy.window().then((win) => {
- cy.get('.react-flow__zoompane')
+ cy.get('.react-flow__renderer')
.trigger('mousedown', 'topLeft', { which: 1, view: win })
.trigger('mousemove', 'bottomLeft')
.trigger('mouseup', { force: true, view: win })
diff --git a/example/package-lock.json b/example/package-lock.json
index 631169fb..eda3f447 100644
--- a/example/package-lock.json
+++ b/example/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "react-flow-examples",
+ "name": "react-flow-tests",
"version": "0.1.0",
"lockfileVersion": 1,
"requires": true,
@@ -3996,11 +3996,6 @@
"type": "^1.0.1"
}
},
- "d3-selection": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz",
- "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
- },
"damerau-levenshtein": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
@@ -10458,10 +10453,7 @@
"react-flow-renderer": {
"version": "file:..",
"requires": {
- "@welldone-software/why-did-you-render": "^4.3.2",
"classcat": "^4.1.0",
- "d3-selection": "^2.0.0",
- "d3-zoom": "^2.0.0",
"easy-peasy": "^3.3.1",
"fast-deep-equal": "^3.1.3",
"react-draggable": "^4.4.3",
@@ -16087,8 +16079,7 @@
"resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.4.tgz",
"integrity": "sha512-ICPurDETFAelF1CTHdIyiUM4PsyZLaM+7oIBhmyP+cuVjze5vDZ8V//LdOFjg0jGnFIZD/Sfmk0r95PSiu78rw==",
"requires": {
- "d3-dispatch": "1",
- "d3-selection": "1"
+ "d3-dispatch": "1"
}
},
"d3-ease": {
@@ -16118,7 +16109,6 @@
"d3-dispatch": "1",
"d3-ease": "1",
"d3-interpolate": "1",
- "d3-selection": "^1.1.0",
"d3-timer": "1"
}
},
@@ -16130,7 +16120,6 @@
"d3-dispatch": "1",
"d3-drag": "1",
"d3-interpolate": "1",
- "d3-selection": "1",
"d3-transition": "1"
}
},
diff --git a/example/package.json b/example/package.json
index da6cd466..3cfbcea4 100644
--- a/example/package.json
+++ b/example/package.json
@@ -1,5 +1,5 @@
{
- "name": "react-flow-examples",
+ "name": "react-flow-tests",
"version": "0.1.0",
"private": true,
"dependencies": {
diff --git a/example/public/favicon.ico b/example/public/favicon.ico
index c2c86b85..731acd59 100644
Binary files a/example/public/favicon.ico and b/example/public/favicon.ico differ
diff --git a/example/public/index.html b/example/public/index.html
index 6e06a78f..f49c16b5 100644
--- a/example/public/index.html
+++ b/example/public/index.html
@@ -4,12 +4,10 @@
-
-
-
React Flow Examples
+
+ React Flow - Test Flows
-