diff --git a/client/package-lock.json b/client/package-lock.json
index f0ed26eb..31f81b10 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -9,14 +9,20 @@
"version": "0.1.0",
"dependencies": {
"@libsql/client": "^0.11.0",
+ "@react-sigma/core": "^4.0.3",
"@tanstack/react-query": "^5.56.2",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
+ "graphology": "^0.25.4",
+ "graphology-layout": "^0.6.1",
+ "graphology-layout-force": "^0.2.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.26.2",
"react-scripts": "^5.0.1",
+ "react-sigma": "^1.2.35",
+ "sigma": "^3.0.0-beta.29",
"web-vitals": "^2.1.4"
}
},
@@ -3461,6 +3467,16 @@
}
}
},
+ "node_modules/@react-sigma/core": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@react-sigma/core/-/core-4.0.3.tgz",
+ "integrity": "sha512-/y/U1GH18xjGYMWNYXXqHGJ+8tHf+e4z1i0gNSm9iuhch8sGFJooO3VfyPJlBox42Wl4/gCapQhOHAfVW0pRtw==",
+ "peerDependencies": {
+ "graphology": "^0.25.4",
+ "react": "^18.0.0",
+ "sigma": "^3.0.0-beta.24"
+ }
+ },
"node_modules/@remix-run/router": {
"version": "1.19.2",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz",
@@ -9246,6 +9262,55 @@
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
},
+ "node_modules/graphology": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz",
+ "integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==",
+ "dependencies": {
+ "events": "^3.3.0",
+ "obliterator": "^2.0.2"
+ },
+ "peerDependencies": {
+ "graphology-types": ">=0.24.0"
+ }
+ },
+ "node_modules/graphology-layout": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/graphology-layout/-/graphology-layout-0.6.1.tgz",
+ "integrity": "sha512-m9aMvbd0uDPffUCFPng5ibRkb2pmfNvdKjQWeZrf71RS1aOoat5874+DcyNfMeCT4aQguKC7Lj9eCbqZj/h8Ag==",
+ "dependencies": {
+ "graphology-utils": "^2.3.0",
+ "pandemonium": "^2.4.0"
+ },
+ "peerDependencies": {
+ "graphology-types": ">=0.19.0"
+ }
+ },
+ "node_modules/graphology-layout-force": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/graphology-layout-force/-/graphology-layout-force-0.2.4.tgz",
+ "integrity": "sha512-NYZz0YAnDkn5pkm30cvB0IScFoWGtbzJMrqaiH070dYlYJiag12Oc89dbVfaMaVR/w8DMIKxn/ix9Bqj+Umm9Q==",
+ "dependencies": {
+ "graphology-utils": "^2.4.2"
+ },
+ "peerDependencies": {
+ "graphology-types": ">=0.19.0"
+ }
+ },
+ "node_modules/graphology-types": {
+ "version": "0.24.7",
+ "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.7.tgz",
+ "integrity": "sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==",
+ "peer": true
+ },
+ "node_modules/graphology-utils": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz",
+ "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==",
+ "peerDependencies": {
+ "graphology-types": ">=0.23.0"
+ }
+ },
"node_modules/gzip-size": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
@@ -12913,6 +12978,14 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/mnemonist": {
+ "version": "0.39.8",
+ "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz",
+ "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==",
+ "dependencies": {
+ "obliterator": "^2.0.1"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -13242,6 +13315,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/obliterator": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
+ "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ=="
+ },
"node_modules/obuf": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
@@ -13370,6 +13448,14 @@
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
"integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw=="
},
+ "node_modules/pandemonium": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz",
+ "integrity": "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g==",
+ "dependencies": {
+ "mnemonist": "^0.39.2"
+ }
+ },
"node_modules/param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
@@ -15378,6 +15464,18 @@
}
}
},
+ "node_modules/react-sigma": {
+ "version": "1.2.35",
+ "resolved": "https://registry.npmjs.org/react-sigma/-/react-sigma-1.2.35.tgz",
+ "integrity": "sha512-amjKjaQusefDp8dD9er3wE/lfubSQT5fJSRF4SsS0LjxRue4bpSapAQ1WpmSM6nQEgawbrKel+bQBmatl7MAIw==",
+ "engines": {
+ "node": ">=8.0"
+ },
+ "peerDependencies": {
+ "react": ">=15.3",
+ "react-dom": ">=15.3"
+ }
+ },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -16222,6 +16320,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/sigma": {
+ "version": "3.0.0-beta.29",
+ "resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.0-beta.29.tgz",
+ "integrity": "sha512-3VpLIEnuDiZbO7XPnsyyUwUoTOI9u5aDq9nIPvc/eO3FHE/z7P7gCvfmAu2JB1635gZSLwt39mvDpYTXZ8+jaQ==",
+ "dependencies": {
+ "events": "^3.3.0",
+ "graphology-utils": "^2.5.2"
+ }
+ },
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
diff --git a/client/package.json b/client/package.json
index 74ecfa39..4758315c 100644
--- a/client/package.json
+++ b/client/package.json
@@ -4,14 +4,20 @@
"private": true,
"dependencies": {
"@libsql/client": "^0.11.0",
+ "@react-sigma/core": "^4.0.3",
"@tanstack/react-query": "^5.56.2",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
+ "graphology": "^0.25.4",
+ "graphology-layout": "^0.6.1",
+ "graphology-layout-force": "^0.2.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.26.2",
"react-scripts": "^5.0.1",
+ "react-sigma": "^1.2.35",
+ "sigma": "^3.0.0-beta.29",
"web-vitals": "^2.1.4"
},
"scripts": {
diff --git a/client/src/App.css b/client/src/App.css
index 4223ef20..2962eebb 100644
--- a/client/src/App.css
+++ b/client/src/App.css
@@ -1,50 +1,18 @@
-.App {
- text-align: center;
- padding-left: 60vmin;
- padding-right: 60vmin;
- background-color: #282c34;
+body {
+ background: rgb(0,131,77);
+ background: radial-gradient(circle, rgba(0,131,77,1) 0%, rgba(17,66,0,1) 100%);
+ font-family: sans-serif;
}
-.App-logo {
- height: 10vmin;
- pointer-events: none;
+button {
+ border-radius: 1rem;
+ padding: 1rem;
+ margin: 1rem;
}
-@media (prefers-reduced-motion: no-preference) {
- .App-logo {
- animation: App-logo-spin infinite 20s linear;
- }
-}
-
-.App-header {
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
-}
-
-.App-link {
- color: #61dafb;
-}
-
-@keyframes App-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
-
-.Page-contents {
- text-align: left;
- padding: 1em;
- border: 1px solid black;
- width: 100%;
-}
-.Page-contents pre {
- width: 100%;
+a {
+ color: lightslategrey;
}
+a:visited {
+ color: slategray;
+}
\ No newline at end of file
diff --git a/client/src/App.js b/client/src/App.js
index d928df36..80424b25 100644
--- a/client/src/App.js
+++ b/client/src/App.js
@@ -1,8 +1,10 @@
-import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
-import Landing from './Landing.jsx'
-import PageView from './PageView.jsx'
-import EditPage from './EditPage.jsx'
+import { BrowserRouter, Routes, Route } from 'react-router-dom';
+import Landing from './landing/Landing.jsx'
+import PageView from './page/PageView.jsx'
+import PageEdit from './page/PageEdit.jsx'
+
+import './App.css'
const queryClient = new QueryClient();
@@ -13,7 +15,7 @@ function App() {
{error}- : -