+ return
{ gameInfo.isLoading?
-
+
+
+
:
-
-
-
+
+
+
{gameInfo.data?.introduction}
-
-
-
- {svgElements}
-
-
-
+
+
+
+
+ {svgElements}
+
+
+
+
}
-
+
}
@@ -119,9 +140,8 @@ function computeWorldLayout(worlds) {
headless: true,
styleEnabled: false
})
-// TODO: Jon play around with graph layout
- const layout = cy.layout({name: "klay", klay: {direction: "DOWN"}} as LayoutOptions).run()
+ const layout = cy.layout({name: "klay", klay: {direction: "DOWN", nodePlacement: "LINEAR_SEGMENTS"}} as LayoutOptions).run()
let nodes = {}
cy.nodes().forEach((node, id) => {
nodes[node.id()] = {
diff --git a/client/src/components/welcome.css b/client/src/components/welcome.css
index 849f441..8e457a2 100644
--- a/client/src/components/welcome.css
+++ b/client/src/components/welcome.css
@@ -1,12 +1,191 @@
-svg .world-circle {
+/* svg .world-circle {
fill: var(--clr-primary)
+} */
+
+.welcome {
+ height: 100%;
+ flex: 1;
+ min-height: 0;
+ display: flex;
+}
+
+.app-content {
+ height: 100%
+}
+
+.welcome .column {
+ height: 100%;
+ overflow: auto;
+}
+
+.welcome-text {
+ padding: 20px;
+}
+
+h1 {
+ font-size: 2em;
+ margin: .67em 0;
+}
+
+h2 {
+ font-size: 1.5em;
+}
+
+h3 {
+ font-size: 1.3em;
+}
+
+h4 {
+ font-size: 1.1em;
+ font-style: italic;
+}
+
+h5, h6 {
+ font-size: 1em;
+ font-style: italic;
+}
+
+/***************/
+/* SVG Graphic */
+/***************/
+
+svg .world-title-wrapper {
+ overflow: auto;
+}
+
+svg .world-title-wrapper div {
+ width: 100%;
+ height: 100%;
+}
+
+svg .world-title-wrapper div {
+ display: flex;
+ align-items:center;
+ justify-content:center;
+ overflow: visible;
+
}
-svg .world-name {
- fill: white;
- font-size: 2px;
+svg .world-title {
font-weight: 500;
- text-anchor: middle;
- dominant-baseline: middle;
+ color: white;
+ margin: 0;
+ padding: 0;
+}
+
+/******************/
+/* Privacy Button */
+/******************/
+
+.privacy {
+ width: 40px;
+ height: 40px;
+ font-size: 25px;
+ border-radius: 20px;
+ position: absolute;
+ right: 10px;
+ bottom: 10px;
+ display: flex;
+ align-items:center;
+ justify-content:center;
+ color: #aaa;
+ background-color: #eee;
+ cursor: pointer;
+}
+
+.privacy p {
+ position: absolute;
+ color: #888;
+ bottom: 1.5px;
+ font-size: 6px;
+}
+
+.privacy .p1 {
+ transform: rotate(50deg);
+ left: 1.5px;
+}
+
+.privacy .p2 {
+ transform: rotate(-50deg);
+ right: 1.5px;
+}
+
+/*****************/
+/* Privacy Popup */
+/*****************/
+
+.modal-wrapper {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 0;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background: rgba(0, 0, 0, 0.25);
+ z-index: 2;
+}
+
+.modal h2 {
+ text-align: center;
+}
+
+.modal {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ min-width: 50%;
+ max-width: 60ch;
+ background: #fff;
+ z-index: 3;
+ padding: 2em;
+ border-radius: 1em;
+ text-align: left;
+ color: var(--vscode-breadcrumb-foreground);
+}
+
+.modal input[type="text"] {
+ width: 100%;
+}
+
+.modal .form-error {
+ color: #a00;
+ font-weight: bold;
+}
+
+.modal input[type="submit"] {
+ border: none;
+ color: var(--vscode-button-foreground);
+ background: var(--vscode-button-background);
+ cursor: pointer;
+ padding: .5em 1em;
+ border-radius: .2em;
+ display: block;
+ margin: 1em auto;
+}
+
+.modal-close {
+ float: right;
+ scale: 2;
+ color: var(--vscode-breadcrumb-foreground);
+ cursor: pointer;
+}
+
+.modal-close:hover {
+ float: right;
+ scale: 2;
+ color: var(--vscode-breadcrumb-focusForeground);
+}
+
+.modal table {
+ width: 100%;
}
diff --git a/package-lock.json b/package-lock.json
index 26c2ec9..2e6d55a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,7 @@
"@types/cytoscape": "^3.19.9",
"@types/react-router-dom": "^5.3.3",
"cytoscape": "^3.23.0",
+ "cytoscape-elk": "^2.1.0",
"cytoscape-klay": "^3.1.4",
"debounce": "^1.2.1",
"express": "^4.18.2",
@@ -34,6 +35,7 @@
"remark-gfm": "^3.0.1",
"remark-math": "^5.1.1",
"vscode-ws-jsonrpc": "^2.0.1",
+ "web-worker": "^1.2.0",
"ws": "^8.11.0"
},
"devDependencies": {
@@ -4180,6 +4182,17 @@
"node": ">=0.10"
}
},
+ "node_modules/cytoscape-elk": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cytoscape-elk/-/cytoscape-elk-2.1.0.tgz",
+ "integrity": "sha512-stkKoUTNOqpyP5eMuqatK0EYir2NWGTH+XlY0rxFj0t0HiQPGI4AuSuTPaGbNM1WhVfb0tWJ5TQQ0R0qshACLw==",
+ "dependencies": {
+ "elkjs": "^0.8.1"
+ },
+ "peerDependencies": {
+ "cytoscape": "^3.2.0"
+ }
+ },
"node_modules/cytoscape-klay": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/cytoscape-klay/-/cytoscape-klay-3.1.4.tgz",
@@ -4435,6 +4448,11 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz",
"integrity": "sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ=="
},
+ "node_modules/elkjs": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz",
+ "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ=="
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -9869,6 +9887,11 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/web-worker": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz",
+ "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
+ },
"node_modules/webpack": {
"version": "5.75.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
diff --git a/package.json b/package.json
index fc3bf0a..67cab6b 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
"@types/cytoscape": "^3.19.9",
"@types/react-router-dom": "^5.3.3",
"cytoscape": "^3.23.0",
+ "cytoscape-elk": "^2.1.0",
"cytoscape-klay": "^3.1.4",
"debounce": "^1.2.1",
"express": "^4.18.2",
@@ -30,6 +31,7 @@
"remark-gfm": "^3.0.1",
"remark-math": "^5.1.1",
"vscode-ws-jsonrpc": "^2.0.1",
+ "web-worker": "^1.2.0",
"ws": "^8.11.0"
},
"devDependencies": {