diff --git a/packages/webpage-refactor/components/graph/graph.js b/packages/webpage-refactor/components/graph/graph.js
index a0e76e8..4f2b9cc 100644
--- a/packages/webpage-refactor/components/graph/graph.js
+++ b/packages/webpage-refactor/components/graph/graph.js
@@ -1,19 +1,135 @@
-import React, { useEffect } from "react";
-/*
-import ReactDOM from "react-dom";
-import * as d3 from "d3";
-import { graphviz } from "d3-graphviz";
-*/
+import React, { useEffect, useState, useRef } from "react";
+import cytoscape from "cytoscape";
+import spread from "cytoscape-spread";
+import {
+ resolveToNumIfPossible,
+ getSquiggleSparkline,
+} from "../../lib/squiggle.js";
+import { truncateValueForDisplay } from "../../lib/truncateNums.js";
-export function Graph() {
- return "Hello";
- /*
- let digraph = `digraph {
- a -> b
- }`;
- useEffect(() => {
- d3.select("#graph").graphviz().renderDot(digraph);
- }, []);
- return
;
-*/
+// import dagre from "cytoscape-dagre";
+// import cola from "cytoscape-cola";
+// import fcose from "cytoscape-fcose";
+import avsdf from "cytoscape-avsdf";
+
+const effectButtonStyle =
+ "bg-transparent m-2 hover:bg-blue-500 text-blue-700 font-semibold hover:text-white py-2 px-4 border border-blue-500 hover:border-transparent rounded mt-5";
+
+const getEdgeLabel = async (squiggleString) => {
+ let sparkline = await getSquiggleSparkline(squiggleString);
+ let num = await resolveToNumIfPossible(squiggleString);
+
+ let sparklineConcat = "";
+ if (false && sparkline.success) {
+ console.log(sparkline);
+
+ sparklineConcat =
+ sparklineConcat +
+ " →" +
+ sparkline.sparkline.replace("▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "");
+ //alert("▁▁▁▁▁▁▁▁▁▁▁");
+ }
+ if (num.asNum) {
+ sparklineConcat =
+ sparklineConcat + " ⇾ " + truncateValueForDisplay(num.num);
+ //alert("▁▁▁▁▁▁▁▁▁▁▁");
+ }
+
+ return squiggleString + sparklineConcat; //sparkline;
+};
+
+export function Graph({ listOfElements, links }) {
+ const containerRef = useRef();
+
+ const callEffect = async (listOfElements, links) => {
+ cytoscape.use(spread); // spread
+
+ let nodeElements = listOfElements.map((element) => {
+ return { data: { id: element.name } };
+ });
+ let linkElements = await Promise.all(
+ links.map(async (link, i) => {
+ return {
+ data: {
+ id: `link-${i}`,
+ source: link.source,
+ target: link.target,
+ label: await getEdgeLabel(link.squiggleString),
+ },
+ };
+ })
+ );
+ const config = {
+ container: containerRef.current,
+ style: [
+ {
+ selector: "node",
+ style: {
+ content: "data(id)",
+ "background-color": "darkgreen",
+ "text-wrap": "wrap",
+ "text-max-width": 200,
+ "source-text-offset": 20,
+ //"text-valign": "bottom",
+ "text-justification": "auto",
+ },
+ padding: 10,
+ },
+ {
+ selector: "edge",
+ style: {
+ label: "data(label)", // maps to data.label
+ labelColor: "blue",
+ "curve-style": "unbundled-bezier",
+ "target-arrow-color": "green",
+ "arrow-scale": 3,
+ "target-arrow-fill": "filled",
+ "font-size": 15,
+ "line-color": "green",
+ "target-arrow-shape": "vee",
+ "text-rotation": "autorotate",
+ "text-margin-x": +25,
+ "text-margin-y": +25,
+ padding: 5,
+ },
+ },
+ ],
+ elements: [
+ /* Dummy data:
+ { data: { id: "n1" } },
+ { data: { id: "n2" } },
+ { data: { id: "e1", source: "n1", target: "n2" } },
+
+ Real data:*/
+ ...nodeElements,
+ ...linkElements,
+ ],
+ layout: {
+ name: "spread", // circle, grid, dagre
+ minDist: 10,
+ //prelayout: false,
+ //animate: "end", // whether to transition the node positions
+ animationDuration: 0, // duration of animation in ms if enabled
+ },
+ userZoomingEnabled: false,
+ userPanningEnabled: false,
+ };
+ cytoscape(config);
+ };
+ useEffect(async () => {
+ await callEffect(listOfElements, links);
+ // console.log(JSON.stringify(config, null, 10));
+ }, [listOfElements, links]);
+
+ return (
+
+
+
+
+ );
}
diff --git a/packages/webpage-refactor/components/graph/graph1.js b/packages/webpage-refactor/components/graph/graph1.js
new file mode 100644
index 0000000..cbb37d3
--- /dev/null
+++ b/packages/webpage-refactor/components/graph/graph1.js
@@ -0,0 +1,89 @@
+import { SimpleReactCytoscape } from "simple-react-cytoscape";
+import { Core } from "cytoscape";
+import { useCallback, useState } from "react";
+
+/*
+const elements = [
+ // list of graph elements to start with
+ {
+ // node a
+ data: { id: "a" },
+ },
+ {
+ // node b
+ data: { id: "b" },
+ },
+ {
+ // node c
+ data: { id: "c" },
+ },
+ {
+ // edge ab
+ data: { id: "ab", source: "a", target: "b" },
+ },
+ {
+ // edge ab
+ data: { id: "ac", source: "a", target: "c" },
+ },
+];
+*/
+
+const style = [
+ // the stylesheet for the graph
+ {
+ selector: "node",
+ style: {
+ "background-color": "#666",
+ label: "data(id)",
+ },
+ },
+
+ {
+ selector: "edge",
+ style: {
+ width: 3,
+ "line-color": "#ccc",
+ "target-arrow-color": "#ccc",
+ "target-arrow-shape": "triangle",
+ "curve-style": "bezier",
+ },
+ },
+];
+
+export function Graph({ listOfElements, links }) {
+ const [myCy, setMyCy] = useState();
+
+ const cyCallback = useCallback(
+ (cy) => {
+ setMyCy(cy);
+ },
+ [listOfElements, links]
+ );
+
+ let nodeElements = listOfElements.map((element) => {
+ return { data: { id: element.name } };
+ });
+ let linkElements = links.map((link, i) => {
+ return {
+ data: {
+ id: `link-i`,
+ source: link.source,
+ target: link.target,
+ label: link.distance,
+ },
+ };
+ });
+ let elements = [...nodeElements, ...linkElements];
+ let options = {
+ elements,
+ style,
+ };
+ return (
+
+
"a"
+
+
JSON representation
+ {/*
{myCy && JSON.stringify(myCy.json())}
*/}
+
+ );
+}
diff --git a/packages/webpage-refactor/components/graph/graph3.js b/packages/webpage-refactor/components/graph/graph3.js
new file mode 100644
index 0000000..0de0f14
--- /dev/null
+++ b/packages/webpage-refactor/components/graph/graph3.js
@@ -0,0 +1,30 @@
+import React, { useEffect, useMemo, useState } from "react";
+import cytoscape from "cytoscape";
+
+export function Graph({ listOfElements, links, options, getCy }) {
+ const [cy, setCy] = useState();
+ const id = useRef("cytoscape-id");
+
+ useEffect(() => {
+ if (!cy) {
+ let container = null;
+ try {
+ container = document.getElementById(id) || undefined;
+ } catch (e) {
+ // Might be running Headless (the unit test are headless)
+ container = undefined;
+ }
+ const newCy = cytoscape({
+ ...options,
+ container,
+ });
+ setCy(newCy);
+ // If a callback was supplied we can now return the value
+ if (getCy) {
+ getCy(newCy);
+ }
+ }
+ }, [cy, getCy, id, options]);
+
+ return ;
+}
diff --git a/packages/webpage-refactor/components/graph/style.css b/packages/webpage-refactor/components/graph/style.css
new file mode 100644
index 0000000..b47162f
--- /dev/null
+++ b/packages/webpage-refactor/components/graph/style.css
@@ -0,0 +1,5 @@
+.simple-react-cytoscape {
+ width: 1500px;
+ height: 500px;
+ border-style: dashed;
+}
diff --git a/packages/webpage-refactor/components/homepage.js b/packages/webpage-refactor/components/homepage.js
index 6a6e077..0f28359 100644
--- a/packages/webpage-refactor/components/homepage.js
+++ b/packages/webpage-refactor/components/homepage.js
@@ -13,7 +13,7 @@ export function Homepage({ listOfElementsInit }) {
// list of elements
const [listOfElements, setListOfElements] = useState(
- listOfElementsInit.slice(0, 3)
+ listOfElementsInit.slice(0, 5)
);
// number of steps
@@ -110,7 +110,7 @@ export function Homepage({ listOfElementsInit }) {
numElements={listOfElements.length}
/>
{/* Comparisons section */}
-
+
+ {/*
+
+ */}
+
{/* Advanced options section */}
- {/*
-
- */}
+
+
);
}
diff --git a/packages/webpage-refactor/lib/squiggle.js b/packages/webpage-refactor/lib/squiggle.js
index 681542a..d4e4585 100644
--- a/packages/webpage-refactor/lib/squiggle.js
+++ b/packages/webpage-refactor/lib/squiggle.js
@@ -27,3 +27,31 @@ export async function resolveToNumIfPossible(comparisonString) {
return response;
}
}
+
+export async function getSquiggleSparkline(comparisonString) {
+ if (!isNaN(comparisonString) && comparisonString != "") {
+ let response = {
+ success: true,
+ sparkline: comparisonString,
+ };
+ return response;
+ }
+ let squiggleSparklineCommand = `sparkline(${comparisonString}, 20)`;
+ let squiggleResponse = await run(squiggleSparklineCommand);
+ console.log(squiggleResponse);
+ if (squiggleResponse.tag == "Ok") {
+ let responseAsNumber = squiggleResponse.value.value;
+ let response = {
+ success: true,
+ sparkline: responseAsNumber,
+ };
+ return response;
+ } else {
+ let errorMsg = squiggleResponse.value;
+ let response = {
+ success: false,
+ errorMsg: errorMsg,
+ };
+ return response;
+ }
+}
diff --git a/packages/webpage-refactor/lib/truncateNums.js b/packages/webpage-refactor/lib/truncateNums.js
new file mode 100644
index 0000000..dfb67ac
--- /dev/null
+++ b/packages/webpage-refactor/lib/truncateNums.js
@@ -0,0 +1,25 @@
+export const truncateValueForDisplay = (value) => {
+ if (value > 10) {
+ return Number(Math.round(value).toPrecision(2));
+ } else if (value > 1) {
+ return Math.round(value * 10) / 10;
+ } else if (num > 0) {
+ let candidateNumSignificantDigits =
+ -Math.floor(Math.log(num) / Math.log(10)) + 1;
+ let numSignificantDigits = topOutAt100AndValidate(
+ candidateNumSignificantDigits
+ );
+ result = num.toFixed(numSignificantDigits);
+ } else if (-1 < num) {
+ let candidateNumSignificantDigits =
+ -Math.floor(Math.log(Math.abs(num)) / Math.log(10)) + 1;
+ let numSignificantDigits = topOutAt100AndValidate(
+ candidateNumSignificantDigits
+ );
+ result = num.toFixed(numSignificantDigits);
+ } else if (num <= -1) {
+ result = "-" + toLocale(truncateValueForDisplay(-num));
+ } else {
+ result = toLocale(num); //return "~0"
+ }
+};
diff --git a/packages/webpage-refactor/package.json b/packages/webpage-refactor/package.json
index 5d8cedf..37cba5c 100644
--- a/packages/webpage-refactor/package.json
+++ b/packages/webpage-refactor/package.json
@@ -10,6 +10,12 @@
"dependencies": {
"@quri/squiggle-lang": "^0.2.11",
"axios": "^0.21.4",
+ "cytoscape": "^3.21.1",
+ "cytoscape-avsdf": "^1.0.0",
+ "cytoscape-cola": "^2.5.1",
+ "cytoscape-dagre": "^2.4.0",
+ "cytoscape-fcose": "^2.1.0",
+ "cytoscape-spread": "^3.0.0",
"next": "latest",
"path": "^0.12.7",
"react": "^17.0.1",
@@ -18,6 +24,7 @@
"react-dom": "17.0.1",
"react-markdown": "^6.0.2",
"remark-gfm": "^1.0.0",
+ "simple-react-cytoscape": "^1.0.4",
"utility-tools": "^0.2.2"
},
"devDependencies": {
diff --git a/packages/webpage-refactor/pages/_app.js b/packages/webpage-refactor/pages/_app.js
index 42d37ca..5282966 100644
--- a/packages/webpage-refactor/pages/_app.js
+++ b/packages/webpage-refactor/pages/_app.js
@@ -1,6 +1,7 @@
// import 'tailwindcss/tailwind.css'
import "tailwindcss/tailwind.css";
import "../styles/globals.css";
+import "../styles/cytoscape.css";
import Head from "next/head";
import { Title } from "../components/title.js";
diff --git a/packages/webpage-refactor/styles/cytoscape.css b/packages/webpage-refactor/styles/cytoscape.css
new file mode 100644
index 0000000..b64acac
--- /dev/null
+++ b/packages/webpage-refactor/styles/cytoscape.css
@@ -0,0 +1,5 @@
+.simple-react-cytoscape {
+ width: 600px;
+ height: 600px;
+ border-style: dashed;
+}
diff --git a/packages/webpage-refactor/yarn.lock b/packages/webpage-refactor/yarn.lock
index 8aa5200..5a35727 100644
--- a/packages/webpage-refactor/yarn.lock
+++ b/packages/webpage-refactor/yarn.lock
@@ -741,6 +741,13 @@ autoprefixer@^10.4.0:
picocolors "^1.0.0"
postcss-value-parser "^4.2.0"
+avsdf-base@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/avsdf-base/-/avsdf-base-1.0.0.tgz#80c437d7d15d2bd201d9c31804e7b7a15a84781a"
+ integrity sha512-APhZNUFJwIwrLsSfE95QjobEntdUhFQgfNtC/BrYmjUpwHh5Y2fbRv8lxAlMr1hdf/CuQYsqJxK3dRzcCL77qw==
+ dependencies:
+ layout-base "^1.0.0"
+
axios@^0.21.4:
version "0.21.4"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
@@ -1012,6 +1019,13 @@ core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+cose-base@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.1.0.tgz#89b2d4a59d7bd0cde3138a4689825f3e8a5abd6a"
+ integrity sha512-HTMm07dhxq1dIPGWwpiVrIk9n+DH7KYmqWA786mLe8jDS+1ZjGtJGIIsJVKoseZXS6/FxiUWCJ2B7XzqUCuhPw==
+ dependencies:
+ layout-base "^2.0.0"
+
cosmiconfig@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
@@ -1066,6 +1080,52 @@ cssfilter@0.0.10:
resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae"
integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==
+cytoscape-avsdf@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cytoscape-avsdf/-/cytoscape-avsdf-1.0.0.tgz#6f079948021433e32fc30b1b0bcbf595f4b65ab0"
+ integrity sha512-Wzd2wmJgr4dK5avHy4nKHp3D8TBZ8H/+5Hq5o24bRdVTvXlhSDzQhAMtzOuhRPYwHcWB+cBhEAXboAK8n7zPTQ==
+ dependencies:
+ avsdf-base "^1.0.0"
+
+cytoscape-cola@^2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/cytoscape-cola/-/cytoscape-cola-2.5.1.tgz#1ec25dfd92533485f29943adf740ecd4feb2ea16"
+ integrity sha512-4/2S9bW1LvdsEPmxXN1OEAPFPbk7DvCx2c9d+TblkQAAvptGaSgtPWCByTEGgT8UxCxcVqes2aFPO5pzwo7R2w==
+ dependencies:
+ webcola "^3.4.0"
+
+cytoscape-dagre@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/cytoscape-dagre/-/cytoscape-dagre-2.4.0.tgz#abf145b1c675afe3b7d531166e6727dc39dc350d"
+ integrity sha512-jfOtKzKduCnruBs3YMHS9kqWjZKqvp6loSJwlotPO5pcU4wLUhkx7ZBIyW3VWZXa8wfkGxv/zhWoBxWtYrUxKQ==
+ dependencies:
+ dagre "^0.8.5"
+
+cytoscape-fcose@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.1.0.tgz#04c3093776ea6b71787009de641607db7d4edf55"
+ integrity sha512-Q3apPl66jf8/2sMsrCjNP247nbDkyIPjA9g5iPMMWNLZgP3/mn9aryF7EFY/oRPEpv7bKJ4jYmCoU5r5/qAc1Q==
+ dependencies:
+ cose-base "^2.0.0"
+
+cytoscape-spread@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cytoscape-spread/-/cytoscape-spread-3.0.0.tgz#9d2cf43eee9a3b92dd518a4a2db8567584a1dd2e"
+ integrity sha512-ekuo4ByFRTZ4TOJylE2bPOMcVVyi8rD+qjvEjMWS2BHcyan40pmhlA4ramz/nTxZR+EtlxEa1asnmfiN8R5HyQ==
+ dependencies:
+ weaverjs "^1.2.0"
+
+cytoscape@^3.21.1:
+ version "3.21.1"
+ resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.21.1.tgz#2d3a8b8ade8661c9efab2e9bf7a354b374d6cf0e"
+ integrity sha512-mxdxCzuGHOMSWHUFO+/ZQPeMNtJAm81LGzdwP02LhT592ZRfHWCvHUY++HpnSjg/SgrKg1CMqegY/HvYLUS1qg==
+ dependencies:
+ heap "^0.2.6"
+ lodash.debounce "^4.0.8"
+ lodash.get "^4.4.2"
+ lodash.set "^4.3.2"
+ lodash.topath "^4.5.2"
+
d3-array@^2.8.0:
version "2.12.1"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81"
@@ -1073,6 +1133,49 @@ d3-array@^2.8.0:
dependencies:
internmap "^1.0.0"
+d3-dispatch@1, d3-dispatch@^1.0.3:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58"
+ integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==
+
+d3-drag@^1.0.4:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70"
+ integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==
+ dependencies:
+ d3-dispatch "1"
+ d3-selection "1"
+
+d3-path@1:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
+ integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
+
+d3-selection@1:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c"
+ integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==
+
+d3-shape@^1.3.5:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
+ integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
+ dependencies:
+ d3-path "1"
+
+d3-timer@^1.0.5:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
+ integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
+
+dagre@^0.8.5:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee"
+ integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==
+ dependencies:
+ graphlib "^2.1.8"
+ lodash "^4.17.15"
+
debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@ -1402,6 +1505,13 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+graphlib@^2.1.8:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da"
+ integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==
+ dependencies:
+ lodash "^4.17.15"
+
h3@^0.2.10:
version "0.2.12"
resolved "https://registry.yarnpkg.com/h3/-/h3-0.2.12.tgz#019db8f0c6910e0dc79266857560e22b5ef2a5e3"
@@ -1439,6 +1549,11 @@ hastscript@^5.0.0:
property-information "^5.0.0"
space-separated-tokens "^1.0.0"
+heap@^0.2.6:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc"
+ integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==
+
hex-color-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
@@ -1750,6 +1865,16 @@ jstat@^1.9.5:
resolved "https://registry.yarnpkg.com/jstat/-/jstat-1.9.5.tgz#9941741566f683624ddeb56f5ba60ed8c29b374e"
integrity sha512-cWnp4vObF5GmB2XsIEzxI/1ZTcYlcfNqxQ/9Fp5KFUa0Jf/4tO0ZkGVnqoEHDisJvYgvn5n3eWZbd2xTVJJPUQ==
+layout-base@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2"
+ integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==
+
+layout-base@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285"
+ integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==
+
lilconfig@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25"
@@ -1773,6 +1898,11 @@ listhen@^0.2.4, listhen@^0.2.6:
selfsigned "^2.0.1"
ufo "^0.8.4"
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
@@ -1783,17 +1913,27 @@ lodash.flatten@^4.4.0:
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
+lodash.get@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+ integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==
+
lodash.isarguments@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==
+lodash.set@^4.3.2:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
+ integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==
+
lodash.topath@^4.5.2:
version "4.5.2"
resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009"
integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==
-lodash@^4.17.11, lodash@^4.17.21:
+lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -2812,6 +2952,11 @@ simple-get@^4.0.0, simple-get@^4.0.1:
once "^1.3.1"
simple-concat "^1.0.0"
+simple-react-cytoscape@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/simple-react-cytoscape/-/simple-react-cytoscape-1.0.4.tgz#6a2b40711d1942de497e1e8623b568b45f0baad9"
+ integrity sha512-gb0Biod8KyjdZS+PXhZcxKwd06VdsEyh22Wm1RyvKfeV5L1Tb5EZvnimrvuBYurn1mhAnh0PUyFPPIHiN9N9AQ==
+
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
@@ -3164,6 +3309,21 @@ warning@^4.0.3:
dependencies:
loose-envify "^1.0.0"
+weaverjs@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/weaverjs/-/weaverjs-1.2.0.tgz#654c15cc735b660a1dae4c7c263cd7c746512fa0"
+ integrity sha512-X+nDGl5mrc8ysArmafu6dD3GNFP2r+NdV6L/PiWac8TpH4BVODO/HMaPLhrXmOZhdI3XM0LVxW5ZrAbwKqkkmw==
+
+webcola@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/webcola/-/webcola-3.4.0.tgz#490d26ae98e5b5109478b94a846a62ff6831a99d"
+ integrity sha512-4BiLXjXw3SJHo3Xd+rF+7fyClT6n7I+AR6TkBqyQ4kTsePSAMDLRCXY1f3B/kXJeP9tYn4G1TblxTO+jAt0gaw==
+ dependencies:
+ d3-dispatch "^1.0.3"
+ d3-drag "^1.0.4"
+ d3-shape "^1.3.5"
+ d3-timer "^1.0.5"
+
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"