@nivo/network
Advanced tools
Comparing version 0.74.1 to 0.75.0
@@ -1,788 +0,2 @@ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } | ||
var react = require('react'); | ||
var core = require('@nivo/core'); | ||
var colors = require('@nivo/colors'); | ||
var tooltip = require('@nivo/tooltip'); | ||
var PropTypes = _interopDefault(require('prop-types')); | ||
var get = _interopDefault(require('lodash/get')); | ||
var isString = _interopDefault(require('lodash/isString')); | ||
var isNumber = _interopDefault(require('lodash/isNumber')); | ||
var d3Force = require('d3-force'); | ||
var reactMotion = require('react-motion'); | ||
var jsxRuntime = require('react/jsx-runtime'); | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function ownKeys(object, enumerableOnly) { | ||
var keys = Object.keys(object); | ||
if (Object.getOwnPropertySymbols) { | ||
var symbols = Object.getOwnPropertySymbols(object); | ||
if (enumerableOnly) symbols = symbols.filter(function (sym) { | ||
return Object.getOwnPropertyDescriptor(object, sym).enumerable; | ||
}); | ||
keys.push.apply(keys, symbols); | ||
} | ||
return keys; | ||
} | ||
function _objectSpread2(target) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
var source = arguments[i] != null ? arguments[i] : {}; | ||
if (i % 2) { | ||
ownKeys(Object(source), true).forEach(function (key) { | ||
_defineProperty(target, key, source[key]); | ||
}); | ||
} else if (Object.getOwnPropertyDescriptors) { | ||
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); | ||
} else { | ||
ownKeys(Object(source)).forEach(function (key) { | ||
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); | ||
}); | ||
} | ||
} | ||
return target; | ||
} | ||
function _arrayWithHoles(arr) { | ||
if (Array.isArray(arr)) return arr; | ||
} | ||
function _iterableToArrayLimit(arr, i) { | ||
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; | ||
var _arr = []; | ||
var _n = true; | ||
var _d = false; | ||
var _e = undefined; | ||
try { | ||
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { | ||
_arr.push(_s.value); | ||
if (i && _arr.length === i) break; | ||
} | ||
} catch (err) { | ||
_d = true; | ||
_e = err; | ||
} finally { | ||
try { | ||
if (!_n && _i["return"] != null) _i["return"](); | ||
} finally { | ||
if (_d) throw _e; | ||
} | ||
} | ||
return _arr; | ||
} | ||
function _arrayLikeToArray(arr, len) { | ||
if (len == null || len > arr.length) len = arr.length; | ||
for (var i = 0, arr2 = new Array(len); i < len; i++) { | ||
arr2[i] = arr[i]; | ||
} | ||
return arr2; | ||
} | ||
function _unsupportedIterableToArray(o, minLen) { | ||
if (!o) return; | ||
if (typeof o === "string") return _arrayLikeToArray(o, minLen); | ||
var n = Object.prototype.toString.call(o).slice(8, -1); | ||
if (n === "Object" && o.constructor) n = o.constructor.name; | ||
if (n === "Map" || n === "Set") return Array.from(o); | ||
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); | ||
} | ||
function _nonIterableRest() { | ||
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); | ||
} | ||
function _slicedToArray(arr, i) { | ||
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); | ||
} | ||
var commonPropTypes = { | ||
nodes: PropTypes.arrayOf(PropTypes.shape({ | ||
id: PropTypes.string.isRequired | ||
})).isRequired, | ||
links: PropTypes.arrayOf(PropTypes.shape({ | ||
source: PropTypes.string.isRequired, | ||
target: PropTypes.string.isRequired | ||
})).isRequired, | ||
layers: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf(['links', 'nodes']), PropTypes.func])).isRequired, | ||
linkDistance: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.number]).isRequired, | ||
repulsivity: PropTypes.number.isRequired, | ||
distanceMin: PropTypes.number.isRequired, | ||
distanceMax: PropTypes.number.isRequired, | ||
iterations: PropTypes.number.isRequired, | ||
nodeColor: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired, | ||
nodeBorderWidth: PropTypes.oneOfType([PropTypes.number, PropTypes.func]).isRequired, | ||
nodeBorderColor: colors.inheritedColorPropType.isRequired, | ||
linkThickness: PropTypes.oneOfType([PropTypes.number, PropTypes.func]).isRequired, | ||
linkColor: colors.inheritedColorPropType.isRequired, | ||
isInteractive: PropTypes.bool.isRequired, | ||
onClick: PropTypes.func | ||
}; | ||
var NetworkPropTypes = _objectSpread2(_objectSpread2({}, commonPropTypes), {}, { | ||
role: PropTypes.string.isRequired | ||
}, core.motionPropTypes); | ||
var NetworkCanvasPropTypes = _objectSpread2({ | ||
pixelRatio: PropTypes.number.isRequired | ||
}, commonPropTypes); | ||
var commonDefaultProps = { | ||
layers: ['links', 'nodes'], | ||
linkDistance: 30, | ||
repulsivity: 10, | ||
distanceMin: 1, | ||
distanceMax: Infinity, | ||
iterations: 90, | ||
nodeBorderWidth: 0, | ||
nodeBorderColor: { | ||
from: 'color' | ||
}, | ||
linkThickness: 1, | ||
linkColor: { | ||
from: 'source.color' | ||
}, | ||
isInteractive: true | ||
}; | ||
var NetworkDefaultProps = _objectSpread2(_objectSpread2({}, commonDefaultProps), {}, { | ||
animate: true, | ||
motionStiffness: 90, | ||
motionDamping: 15, | ||
role: 'img' | ||
}); | ||
var NetworkCanvasDefaultProps = _objectSpread2(_objectSpread2({}, commonDefaultProps), {}, { | ||
pixelRatio: typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1 | ||
}); | ||
var computeForces = function computeForces(_ref) { | ||
var linkDistance = _ref.linkDistance, | ||
repulsivity = _ref.repulsivity, | ||
distanceMin = _ref.distanceMin, | ||
distanceMax = _ref.distanceMax, | ||
center = _ref.center; | ||
var computedLinkDistance; | ||
if (typeof linkDistance === 'function') { | ||
computedLinkDistance = linkDistance; | ||
} else if (isNumber(linkDistance)) { | ||
computedLinkDistance = linkDistance; | ||
} else if (isString(linkDistance)) { | ||
computedLinkDistance = function computedLinkDistance(link) { | ||
return get(link, linkDistance); | ||
}; | ||
} | ||
var linkForce = d3Force.forceLink().id(function (d) { | ||
return d.id; | ||
}).distance(computedLinkDistance); | ||
var chargeForce = d3Force.forceManyBody().strength(-repulsivity).distanceMin(distanceMin).distanceMax(distanceMax); | ||
var centerForce = d3Force.forceCenter(center[0], center[1]); | ||
return { | ||
link: linkForce, | ||
charge: chargeForce, | ||
center: centerForce | ||
}; | ||
}; | ||
var useNetwork = function useNetwork(_ref2) { | ||
var nodes = _ref2.nodes, | ||
links = _ref2.links, | ||
linkDistance = _ref2.linkDistance, | ||
repulsivity = _ref2.repulsivity, | ||
distanceMin = _ref2.distanceMin, | ||
distanceMax = _ref2.distanceMax, | ||
center = _ref2.center, | ||
iterations = _ref2.iterations; | ||
var _useState = react.useState([]), | ||
_useState2 = _slicedToArray(_useState, 2), | ||
currentNodes = _useState2[0], | ||
setCurrentNodes = _useState2[1]; | ||
var _useState3 = react.useState([]), | ||
_useState4 = _slicedToArray(_useState3, 2), | ||
currentLinks = _useState4[0], | ||
setCurrentLinks = _useState4[1]; | ||
react.useEffect(function () { | ||
var forces = computeForces({ | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
center: center | ||
}); | ||
var nodesCopy = nodes.map(function (node) { | ||
return _objectSpread2({}, node); | ||
}); | ||
var linksCopy = links.map(function (link) { | ||
return _objectSpread2({ | ||
id: "".concat(link.source, ".").concat(link.target) | ||
}, link); | ||
}); | ||
var simulation = d3Force.forceSimulation(nodesCopy).force('link', forces.link.links(linksCopy)).force('charge', forces.charge).force('center', forces.center).stop(); | ||
simulation.tick(iterations); | ||
setCurrentNodes(nodesCopy); | ||
setCurrentLinks(linksCopy.map(function (link) { | ||
link.previousSource = currentNodes.find(function (n) { | ||
return n.id === link.source.id; | ||
}); | ||
link.previousTarget = currentNodes.find(function (n) { | ||
return n.id === link.target.id; | ||
}); | ||
return link; | ||
})); | ||
return function () { | ||
simulation.stop(); | ||
}; | ||
}, [nodes, links, linkDistance, repulsivity, distanceMin, distanceMax, iterations, center[0], center[1]]); | ||
return [currentNodes, currentLinks]; | ||
}; | ||
var useNodeColor = function useNodeColor(color) { | ||
return react.useMemo(function () { | ||
if (typeof color === 'function') return color; | ||
return function () { | ||
return color; | ||
}; | ||
}, [color]); | ||
}; | ||
var useLinkThickness = function useLinkThickness(thickness) { | ||
return react.useMemo(function () { | ||
if (typeof thickness === 'function') return thickness; | ||
return function () { | ||
return thickness; | ||
}; | ||
}, [thickness]); | ||
}; | ||
function _objectWithoutPropertiesLoose(source, excluded) { | ||
if (source == null) return {}; | ||
var target = {}; | ||
var sourceKeys = Object.keys(source); | ||
var key, i; | ||
for (i = 0; i < sourceKeys.length; i++) { | ||
key = sourceKeys[i]; | ||
if (excluded.indexOf(key) >= 0) continue; | ||
target[key] = source[key]; | ||
} | ||
return target; | ||
} | ||
function _objectWithoutProperties(source, excluded) { | ||
if (source == null) return {}; | ||
var target = _objectWithoutPropertiesLoose(source, excluded); | ||
var key, i; | ||
if (Object.getOwnPropertySymbols) { | ||
var sourceSymbolKeys = Object.getOwnPropertySymbols(source); | ||
for (i = 0; i < sourceSymbolKeys.length; i++) { | ||
key = sourceSymbolKeys[i]; | ||
if (excluded.indexOf(key) >= 0) continue; | ||
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; | ||
target[key] = source[key]; | ||
} | ||
} | ||
return target; | ||
} | ||
var Node = function Node(_ref) { | ||
var node = _ref.node, | ||
x = _ref.x, | ||
y = _ref.y, | ||
radius = _ref.radius, | ||
color = _ref.color, | ||
borderWidth = _ref.borderWidth, | ||
borderColor = _ref.borderColor, | ||
_ref$scale = _ref.scale, | ||
scale = _ref$scale === void 0 ? 1 : _ref$scale, | ||
handleNodeClick = _ref.handleNodeClick, | ||
handleNodeHover = _ref.handleNodeHover, | ||
handleNodeLeave = _ref.handleNodeLeave; | ||
return jsxRuntime.jsx("circle", { | ||
transform: "translate(".concat(x, ",").concat(y, ") scale(").concat(scale, ")"), | ||
r: radius, | ||
fill: color, | ||
strokeWidth: borderWidth, | ||
stroke: borderColor, | ||
onClick: function onClick(event) { | ||
return handleNodeClick(node, event); | ||
}, | ||
onMouseEnter: function onMouseEnter(event) { | ||
return handleNodeHover(node, event); | ||
}, | ||
onMouseMove: function onMouseMove(event) { | ||
return handleNodeHover(node, event); | ||
}, | ||
onMouseLeave: handleNodeLeave | ||
}); | ||
}; | ||
var Node$1 = react.memo(Node); | ||
var willEnter = function willEnter(_ref) { | ||
var style = _ref.style; | ||
return { | ||
x: style.x.val, | ||
y: style.y.val, | ||
radius: style.radius.val, | ||
scale: 0 | ||
}; | ||
}; | ||
var willLeave = function willLeave(springConfig) { | ||
return function (_ref2) { | ||
var style = _ref2.style; | ||
return { | ||
x: style.x, | ||
y: style.y, | ||
radius: style.radius, | ||
scale: reactMotion.spring(0, springConfig) | ||
}; | ||
}; | ||
}; | ||
var AnimatedNodes = function AnimatedNodes(_ref3) { | ||
var nodes = _ref3.nodes, | ||
color = _ref3.color, | ||
borderColor = _ref3.borderColor, | ||
props = _objectWithoutProperties(_ref3, ["nodes", "color", "borderColor"]); | ||
var _useMotionConfig = core.useMotionConfig(), | ||
springConfig = _useMotionConfig.springConfig; | ||
return jsxRuntime.jsx(reactMotion.TransitionMotion, { | ||
willEnter: willEnter, | ||
willLeave: willLeave(springConfig), | ||
styles: nodes.map(function (node) { | ||
return { | ||
key: node.id, | ||
data: node, | ||
style: { | ||
x: reactMotion.spring(node.x, springConfig), | ||
y: reactMotion.spring(node.y, springConfig), | ||
radius: reactMotion.spring(node.radius, springConfig), | ||
scale: reactMotion.spring(1, springConfig) | ||
} | ||
}; | ||
}), | ||
children: function children(interpolatedStyles) { | ||
return jsxRuntime.jsx(jsxRuntime.Fragment, { | ||
children: interpolatedStyles.map(function (_ref4) { | ||
var key = _ref4.key, | ||
style = _ref4.style, | ||
node = _ref4.data; | ||
return jsxRuntime.jsx(Node$1, _objectSpread2({ | ||
node: node, | ||
x: style.x, | ||
y: style.y, | ||
radius: Math.max(style.radius, 0), | ||
color: color(node), | ||
borderColor: borderColor(node), | ||
scale: Math.max(style.scale, 0) | ||
}, props), key); | ||
}) | ||
}); | ||
} | ||
}); | ||
}; | ||
var AnimatedNodes$1 = react.memo(AnimatedNodes); | ||
var StaticNodes = function StaticNodes(_ref) { | ||
var nodes = _ref.nodes, | ||
color = _ref.color, | ||
borderColor = _ref.borderColor, | ||
props = _objectWithoutProperties(_ref, ["nodes", "color", "borderColor"]); | ||
return nodes.map(function (node) { | ||
return jsxRuntime.jsx(Node$1, _objectSpread2({ | ||
node: node, | ||
x: node.x, | ||
y: node.y, | ||
radius: node.radius, | ||
color: color(node), | ||
borderColor: borderColor(node) | ||
}, props), node.id); | ||
}); | ||
}; | ||
var StaticNodes$1 = react.memo(StaticNodes); | ||
var Link = function Link(_ref) { | ||
var sourceX = _ref.sourceX, | ||
sourceY = _ref.sourceY, | ||
targetX = _ref.targetX, | ||
targetY = _ref.targetY, | ||
thickness = _ref.thickness, | ||
color = _ref.color; | ||
return jsxRuntime.jsx("line", { | ||
stroke: color, | ||
strokeWidth: thickness, | ||
strokeLinecap: "round", | ||
x1: sourceX, | ||
y1: sourceY, | ||
x2: targetX, | ||
y2: targetY | ||
}); | ||
}; | ||
var Link$1 = react.memo(Link); | ||
var willEnter$1 = function willEnter(_ref) { | ||
var style = _ref.style, | ||
data = _ref.data; | ||
var sourceX = data.previousSource ? data.previousSource.x : style.sourceX.val; | ||
var sourceY = data.previousSource ? data.previousSource.y : style.sourceY.val; | ||
return { | ||
sourceX: sourceX, | ||
sourceY: sourceY, | ||
targetX: sourceX, | ||
targetY: sourceY | ||
}; | ||
}; | ||
var AnimatedLinks = function AnimatedLinks(_ref2) { | ||
var links = _ref2.links, | ||
linkThickness = _ref2.linkThickness, | ||
linkColor = _ref2.linkColor; | ||
var _useMotionConfig = core.useMotionConfig(), | ||
springConfig = _useMotionConfig.springConfig; | ||
return jsxRuntime.jsx(reactMotion.TransitionMotion, { | ||
willEnter: willEnter$1, | ||
styles: links.map(function (link) { | ||
return { | ||
key: link.id, | ||
data: link, | ||
style: { | ||
sourceX: reactMotion.spring(link.source.x, springConfig), | ||
sourceY: reactMotion.spring(link.source.y, springConfig), | ||
targetX: reactMotion.spring(link.target.x, springConfig), | ||
targetY: reactMotion.spring(link.target.y, springConfig) | ||
} | ||
}; | ||
}), | ||
children: function children(interpolatedStyles) { | ||
return jsxRuntime.jsx(jsxRuntime.Fragment, { | ||
children: interpolatedStyles.map(function (_ref3) { | ||
var key = _ref3.key, | ||
style = _ref3.style, | ||
link = _ref3.data; | ||
return jsxRuntime.jsx(Link$1, { | ||
link: link, | ||
color: linkColor(link), | ||
thickness: linkThickness(link), | ||
sourceX: style.sourceX, | ||
sourceY: style.sourceY, | ||
targetX: style.targetX, | ||
targetY: style.targetY | ||
}, key); | ||
}) | ||
}); | ||
} | ||
}); | ||
}; | ||
var AnimatedLinks$1 = react.memo(AnimatedLinks); | ||
var StaticLinks = function StaticLinks(_ref) { | ||
var links = _ref.links, | ||
linkThickness = _ref.linkThickness, | ||
linkColor = _ref.linkColor; | ||
return links.map(function (link) { | ||
return jsxRuntime.jsx(Link$1, { | ||
link: link, | ||
color: linkColor(link), | ||
thickness: linkThickness(link), | ||
sourceX: link.source.x, | ||
sourceY: link.source.y, | ||
targetX: link.target.x, | ||
targetY: link.target.y | ||
}, link.id); | ||
}); | ||
}; | ||
var StaticLinks$1 = react.memo(StaticLinks); | ||
var NetworkNodeTooltip = function NetworkNodeTooltip(_ref) { | ||
var node = _ref.node, | ||
format = _ref.format, | ||
tooltip$1 = _ref.tooltip; | ||
return jsxRuntime.jsx(tooltip.BasicTooltip, { | ||
id: node.id, | ||
enableChip: true, | ||
color: node.color, | ||
format: format, | ||
renderContent: typeof tooltip$1 === 'function' ? tooltip$1.bind(null, _objectSpread2({}, node)) : null | ||
}); | ||
}; | ||
var NetworkNodeTooltip$1 = react.memo(NetworkNodeTooltip); | ||
var Network = function Network(props) { | ||
var width = props.width, | ||
height = props.height, | ||
partialMargin = props.margin, | ||
rawNodes = props.nodes, | ||
rawLinks = props.links, | ||
linkDistance = props.linkDistance, | ||
repulsivity = props.repulsivity, | ||
distanceMin = props.distanceMin, | ||
distanceMax = props.distanceMax, | ||
iterations = props.iterations, | ||
layers = props.layers, | ||
nodeColor = props.nodeColor, | ||
nodeBorderWidth = props.nodeBorderWidth, | ||
nodeBorderColor = props.nodeBorderColor, | ||
linkThickness = props.linkThickness, | ||
linkColor = props.linkColor, | ||
tooltip$1 = props.tooltip, | ||
isInteractive = props.isInteractive, | ||
onClick = props.onClick, | ||
role = props.role; | ||
var _useDimensions = core.useDimensions(width, height, partialMargin), | ||
margin = _useDimensions.margin, | ||
innerWidth = _useDimensions.innerWidth, | ||
innerHeight = _useDimensions.innerHeight, | ||
outerWidth = _useDimensions.outerWidth, | ||
outerHeight = _useDimensions.outerHeight; | ||
var _useMotionConfig = core.useMotionConfig(), | ||
animate = _useMotionConfig.animate; | ||
var theme = core.useTheme(); | ||
var getColor = useNodeColor(nodeColor); | ||
var getBorderColor = colors.useInheritedColor(nodeBorderColor, theme); | ||
var getLinkThickness = useLinkThickness(linkThickness); | ||
var getLinkColor = colors.useInheritedColor(linkColor, theme); | ||
var _useNetwork = useNetwork({ | ||
nodes: rawNodes, | ||
links: rawLinks, | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
iterations: iterations, | ||
center: [innerWidth / 2, innerHeight / 2] | ||
}), | ||
_useNetwork2 = _slicedToArray(_useNetwork, 2), | ||
nodes = _useNetwork2[0], | ||
links = _useNetwork2[1]; | ||
var _useTooltip = tooltip.useTooltip(), | ||
showTooltipFromEvent = _useTooltip.showTooltipFromEvent, | ||
hideTooltip = _useTooltip.hideTooltip; | ||
var handleNodeHover = react.useCallback(function (node, event) { | ||
showTooltipFromEvent(jsxRuntime.jsx(NetworkNodeTooltip$1, { | ||
node: node, | ||
tooltip: tooltip$1 | ||
}), event); | ||
}, [showTooltipFromEvent, tooltip$1]); | ||
var handleNodeLeave = react.useCallback(function () { | ||
hideTooltip(); | ||
}, [hideTooltip]); | ||
var layerById = { | ||
links: react.createElement(animate === true ? AnimatedLinks$1 : StaticLinks$1, { | ||
key: 'links', | ||
links: links, | ||
linkThickness: getLinkThickness, | ||
linkColor: getLinkColor | ||
}), | ||
nodes: react.createElement(animate === true ? AnimatedNodes$1 : StaticNodes$1, { | ||
key: 'nodes', | ||
nodes: nodes, | ||
color: getColor, | ||
borderWidth: nodeBorderWidth, | ||
borderColor: getBorderColor, | ||
handleNodeClick: isInteractive ? onClick : undefined, | ||
handleNodeHover: isInteractive ? handleNodeHover : undefined, | ||
handleNodeLeave: isInteractive ? handleNodeLeave : undefined | ||
}) | ||
}; | ||
return jsxRuntime.jsx(core.SvgWrapper, { | ||
width: outerWidth, | ||
height: outerHeight, | ||
margin: margin, | ||
role: role, | ||
children: layers.map(function (layer, i) { | ||
if (typeof layer === 'function') { | ||
return jsxRuntime.jsx(react.Fragment, { | ||
children: layer(_objectSpread2(_objectSpread2({}, props), {}, { | ||
innerWidth: innerWidth, | ||
innerHeight: innerHeight, | ||
nodes: nodes, | ||
links: links | ||
})) | ||
}, i); | ||
} | ||
return layerById[layer]; | ||
}) | ||
}); | ||
}; | ||
Network.defaultProps = NetworkDefaultProps; | ||
var Network$1 = core.withContainer(Network); | ||
var ResponsiveNetwork = function ResponsiveNetwork(props) { | ||
return jsxRuntime.jsx(core.ResponsiveWrapper, { | ||
children: function children(_ref) { | ||
var width = _ref.width, | ||
height = _ref.height; | ||
return jsxRuntime.jsx(Network$1, _objectSpread2({ | ||
width: width, | ||
height: height | ||
}, props)); | ||
} | ||
}); | ||
}; | ||
var NetworkCanvas = function NetworkCanvas(props) { | ||
var width = props.width, | ||
height = props.height, | ||
partialMargin = props.margin, | ||
pixelRatio = props.pixelRatio, | ||
rawNodes = props.nodes, | ||
rawLinks = props.links, | ||
linkDistance = props.linkDistance, | ||
repulsivity = props.repulsivity, | ||
distanceMin = props.distanceMin, | ||
distanceMax = props.distanceMax, | ||
iterations = props.iterations, | ||
layers = props.layers, | ||
nodeColor = props.nodeColor, | ||
nodeBorderWidth = props.nodeBorderWidth, | ||
nodeBorderColor = props.nodeBorderColor, | ||
linkThickness = props.linkThickness, | ||
linkColor = props.linkColor, | ||
isInteractive = props.isInteractive, | ||
tooltip$1 = props.tooltip, | ||
onClick = props.onClick; | ||
var canvasEl = react.useRef(null); | ||
var _useDimensions = core.useDimensions(width, height, partialMargin), | ||
margin = _useDimensions.margin, | ||
innerWidth = _useDimensions.innerWidth, | ||
innerHeight = _useDimensions.innerHeight, | ||
outerWidth = _useDimensions.outerWidth, | ||
outerHeight = _useDimensions.outerHeight; | ||
var _useNetwork = useNetwork({ | ||
nodes: rawNodes, | ||
links: rawLinks, | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
iterations: iterations, | ||
center: [innerWidth / 2, innerHeight / 2] | ||
}), | ||
_useNetwork2 = _slicedToArray(_useNetwork, 2), | ||
nodes = _useNetwork2[0], | ||
links = _useNetwork2[1]; | ||
var theme = core.useTheme(); | ||
var getNodeColor = useNodeColor(nodeColor); | ||
var getBorderColor = colors.useInheritedColor(nodeBorderColor, theme); | ||
var getLinkThickness = useLinkThickness(linkThickness); | ||
var getLinkColor = colors.useInheritedColor(linkColor, theme); | ||
react.useEffect(function () { | ||
canvasEl.current.width = outerWidth * pixelRatio; | ||
canvasEl.current.height = outerHeight * pixelRatio; | ||
var ctx = canvasEl.current.getContext('2d'); | ||
ctx.scale(pixelRatio, pixelRatio); | ||
ctx.fillStyle = theme.background; | ||
ctx.fillRect(0, 0, outerWidth, outerHeight); | ||
ctx.translate(margin.left, margin.top); | ||
layers.forEach(function (layer) { | ||
if (layer === 'links') { | ||
links.forEach(function (link) { | ||
ctx.strokeStyle = getLinkColor(link); | ||
ctx.lineWidth = getLinkThickness(link); | ||
ctx.beginPath(); | ||
ctx.moveTo(link.source.x, link.source.y); | ||
ctx.lineTo(link.target.x, link.target.y); | ||
ctx.stroke(); | ||
}); | ||
} else if (layer === 'nodes') { | ||
nodes.forEach(function (node) { | ||
ctx.fillStyle = getNodeColor(node); | ||
ctx.beginPath(); | ||
ctx.arc(node.x, node.y, node.radius, 0, 2 * Math.PI); | ||
ctx.fill(); | ||
if (nodeBorderWidth > 0) { | ||
ctx.strokeStyle = getBorderColor(node); | ||
ctx.lineWidth = nodeBorderWidth; | ||
ctx.stroke(); | ||
} | ||
}); | ||
} else if (typeof layer === 'function') { | ||
layer(ctx, _objectSpread2(_objectSpread2({}, props), {}, { | ||
nodes: nodes, | ||
links: links | ||
})); | ||
} | ||
}); | ||
}, [canvasEl, outerWidth, outerHeight, layers, theme, nodes, links, getNodeColor, nodeBorderWidth, getBorderColor, getLinkThickness, getLinkColor]); | ||
var getNodeFromMouseEvent = react.useCallback(function (event) { | ||
if (!canvasEl.current) return null; | ||
var _getRelativeCursor = core.getRelativeCursor(canvasEl.current, event), | ||
_getRelativeCursor2 = _slicedToArray(_getRelativeCursor, 2), | ||
x = _getRelativeCursor2[0], | ||
y = _getRelativeCursor2[1]; | ||
return nodes.find(function (node) { | ||
var distanceFromNode = core.getDistance(node.x, node.y, x - margin.left, y - margin.top); | ||
return distanceFromNode <= node.radius; | ||
}); | ||
}, [canvasEl, margin, nodes]); | ||
var _useTooltip = tooltip.useTooltip(), | ||
showTooltipFromEvent = _useTooltip.showTooltipFromEvent, | ||
hideTooltip = _useTooltip.hideTooltip; | ||
var handleMouseHover = react.useCallback(function (event) { | ||
var node = getNodeFromMouseEvent(event); | ||
if (node) { | ||
showTooltipFromEvent(jsxRuntime.jsx(NetworkNodeTooltip$1, { | ||
node: node, | ||
tooltip: tooltip$1 | ||
}), event); | ||
} else { | ||
hideTooltip(); | ||
} | ||
}, [getNodeFromMouseEvent, showTooltipFromEvent, tooltip$1, hideTooltip]); | ||
var handleMouseLeave = react.useCallback(function () { | ||
hideTooltip(); | ||
}, [hideTooltip]); | ||
var handleClick = react.useCallback(function (event) { | ||
if (!onClick) return; | ||
var node = getNodeFromMouseEvent(event); | ||
if (node) { | ||
onClick(node, event); | ||
} | ||
}, [getNodeFromMouseEvent, onClick]); | ||
return jsxRuntime.jsx("canvas", { | ||
ref: canvasEl, | ||
width: outerWidth * pixelRatio, | ||
height: outerHeight * pixelRatio, | ||
style: { | ||
width: outerWidth, | ||
height: outerHeight, | ||
cursor: isInteractive ? 'auto' : 'normal' | ||
}, | ||
onClick: isInteractive ? handleClick : undefined, | ||
onMouseEnter: isInteractive ? handleMouseHover : undefined, | ||
onMouseLeave: isInteractive ? handleMouseLeave : undefined, | ||
onMouseMove: isInteractive ? handleMouseHover : undefined | ||
}); | ||
}; | ||
NetworkCanvas.defaultProps = NetworkCanvasDefaultProps; | ||
var NetworkCanvas$1 = core.withContainer(NetworkCanvas); | ||
var ResponsiveNetworkCanvas = function ResponsiveNetworkCanvas(props) { | ||
return jsxRuntime.jsx(core.ResponsiveWrapper, { | ||
children: function children(_ref) { | ||
var width = _ref.width, | ||
height = _ref.height; | ||
return jsxRuntime.jsx(NetworkCanvas$1, _objectSpread2({ | ||
width: width, | ||
height: height | ||
}, props)); | ||
} | ||
}); | ||
}; | ||
exports.Network = Network$1; | ||
exports.NetworkCanvas = NetworkCanvas$1; | ||
exports.NetworkCanvasDefaultProps = NetworkCanvasDefaultProps; | ||
exports.NetworkCanvasPropTypes = NetworkCanvasPropTypes; | ||
exports.NetworkDefaultProps = NetworkDefaultProps; | ||
exports.NetworkPropTypes = NetworkPropTypes; | ||
exports.ResponsiveNetwork = ResponsiveNetwork; | ||
exports.ResponsiveNetworkCanvas = ResponsiveNetworkCanvas; | ||
exports.useLinkThickness = useLinkThickness; | ||
exports.useNetwork = useNetwork; | ||
exports.useNodeColor = useNodeColor; | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@nivo/core"),i=require("@nivo/colors"),n=require("@nivo/tooltip"),t=require("prop-types"),o=require("lodash/get"),u=require("lodash/isString"),s=require("lodash/isNumber"),a=require("d3-force"),d=require("react-motion"),l=require("react/jsx-runtime");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=c(t),p=c(o),h=c(u),k=c(s);function v(){return v=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var i=arguments[r];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n])}return e},v.apply(this,arguments)}function y(e,r){if(null==e)return{};var i,n,t={},o=Object.keys(e);for(n=0;n<o.length;n++)i=o[n],r.indexOf(i)>=0||(t[i]=e[i]);return t}var g={nodes:f.default.arrayOf(f.default.shape({id:f.default.string.isRequired})).isRequired,links:f.default.arrayOf(f.default.shape({source:f.default.string.isRequired,target:f.default.string.isRequired})).isRequired,layers:f.default.arrayOf(f.default.oneOfType([f.default.oneOf(["links","nodes"]),f.default.func])).isRequired,linkDistance:f.default.oneOfType([f.default.string,f.default.func,f.default.number]).isRequired,repulsivity:f.default.number.isRequired,distanceMin:f.default.number.isRequired,distanceMax:f.default.number.isRequired,iterations:f.default.number.isRequired,nodeColor:f.default.oneOfType([f.default.string,f.default.func]).isRequired,nodeBorderWidth:f.default.oneOfType([f.default.number,f.default.func]).isRequired,nodeBorderColor:i.inheritedColorPropType.isRequired,linkThickness:f.default.oneOfType([f.default.number,f.default.func]).isRequired,linkColor:i.inheritedColorPropType.isRequired,isInteractive:f.default.bool.isRequired,onClick:f.default.func},m=v({},g,{role:f.default.string.isRequired},r.motionPropTypes),x=v({pixelRatio:f.default.number.isRequired},g),q={layers:["links","nodes"],linkDistance:30,repulsivity:10,distanceMin:1,distanceMax:1/0,iterations:90,nodeBorderWidth:0,nodeBorderColor:{from:"color"},linkThickness:1,linkColor:{from:"source.color"},isInteractive:!0},R=v({},q,{animate:!0,motionStiffness:90,motionDamping:15,role:"img"}),C=v({},q,{pixelRatio:"undefined"!=typeof window&&window.devicePixelRatio||1}),b=function(r){var i=r.nodes,n=r.links,t=r.linkDistance,o=r.repulsivity,u=r.distanceMin,s=r.distanceMax,d=r.center,l=r.iterations,c=e.useState([]),f=c[0],y=c[1],g=e.useState([]),m=g[0],x=g[1];return e.useEffect((function(){var e=function(e){var r,i=e.linkDistance,n=e.repulsivity,t=e.distanceMin,o=e.distanceMax,u=e.center;return"function"==typeof i||k.default(i)?r=i:h.default(i)&&(r=function(e){return p.default(e,i)}),{link:a.forceLink().id((function(e){return e.id})).distance(r),charge:a.forceManyBody().strength(-n).distanceMin(t).distanceMax(o),center:a.forceCenter(u[0],u[1])}}({linkDistance:t,repulsivity:o,distanceMin:u,distanceMax:s,center:d}),r=i.map((function(e){return v({},e)})),c=n.map((function(e){return v({id:e.source+"."+e.target},e)})),g=a.forceSimulation(r).force("link",e.link.links(c)).force("charge",e.charge).force("center",e.center).stop();return g.tick(l),y(r),x(c.map((function(e){return e.previousSource=f.find((function(r){return r.id===e.source.id})),e.previousTarget=f.find((function(r){return r.id===e.target.id})),e}))),function(){g.stop()}}),[i,n,t,o,u,s,l,d[0],d[1]]),[f,m]},T=function(r){return e.useMemo((function(){return"function"==typeof r?r:function(){return r}}),[r])},M=function(r){return e.useMemo((function(){return"function"==typeof r?r:function(){return r}}),[r])},w=function(e){var r=e.node,i=e.x,n=e.y,t=e.radius,o=e.color,u=e.borderWidth,s=e.borderColor,a=e.scale,d=void 0===a?1:a,c=e.handleNodeClick,f=e.handleNodeHover,p=e.handleNodeLeave;return l.jsx("circle",{transform:"translate("+i+","+n+") scale("+d+")",r:t,fill:o,strokeWidth:u,stroke:s,onClick:function(e){return c(r,e)},onMouseEnter:function(e){return f(r,e)},onMouseMove:function(e){return f(r,e)},onMouseLeave:p})};w.propTypes={node:f.default.object.isRequired,x:f.default.number.isRequired,y:f.default.number.isRequired,radius:f.default.number.isRequired,color:f.default.string.isRequired,borderWidth:f.default.number.isRequired,borderColor:f.default.string.isRequired,scale:f.default.number,handleNodeHover:f.default.func.isRequired,handleNodeLeave:f.default.func.isRequired};var j=e.memo(w),N=["nodes","color","borderColor"],W=function(e){var r=e.style;return{x:r.x.val,y:r.y.val,radius:r.radius.val,scale:0}},D=function(e){return function(r){var i=r.style;return{x:i.x,y:i.y,radius:i.radius,scale:d.spring(0,e)}}},O=function(e){var i=e.nodes,n=e.color,t=e.borderColor,o=y(e,N),u=r.useMotionConfig().springConfig;return l.jsx(d.TransitionMotion,{willEnter:W,willLeave:D(u),styles:i.map((function(e){return{key:e.id,data:e,style:{x:d.spring(e.x,u),y:d.spring(e.y,u),radius:d.spring(e.radius,u),scale:d.spring(1,u)}}})),children:function(e){return l.jsx(l.Fragment,{children:e.map((function(e){var r=e.key,i=e.style,u=e.data;return l.jsx(j,v({node:u,x:i.x,y:i.y,radius:Math.max(i.radius,0),color:n(u),borderColor:t(u),scale:Math.max(i.scale,0)},o),r)}))})}})};O.propTypes={nodes:f.default.array.isRequired,color:f.default.func.isRequired,borderWidth:f.default.number.isRequired,borderColor:f.default.func.isRequired,handleNodeHover:f.default.func.isRequired,handleNodeLeave:f.default.func.isRequired};var P=e.memo(O),S=["nodes","color","borderColor"],X=function(e){var r=e.nodes,i=e.color,n=e.borderColor,t=y(e,S);return r.map((function(e){return l.jsx(j,v({node:e,x:e.x,y:e.y,radius:e.radius,color:i(e),borderColor:n(e)},t),e.id)}))};X.propTypes={nodes:f.default.array.isRequired,color:f.default.func.isRequired,borderWidth:f.default.number.isRequired,borderColor:f.default.func.isRequired,handleNodeHover:f.default.func.isRequired,handleNodeLeave:f.default.func.isRequired};var Y=e.memo(X),E=function(e){var r=e.sourceX,i=e.sourceY,n=e.targetX,t=e.targetY,o=e.thickness,u=e.color;return l.jsx("line",{stroke:u,strokeWidth:o,strokeLinecap:"round",x1:r,y1:i,x2:n,y2:t})};E.propTypes={link:f.default.object.isRequired,sourceX:f.default.number.isRequired,sourceY:f.default.number.isRequired,targetX:f.default.number.isRequired,targetY:f.default.number.isRequired,thickness:f.default.number.isRequired,color:f.default.string.isRequired};var L=e.memo(E),B=function(e){var r=e.style,i=e.data,n=i.previousSource?i.previousSource.x:r.sourceX.val,t=i.previousSource?i.previousSource.y:r.sourceY.val;return{sourceX:n,sourceY:t,targetX:n,targetY:t}},H=function(e){var i=e.links,n=e.linkThickness,t=e.linkColor,o=r.useMotionConfig().springConfig;return l.jsx(d.TransitionMotion,{willEnter:B,styles:i.map((function(e){return{key:e.id,data:e,style:{sourceX:d.spring(e.source.x,o),sourceY:d.spring(e.source.y,o),targetX:d.spring(e.target.x,o),targetY:d.spring(e.target.y,o)}}})),children:function(e){return l.jsx(l.Fragment,{children:e.map((function(e){var r=e.key,i=e.style,o=e.data;return l.jsx(L,{link:o,color:t(o),thickness:n(o),sourceX:i.sourceX,sourceY:i.sourceY,targetX:i.targetX,targetY:i.targetY},r)}))})}})};H.propTypes={links:f.default.array.isRequired,linkThickness:f.default.func.isRequired,linkColor:f.default.func.isRequired};var I=e.memo(H),F=function(e){var r=e.links,i=e.linkThickness,n=e.linkColor;return r.map((function(e){return l.jsx(L,{link:e,color:n(e),thickness:i(e),sourceX:e.source.x,sourceY:e.source.y,targetX:e.target.x,targetY:e.target.y},e.id)}))};F.propTypes={links:f.default.array.isRequired,linkThickness:f.default.func.isRequired,linkColor:f.default.func.isRequired};var _=e.memo(F),z=function(e){var r=e.node,i=e.format,t=e.tooltip;return l.jsx(n.BasicTooltip,{id:r.id,enableChip:!0,color:r.color,format:i,renderContent:"function"==typeof t?t.bind(null,v({},r)):null})};z.propTypes={node:f.default.shape({id:f.default.string.isRequired,color:f.default.string.isRequired}).isRequired,format:f.default.func,tooltip:f.default.func};var A=e.memo(z),G=function(t){var o=t.width,u=t.height,s=t.margin,a=t.nodes,d=t.links,c=t.linkDistance,f=t.repulsivity,p=t.distanceMin,h=t.distanceMax,k=t.iterations,y=t.layers,g=t.nodeColor,m=t.nodeBorderWidth,x=t.nodeBorderColor,q=t.linkThickness,R=t.linkColor,C=t.tooltip,w=t.isInteractive,j=t.onClick,N=t.role,W=r.useDimensions(o,u,s),D=W.margin,O=W.innerWidth,S=W.innerHeight,X=W.outerWidth,E=W.outerHeight,L=r.useMotionConfig().animate,B=r.useTheme(),H=T(g),F=i.useInheritedColor(x,B),z=M(q),G=i.useInheritedColor(R,B),J=b({nodes:a,links:d,linkDistance:c,repulsivity:f,distanceMin:p,distanceMax:h,iterations:k,center:[O/2,S/2]}),K=J[0],Q=J[1],U=n.useTooltip(),V=U.showTooltipFromEvent,Z=U.hideTooltip,$=e.useCallback((function(e,r){V(l.jsx(A,{node:e,tooltip:C}),r)}),[V,C]),ee=e.useCallback((function(){Z()}),[Z]),re={links:e.createElement(!0===L?I:_,{key:"links",links:Q,linkThickness:z,linkColor:G}),nodes:e.createElement(!0===L?P:Y,{key:"nodes",nodes:K,color:H,borderWidth:m,borderColor:F,handleNodeClick:w?j:void 0,handleNodeHover:w?$:void 0,handleNodeLeave:w?ee:void 0})};return l.jsx(r.SvgWrapper,{width:X,height:E,margin:D,role:N,children:y.map((function(r,i){return"function"==typeof r?l.jsx(e.Fragment,{children:r(v({},t,{innerWidth:O,innerHeight:S,nodes:K,links:Q}))},i):re[r]}))})};G.propTypes=m,G.defaultProps=R;var J=r.withContainer(G),K=function(t){var o=t.width,u=t.height,s=t.margin,a=t.pixelRatio,d=t.nodes,c=t.links,f=t.linkDistance,p=t.repulsivity,h=t.distanceMin,k=t.distanceMax,y=t.iterations,g=t.layers,m=t.nodeColor,x=t.nodeBorderWidth,q=t.nodeBorderColor,R=t.linkThickness,C=t.linkColor,w=t.isInteractive,j=t.tooltip,N=t.onClick,W=e.useRef(null),D=r.useDimensions(o,u,s),O=D.margin,P=D.innerWidth,S=D.innerHeight,X=D.outerWidth,Y=D.outerHeight,E=b({nodes:d,links:c,linkDistance:f,repulsivity:p,distanceMin:h,distanceMax:k,iterations:y,center:[P/2,S/2]}),L=E[0],B=E[1],H=r.useTheme(),I=T(m),F=i.useInheritedColor(q,H),_=M(R),z=i.useInheritedColor(C,H);e.useEffect((function(){W.current.width=X*a,W.current.height=Y*a;var e=W.current.getContext("2d");e.scale(a,a),e.fillStyle=H.background,e.fillRect(0,0,X,Y),e.translate(O.left,O.top),g.forEach((function(r){"links"===r?B.forEach((function(r){e.strokeStyle=z(r),e.lineWidth=_(r),e.beginPath(),e.moveTo(r.source.x,r.source.y),e.lineTo(r.target.x,r.target.y),e.stroke()})):"nodes"===r?L.forEach((function(r){e.fillStyle=I(r),e.beginPath(),e.arc(r.x,r.y,r.radius,0,2*Math.PI),e.fill(),x>0&&(e.strokeStyle=F(r),e.lineWidth=x,e.stroke())})):"function"==typeof r&&r(e,v({},t,{nodes:L,links:B}))}))}),[W,X,Y,g,H,L,B,I,x,F,_,z]);var G=e.useCallback((function(e){if(!W.current)return null;var i=r.getRelativeCursor(W.current,e),n=i[0],t=i[1];return L.find((function(e){return r.getDistance(e.x,e.y,n-O.left,t-O.top)<=e.radius}))}),[W,O,L]),J=n.useTooltip(),K=J.showTooltipFromEvent,Q=J.hideTooltip,U=e.useCallback((function(e){var r=G(e);r?K(l.jsx(A,{node:r,tooltip:j}),e):Q()}),[G,K,j,Q]),V=e.useCallback((function(){Q()}),[Q]),Z=e.useCallback((function(e){if(N){var r=G(e);r&&N(r,e)}}),[G,N]);return l.jsx("canvas",{ref:W,width:X*a,height:Y*a,style:{width:X,height:Y,cursor:w?"auto":"normal"},onClick:w?Z:void 0,onMouseEnter:w?U:void 0,onMouseLeave:w?V:void 0,onMouseMove:w?U:void 0})};K.propTypes=x,K.defaultProps=C;var Q=r.withContainer(K);exports.Network=J,exports.NetworkCanvas=Q,exports.NetworkCanvasDefaultProps=C,exports.NetworkCanvasPropTypes=x,exports.NetworkDefaultProps=R,exports.NetworkPropTypes=m,exports.ResponsiveNetwork=function(e){return l.jsx(r.ResponsiveWrapper,{children:function(r){var i=r.width,n=r.height;return l.jsx(J,v({width:i,height:n},e))}})},exports.ResponsiveNetworkCanvas=function(e){return l.jsx(r.ResponsiveWrapper,{children:function(r){var i=r.width,n=r.height;return l.jsx(Q,v({width:i,height:n},e))}})},exports.useLinkThickness=M,exports.useNetwork=b,exports.useNodeColor=T; | ||
//# sourceMappingURL=nivo-network.cjs.js.map |
@@ -1,772 +0,2 @@ | ||
import { useState, useEffect, useMemo, memo, useCallback, createElement, Fragment as Fragment$1, useRef } from 'react'; | ||
import { motionPropTypes, useMotionConfig, withContainer, useDimensions, useTheme, SvgWrapper, ResponsiveWrapper, getRelativeCursor, getDistance } from '@nivo/core'; | ||
import { inheritedColorPropType, useInheritedColor } from '@nivo/colors'; | ||
import { BasicTooltip, useTooltip } from '@nivo/tooltip'; | ||
import PropTypes from 'prop-types'; | ||
import get from 'lodash/get'; | ||
import isString from 'lodash/isString'; | ||
import isNumber from 'lodash/isNumber'; | ||
import { forceSimulation, forceLink, forceManyBody, forceCenter } from 'd3-force'; | ||
import { TransitionMotion, spring } from 'react-motion'; | ||
import { jsx, Fragment } from 'react/jsx-runtime'; | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function ownKeys(object, enumerableOnly) { | ||
var keys = Object.keys(object); | ||
if (Object.getOwnPropertySymbols) { | ||
var symbols = Object.getOwnPropertySymbols(object); | ||
if (enumerableOnly) symbols = symbols.filter(function (sym) { | ||
return Object.getOwnPropertyDescriptor(object, sym).enumerable; | ||
}); | ||
keys.push.apply(keys, symbols); | ||
} | ||
return keys; | ||
} | ||
function _objectSpread2(target) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
var source = arguments[i] != null ? arguments[i] : {}; | ||
if (i % 2) { | ||
ownKeys(Object(source), true).forEach(function (key) { | ||
_defineProperty(target, key, source[key]); | ||
}); | ||
} else if (Object.getOwnPropertyDescriptors) { | ||
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); | ||
} else { | ||
ownKeys(Object(source)).forEach(function (key) { | ||
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); | ||
}); | ||
} | ||
} | ||
return target; | ||
} | ||
function _arrayWithHoles(arr) { | ||
if (Array.isArray(arr)) return arr; | ||
} | ||
function _iterableToArrayLimit(arr, i) { | ||
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; | ||
var _arr = []; | ||
var _n = true; | ||
var _d = false; | ||
var _e = undefined; | ||
try { | ||
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { | ||
_arr.push(_s.value); | ||
if (i && _arr.length === i) break; | ||
} | ||
} catch (err) { | ||
_d = true; | ||
_e = err; | ||
} finally { | ||
try { | ||
if (!_n && _i["return"] != null) _i["return"](); | ||
} finally { | ||
if (_d) throw _e; | ||
} | ||
} | ||
return _arr; | ||
} | ||
function _arrayLikeToArray(arr, len) { | ||
if (len == null || len > arr.length) len = arr.length; | ||
for (var i = 0, arr2 = new Array(len); i < len; i++) { | ||
arr2[i] = arr[i]; | ||
} | ||
return arr2; | ||
} | ||
function _unsupportedIterableToArray(o, minLen) { | ||
if (!o) return; | ||
if (typeof o === "string") return _arrayLikeToArray(o, minLen); | ||
var n = Object.prototype.toString.call(o).slice(8, -1); | ||
if (n === "Object" && o.constructor) n = o.constructor.name; | ||
if (n === "Map" || n === "Set") return Array.from(o); | ||
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); | ||
} | ||
function _nonIterableRest() { | ||
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); | ||
} | ||
function _slicedToArray(arr, i) { | ||
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); | ||
} | ||
var commonPropTypes = { | ||
nodes: PropTypes.arrayOf(PropTypes.shape({ | ||
id: PropTypes.string.isRequired | ||
})).isRequired, | ||
links: PropTypes.arrayOf(PropTypes.shape({ | ||
source: PropTypes.string.isRequired, | ||
target: PropTypes.string.isRequired | ||
})).isRequired, | ||
layers: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf(['links', 'nodes']), PropTypes.func])).isRequired, | ||
linkDistance: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.number]).isRequired, | ||
repulsivity: PropTypes.number.isRequired, | ||
distanceMin: PropTypes.number.isRequired, | ||
distanceMax: PropTypes.number.isRequired, | ||
iterations: PropTypes.number.isRequired, | ||
nodeColor: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired, | ||
nodeBorderWidth: PropTypes.oneOfType([PropTypes.number, PropTypes.func]).isRequired, | ||
nodeBorderColor: inheritedColorPropType.isRequired, | ||
linkThickness: PropTypes.oneOfType([PropTypes.number, PropTypes.func]).isRequired, | ||
linkColor: inheritedColorPropType.isRequired, | ||
isInteractive: PropTypes.bool.isRequired, | ||
onClick: PropTypes.func | ||
}; | ||
var NetworkPropTypes = _objectSpread2(_objectSpread2({}, commonPropTypes), {}, { | ||
role: PropTypes.string.isRequired | ||
}, motionPropTypes); | ||
var NetworkCanvasPropTypes = _objectSpread2({ | ||
pixelRatio: PropTypes.number.isRequired | ||
}, commonPropTypes); | ||
var commonDefaultProps = { | ||
layers: ['links', 'nodes'], | ||
linkDistance: 30, | ||
repulsivity: 10, | ||
distanceMin: 1, | ||
distanceMax: Infinity, | ||
iterations: 90, | ||
nodeBorderWidth: 0, | ||
nodeBorderColor: { | ||
from: 'color' | ||
}, | ||
linkThickness: 1, | ||
linkColor: { | ||
from: 'source.color' | ||
}, | ||
isInteractive: true | ||
}; | ||
var NetworkDefaultProps = _objectSpread2(_objectSpread2({}, commonDefaultProps), {}, { | ||
animate: true, | ||
motionStiffness: 90, | ||
motionDamping: 15, | ||
role: 'img' | ||
}); | ||
var NetworkCanvasDefaultProps = _objectSpread2(_objectSpread2({}, commonDefaultProps), {}, { | ||
pixelRatio: typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1 | ||
}); | ||
var computeForces = function computeForces(_ref) { | ||
var linkDistance = _ref.linkDistance, | ||
repulsivity = _ref.repulsivity, | ||
distanceMin = _ref.distanceMin, | ||
distanceMax = _ref.distanceMax, | ||
center = _ref.center; | ||
var computedLinkDistance; | ||
if (typeof linkDistance === 'function') { | ||
computedLinkDistance = linkDistance; | ||
} else if (isNumber(linkDistance)) { | ||
computedLinkDistance = linkDistance; | ||
} else if (isString(linkDistance)) { | ||
computedLinkDistance = function computedLinkDistance(link) { | ||
return get(link, linkDistance); | ||
}; | ||
} | ||
var linkForce = forceLink().id(function (d) { | ||
return d.id; | ||
}).distance(computedLinkDistance); | ||
var chargeForce = forceManyBody().strength(-repulsivity).distanceMin(distanceMin).distanceMax(distanceMax); | ||
var centerForce = forceCenter(center[0], center[1]); | ||
return { | ||
link: linkForce, | ||
charge: chargeForce, | ||
center: centerForce | ||
}; | ||
}; | ||
var useNetwork = function useNetwork(_ref2) { | ||
var nodes = _ref2.nodes, | ||
links = _ref2.links, | ||
linkDistance = _ref2.linkDistance, | ||
repulsivity = _ref2.repulsivity, | ||
distanceMin = _ref2.distanceMin, | ||
distanceMax = _ref2.distanceMax, | ||
center = _ref2.center, | ||
iterations = _ref2.iterations; | ||
var _useState = useState([]), | ||
_useState2 = _slicedToArray(_useState, 2), | ||
currentNodes = _useState2[0], | ||
setCurrentNodes = _useState2[1]; | ||
var _useState3 = useState([]), | ||
_useState4 = _slicedToArray(_useState3, 2), | ||
currentLinks = _useState4[0], | ||
setCurrentLinks = _useState4[1]; | ||
useEffect(function () { | ||
var forces = computeForces({ | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
center: center | ||
}); | ||
var nodesCopy = nodes.map(function (node) { | ||
return _objectSpread2({}, node); | ||
}); | ||
var linksCopy = links.map(function (link) { | ||
return _objectSpread2({ | ||
id: "".concat(link.source, ".").concat(link.target) | ||
}, link); | ||
}); | ||
var simulation = forceSimulation(nodesCopy).force('link', forces.link.links(linksCopy)).force('charge', forces.charge).force('center', forces.center).stop(); | ||
simulation.tick(iterations); | ||
setCurrentNodes(nodesCopy); | ||
setCurrentLinks(linksCopy.map(function (link) { | ||
link.previousSource = currentNodes.find(function (n) { | ||
return n.id === link.source.id; | ||
}); | ||
link.previousTarget = currentNodes.find(function (n) { | ||
return n.id === link.target.id; | ||
}); | ||
return link; | ||
})); | ||
return function () { | ||
simulation.stop(); | ||
}; | ||
}, [nodes, links, linkDistance, repulsivity, distanceMin, distanceMax, iterations, center[0], center[1]]); | ||
return [currentNodes, currentLinks]; | ||
}; | ||
var useNodeColor = function useNodeColor(color) { | ||
return useMemo(function () { | ||
if (typeof color === 'function') return color; | ||
return function () { | ||
return color; | ||
}; | ||
}, [color]); | ||
}; | ||
var useLinkThickness = function useLinkThickness(thickness) { | ||
return useMemo(function () { | ||
if (typeof thickness === 'function') return thickness; | ||
return function () { | ||
return thickness; | ||
}; | ||
}, [thickness]); | ||
}; | ||
function _objectWithoutPropertiesLoose(source, excluded) { | ||
if (source == null) return {}; | ||
var target = {}; | ||
var sourceKeys = Object.keys(source); | ||
var key, i; | ||
for (i = 0; i < sourceKeys.length; i++) { | ||
key = sourceKeys[i]; | ||
if (excluded.indexOf(key) >= 0) continue; | ||
target[key] = source[key]; | ||
} | ||
return target; | ||
} | ||
function _objectWithoutProperties(source, excluded) { | ||
if (source == null) return {}; | ||
var target = _objectWithoutPropertiesLoose(source, excluded); | ||
var key, i; | ||
if (Object.getOwnPropertySymbols) { | ||
var sourceSymbolKeys = Object.getOwnPropertySymbols(source); | ||
for (i = 0; i < sourceSymbolKeys.length; i++) { | ||
key = sourceSymbolKeys[i]; | ||
if (excluded.indexOf(key) >= 0) continue; | ||
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; | ||
target[key] = source[key]; | ||
} | ||
} | ||
return target; | ||
} | ||
var Node = function Node(_ref) { | ||
var node = _ref.node, | ||
x = _ref.x, | ||
y = _ref.y, | ||
radius = _ref.radius, | ||
color = _ref.color, | ||
borderWidth = _ref.borderWidth, | ||
borderColor = _ref.borderColor, | ||
_ref$scale = _ref.scale, | ||
scale = _ref$scale === void 0 ? 1 : _ref$scale, | ||
handleNodeClick = _ref.handleNodeClick, | ||
handleNodeHover = _ref.handleNodeHover, | ||
handleNodeLeave = _ref.handleNodeLeave; | ||
return jsx("circle", { | ||
transform: "translate(".concat(x, ",").concat(y, ") scale(").concat(scale, ")"), | ||
r: radius, | ||
fill: color, | ||
strokeWidth: borderWidth, | ||
stroke: borderColor, | ||
onClick: function onClick(event) { | ||
return handleNodeClick(node, event); | ||
}, | ||
onMouseEnter: function onMouseEnter(event) { | ||
return handleNodeHover(node, event); | ||
}, | ||
onMouseMove: function onMouseMove(event) { | ||
return handleNodeHover(node, event); | ||
}, | ||
onMouseLeave: handleNodeLeave | ||
}); | ||
}; | ||
var Node$1 = memo(Node); | ||
var willEnter = function willEnter(_ref) { | ||
var style = _ref.style; | ||
return { | ||
x: style.x.val, | ||
y: style.y.val, | ||
radius: style.radius.val, | ||
scale: 0 | ||
}; | ||
}; | ||
var willLeave = function willLeave(springConfig) { | ||
return function (_ref2) { | ||
var style = _ref2.style; | ||
return { | ||
x: style.x, | ||
y: style.y, | ||
radius: style.radius, | ||
scale: spring(0, springConfig) | ||
}; | ||
}; | ||
}; | ||
var AnimatedNodes = function AnimatedNodes(_ref3) { | ||
var nodes = _ref3.nodes, | ||
color = _ref3.color, | ||
borderColor = _ref3.borderColor, | ||
props = _objectWithoutProperties(_ref3, ["nodes", "color", "borderColor"]); | ||
var _useMotionConfig = useMotionConfig(), | ||
springConfig = _useMotionConfig.springConfig; | ||
return jsx(TransitionMotion, { | ||
willEnter: willEnter, | ||
willLeave: willLeave(springConfig), | ||
styles: nodes.map(function (node) { | ||
return { | ||
key: node.id, | ||
data: node, | ||
style: { | ||
x: spring(node.x, springConfig), | ||
y: spring(node.y, springConfig), | ||
radius: spring(node.radius, springConfig), | ||
scale: spring(1, springConfig) | ||
} | ||
}; | ||
}), | ||
children: function children(interpolatedStyles) { | ||
return jsx(Fragment, { | ||
children: interpolatedStyles.map(function (_ref4) { | ||
var key = _ref4.key, | ||
style = _ref4.style, | ||
node = _ref4.data; | ||
return jsx(Node$1, _objectSpread2({ | ||
node: node, | ||
x: style.x, | ||
y: style.y, | ||
radius: Math.max(style.radius, 0), | ||
color: color(node), | ||
borderColor: borderColor(node), | ||
scale: Math.max(style.scale, 0) | ||
}, props), key); | ||
}) | ||
}); | ||
} | ||
}); | ||
}; | ||
var AnimatedNodes$1 = memo(AnimatedNodes); | ||
var StaticNodes = function StaticNodes(_ref) { | ||
var nodes = _ref.nodes, | ||
color = _ref.color, | ||
borderColor = _ref.borderColor, | ||
props = _objectWithoutProperties(_ref, ["nodes", "color", "borderColor"]); | ||
return nodes.map(function (node) { | ||
return jsx(Node$1, _objectSpread2({ | ||
node: node, | ||
x: node.x, | ||
y: node.y, | ||
radius: node.radius, | ||
color: color(node), | ||
borderColor: borderColor(node) | ||
}, props), node.id); | ||
}); | ||
}; | ||
var StaticNodes$1 = memo(StaticNodes); | ||
var Link = function Link(_ref) { | ||
var sourceX = _ref.sourceX, | ||
sourceY = _ref.sourceY, | ||
targetX = _ref.targetX, | ||
targetY = _ref.targetY, | ||
thickness = _ref.thickness, | ||
color = _ref.color; | ||
return jsx("line", { | ||
stroke: color, | ||
strokeWidth: thickness, | ||
strokeLinecap: "round", | ||
x1: sourceX, | ||
y1: sourceY, | ||
x2: targetX, | ||
y2: targetY | ||
}); | ||
}; | ||
var Link$1 = memo(Link); | ||
var willEnter$1 = function willEnter(_ref) { | ||
var style = _ref.style, | ||
data = _ref.data; | ||
var sourceX = data.previousSource ? data.previousSource.x : style.sourceX.val; | ||
var sourceY = data.previousSource ? data.previousSource.y : style.sourceY.val; | ||
return { | ||
sourceX: sourceX, | ||
sourceY: sourceY, | ||
targetX: sourceX, | ||
targetY: sourceY | ||
}; | ||
}; | ||
var AnimatedLinks = function AnimatedLinks(_ref2) { | ||
var links = _ref2.links, | ||
linkThickness = _ref2.linkThickness, | ||
linkColor = _ref2.linkColor; | ||
var _useMotionConfig = useMotionConfig(), | ||
springConfig = _useMotionConfig.springConfig; | ||
return jsx(TransitionMotion, { | ||
willEnter: willEnter$1, | ||
styles: links.map(function (link) { | ||
return { | ||
key: link.id, | ||
data: link, | ||
style: { | ||
sourceX: spring(link.source.x, springConfig), | ||
sourceY: spring(link.source.y, springConfig), | ||
targetX: spring(link.target.x, springConfig), | ||
targetY: spring(link.target.y, springConfig) | ||
} | ||
}; | ||
}), | ||
children: function children(interpolatedStyles) { | ||
return jsx(Fragment, { | ||
children: interpolatedStyles.map(function (_ref3) { | ||
var key = _ref3.key, | ||
style = _ref3.style, | ||
link = _ref3.data; | ||
return jsx(Link$1, { | ||
link: link, | ||
color: linkColor(link), | ||
thickness: linkThickness(link), | ||
sourceX: style.sourceX, | ||
sourceY: style.sourceY, | ||
targetX: style.targetX, | ||
targetY: style.targetY | ||
}, key); | ||
}) | ||
}); | ||
} | ||
}); | ||
}; | ||
var AnimatedLinks$1 = memo(AnimatedLinks); | ||
var StaticLinks = function StaticLinks(_ref) { | ||
var links = _ref.links, | ||
linkThickness = _ref.linkThickness, | ||
linkColor = _ref.linkColor; | ||
return links.map(function (link) { | ||
return jsx(Link$1, { | ||
link: link, | ||
color: linkColor(link), | ||
thickness: linkThickness(link), | ||
sourceX: link.source.x, | ||
sourceY: link.source.y, | ||
targetX: link.target.x, | ||
targetY: link.target.y | ||
}, link.id); | ||
}); | ||
}; | ||
var StaticLinks$1 = memo(StaticLinks); | ||
var NetworkNodeTooltip = function NetworkNodeTooltip(_ref) { | ||
var node = _ref.node, | ||
format = _ref.format, | ||
tooltip = _ref.tooltip; | ||
return jsx(BasicTooltip, { | ||
id: node.id, | ||
enableChip: true, | ||
color: node.color, | ||
format: format, | ||
renderContent: typeof tooltip === 'function' ? tooltip.bind(null, _objectSpread2({}, node)) : null | ||
}); | ||
}; | ||
var NetworkNodeTooltip$1 = memo(NetworkNodeTooltip); | ||
var Network = function Network(props) { | ||
var width = props.width, | ||
height = props.height, | ||
partialMargin = props.margin, | ||
rawNodes = props.nodes, | ||
rawLinks = props.links, | ||
linkDistance = props.linkDistance, | ||
repulsivity = props.repulsivity, | ||
distanceMin = props.distanceMin, | ||
distanceMax = props.distanceMax, | ||
iterations = props.iterations, | ||
layers = props.layers, | ||
nodeColor = props.nodeColor, | ||
nodeBorderWidth = props.nodeBorderWidth, | ||
nodeBorderColor = props.nodeBorderColor, | ||
linkThickness = props.linkThickness, | ||
linkColor = props.linkColor, | ||
tooltip = props.tooltip, | ||
isInteractive = props.isInteractive, | ||
onClick = props.onClick, | ||
role = props.role; | ||
var _useDimensions = useDimensions(width, height, partialMargin), | ||
margin = _useDimensions.margin, | ||
innerWidth = _useDimensions.innerWidth, | ||
innerHeight = _useDimensions.innerHeight, | ||
outerWidth = _useDimensions.outerWidth, | ||
outerHeight = _useDimensions.outerHeight; | ||
var _useMotionConfig = useMotionConfig(), | ||
animate = _useMotionConfig.animate; | ||
var theme = useTheme(); | ||
var getColor = useNodeColor(nodeColor); | ||
var getBorderColor = useInheritedColor(nodeBorderColor, theme); | ||
var getLinkThickness = useLinkThickness(linkThickness); | ||
var getLinkColor = useInheritedColor(linkColor, theme); | ||
var _useNetwork = useNetwork({ | ||
nodes: rawNodes, | ||
links: rawLinks, | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
iterations: iterations, | ||
center: [innerWidth / 2, innerHeight / 2] | ||
}), | ||
_useNetwork2 = _slicedToArray(_useNetwork, 2), | ||
nodes = _useNetwork2[0], | ||
links = _useNetwork2[1]; | ||
var _useTooltip = useTooltip(), | ||
showTooltipFromEvent = _useTooltip.showTooltipFromEvent, | ||
hideTooltip = _useTooltip.hideTooltip; | ||
var handleNodeHover = useCallback(function (node, event) { | ||
showTooltipFromEvent(jsx(NetworkNodeTooltip$1, { | ||
node: node, | ||
tooltip: tooltip | ||
}), event); | ||
}, [showTooltipFromEvent, tooltip]); | ||
var handleNodeLeave = useCallback(function () { | ||
hideTooltip(); | ||
}, [hideTooltip]); | ||
var layerById = { | ||
links: createElement(animate === true ? AnimatedLinks$1 : StaticLinks$1, { | ||
key: 'links', | ||
links: links, | ||
linkThickness: getLinkThickness, | ||
linkColor: getLinkColor | ||
}), | ||
nodes: createElement(animate === true ? AnimatedNodes$1 : StaticNodes$1, { | ||
key: 'nodes', | ||
nodes: nodes, | ||
color: getColor, | ||
borderWidth: nodeBorderWidth, | ||
borderColor: getBorderColor, | ||
handleNodeClick: isInteractive ? onClick : undefined, | ||
handleNodeHover: isInteractive ? handleNodeHover : undefined, | ||
handleNodeLeave: isInteractive ? handleNodeLeave : undefined | ||
}) | ||
}; | ||
return jsx(SvgWrapper, { | ||
width: outerWidth, | ||
height: outerHeight, | ||
margin: margin, | ||
role: role, | ||
children: layers.map(function (layer, i) { | ||
if (typeof layer === 'function') { | ||
return jsx(Fragment$1, { | ||
children: layer(_objectSpread2(_objectSpread2({}, props), {}, { | ||
innerWidth: innerWidth, | ||
innerHeight: innerHeight, | ||
nodes: nodes, | ||
links: links | ||
})) | ||
}, i); | ||
} | ||
return layerById[layer]; | ||
}) | ||
}); | ||
}; | ||
Network.defaultProps = NetworkDefaultProps; | ||
var Network$1 = withContainer(Network); | ||
var ResponsiveNetwork = function ResponsiveNetwork(props) { | ||
return jsx(ResponsiveWrapper, { | ||
children: function children(_ref) { | ||
var width = _ref.width, | ||
height = _ref.height; | ||
return jsx(Network$1, _objectSpread2({ | ||
width: width, | ||
height: height | ||
}, props)); | ||
} | ||
}); | ||
}; | ||
var NetworkCanvas = function NetworkCanvas(props) { | ||
var width = props.width, | ||
height = props.height, | ||
partialMargin = props.margin, | ||
pixelRatio = props.pixelRatio, | ||
rawNodes = props.nodes, | ||
rawLinks = props.links, | ||
linkDistance = props.linkDistance, | ||
repulsivity = props.repulsivity, | ||
distanceMin = props.distanceMin, | ||
distanceMax = props.distanceMax, | ||
iterations = props.iterations, | ||
layers = props.layers, | ||
nodeColor = props.nodeColor, | ||
nodeBorderWidth = props.nodeBorderWidth, | ||
nodeBorderColor = props.nodeBorderColor, | ||
linkThickness = props.linkThickness, | ||
linkColor = props.linkColor, | ||
isInteractive = props.isInteractive, | ||
tooltip = props.tooltip, | ||
onClick = props.onClick; | ||
var canvasEl = useRef(null); | ||
var _useDimensions = useDimensions(width, height, partialMargin), | ||
margin = _useDimensions.margin, | ||
innerWidth = _useDimensions.innerWidth, | ||
innerHeight = _useDimensions.innerHeight, | ||
outerWidth = _useDimensions.outerWidth, | ||
outerHeight = _useDimensions.outerHeight; | ||
var _useNetwork = useNetwork({ | ||
nodes: rawNodes, | ||
links: rawLinks, | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
iterations: iterations, | ||
center: [innerWidth / 2, innerHeight / 2] | ||
}), | ||
_useNetwork2 = _slicedToArray(_useNetwork, 2), | ||
nodes = _useNetwork2[0], | ||
links = _useNetwork2[1]; | ||
var theme = useTheme(); | ||
var getNodeColor = useNodeColor(nodeColor); | ||
var getBorderColor = useInheritedColor(nodeBorderColor, theme); | ||
var getLinkThickness = useLinkThickness(linkThickness); | ||
var getLinkColor = useInheritedColor(linkColor, theme); | ||
useEffect(function () { | ||
canvasEl.current.width = outerWidth * pixelRatio; | ||
canvasEl.current.height = outerHeight * pixelRatio; | ||
var ctx = canvasEl.current.getContext('2d'); | ||
ctx.scale(pixelRatio, pixelRatio); | ||
ctx.fillStyle = theme.background; | ||
ctx.fillRect(0, 0, outerWidth, outerHeight); | ||
ctx.translate(margin.left, margin.top); | ||
layers.forEach(function (layer) { | ||
if (layer === 'links') { | ||
links.forEach(function (link) { | ||
ctx.strokeStyle = getLinkColor(link); | ||
ctx.lineWidth = getLinkThickness(link); | ||
ctx.beginPath(); | ||
ctx.moveTo(link.source.x, link.source.y); | ||
ctx.lineTo(link.target.x, link.target.y); | ||
ctx.stroke(); | ||
}); | ||
} else if (layer === 'nodes') { | ||
nodes.forEach(function (node) { | ||
ctx.fillStyle = getNodeColor(node); | ||
ctx.beginPath(); | ||
ctx.arc(node.x, node.y, node.radius, 0, 2 * Math.PI); | ||
ctx.fill(); | ||
if (nodeBorderWidth > 0) { | ||
ctx.strokeStyle = getBorderColor(node); | ||
ctx.lineWidth = nodeBorderWidth; | ||
ctx.stroke(); | ||
} | ||
}); | ||
} else if (typeof layer === 'function') { | ||
layer(ctx, _objectSpread2(_objectSpread2({}, props), {}, { | ||
nodes: nodes, | ||
links: links | ||
})); | ||
} | ||
}); | ||
}, [canvasEl, outerWidth, outerHeight, layers, theme, nodes, links, getNodeColor, nodeBorderWidth, getBorderColor, getLinkThickness, getLinkColor]); | ||
var getNodeFromMouseEvent = useCallback(function (event) { | ||
if (!canvasEl.current) return null; | ||
var _getRelativeCursor = getRelativeCursor(canvasEl.current, event), | ||
_getRelativeCursor2 = _slicedToArray(_getRelativeCursor, 2), | ||
x = _getRelativeCursor2[0], | ||
y = _getRelativeCursor2[1]; | ||
return nodes.find(function (node) { | ||
var distanceFromNode = getDistance(node.x, node.y, x - margin.left, y - margin.top); | ||
return distanceFromNode <= node.radius; | ||
}); | ||
}, [canvasEl, margin, nodes]); | ||
var _useTooltip = useTooltip(), | ||
showTooltipFromEvent = _useTooltip.showTooltipFromEvent, | ||
hideTooltip = _useTooltip.hideTooltip; | ||
var handleMouseHover = useCallback(function (event) { | ||
var node = getNodeFromMouseEvent(event); | ||
if (node) { | ||
showTooltipFromEvent(jsx(NetworkNodeTooltip$1, { | ||
node: node, | ||
tooltip: tooltip | ||
}), event); | ||
} else { | ||
hideTooltip(); | ||
} | ||
}, [getNodeFromMouseEvent, showTooltipFromEvent, tooltip, hideTooltip]); | ||
var handleMouseLeave = useCallback(function () { | ||
hideTooltip(); | ||
}, [hideTooltip]); | ||
var handleClick = useCallback(function (event) { | ||
if (!onClick) return; | ||
var node = getNodeFromMouseEvent(event); | ||
if (node) { | ||
onClick(node, event); | ||
} | ||
}, [getNodeFromMouseEvent, onClick]); | ||
return jsx("canvas", { | ||
ref: canvasEl, | ||
width: outerWidth * pixelRatio, | ||
height: outerHeight * pixelRatio, | ||
style: { | ||
width: outerWidth, | ||
height: outerHeight, | ||
cursor: isInteractive ? 'auto' : 'normal' | ||
}, | ||
onClick: isInteractive ? handleClick : undefined, | ||
onMouseEnter: isInteractive ? handleMouseHover : undefined, | ||
onMouseLeave: isInteractive ? handleMouseLeave : undefined, | ||
onMouseMove: isInteractive ? handleMouseHover : undefined | ||
}); | ||
}; | ||
NetworkCanvas.defaultProps = NetworkCanvasDefaultProps; | ||
var NetworkCanvas$1 = withContainer(NetworkCanvas); | ||
var ResponsiveNetworkCanvas = function ResponsiveNetworkCanvas(props) { | ||
return jsx(ResponsiveWrapper, { | ||
children: function children(_ref) { | ||
var width = _ref.width, | ||
height = _ref.height; | ||
return jsx(NetworkCanvas$1, _objectSpread2({ | ||
width: width, | ||
height: height | ||
}, props)); | ||
} | ||
}); | ||
}; | ||
export { Network$1 as Network, NetworkCanvas$1 as NetworkCanvas, NetworkCanvasDefaultProps, NetworkCanvasPropTypes, NetworkDefaultProps, NetworkPropTypes, ResponsiveNetwork, ResponsiveNetworkCanvas, useLinkThickness, useNetwork, useNodeColor }; | ||
import{useState as e,useEffect as r,useMemo as i,memo as n,useCallback as o,createElement as t,Fragment as s,useRef as u}from"react";import{motionPropTypes as d,useMotionConfig as a,withContainer as c,useDimensions as l,useTheme as f,SvgWrapper as h,ResponsiveWrapper as p,getRelativeCursor as v,getDistance as k}from"@nivo/core";import{inheritedColorPropType as y,useInheritedColor as m}from"@nivo/colors";import{BasicTooltip as g,useTooltip as R}from"@nivo/tooltip";import q from"prop-types";import b from"lodash/get";import x from"lodash/isString";import C from"lodash/isNumber";import{forceSimulation as M,forceLink as T,forceManyBody as w,forceCenter as W}from"d3-force";import{TransitionMotion as N,spring as X}from"react-motion";import{jsx as Y,Fragment as O}from"react/jsx-runtime";function S(){return S=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var i=arguments[r];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n])}return e},S.apply(this,arguments)}function D(e,r){if(null==e)return{};var i,n,o={},t=Object.keys(e);for(n=0;n<t.length;n++)i=t[n],r.indexOf(i)>=0||(o[i]=e[i]);return o}var H={nodes:q.arrayOf(q.shape({id:q.string.isRequired})).isRequired,links:q.arrayOf(q.shape({source:q.string.isRequired,target:q.string.isRequired})).isRequired,layers:q.arrayOf(q.oneOfType([q.oneOf(["links","nodes"]),q.func])).isRequired,linkDistance:q.oneOfType([q.string,q.func,q.number]).isRequired,repulsivity:q.number.isRequired,distanceMin:q.number.isRequired,distanceMax:q.number.isRequired,iterations:q.number.isRequired,nodeColor:q.oneOfType([q.string,q.func]).isRequired,nodeBorderWidth:q.oneOfType([q.number,q.func]).isRequired,nodeBorderColor:y.isRequired,linkThickness:q.oneOfType([q.number,q.func]).isRequired,linkColor:y.isRequired,isInteractive:q.bool.isRequired,onClick:q.func},E=S({},H,{role:q.string.isRequired},d),L=S({pixelRatio:q.number.isRequired},H),B={layers:["links","nodes"],linkDistance:30,repulsivity:10,distanceMin:1,distanceMax:1/0,iterations:90,nodeBorderWidth:0,nodeBorderColor:{from:"color"},linkThickness:1,linkColor:{from:"source.color"},isInteractive:!0},P=S({},B,{animate:!0,motionStiffness:90,motionDamping:15,role:"img"}),j=S({},B,{pixelRatio:"undefined"!=typeof window&&window.devicePixelRatio||1}),I=function(i){var n=i.nodes,o=i.links,t=i.linkDistance,s=i.repulsivity,u=i.distanceMin,d=i.distanceMax,a=i.center,c=i.iterations,l=e([]),f=l[0],h=l[1],p=e([]),v=p[0],k=p[1];return r((function(){var e=function(e){var r,i=e.linkDistance,n=e.repulsivity,o=e.distanceMin,t=e.distanceMax,s=e.center;return"function"==typeof i||C(i)?r=i:x(i)&&(r=function(e){return b(e,i)}),{link:T().id((function(e){return e.id})).distance(r),charge:w().strength(-n).distanceMin(o).distanceMax(t),center:W(s[0],s[1])}}({linkDistance:t,repulsivity:s,distanceMin:u,distanceMax:d,center:a}),r=n.map((function(e){return S({},e)})),i=o.map((function(e){return S({id:e.source+"."+e.target},e)})),l=M(r).force("link",e.link.links(i)).force("charge",e.charge).force("center",e.center).stop();return l.tick(c),h(r),k(i.map((function(e){return e.previousSource=f.find((function(r){return r.id===e.source.id})),e.previousTarget=f.find((function(r){return r.id===e.target.id})),e}))),function(){l.stop()}}),[n,o,t,s,u,d,c,a[0],a[1]]),[f,v]},F=function(e){return i((function(){return"function"==typeof e?e:function(){return e}}),[e])},z=function(e){return i((function(){return"function"==typeof e?e:function(){return e}}),[e])},A=function(e){var r=e.node,i=e.x,n=e.y,o=e.radius,t=e.color,s=e.borderWidth,u=e.borderColor,d=e.scale,a=void 0===d?1:d,c=e.handleNodeClick,l=e.handleNodeHover,f=e.handleNodeLeave;return Y("circle",{transform:"translate("+i+","+n+") scale("+a+")",r:o,fill:t,strokeWidth:s,stroke:u,onClick:function(e){return c(r,e)},onMouseEnter:function(e){return l(r,e)},onMouseMove:function(e){return l(r,e)},onMouseLeave:f})};A.propTypes={node:q.object.isRequired,x:q.number.isRequired,y:q.number.isRequired,radius:q.number.isRequired,color:q.string.isRequired,borderWidth:q.number.isRequired,borderColor:q.string.isRequired,scale:q.number,handleNodeHover:q.func.isRequired,handleNodeLeave:q.func.isRequired};var G=n(A),J=["nodes","color","borderColor"],K=function(e){var r=e.style;return{x:r.x.val,y:r.y.val,radius:r.radius.val,scale:0}},Q=function(e){return function(r){var i=r.style;return{x:i.x,y:i.y,radius:i.radius,scale:X(0,e)}}},U=function(e){var r=e.nodes,i=e.color,n=e.borderColor,o=D(e,J),t=a().springConfig;return Y(N,{willEnter:K,willLeave:Q(t),styles:r.map((function(e){return{key:e.id,data:e,style:{x:X(e.x,t),y:X(e.y,t),radius:X(e.radius,t),scale:X(1,t)}}})),children:function(e){return Y(O,{children:e.map((function(e){var r=e.key,t=e.style,s=e.data;return Y(G,S({node:s,x:t.x,y:t.y,radius:Math.max(t.radius,0),color:i(s),borderColor:n(s),scale:Math.max(t.scale,0)},o),r)}))})}})};U.propTypes={nodes:q.array.isRequired,color:q.func.isRequired,borderWidth:q.number.isRequired,borderColor:q.func.isRequired,handleNodeHover:q.func.isRequired,handleNodeLeave:q.func.isRequired};var V=n(U),Z=["nodes","color","borderColor"],$=function(e){var r=e.nodes,i=e.color,n=e.borderColor,o=D(e,Z);return r.map((function(e){return Y(G,S({node:e,x:e.x,y:e.y,radius:e.radius,color:i(e),borderColor:n(e)},o),e.id)}))};$.propTypes={nodes:q.array.isRequired,color:q.func.isRequired,borderWidth:q.number.isRequired,borderColor:q.func.isRequired,handleNodeHover:q.func.isRequired,handleNodeLeave:q.func.isRequired};var _=n($),ee=function(e){var r=e.sourceX,i=e.sourceY,n=e.targetX,o=e.targetY,t=e.thickness,s=e.color;return Y("line",{stroke:s,strokeWidth:t,strokeLinecap:"round",x1:r,y1:i,x2:n,y2:o})};ee.propTypes={link:q.object.isRequired,sourceX:q.number.isRequired,sourceY:q.number.isRequired,targetX:q.number.isRequired,targetY:q.number.isRequired,thickness:q.number.isRequired,color:q.string.isRequired};var re=n(ee),ie=function(e){var r=e.style,i=e.data,n=i.previousSource?i.previousSource.x:r.sourceX.val,o=i.previousSource?i.previousSource.y:r.sourceY.val;return{sourceX:n,sourceY:o,targetX:n,targetY:o}},ne=function(e){var r=e.links,i=e.linkThickness,n=e.linkColor,o=a().springConfig;return Y(N,{willEnter:ie,styles:r.map((function(e){return{key:e.id,data:e,style:{sourceX:X(e.source.x,o),sourceY:X(e.source.y,o),targetX:X(e.target.x,o),targetY:X(e.target.y,o)}}})),children:function(e){return Y(O,{children:e.map((function(e){var r=e.key,o=e.style,t=e.data;return Y(re,{link:t,color:n(t),thickness:i(t),sourceX:o.sourceX,sourceY:o.sourceY,targetX:o.targetX,targetY:o.targetY},r)}))})}})};ne.propTypes={links:q.array.isRequired,linkThickness:q.func.isRequired,linkColor:q.func.isRequired};var oe=n(ne),te=function(e){var r=e.links,i=e.linkThickness,n=e.linkColor;return r.map((function(e){return Y(re,{link:e,color:n(e),thickness:i(e),sourceX:e.source.x,sourceY:e.source.y,targetX:e.target.x,targetY:e.target.y},e.id)}))};te.propTypes={links:q.array.isRequired,linkThickness:q.func.isRequired,linkColor:q.func.isRequired};var se=n(te),ue=function(e){var r=e.node,i=e.format,n=e.tooltip;return Y(g,{id:r.id,enableChip:!0,color:r.color,format:i,renderContent:"function"==typeof n?n.bind(null,S({},r)):null})};ue.propTypes={node:q.shape({id:q.string.isRequired,color:q.string.isRequired}).isRequired,format:q.func,tooltip:q.func};var de=n(ue),ae=function(e){var r=e.width,i=e.height,n=e.margin,u=e.nodes,d=e.links,c=e.linkDistance,p=e.repulsivity,v=e.distanceMin,k=e.distanceMax,y=e.iterations,g=e.layers,q=e.nodeColor,b=e.nodeBorderWidth,x=e.nodeBorderColor,C=e.linkThickness,M=e.linkColor,T=e.tooltip,w=e.isInteractive,W=e.onClick,N=e.role,X=l(r,i,n),O=X.margin,D=X.innerWidth,H=X.innerHeight,E=X.outerWidth,L=X.outerHeight,B=a().animate,P=f(),j=F(q),A=m(x,P),G=z(C),J=m(M,P),K=I({nodes:u,links:d,linkDistance:c,repulsivity:p,distanceMin:v,distanceMax:k,iterations:y,center:[D/2,H/2]}),Q=K[0],U=K[1],Z=R(),$=Z.showTooltipFromEvent,ee=Z.hideTooltip,re=o((function(e,r){$(Y(de,{node:e,tooltip:T}),r)}),[$,T]),ie=o((function(){ee()}),[ee]),ne={links:t(!0===B?oe:se,{key:"links",links:U,linkThickness:G,linkColor:J}),nodes:t(!0===B?V:_,{key:"nodes",nodes:Q,color:j,borderWidth:b,borderColor:A,handleNodeClick:w?W:void 0,handleNodeHover:w?re:void 0,handleNodeLeave:w?ie:void 0})};return Y(h,{width:E,height:L,margin:O,role:N,children:g.map((function(r,i){return"function"==typeof r?Y(s,{children:r(S({},e,{innerWidth:D,innerHeight:H,nodes:Q,links:U}))},i):ne[r]}))})};ae.propTypes=E,ae.defaultProps=P;var ce=c(ae),le=function(e){return Y(p,{children:function(r){var i=r.width,n=r.height;return Y(ce,S({width:i,height:n},e))}})},fe=function(e){var i=e.width,n=e.height,t=e.margin,s=e.pixelRatio,d=e.nodes,a=e.links,c=e.linkDistance,h=e.repulsivity,p=e.distanceMin,y=e.distanceMax,g=e.iterations,q=e.layers,b=e.nodeColor,x=e.nodeBorderWidth,C=e.nodeBorderColor,M=e.linkThickness,T=e.linkColor,w=e.isInteractive,W=e.tooltip,N=e.onClick,X=u(null),O=l(i,n,t),D=O.margin,H=O.innerWidth,E=O.innerHeight,L=O.outerWidth,B=O.outerHeight,P=I({nodes:d,links:a,linkDistance:c,repulsivity:h,distanceMin:p,distanceMax:y,iterations:g,center:[H/2,E/2]}),j=P[0],A=P[1],G=f(),J=F(b),K=m(C,G),Q=z(M),U=m(T,G);r((function(){X.current.width=L*s,X.current.height=B*s;var r=X.current.getContext("2d");r.scale(s,s),r.fillStyle=G.background,r.fillRect(0,0,L,B),r.translate(D.left,D.top),q.forEach((function(i){"links"===i?A.forEach((function(e){r.strokeStyle=U(e),r.lineWidth=Q(e),r.beginPath(),r.moveTo(e.source.x,e.source.y),r.lineTo(e.target.x,e.target.y),r.stroke()})):"nodes"===i?j.forEach((function(e){r.fillStyle=J(e),r.beginPath(),r.arc(e.x,e.y,e.radius,0,2*Math.PI),r.fill(),x>0&&(r.strokeStyle=K(e),r.lineWidth=x,r.stroke())})):"function"==typeof i&&i(r,S({},e,{nodes:j,links:A}))}))}),[X,L,B,q,G,j,A,J,x,K,Q,U]);var V=o((function(e){if(!X.current)return null;var r=v(X.current,e),i=r[0],n=r[1];return j.find((function(e){return k(e.x,e.y,i-D.left,n-D.top)<=e.radius}))}),[X,D,j]),Z=R(),$=Z.showTooltipFromEvent,_=Z.hideTooltip,ee=o((function(e){var r=V(e);r?$(Y(de,{node:r,tooltip:W}),e):_()}),[V,$,W,_]),re=o((function(){_()}),[_]),ie=o((function(e){if(N){var r=V(e);r&&N(r,e)}}),[V,N]);return Y("canvas",{ref:X,width:L*s,height:B*s,style:{width:L,height:B,cursor:w?"auto":"normal"},onClick:w?ie:void 0,onMouseEnter:w?ee:void 0,onMouseLeave:w?re:void 0,onMouseMove:w?ee:void 0})};fe.propTypes=L,fe.defaultProps=j;var he=c(fe),pe=function(e){return Y(p,{children:function(r){var i=r.width,n=r.height;return Y(he,S({width:i,height:n},e))}})};export{ce as Network,he as NetworkCanvas,j as NetworkCanvasDefaultProps,L as NetworkCanvasPropTypes,P as NetworkDefaultProps,E as NetworkPropTypes,le as ResponsiveNetwork,pe as ResponsiveNetworkCanvas,z as useLinkThickness,I as useNetwork,F as useNodeColor}; | ||
//# sourceMappingURL=nivo-network.es.js.map |
@@ -1,785 +0,2 @@ | ||
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@nivo/core'), require('@nivo/colors'), require('@nivo/tooltip'), require('prop-types'), require('lodash/get'), require('lodash/isString'), require('lodash/isNumber'), require('d3-force'), require('react-motion'), require('react/jsx-runtime')) : | ||
typeof define === 'function' && define.amd ? define(['exports', 'react', '@nivo/core', '@nivo/colors', '@nivo/tooltip', 'prop-types', 'lodash/get', 'lodash/isString', 'lodash/isNumber', 'd3-force', 'react-motion', 'react/jsx-runtime'], factory) : | ||
(global = global || self, factory(global.nivo = global.nivo || {}, global.React, global.nivo, global.nivo, global.nivo, global.PropTypes, global['lodash/get'], global['lodash/isString'], global['lodash/isNumber'], global.d3, global.ReactMotion, global['react/jsx-runtime'])); | ||
}(this, (function (exports, react, core, colors, tooltip, PropTypes, get, isString, isNumber, d3Force, reactMotion, jsxRuntime) { 'use strict'; | ||
PropTypes = PropTypes && Object.prototype.hasOwnProperty.call(PropTypes, 'default') ? PropTypes['default'] : PropTypes; | ||
get = get && Object.prototype.hasOwnProperty.call(get, 'default') ? get['default'] : get; | ||
isString = isString && Object.prototype.hasOwnProperty.call(isString, 'default') ? isString['default'] : isString; | ||
isNumber = isNumber && Object.prototype.hasOwnProperty.call(isNumber, 'default') ? isNumber['default'] : isNumber; | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
function ownKeys(object, enumerableOnly) { | ||
var keys = Object.keys(object); | ||
if (Object.getOwnPropertySymbols) { | ||
var symbols = Object.getOwnPropertySymbols(object); | ||
if (enumerableOnly) symbols = symbols.filter(function (sym) { | ||
return Object.getOwnPropertyDescriptor(object, sym).enumerable; | ||
}); | ||
keys.push.apply(keys, symbols); | ||
} | ||
return keys; | ||
} | ||
function _objectSpread2(target) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
var source = arguments[i] != null ? arguments[i] : {}; | ||
if (i % 2) { | ||
ownKeys(Object(source), true).forEach(function (key) { | ||
_defineProperty(target, key, source[key]); | ||
}); | ||
} else if (Object.getOwnPropertyDescriptors) { | ||
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); | ||
} else { | ||
ownKeys(Object(source)).forEach(function (key) { | ||
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); | ||
}); | ||
} | ||
} | ||
return target; | ||
} | ||
function _arrayWithHoles(arr) { | ||
if (Array.isArray(arr)) return arr; | ||
} | ||
function _iterableToArrayLimit(arr, i) { | ||
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; | ||
var _arr = []; | ||
var _n = true; | ||
var _d = false; | ||
var _e = undefined; | ||
try { | ||
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { | ||
_arr.push(_s.value); | ||
if (i && _arr.length === i) break; | ||
} | ||
} catch (err) { | ||
_d = true; | ||
_e = err; | ||
} finally { | ||
try { | ||
if (!_n && _i["return"] != null) _i["return"](); | ||
} finally { | ||
if (_d) throw _e; | ||
} | ||
} | ||
return _arr; | ||
} | ||
function _arrayLikeToArray(arr, len) { | ||
if (len == null || len > arr.length) len = arr.length; | ||
for (var i = 0, arr2 = new Array(len); i < len; i++) { | ||
arr2[i] = arr[i]; | ||
} | ||
return arr2; | ||
} | ||
function _unsupportedIterableToArray(o, minLen) { | ||
if (!o) return; | ||
if (typeof o === "string") return _arrayLikeToArray(o, minLen); | ||
var n = Object.prototype.toString.call(o).slice(8, -1); | ||
if (n === "Object" && o.constructor) n = o.constructor.name; | ||
if (n === "Map" || n === "Set") return Array.from(o); | ||
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); | ||
} | ||
function _nonIterableRest() { | ||
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); | ||
} | ||
function _slicedToArray(arr, i) { | ||
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); | ||
} | ||
var commonPropTypes = { | ||
nodes: PropTypes.arrayOf(PropTypes.shape({ | ||
id: PropTypes.string.isRequired | ||
})).isRequired, | ||
links: PropTypes.arrayOf(PropTypes.shape({ | ||
source: PropTypes.string.isRequired, | ||
target: PropTypes.string.isRequired | ||
})).isRequired, | ||
layers: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf(['links', 'nodes']), PropTypes.func])).isRequired, | ||
linkDistance: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.number]).isRequired, | ||
repulsivity: PropTypes.number.isRequired, | ||
distanceMin: PropTypes.number.isRequired, | ||
distanceMax: PropTypes.number.isRequired, | ||
iterations: PropTypes.number.isRequired, | ||
nodeColor: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired, | ||
nodeBorderWidth: PropTypes.oneOfType([PropTypes.number, PropTypes.func]).isRequired, | ||
nodeBorderColor: colors.inheritedColorPropType.isRequired, | ||
linkThickness: PropTypes.oneOfType([PropTypes.number, PropTypes.func]).isRequired, | ||
linkColor: colors.inheritedColorPropType.isRequired, | ||
isInteractive: PropTypes.bool.isRequired, | ||
onClick: PropTypes.func | ||
}; | ||
var NetworkPropTypes = _objectSpread2(_objectSpread2({}, commonPropTypes), {}, { | ||
role: PropTypes.string.isRequired | ||
}, core.motionPropTypes); | ||
var NetworkCanvasPropTypes = _objectSpread2({ | ||
pixelRatio: PropTypes.number.isRequired | ||
}, commonPropTypes); | ||
var commonDefaultProps = { | ||
layers: ['links', 'nodes'], | ||
linkDistance: 30, | ||
repulsivity: 10, | ||
distanceMin: 1, | ||
distanceMax: Infinity, | ||
iterations: 90, | ||
nodeBorderWidth: 0, | ||
nodeBorderColor: { | ||
from: 'color' | ||
}, | ||
linkThickness: 1, | ||
linkColor: { | ||
from: 'source.color' | ||
}, | ||
isInteractive: true | ||
}; | ||
var NetworkDefaultProps = _objectSpread2(_objectSpread2({}, commonDefaultProps), {}, { | ||
animate: true, | ||
motionStiffness: 90, | ||
motionDamping: 15, | ||
role: 'img' | ||
}); | ||
var NetworkCanvasDefaultProps = _objectSpread2(_objectSpread2({}, commonDefaultProps), {}, { | ||
pixelRatio: typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1 | ||
}); | ||
var computeForces = function computeForces(_ref) { | ||
var linkDistance = _ref.linkDistance, | ||
repulsivity = _ref.repulsivity, | ||
distanceMin = _ref.distanceMin, | ||
distanceMax = _ref.distanceMax, | ||
center = _ref.center; | ||
var computedLinkDistance; | ||
if (typeof linkDistance === 'function') { | ||
computedLinkDistance = linkDistance; | ||
} else if (isNumber(linkDistance)) { | ||
computedLinkDistance = linkDistance; | ||
} else if (isString(linkDistance)) { | ||
computedLinkDistance = function computedLinkDistance(link) { | ||
return get(link, linkDistance); | ||
}; | ||
} | ||
var linkForce = d3Force.forceLink().id(function (d) { | ||
return d.id; | ||
}).distance(computedLinkDistance); | ||
var chargeForce = d3Force.forceManyBody().strength(-repulsivity).distanceMin(distanceMin).distanceMax(distanceMax); | ||
var centerForce = d3Force.forceCenter(center[0], center[1]); | ||
return { | ||
link: linkForce, | ||
charge: chargeForce, | ||
center: centerForce | ||
}; | ||
}; | ||
var useNetwork = function useNetwork(_ref2) { | ||
var nodes = _ref2.nodes, | ||
links = _ref2.links, | ||
linkDistance = _ref2.linkDistance, | ||
repulsivity = _ref2.repulsivity, | ||
distanceMin = _ref2.distanceMin, | ||
distanceMax = _ref2.distanceMax, | ||
center = _ref2.center, | ||
iterations = _ref2.iterations; | ||
var _useState = react.useState([]), | ||
_useState2 = _slicedToArray(_useState, 2), | ||
currentNodes = _useState2[0], | ||
setCurrentNodes = _useState2[1]; | ||
var _useState3 = react.useState([]), | ||
_useState4 = _slicedToArray(_useState3, 2), | ||
currentLinks = _useState4[0], | ||
setCurrentLinks = _useState4[1]; | ||
react.useEffect(function () { | ||
var forces = computeForces({ | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
center: center | ||
}); | ||
var nodesCopy = nodes.map(function (node) { | ||
return _objectSpread2({}, node); | ||
}); | ||
var linksCopy = links.map(function (link) { | ||
return _objectSpread2({ | ||
id: "".concat(link.source, ".").concat(link.target) | ||
}, link); | ||
}); | ||
var simulation = d3Force.forceSimulation(nodesCopy).force('link', forces.link.links(linksCopy)).force('charge', forces.charge).force('center', forces.center).stop(); | ||
simulation.tick(iterations); | ||
setCurrentNodes(nodesCopy); | ||
setCurrentLinks(linksCopy.map(function (link) { | ||
link.previousSource = currentNodes.find(function (n) { | ||
return n.id === link.source.id; | ||
}); | ||
link.previousTarget = currentNodes.find(function (n) { | ||
return n.id === link.target.id; | ||
}); | ||
return link; | ||
})); | ||
return function () { | ||
simulation.stop(); | ||
}; | ||
}, [nodes, links, linkDistance, repulsivity, distanceMin, distanceMax, iterations, center[0], center[1]]); | ||
return [currentNodes, currentLinks]; | ||
}; | ||
var useNodeColor = function useNodeColor(color) { | ||
return react.useMemo(function () { | ||
if (typeof color === 'function') return color; | ||
return function () { | ||
return color; | ||
}; | ||
}, [color]); | ||
}; | ||
var useLinkThickness = function useLinkThickness(thickness) { | ||
return react.useMemo(function () { | ||
if (typeof thickness === 'function') return thickness; | ||
return function () { | ||
return thickness; | ||
}; | ||
}, [thickness]); | ||
}; | ||
function _objectWithoutPropertiesLoose(source, excluded) { | ||
if (source == null) return {}; | ||
var target = {}; | ||
var sourceKeys = Object.keys(source); | ||
var key, i; | ||
for (i = 0; i < sourceKeys.length; i++) { | ||
key = sourceKeys[i]; | ||
if (excluded.indexOf(key) >= 0) continue; | ||
target[key] = source[key]; | ||
} | ||
return target; | ||
} | ||
function _objectWithoutProperties(source, excluded) { | ||
if (source == null) return {}; | ||
var target = _objectWithoutPropertiesLoose(source, excluded); | ||
var key, i; | ||
if (Object.getOwnPropertySymbols) { | ||
var sourceSymbolKeys = Object.getOwnPropertySymbols(source); | ||
for (i = 0; i < sourceSymbolKeys.length; i++) { | ||
key = sourceSymbolKeys[i]; | ||
if (excluded.indexOf(key) >= 0) continue; | ||
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; | ||
target[key] = source[key]; | ||
} | ||
} | ||
return target; | ||
} | ||
var Node = function Node(_ref) { | ||
var node = _ref.node, | ||
x = _ref.x, | ||
y = _ref.y, | ||
radius = _ref.radius, | ||
color = _ref.color, | ||
borderWidth = _ref.borderWidth, | ||
borderColor = _ref.borderColor, | ||
_ref$scale = _ref.scale, | ||
scale = _ref$scale === void 0 ? 1 : _ref$scale, | ||
handleNodeClick = _ref.handleNodeClick, | ||
handleNodeHover = _ref.handleNodeHover, | ||
handleNodeLeave = _ref.handleNodeLeave; | ||
return jsxRuntime.jsx("circle", { | ||
transform: "translate(".concat(x, ",").concat(y, ") scale(").concat(scale, ")"), | ||
r: radius, | ||
fill: color, | ||
strokeWidth: borderWidth, | ||
stroke: borderColor, | ||
onClick: function onClick(event) { | ||
return handleNodeClick(node, event); | ||
}, | ||
onMouseEnter: function onMouseEnter(event) { | ||
return handleNodeHover(node, event); | ||
}, | ||
onMouseMove: function onMouseMove(event) { | ||
return handleNodeHover(node, event); | ||
}, | ||
onMouseLeave: handleNodeLeave | ||
}); | ||
}; | ||
var Node$1 = react.memo(Node); | ||
var willEnter = function willEnter(_ref) { | ||
var style = _ref.style; | ||
return { | ||
x: style.x.val, | ||
y: style.y.val, | ||
radius: style.radius.val, | ||
scale: 0 | ||
}; | ||
}; | ||
var willLeave = function willLeave(springConfig) { | ||
return function (_ref2) { | ||
var style = _ref2.style; | ||
return { | ||
x: style.x, | ||
y: style.y, | ||
radius: style.radius, | ||
scale: reactMotion.spring(0, springConfig) | ||
}; | ||
}; | ||
}; | ||
var AnimatedNodes = function AnimatedNodes(_ref3) { | ||
var nodes = _ref3.nodes, | ||
color = _ref3.color, | ||
borderColor = _ref3.borderColor, | ||
props = _objectWithoutProperties(_ref3, ["nodes", "color", "borderColor"]); | ||
var _useMotionConfig = core.useMotionConfig(), | ||
springConfig = _useMotionConfig.springConfig; | ||
return jsxRuntime.jsx(reactMotion.TransitionMotion, { | ||
willEnter: willEnter, | ||
willLeave: willLeave(springConfig), | ||
styles: nodes.map(function (node) { | ||
return { | ||
key: node.id, | ||
data: node, | ||
style: { | ||
x: reactMotion.spring(node.x, springConfig), | ||
y: reactMotion.spring(node.y, springConfig), | ||
radius: reactMotion.spring(node.radius, springConfig), | ||
scale: reactMotion.spring(1, springConfig) | ||
} | ||
}; | ||
}), | ||
children: function children(interpolatedStyles) { | ||
return jsxRuntime.jsx(jsxRuntime.Fragment, { | ||
children: interpolatedStyles.map(function (_ref4) { | ||
var key = _ref4.key, | ||
style = _ref4.style, | ||
node = _ref4.data; | ||
return jsxRuntime.jsx(Node$1, _objectSpread2({ | ||
node: node, | ||
x: style.x, | ||
y: style.y, | ||
radius: Math.max(style.radius, 0), | ||
color: color(node), | ||
borderColor: borderColor(node), | ||
scale: Math.max(style.scale, 0) | ||
}, props), key); | ||
}) | ||
}); | ||
} | ||
}); | ||
}; | ||
var AnimatedNodes$1 = react.memo(AnimatedNodes); | ||
var StaticNodes = function StaticNodes(_ref) { | ||
var nodes = _ref.nodes, | ||
color = _ref.color, | ||
borderColor = _ref.borderColor, | ||
props = _objectWithoutProperties(_ref, ["nodes", "color", "borderColor"]); | ||
return nodes.map(function (node) { | ||
return jsxRuntime.jsx(Node$1, _objectSpread2({ | ||
node: node, | ||
x: node.x, | ||
y: node.y, | ||
radius: node.radius, | ||
color: color(node), | ||
borderColor: borderColor(node) | ||
}, props), node.id); | ||
}); | ||
}; | ||
var StaticNodes$1 = react.memo(StaticNodes); | ||
var Link = function Link(_ref) { | ||
var sourceX = _ref.sourceX, | ||
sourceY = _ref.sourceY, | ||
targetX = _ref.targetX, | ||
targetY = _ref.targetY, | ||
thickness = _ref.thickness, | ||
color = _ref.color; | ||
return jsxRuntime.jsx("line", { | ||
stroke: color, | ||
strokeWidth: thickness, | ||
strokeLinecap: "round", | ||
x1: sourceX, | ||
y1: sourceY, | ||
x2: targetX, | ||
y2: targetY | ||
}); | ||
}; | ||
var Link$1 = react.memo(Link); | ||
var willEnter$1 = function willEnter(_ref) { | ||
var style = _ref.style, | ||
data = _ref.data; | ||
var sourceX = data.previousSource ? data.previousSource.x : style.sourceX.val; | ||
var sourceY = data.previousSource ? data.previousSource.y : style.sourceY.val; | ||
return { | ||
sourceX: sourceX, | ||
sourceY: sourceY, | ||
targetX: sourceX, | ||
targetY: sourceY | ||
}; | ||
}; | ||
var AnimatedLinks = function AnimatedLinks(_ref2) { | ||
var links = _ref2.links, | ||
linkThickness = _ref2.linkThickness, | ||
linkColor = _ref2.linkColor; | ||
var _useMotionConfig = core.useMotionConfig(), | ||
springConfig = _useMotionConfig.springConfig; | ||
return jsxRuntime.jsx(reactMotion.TransitionMotion, { | ||
willEnter: willEnter$1, | ||
styles: links.map(function (link) { | ||
return { | ||
key: link.id, | ||
data: link, | ||
style: { | ||
sourceX: reactMotion.spring(link.source.x, springConfig), | ||
sourceY: reactMotion.spring(link.source.y, springConfig), | ||
targetX: reactMotion.spring(link.target.x, springConfig), | ||
targetY: reactMotion.spring(link.target.y, springConfig) | ||
} | ||
}; | ||
}), | ||
children: function children(interpolatedStyles) { | ||
return jsxRuntime.jsx(jsxRuntime.Fragment, { | ||
children: interpolatedStyles.map(function (_ref3) { | ||
var key = _ref3.key, | ||
style = _ref3.style, | ||
link = _ref3.data; | ||
return jsxRuntime.jsx(Link$1, { | ||
link: link, | ||
color: linkColor(link), | ||
thickness: linkThickness(link), | ||
sourceX: style.sourceX, | ||
sourceY: style.sourceY, | ||
targetX: style.targetX, | ||
targetY: style.targetY | ||
}, key); | ||
}) | ||
}); | ||
} | ||
}); | ||
}; | ||
var AnimatedLinks$1 = react.memo(AnimatedLinks); | ||
var StaticLinks = function StaticLinks(_ref) { | ||
var links = _ref.links, | ||
linkThickness = _ref.linkThickness, | ||
linkColor = _ref.linkColor; | ||
return links.map(function (link) { | ||
return jsxRuntime.jsx(Link$1, { | ||
link: link, | ||
color: linkColor(link), | ||
thickness: linkThickness(link), | ||
sourceX: link.source.x, | ||
sourceY: link.source.y, | ||
targetX: link.target.x, | ||
targetY: link.target.y | ||
}, link.id); | ||
}); | ||
}; | ||
var StaticLinks$1 = react.memo(StaticLinks); | ||
var NetworkNodeTooltip = function NetworkNodeTooltip(_ref) { | ||
var node = _ref.node, | ||
format = _ref.format, | ||
tooltip$1 = _ref.tooltip; | ||
return jsxRuntime.jsx(tooltip.BasicTooltip, { | ||
id: node.id, | ||
enableChip: true, | ||
color: node.color, | ||
format: format, | ||
renderContent: typeof tooltip$1 === 'function' ? tooltip$1.bind(null, _objectSpread2({}, node)) : null | ||
}); | ||
}; | ||
var NetworkNodeTooltip$1 = react.memo(NetworkNodeTooltip); | ||
var Network = function Network(props) { | ||
var width = props.width, | ||
height = props.height, | ||
partialMargin = props.margin, | ||
rawNodes = props.nodes, | ||
rawLinks = props.links, | ||
linkDistance = props.linkDistance, | ||
repulsivity = props.repulsivity, | ||
distanceMin = props.distanceMin, | ||
distanceMax = props.distanceMax, | ||
iterations = props.iterations, | ||
layers = props.layers, | ||
nodeColor = props.nodeColor, | ||
nodeBorderWidth = props.nodeBorderWidth, | ||
nodeBorderColor = props.nodeBorderColor, | ||
linkThickness = props.linkThickness, | ||
linkColor = props.linkColor, | ||
tooltip$1 = props.tooltip, | ||
isInteractive = props.isInteractive, | ||
onClick = props.onClick, | ||
role = props.role; | ||
var _useDimensions = core.useDimensions(width, height, partialMargin), | ||
margin = _useDimensions.margin, | ||
innerWidth = _useDimensions.innerWidth, | ||
innerHeight = _useDimensions.innerHeight, | ||
outerWidth = _useDimensions.outerWidth, | ||
outerHeight = _useDimensions.outerHeight; | ||
var _useMotionConfig = core.useMotionConfig(), | ||
animate = _useMotionConfig.animate; | ||
var theme = core.useTheme(); | ||
var getColor = useNodeColor(nodeColor); | ||
var getBorderColor = colors.useInheritedColor(nodeBorderColor, theme); | ||
var getLinkThickness = useLinkThickness(linkThickness); | ||
var getLinkColor = colors.useInheritedColor(linkColor, theme); | ||
var _useNetwork = useNetwork({ | ||
nodes: rawNodes, | ||
links: rawLinks, | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
iterations: iterations, | ||
center: [innerWidth / 2, innerHeight / 2] | ||
}), | ||
_useNetwork2 = _slicedToArray(_useNetwork, 2), | ||
nodes = _useNetwork2[0], | ||
links = _useNetwork2[1]; | ||
var _useTooltip = tooltip.useTooltip(), | ||
showTooltipFromEvent = _useTooltip.showTooltipFromEvent, | ||
hideTooltip = _useTooltip.hideTooltip; | ||
var handleNodeHover = react.useCallback(function (node, event) { | ||
showTooltipFromEvent(jsxRuntime.jsx(NetworkNodeTooltip$1, { | ||
node: node, | ||
tooltip: tooltip$1 | ||
}), event); | ||
}, [showTooltipFromEvent, tooltip$1]); | ||
var handleNodeLeave = react.useCallback(function () { | ||
hideTooltip(); | ||
}, [hideTooltip]); | ||
var layerById = { | ||
links: react.createElement(animate === true ? AnimatedLinks$1 : StaticLinks$1, { | ||
key: 'links', | ||
links: links, | ||
linkThickness: getLinkThickness, | ||
linkColor: getLinkColor | ||
}), | ||
nodes: react.createElement(animate === true ? AnimatedNodes$1 : StaticNodes$1, { | ||
key: 'nodes', | ||
nodes: nodes, | ||
color: getColor, | ||
borderWidth: nodeBorderWidth, | ||
borderColor: getBorderColor, | ||
handleNodeClick: isInteractive ? onClick : undefined, | ||
handleNodeHover: isInteractive ? handleNodeHover : undefined, | ||
handleNodeLeave: isInteractive ? handleNodeLeave : undefined | ||
}) | ||
}; | ||
return jsxRuntime.jsx(core.SvgWrapper, { | ||
width: outerWidth, | ||
height: outerHeight, | ||
margin: margin, | ||
role: role, | ||
children: layers.map(function (layer, i) { | ||
if (typeof layer === 'function') { | ||
return jsxRuntime.jsx(react.Fragment, { | ||
children: layer(_objectSpread2(_objectSpread2({}, props), {}, { | ||
innerWidth: innerWidth, | ||
innerHeight: innerHeight, | ||
nodes: nodes, | ||
links: links | ||
})) | ||
}, i); | ||
} | ||
return layerById[layer]; | ||
}) | ||
}); | ||
}; | ||
Network.defaultProps = NetworkDefaultProps; | ||
var Network$1 = core.withContainer(Network); | ||
var ResponsiveNetwork = function ResponsiveNetwork(props) { | ||
return jsxRuntime.jsx(core.ResponsiveWrapper, { | ||
children: function children(_ref) { | ||
var width = _ref.width, | ||
height = _ref.height; | ||
return jsxRuntime.jsx(Network$1, _objectSpread2({ | ||
width: width, | ||
height: height | ||
}, props)); | ||
} | ||
}); | ||
}; | ||
var NetworkCanvas = function NetworkCanvas(props) { | ||
var width = props.width, | ||
height = props.height, | ||
partialMargin = props.margin, | ||
pixelRatio = props.pixelRatio, | ||
rawNodes = props.nodes, | ||
rawLinks = props.links, | ||
linkDistance = props.linkDistance, | ||
repulsivity = props.repulsivity, | ||
distanceMin = props.distanceMin, | ||
distanceMax = props.distanceMax, | ||
iterations = props.iterations, | ||
layers = props.layers, | ||
nodeColor = props.nodeColor, | ||
nodeBorderWidth = props.nodeBorderWidth, | ||
nodeBorderColor = props.nodeBorderColor, | ||
linkThickness = props.linkThickness, | ||
linkColor = props.linkColor, | ||
isInteractive = props.isInteractive, | ||
tooltip$1 = props.tooltip, | ||
onClick = props.onClick; | ||
var canvasEl = react.useRef(null); | ||
var _useDimensions = core.useDimensions(width, height, partialMargin), | ||
margin = _useDimensions.margin, | ||
innerWidth = _useDimensions.innerWidth, | ||
innerHeight = _useDimensions.innerHeight, | ||
outerWidth = _useDimensions.outerWidth, | ||
outerHeight = _useDimensions.outerHeight; | ||
var _useNetwork = useNetwork({ | ||
nodes: rawNodes, | ||
links: rawLinks, | ||
linkDistance: linkDistance, | ||
repulsivity: repulsivity, | ||
distanceMin: distanceMin, | ||
distanceMax: distanceMax, | ||
iterations: iterations, | ||
center: [innerWidth / 2, innerHeight / 2] | ||
}), | ||
_useNetwork2 = _slicedToArray(_useNetwork, 2), | ||
nodes = _useNetwork2[0], | ||
links = _useNetwork2[1]; | ||
var theme = core.useTheme(); | ||
var getNodeColor = useNodeColor(nodeColor); | ||
var getBorderColor = colors.useInheritedColor(nodeBorderColor, theme); | ||
var getLinkThickness = useLinkThickness(linkThickness); | ||
var getLinkColor = colors.useInheritedColor(linkColor, theme); | ||
react.useEffect(function () { | ||
canvasEl.current.width = outerWidth * pixelRatio; | ||
canvasEl.current.height = outerHeight * pixelRatio; | ||
var ctx = canvasEl.current.getContext('2d'); | ||
ctx.scale(pixelRatio, pixelRatio); | ||
ctx.fillStyle = theme.background; | ||
ctx.fillRect(0, 0, outerWidth, outerHeight); | ||
ctx.translate(margin.left, margin.top); | ||
layers.forEach(function (layer) { | ||
if (layer === 'links') { | ||
links.forEach(function (link) { | ||
ctx.strokeStyle = getLinkColor(link); | ||
ctx.lineWidth = getLinkThickness(link); | ||
ctx.beginPath(); | ||
ctx.moveTo(link.source.x, link.source.y); | ||
ctx.lineTo(link.target.x, link.target.y); | ||
ctx.stroke(); | ||
}); | ||
} else if (layer === 'nodes') { | ||
nodes.forEach(function (node) { | ||
ctx.fillStyle = getNodeColor(node); | ||
ctx.beginPath(); | ||
ctx.arc(node.x, node.y, node.radius, 0, 2 * Math.PI); | ||
ctx.fill(); | ||
if (nodeBorderWidth > 0) { | ||
ctx.strokeStyle = getBorderColor(node); | ||
ctx.lineWidth = nodeBorderWidth; | ||
ctx.stroke(); | ||
} | ||
}); | ||
} else if (typeof layer === 'function') { | ||
layer(ctx, _objectSpread2(_objectSpread2({}, props), {}, { | ||
nodes: nodes, | ||
links: links | ||
})); | ||
} | ||
}); | ||
}, [canvasEl, outerWidth, outerHeight, layers, theme, nodes, links, getNodeColor, nodeBorderWidth, getBorderColor, getLinkThickness, getLinkColor]); | ||
var getNodeFromMouseEvent = react.useCallback(function (event) { | ||
if (!canvasEl.current) return null; | ||
var _getRelativeCursor = core.getRelativeCursor(canvasEl.current, event), | ||
_getRelativeCursor2 = _slicedToArray(_getRelativeCursor, 2), | ||
x = _getRelativeCursor2[0], | ||
y = _getRelativeCursor2[1]; | ||
return nodes.find(function (node) { | ||
var distanceFromNode = core.getDistance(node.x, node.y, x - margin.left, y - margin.top); | ||
return distanceFromNode <= node.radius; | ||
}); | ||
}, [canvasEl, margin, nodes]); | ||
var _useTooltip = tooltip.useTooltip(), | ||
showTooltipFromEvent = _useTooltip.showTooltipFromEvent, | ||
hideTooltip = _useTooltip.hideTooltip; | ||
var handleMouseHover = react.useCallback(function (event) { | ||
var node = getNodeFromMouseEvent(event); | ||
if (node) { | ||
showTooltipFromEvent(jsxRuntime.jsx(NetworkNodeTooltip$1, { | ||
node: node, | ||
tooltip: tooltip$1 | ||
}), event); | ||
} else { | ||
hideTooltip(); | ||
} | ||
}, [getNodeFromMouseEvent, showTooltipFromEvent, tooltip$1, hideTooltip]); | ||
var handleMouseLeave = react.useCallback(function () { | ||
hideTooltip(); | ||
}, [hideTooltip]); | ||
var handleClick = react.useCallback(function (event) { | ||
if (!onClick) return; | ||
var node = getNodeFromMouseEvent(event); | ||
if (node) { | ||
onClick(node, event); | ||
} | ||
}, [getNodeFromMouseEvent, onClick]); | ||
return jsxRuntime.jsx("canvas", { | ||
ref: canvasEl, | ||
width: outerWidth * pixelRatio, | ||
height: outerHeight * pixelRatio, | ||
style: { | ||
width: outerWidth, | ||
height: outerHeight, | ||
cursor: isInteractive ? 'auto' : 'normal' | ||
}, | ||
onClick: isInteractive ? handleClick : undefined, | ||
onMouseEnter: isInteractive ? handleMouseHover : undefined, | ||
onMouseLeave: isInteractive ? handleMouseLeave : undefined, | ||
onMouseMove: isInteractive ? handleMouseHover : undefined | ||
}); | ||
}; | ||
NetworkCanvas.defaultProps = NetworkCanvasDefaultProps; | ||
var NetworkCanvas$1 = core.withContainer(NetworkCanvas); | ||
var ResponsiveNetworkCanvas = function ResponsiveNetworkCanvas(props) { | ||
return jsxRuntime.jsx(core.ResponsiveWrapper, { | ||
children: function children(_ref) { | ||
var width = _ref.width, | ||
height = _ref.height; | ||
return jsxRuntime.jsx(NetworkCanvas$1, _objectSpread2({ | ||
width: width, | ||
height: height | ||
}, props)); | ||
} | ||
}); | ||
}; | ||
exports.Network = Network$1; | ||
exports.NetworkCanvas = NetworkCanvas$1; | ||
exports.NetworkCanvasDefaultProps = NetworkCanvasDefaultProps; | ||
exports.NetworkCanvasPropTypes = NetworkCanvasPropTypes; | ||
exports.NetworkDefaultProps = NetworkDefaultProps; | ||
exports.NetworkPropTypes = NetworkPropTypes; | ||
exports.ResponsiveNetwork = ResponsiveNetwork; | ||
exports.ResponsiveNetworkCanvas = ResponsiveNetworkCanvas; | ||
exports.useLinkThickness = useLinkThickness; | ||
exports.useNetwork = useNetwork; | ||
exports.useNodeColor = useNodeColor; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
}))); | ||
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("react"),require("@nivo/core"),require("@nivo/colors"),require("@nivo/tooltip"),require("prop-types"),require("lodash/get"),require("lodash/isString"),require("lodash/isNumber"),require("d3-force"),require("react-motion"),require("react/jsx-runtime")):"function"==typeof define&&define.amd?define(["exports","react","@nivo/core","@nivo/colors","@nivo/tooltip","prop-types","lodash/get","lodash/isString","lodash/isNumber","d3-force","react-motion","react/jsx-runtime"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).nivo=e.nivo||{},e.React,e.nivo,e.nivo,e.nivo,e.PropTypes,e["lodash/get"],e["lodash/isString"],e["lodash/isNumber"],e.d3,e.ReactMotion,e["react/jsx-runtime"])}(this,(function(e,r,i,n,t,o,u,s,a,d,l,c){"use strict";function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var p=f(o),h=f(u),v=f(s),k=f(a);function y(){return y=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var i=arguments[r];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n])}return e},y.apply(this,arguments)}function g(e,r){if(null==e)return{};var i,n,t={},o=Object.keys(e);for(n=0;n<o.length;n++)i=o[n],r.indexOf(i)>=0||(t[i]=e[i]);return t}var m={nodes:p.default.arrayOf(p.default.shape({id:p.default.string.isRequired})).isRequired,links:p.default.arrayOf(p.default.shape({source:p.default.string.isRequired,target:p.default.string.isRequired})).isRequired,layers:p.default.arrayOf(p.default.oneOfType([p.default.oneOf(["links","nodes"]),p.default.func])).isRequired,linkDistance:p.default.oneOfType([p.default.string,p.default.func,p.default.number]).isRequired,repulsivity:p.default.number.isRequired,distanceMin:p.default.number.isRequired,distanceMax:p.default.number.isRequired,iterations:p.default.number.isRequired,nodeColor:p.default.oneOfType([p.default.string,p.default.func]).isRequired,nodeBorderWidth:p.default.oneOfType([p.default.number,p.default.func]).isRequired,nodeBorderColor:n.inheritedColorPropType.isRequired,linkThickness:p.default.oneOfType([p.default.number,p.default.func]).isRequired,linkColor:n.inheritedColorPropType.isRequired,isInteractive:p.default.bool.isRequired,onClick:p.default.func},R=y({},m,{role:p.default.string.isRequired},i.motionPropTypes),q=y({pixelRatio:p.default.number.isRequired},m),x={layers:["links","nodes"],linkDistance:30,repulsivity:10,distanceMin:1,distanceMax:1/0,iterations:90,nodeBorderWidth:0,nodeBorderColor:{from:"color"},linkThickness:1,linkColor:{from:"source.color"},isInteractive:!0},C=y({},x,{animate:!0,motionStiffness:90,motionDamping:15,role:"img"}),b=y({},x,{pixelRatio:"undefined"!=typeof window&&window.devicePixelRatio||1}),T=function(e){var i=e.nodes,n=e.links,t=e.linkDistance,o=e.repulsivity,u=e.distanceMin,s=e.distanceMax,a=e.center,l=e.iterations,c=r.useState([]),f=c[0],p=c[1],g=r.useState([]),m=g[0],R=g[1];return r.useEffect((function(){var e=function(e){var r,i=e.linkDistance,n=e.repulsivity,t=e.distanceMin,o=e.distanceMax,u=e.center;return"function"==typeof i||k.default(i)?r=i:v.default(i)&&(r=function(e){return h.default(e,i)}),{link:d.forceLink().id((function(e){return e.id})).distance(r),charge:d.forceManyBody().strength(-n).distanceMin(t).distanceMax(o),center:d.forceCenter(u[0],u[1])}}({linkDistance:t,repulsivity:o,distanceMin:u,distanceMax:s,center:a}),r=i.map((function(e){return y({},e)})),c=n.map((function(e){return y({id:e.source+"."+e.target},e)})),g=d.forceSimulation(r).force("link",e.link.links(c)).force("charge",e.charge).force("center",e.center).stop();return g.tick(l),p(r),R(c.map((function(e){return e.previousSource=f.find((function(r){return r.id===e.source.id})),e.previousTarget=f.find((function(r){return r.id===e.target.id})),e}))),function(){g.stop()}}),[i,n,t,o,u,s,l,a[0],a[1]]),[f,m]},M=function(e){return r.useMemo((function(){return"function"==typeof e?e:function(){return e}}),[e])},j=function(e){return r.useMemo((function(){return"function"==typeof e?e:function(){return e}}),[e])},w=function(e){var r=e.node,i=e.x,n=e.y,t=e.radius,o=e.color,u=e.borderWidth,s=e.borderColor,a=e.scale,d=void 0===a?1:a,l=e.handleNodeClick,f=e.handleNodeHover,p=e.handleNodeLeave;return c.jsx("circle",{transform:"translate("+i+","+n+") scale("+d+")",r:t,fill:o,strokeWidth:u,stroke:s,onClick:function(e){return l(r,e)},onMouseEnter:function(e){return f(r,e)},onMouseMove:function(e){return f(r,e)},onMouseLeave:p})};w.propTypes={node:p.default.object.isRequired,x:p.default.number.isRequired,y:p.default.number.isRequired,radius:p.default.number.isRequired,color:p.default.string.isRequired,borderWidth:p.default.number.isRequired,borderColor:p.default.string.isRequired,scale:p.default.number,handleNodeHover:p.default.func.isRequired,handleNodeLeave:p.default.func.isRequired};var N=r.memo(w),W=["nodes","color","borderColor"],S=function(e){var r=e.style;return{x:r.x.val,y:r.y.val,radius:r.radius.val,scale:0}},P=function(e){return function(r){var i=r.style;return{x:i.x,y:i.y,radius:i.radius,scale:l.spring(0,e)}}},D=function(e){var r=e.nodes,n=e.color,t=e.borderColor,o=g(e,W),u=i.useMotionConfig().springConfig;return c.jsx(l.TransitionMotion,{willEnter:S,willLeave:P(u),styles:r.map((function(e){return{key:e.id,data:e,style:{x:l.spring(e.x,u),y:l.spring(e.y,u),radius:l.spring(e.radius,u),scale:l.spring(1,u)}}})),children:function(e){return c.jsx(c.Fragment,{children:e.map((function(e){var r=e.key,i=e.style,u=e.data;return c.jsx(N,y({node:u,x:i.x,y:i.y,radius:Math.max(i.radius,0),color:n(u),borderColor:t(u),scale:Math.max(i.scale,0)},o),r)}))})}})};D.propTypes={nodes:p.default.array.isRequired,color:p.default.func.isRequired,borderWidth:p.default.number.isRequired,borderColor:p.default.func.isRequired,handleNodeHover:p.default.func.isRequired,handleNodeLeave:p.default.func.isRequired};var O=r.memo(D),X=["nodes","color","borderColor"],Y=function(e){var r=e.nodes,i=e.color,n=e.borderColor,t=g(e,X);return r.map((function(e){return c.jsx(N,y({node:e,x:e.x,y:e.y,radius:e.radius,color:i(e),borderColor:n(e)},t),e.id)}))};Y.propTypes={nodes:p.default.array.isRequired,color:p.default.func.isRequired,borderWidth:p.default.number.isRequired,borderColor:p.default.func.isRequired,handleNodeHover:p.default.func.isRequired,handleNodeLeave:p.default.func.isRequired};var E=r.memo(Y),L=function(e){var r=e.sourceX,i=e.sourceY,n=e.targetX,t=e.targetY,o=e.thickness,u=e.color;return c.jsx("line",{stroke:u,strokeWidth:o,strokeLinecap:"round",x1:r,y1:i,x2:n,y2:t})};L.propTypes={link:p.default.object.isRequired,sourceX:p.default.number.isRequired,sourceY:p.default.number.isRequired,targetX:p.default.number.isRequired,targetY:p.default.number.isRequired,thickness:p.default.number.isRequired,color:p.default.string.isRequired};var B=r.memo(L),H=function(e){var r=e.style,i=e.data,n=i.previousSource?i.previousSource.x:r.sourceX.val,t=i.previousSource?i.previousSource.y:r.sourceY.val;return{sourceX:n,sourceY:t,targetX:n,targetY:t}},I=function(e){var r=e.links,n=e.linkThickness,t=e.linkColor,o=i.useMotionConfig().springConfig;return c.jsx(l.TransitionMotion,{willEnter:H,styles:r.map((function(e){return{key:e.id,data:e,style:{sourceX:l.spring(e.source.x,o),sourceY:l.spring(e.source.y,o),targetX:l.spring(e.target.x,o),targetY:l.spring(e.target.y,o)}}})),children:function(e){return c.jsx(c.Fragment,{children:e.map((function(e){var r=e.key,i=e.style,o=e.data;return c.jsx(B,{link:o,color:t(o),thickness:n(o),sourceX:i.sourceX,sourceY:i.sourceY,targetX:i.targetX,targetY:i.targetY},r)}))})}})};I.propTypes={links:p.default.array.isRequired,linkThickness:p.default.func.isRequired,linkColor:p.default.func.isRequired};var F=r.memo(I),_=function(e){var r=e.links,i=e.linkThickness,n=e.linkColor;return r.map((function(e){return c.jsx(B,{link:e,color:n(e),thickness:i(e),sourceX:e.source.x,sourceY:e.source.y,targetX:e.target.x,targetY:e.target.y},e.id)}))};_.propTypes={links:p.default.array.isRequired,linkThickness:p.default.func.isRequired,linkColor:p.default.func.isRequired};var z=r.memo(_),A=function(e){var r=e.node,i=e.format,n=e.tooltip;return c.jsx(t.BasicTooltip,{id:r.id,enableChip:!0,color:r.color,format:i,renderContent:"function"==typeof n?n.bind(null,y({},r)):null})};A.propTypes={node:p.default.shape({id:p.default.string.isRequired,color:p.default.string.isRequired}).isRequired,format:p.default.func,tooltip:p.default.func};var G=r.memo(A),J=function(e){var o=e.width,u=e.height,s=e.margin,a=e.nodes,d=e.links,l=e.linkDistance,f=e.repulsivity,p=e.distanceMin,h=e.distanceMax,v=e.iterations,k=e.layers,g=e.nodeColor,m=e.nodeBorderWidth,R=e.nodeBorderColor,q=e.linkThickness,x=e.linkColor,C=e.tooltip,b=e.isInteractive,w=e.onClick,N=e.role,W=i.useDimensions(o,u,s),S=W.margin,P=W.innerWidth,D=W.innerHeight,X=W.outerWidth,Y=W.outerHeight,L=i.useMotionConfig().animate,B=i.useTheme(),H=M(g),I=n.useInheritedColor(R,B),_=j(q),A=n.useInheritedColor(x,B),J=T({nodes:a,links:d,linkDistance:l,repulsivity:f,distanceMin:p,distanceMax:h,iterations:v,center:[P/2,D/2]}),K=J[0],Q=J[1],U=t.useTooltip(),V=U.showTooltipFromEvent,Z=U.hideTooltip,$=r.useCallback((function(e,r){V(c.jsx(G,{node:e,tooltip:C}),r)}),[V,C]),ee=r.useCallback((function(){Z()}),[Z]),re={links:r.createElement(!0===L?F:z,{key:"links",links:Q,linkThickness:_,linkColor:A}),nodes:r.createElement(!0===L?O:E,{key:"nodes",nodes:K,color:H,borderWidth:m,borderColor:I,handleNodeClick:b?w:void 0,handleNodeHover:b?$:void 0,handleNodeLeave:b?ee:void 0})};return c.jsx(i.SvgWrapper,{width:X,height:Y,margin:S,role:N,children:k.map((function(i,n){return"function"==typeof i?c.jsx(r.Fragment,{children:i(y({},e,{innerWidth:P,innerHeight:D,nodes:K,links:Q}))},n):re[i]}))})};J.propTypes=R,J.defaultProps=C;var K=i.withContainer(J),Q=function(e){var o=e.width,u=e.height,s=e.margin,a=e.pixelRatio,d=e.nodes,l=e.links,f=e.linkDistance,p=e.repulsivity,h=e.distanceMin,v=e.distanceMax,k=e.iterations,g=e.layers,m=e.nodeColor,R=e.nodeBorderWidth,q=e.nodeBorderColor,x=e.linkThickness,C=e.linkColor,b=e.isInteractive,w=e.tooltip,N=e.onClick,W=r.useRef(null),S=i.useDimensions(o,u,s),P=S.margin,D=S.innerWidth,O=S.innerHeight,X=S.outerWidth,Y=S.outerHeight,E=T({nodes:d,links:l,linkDistance:f,repulsivity:p,distanceMin:h,distanceMax:v,iterations:k,center:[D/2,O/2]}),L=E[0],B=E[1],H=i.useTheme(),I=M(m),F=n.useInheritedColor(q,H),_=j(x),z=n.useInheritedColor(C,H);r.useEffect((function(){W.current.width=X*a,W.current.height=Y*a;var r=W.current.getContext("2d");r.scale(a,a),r.fillStyle=H.background,r.fillRect(0,0,X,Y),r.translate(P.left,P.top),g.forEach((function(i){"links"===i?B.forEach((function(e){r.strokeStyle=z(e),r.lineWidth=_(e),r.beginPath(),r.moveTo(e.source.x,e.source.y),r.lineTo(e.target.x,e.target.y),r.stroke()})):"nodes"===i?L.forEach((function(e){r.fillStyle=I(e),r.beginPath(),r.arc(e.x,e.y,e.radius,0,2*Math.PI),r.fill(),R>0&&(r.strokeStyle=F(e),r.lineWidth=R,r.stroke())})):"function"==typeof i&&i(r,y({},e,{nodes:L,links:B}))}))}),[W,X,Y,g,H,L,B,I,R,F,_,z]);var A=r.useCallback((function(e){if(!W.current)return null;var r=i.getRelativeCursor(W.current,e),n=r[0],t=r[1];return L.find((function(e){return i.getDistance(e.x,e.y,n-P.left,t-P.top)<=e.radius}))}),[W,P,L]),J=t.useTooltip(),K=J.showTooltipFromEvent,Q=J.hideTooltip,U=r.useCallback((function(e){var r=A(e);r?K(c.jsx(G,{node:r,tooltip:w}),e):Q()}),[A,K,w,Q]),V=r.useCallback((function(){Q()}),[Q]),Z=r.useCallback((function(e){if(N){var r=A(e);r&&N(r,e)}}),[A,N]);return c.jsx("canvas",{ref:W,width:X*a,height:Y*a,style:{width:X,height:Y,cursor:b?"auto":"normal"},onClick:b?Z:void 0,onMouseEnter:b?U:void 0,onMouseLeave:b?V:void 0,onMouseMove:b?U:void 0})};Q.propTypes=q,Q.defaultProps=b;var U=i.withContainer(Q);e.Network=K,e.NetworkCanvas=U,e.NetworkCanvasDefaultProps=b,e.NetworkCanvasPropTypes=q,e.NetworkDefaultProps=C,e.NetworkPropTypes=R,e.ResponsiveNetwork=function(e){return c.jsx(i.ResponsiveWrapper,{children:function(r){var i=r.width,n=r.height;return c.jsx(K,y({width:i,height:n},e))}})},e.ResponsiveNetworkCanvas=function(e){return c.jsx(i.ResponsiveWrapper,{children:function(r){var i=r.width,n=r.height;return c.jsx(U,y({width:i,height:n},e))}})},e.useLinkThickness=j,e.useNetwork=T,e.useNodeColor=M,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=nivo-network.umd.js.map |
{ | ||
"name": "@nivo/network", | ||
"version": "0.74.1", | ||
"version": "0.75.0", | ||
"license": "MIT", | ||
@@ -33,4 +33,4 @@ "author": { | ||
"dependencies": { | ||
"@nivo/colors": "0.74.1", | ||
"@nivo/tooltip": "0.74.1", | ||
"@nivo/colors": "0.75.0", | ||
"@nivo/tooltip": "0.75.0", | ||
"d3-force": "^2.0.1", | ||
@@ -41,6 +41,6 @@ "lodash": "^4.17.21", | ||
"devDependencies": { | ||
"@nivo/core": "0.74.1" | ||
"@nivo/core": "0.75.0" | ||
}, | ||
"peerDependencies": { | ||
"@nivo/core": "0.74.1", | ||
"@nivo/core": "0.75.0", | ||
"prop-types": ">= 15.5.10 < 16.0.0", | ||
@@ -52,3 +52,3 @@ "react": ">= 16.14.0 < 18.0.0" | ||
}, | ||
"gitHead": "4ae8bc60779cb9bb8cb14b16726819217da16133" | ||
"gitHead": "bfe8126876bf0e46ad82251935ab78178e901bcf" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
248576
473
4
1
+ Added@nivo/colors@0.75.0(transitive)
+ Added@nivo/core@0.75.0(transitive)
+ Added@nivo/recompose@0.75.0(transitive)
+ Added@nivo/tooltip@0.75.0(transitive)
- Removed@nivo/colors@0.74.1(transitive)
- Removed@nivo/core@0.74.1(transitive)
- Removed@nivo/recompose@0.74.0(transitive)
- Removed@nivo/tooltip@0.74.1(transitive)
Updated@nivo/colors@0.75.0
Updated@nivo/tooltip@0.75.0