diff --git a/packages/vx-demo/src/components/gallery.js b/packages/vx-demo/src/components/gallery.js
index 25f3d08ff0..e2dcbbe0ea 100644
--- a/packages/vx-demo/src/components/gallery.js
+++ b/packages/vx-demo/src/components/gallery.js
@@ -35,8 +35,8 @@ import Pack from './tiles/Pack.tsx';
import Treemap from './tiles/Treemap.tsx';
import Radar from './tiles/radar';
import Responsive from './tiles/Responsive.tsx';
-import DragI from './tiles/drag-i';
-import DragII from './tiles/drag-ii';
+import DragI from './tiles/Drag-i.tsx';
+import DragII from './tiles/Drag-ii.tsx';
import LinkTypes from './tiles/LinkTypes.tsx';
import Threshold from './tiles/Threshold.tsx';
import Chord from './tiles/Chord.tsx';
diff --git a/packages/vx-demo/src/components/tiles/Drag-i.tsx b/packages/vx-demo/src/components/tiles/Drag-i.tsx
new file mode 100644
index 0000000000..f7898efe64
--- /dev/null
+++ b/packages/vx-demo/src/components/tiles/Drag-i.tsx
@@ -0,0 +1,131 @@
+import React, { useMemo, useState } from 'react';
+import { scaleOrdinal } from '@vx/scale';
+import { LinearGradient } from '@vx/gradient';
+import { Drag, raise } from '@vx/drag';
+import { WidthAndHeight, ShowProvidedProps } from '../../types';
+
+const colors = [
+ '#025aac',
+ '#02cff9',
+ '#02efff',
+ '#03aeed',
+ '#0384d7',
+ '#edfdff',
+ '#ab31ff',
+ '#5924d7',
+ '#d145ff',
+ '#1a02b1',
+ '#e582ff',
+ '#ff00d4',
+ '#270eff',
+ '#827ce2',
+];
+
+const generateCircles = ({ num, width, height }: { num: number } & WidthAndHeight) =>
+ new Array(num).fill(1).map((d, i) => {
+ const radius = 25 - Math.random() * 20;
+ return {
+ id: `${i}`,
+ radius,
+ x: Math.round(Math.random() * (width - radius * 2) + radius),
+ y: Math.round(Math.random() * (height - radius * 2) + radius),
+ };
+ });
+
+const generateItems = ({ width, height }: WidthAndHeight) =>
+ generateCircles({
+ num: width < 360 ? 40 : 185,
+ width,
+ height,
+ });
+
+export default function DragI({ width, height }: ShowProvidedProps) {
+ const memoizedItems = useMemo(() => generateItems({ width, height }), [width, height]);
+ const [draggingItems, setDraggingItems] = useState(memoizedItems);
+
+ const colorScale = useMemo(
+ () =>
+ scaleOrdinal({
+ range: colors,
+ domain: draggingItems.map(d => d.id),
+ }),
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [width, height],
+ );
+
+ if (width < 10) return null;
+
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/packages/vx-demo/src/components/tiles/Drag-ii.tsx b/packages/vx-demo/src/components/tiles/Drag-ii.tsx
new file mode 100644
index 0000000000..d9ff12f477
--- /dev/null
+++ b/packages/vx-demo/src/components/tiles/Drag-ii.tsx
@@ -0,0 +1,124 @@
+import React, { useState } from 'react';
+import { LinePath } from '@vx/shape';
+import { Drag } from '@vx/drag';
+import { curveBasis } from '@vx/curve';
+import { LinearGradient } from '@vx/gradient';
+import { ShowProvidedProps } from '../../types';
+
+type Lines = { x: number; y: number }[][];
+
+export default function DragII({ width, height }: ShowProvidedProps) {
+ const [lines, setLines] = useState([]);
+
+ if (width < 10) return null;
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/packages/vx-demo/src/components/tiles/Geo-Mercator.tsx b/packages/vx-demo/src/components/tiles/Geo-Mercator.tsx
index 0f72dca880..68d5137f37 100644
--- a/packages/vx-demo/src/components/tiles/Geo-Mercator.tsx
+++ b/packages/vx-demo/src/components/tiles/Geo-Mercator.tsx
@@ -35,7 +35,6 @@ export default ({ width, height, events = false }: ShowProvidedProps) => {
const centerX = width / 2;
const centerY = height / 2;
const scale = (width / 630) * 100;
- console.warn({ width, height });
return (