From 3e90445fab1abcab72fb88af551d0b16f7d2a213 Mon Sep 17 00:00:00 2001 From: Simeon Radivoev Date: Fri, 23 Jan 2026 04:56:39 +0200 Subject: [PATCH] initial commit --- .gitignore | 24 +++ .vscode/settings.json | 9 + README.md | 18 ++ bun.lock | 225 ++++++++++++++++++++++++ bun.lockb | Bin 0 -> 126390 bytes electrobun.config.ts | 23 +++ package.json | 36 ++++ src/bun/index.ts | 38 ++++ src/mainview/components/Clock.tsx | 21 +++ src/mainview/components/GamepadIcon.tsx | 23 +++ src/mainview/index.css | 23 +++ src/mainview/index.html | 12 ++ src/mainview/index.tsx | 30 ++++ src/mainview/routeTree.gen.ts | 77 ++++++++ src/mainview/routes/Dashboard.tsx | 225 ++++++++++++++++++++++++ src/mainview/routes/GameDetails.tsx | 110 ++++++++++++ src/mainview/routes/__root.tsx | 16 ++ tailwind.config.js | 5 + tsconfig.json | 20 +++ vite.config.ts | 26 +++ 20 files changed, 961 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 bun.lock create mode 100644 bun.lockb create mode 100644 electrobun.config.ts create mode 100644 package.json create mode 100644 src/bun/index.ts create mode 100644 src/mainview/components/Clock.tsx create mode 100644 src/mainview/components/GamepadIcon.tsx create mode 100644 src/mainview/index.css create mode 100644 src/mainview/index.html create mode 100644 src/mainview/index.tsx create mode 100644 src/mainview/routeTree.gen.ts create mode 100644 src/mainview/routes/Dashboard.tsx create mode 100644 src/mainview/routes/GameDetails.tsx create mode 100644 src/mainview/routes/__root.tsx create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9056eb9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +.DS_Store +**/target +**/zig-cache +**/zig-out +node_modules +build +/package/vendors +/package/src/extractor/.zig-cache +/package/src/launcher/.zig-cache +.zig-cache +.colab.json +dist +.cache +/package/bin/electrobun +/package/bin/electrobun.exe +electrobun-cef* +electrobun-core* +electrobun-cli* +dist-* +/package/src/cli/templates/embedded.ts +*.tar.gz +settings.local.json +.tanstack +artifacts \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8e45f31 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ + "files.readonlyInclude": { + "**/routeTree.gen.ts": true + }, + "files.watcherExclude": { + "**/routeTree.gen.ts": true + }, + "search.exclude": { + "**/routeTree.gen.ts": true + } \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2ddd3b3 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Gameflow Deck + +## Getting Started + +1. Install dependencies: + ```bash + bun install + ``` + +2. Run in development mode: + ```bash + bun run dev + ``` + +3. Build for production: + ```bash + bun run build + ``` \ No newline at end of file diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..cfd969f --- /dev/null +++ b/bun.lock @@ -0,0 +1,225 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "electrobun-hello-world", + "dependencies": { + "electrobun": "^0.0.19-beta.110", + }, + "devDependencies": { + "@types/bun": "latest", + }, + }, + }, + "packages": { + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@oneidentity/zstd-js": ["@oneidentity/zstd-js@1.0.3", "", { "dependencies": { "@types/emscripten": "^1.39.4" } }, "sha512-Jm6sawqxLzBrjC4sg2BeXToa33yPzUmq20CKsehKY2++D/gHb/oSwVjNgT+RH4vys+r8FynrgcNzGwhZWMLzfQ=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@types/bun": ["@types/bun@1.2.19", "", { "dependencies": { "bun-types": "1.2.19" } }, "sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg=="], + + "@types/emscripten": ["@types/emscripten@1.40.1", "", {}, "sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg=="], + + "@types/filesystem": ["@types/filesystem@0.0.36", "", { "dependencies": { "@types/filewriter": "*" } }, "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA=="], + + "@types/filewriter": ["@types/filewriter@0.0.33", "", {}, "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g=="], + + "@types/har-format": ["@types/har-format@1.2.16", "", {}, "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A=="], + + "@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@types/react": ["@types/react@19.1.9", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA=="], + + "@types/webextension-polyfill": ["@types/webextension-polyfill@0.12.3", "", {}, "sha512-F58aDVSeN/MjUGazXo/cPsmR76EvqQhQ1v4x23hFjUX0cfAJYE+JBWwiOGW36/VJGGxoH74sVlRIF3z7SJCKyg=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], + + "archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bare-events": ["bare-events@2.6.1", "", {}, "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "browser-namespace": ["browser-namespace@1.4.0", "", { "dependencies": { "@types/filesystem": "*", "@types/har-format": "*", "@types/webextension-polyfill": "*" } }, "sha512-9b4yNTNs+8HVPssSq8RSZMRunf+G4cVQ2PMtOTn+uEVFOW5C0Uo+eGXuJ5LfxS1UDph5oAdWj92thPyxVhpqXg=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], + + "bun-types": ["bun-types@1.2.19", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ=="], + + "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], + + "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "electrobun": ["electrobun@0.0.19-beta.111", "", { "dependencies": { "@oneidentity/zstd-js": "^1.0.3", "archiver": "^7.0.1", "rpc-anywhere": "1.5.0", "tar": "^6.2.1" }, "bin": { "electrobun": "bin/electrobun.cjs" } }, "sha512-Sijyfi2CqSqh5NUnRPWMrjb/wHOs9sohFP5kEsVhf7eNJIS++/advXi9VkGu6lhhBXTnraJq/ED8UBOo1WUzbw=="], + + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], + + "rpc-anywhere": ["rpc-anywhere@1.5.0", "", { "dependencies": { "browser-namespace": "^1.4.0" } }, "sha512-ZYrB0foAM4oE7oBnUH3BL7LwtW9d6+RkzL/rFnjj8GCaFt5c81Rbw6oVl6u9AMsGONsKeJX0mL62TpbPXSO6og=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "streamx": ["streamx@2.22.1", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA=="], + + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], + + "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], + + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "path-scurry/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + } +} diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..2c9f1c2b5b3cff52cdf66f19acc72f26c4fa5223 GIT binary patch literal 126390 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

s6w)3wtBWb`uCH;Xx*Cv(s9dT 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 d^Eq^-*M51Fk^zQO^KbW&4d { + const channel = await Updater.localInfo.channel(); + if (channel === "dev") { + try { + await fetch(DEV_SERVER_URL, { method: "HEAD" }); + console.log(`HMR enabled: Using Vite dev server at ${DEV_SERVER_URL}`); + return DEV_SERVER_URL; + } catch { + console.log("Vite dev server not running. Run 'bun run dev:hmr' for HMR support."); + } + } + return "views://mainview/index.html"; +} + +// Create the main application window +const url = await getMainViewUrl(); + +const mainWindow = new BrowserWindow({ + title: "GameFlow", + url, + styleMask: { + Borderless: true, + }, + frame: { + width: 1280, + height: 800, + x: 200, + y: 200, + }, +}); + +console.log("React Tailwind Vite app started!"); \ No newline at end of file diff --git a/src/mainview/components/Clock.tsx b/src/mainview/components/Clock.tsx new file mode 100644 index 0000000..64fce83 --- /dev/null +++ b/src/mainview/components/Clock.tsx @@ -0,0 +1,21 @@ +import React, { useEffect, useState } from "react"; + +export default function Clock() { + const locale = "en"; + const [today, setDate] = useState(new Date()); + + useEffect(() => { + const timer = setInterval(() => { + setDate(new Date()); + }, 60 * 1000); + + return () => { + clearInterval(timer); + }; + }, []); + return ( +
+ {today.toLocaleTimeString(locale, { hour: "numeric", minute: "numeric" })} +
+ ); +} diff --git a/src/mainview/components/GamepadIcon.tsx b/src/mainview/components/GamepadIcon.tsx new file mode 100644 index 0000000..197aac0 --- /dev/null +++ b/src/mainview/components/GamepadIcon.tsx @@ -0,0 +1,23 @@ +import React from "react"; + +export default function GamepadIcon({ + platform, + variant, + button, + text, +}: { + platform: "xbox" | "playstation" | "nintendo"; + variant: string; + button: string; + text?: string; +}) { + return ( +
+ + {text} + +
+ ); +} diff --git a/src/mainview/index.css b/src/mainview/index.css new file mode 100644 index 0000000..06141ff --- /dev/null +++ b/src/mainview/index.css @@ -0,0 +1,23 @@ +@import "tailwindcss"; + +@theme { + --color-dark: #333333; + --color-light: #464646; + --color-light: #828282; + --color-light2: #bcbcbc; + --color-primary: #E5FF00; + --color-alt: #4656E6; + --color-alert: #E60012; +} + +html { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; +} + +body { +} + +#root { +} \ No newline at end of file diff --git a/src/mainview/index.html b/src/mainview/index.html new file mode 100644 index 0000000..fea9b76 --- /dev/null +++ b/src/mainview/index.html @@ -0,0 +1,12 @@ + + + + + + GameFlow + + +
+ + + \ No newline at end of file diff --git a/src/mainview/index.tsx b/src/mainview/index.tsx new file mode 100644 index 0000000..d9a6f78 --- /dev/null +++ b/src/mainview/index.tsx @@ -0,0 +1,30 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import { createRouter, RouterProvider } from "@tanstack/react-router"; +import { routeTree } from "./routeTree.gen"; + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: "intent", + scrollRestoration: true, +}); + +// Register things for typesafety +declare module "@tanstack/react-router" { + interface Register { + router: typeof router; + } +} + +const rootElement = document.getElementById("root")!; + +if (!rootElement.innerHTML) { + const root = createRoot(rootElement); + root.render( + + + , + ); +} diff --git a/src/mainview/routeTree.gen.ts b/src/mainview/routeTree.gen.ts new file mode 100644 index 0000000..d1b5749 --- /dev/null +++ b/src/mainview/routeTree.gen.ts @@ -0,0 +1,77 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as GameDetailsRouteImport } from './routes/GameDetails' +import { Route as DashboardRouteImport } from './routes/Dashboard' + +const GameDetailsRoute = GameDetailsRouteImport.update({ + id: '/GameDetails', + path: '/GameDetails', + getParentRoute: () => rootRouteImport, +} as any) +const DashboardRoute = DashboardRouteImport.update({ + id: '/Dashboard', + path: '/Dashboard', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/Dashboard': typeof DashboardRoute + '/GameDetails': typeof GameDetailsRoute +} +export interface FileRoutesByTo { + '/Dashboard': typeof DashboardRoute + '/GameDetails': typeof GameDetailsRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/Dashboard': typeof DashboardRoute + '/GameDetails': typeof GameDetailsRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/Dashboard' | '/GameDetails' + fileRoutesByTo: FileRoutesByTo + to: '/Dashboard' | '/GameDetails' + id: '__root__' | '/Dashboard' | '/GameDetails' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + DashboardRoute: typeof DashboardRoute + GameDetailsRoute: typeof GameDetailsRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/GameDetails': { + id: '/GameDetails' + path: '/GameDetails' + fullPath: '/GameDetails' + preLoaderRoute: typeof GameDetailsRouteImport + parentRoute: typeof rootRouteImport + } + '/Dashboard': { + id: '/Dashboard' + path: '/Dashboard' + fullPath: '/Dashboard' + preLoaderRoute: typeof DashboardRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + DashboardRoute: DashboardRoute, + GameDetailsRoute: GameDetailsRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/src/mainview/routes/Dashboard.tsx b/src/mainview/routes/Dashboard.tsx new file mode 100644 index 0000000..42219ce --- /dev/null +++ b/src/mainview/routes/Dashboard.tsx @@ -0,0 +1,225 @@ +import React, { useEffect, useState } from "react"; +import { + Plus, + Search, + Settings, + Power, + Sun, + Wifi, + BatteryFull, + Gamepad2, + Bluetooth, + Settings2, + Bell, + HardDrive, +} from "lucide-react"; +import { createFileRoute, Link, linkOptions } from "@tanstack/react-router"; +import "gamepad.css/styles.min.css"; +import GamepadIcon from "../components/GamepadIcon"; +import Clock from "../components/Clock"; +import classNames from "classnames"; + +export const Route = createFileRoute("/Dashboard")({ + component: ConsoleHomeUI, +}); + +const games = [ + { + title: "The Legend of Zelda", + subtitle: "Link's Awakening", + }, + { + title: "Captain Toad", + subtitle: "Treasure Tracker", + focused: true, + }, + { + title: "Crash Bandicoot", + subtitle: "N. Sane Trilogy", + }, + { + title: "Super Mario", + subtitle: "Odyssey", + }, + { + title: "Animal Crossing", + subtitle: "New Horizons", + }, +]; + +export default function ConsoleHomeUI() { + const [focus, setFocus] = useState(1); + + useEffect(() => { + const onKey = (e: KeyboardEvent) => { + if (e.key === "ArrowRight") + setFocus((i) => Math.min(i + 1, games.length - 1)); + if (e.key === "ArrowLeft") setFocus((i) => Math.max(i - 1, 0)); + }; + window.addEventListener("keydown", onKey); + return () => window.removeEventListener("keydown", onKey); + }, []); + + return ( +
+ {/* Top bar */} +
+
+
+
+ +
+ +
+ + + + +
+ + 100% +
+
+
+ +
+
+ +
+
+
+
+ + {/* Filter bar */} +
+ +
+ + + +
+ +
+ + {/* Game carousel */} +
+ {games.map((g, i) => { + const focused = i === focus; + return ( +
+
+
+
+ +
+
+
+
{g.title}
+
{g.subtitle}
+
+
+ ); + })} +
+ + {/* Menu */} + +
+ + + + + + + + Settings + +
+ + {/* Bottom bar */} +
+
+ + + Continue + + + + Back + + + + Close + + + + Options + +
+
+
+ ); +} + +function CircleIcon({ + to, + active, + highlight, +}: { + to?: any; + active?: boolean; + highlight?: boolean; + label?: string; +}) { + return ( + + + + ); +} diff --git a/src/mainview/routes/GameDetails.tsx b/src/mainview/routes/GameDetails.tsx new file mode 100644 index 0000000..3dcf5bc --- /dev/null +++ b/src/mainview/routes/GameDetails.tsx @@ -0,0 +1,110 @@ +import React, { useEffect, useState } from "react"; +import { Bell, Library, Store, Settings, Gamepad2 } from "lucide-react"; +import { createFileRoute } from "@tanstack/react-router"; + +const games = [ + "Halo Infinite", + "Cyberpunk", + "Hades", + "Stardew Valley", + "Neon Skies", + "Void Runner", + "Rogue Light", + "Drift City", +]; + +export const Route = createFileRoute("/GameDetails")({ + loader: ({ params }) => params.postId, + component: GameDetailsUI, +}); + +export function GameDetailsUI() { + // In a component! + const { postId } = Route.useParams(); + + return ( +
+ {/* Header */} +
+
+
Now Playing
+

+ Halo Infinite +

+
+ Action · FPS · Sci-Fi +
+
+ +
+ + 3 +
+
+ + {/* Content split */} +
+ {/* Cover / media */} +
+
+ + {/* Primary action */} + +
+ + {/* Details */} +
+ {/* Description */} +

+ Experience the epic sci-fi saga and master chief’s greatest journey + yet. Explore vast open worlds, engage in tactical combat, and + uncover the mysteries of Zeta Halo. +

+ + {/* Metadata */} +
+ + + + +
+ + {/* Actions */} +
+ + + +
+
+
+ + {/* Footer hints */} +
+ A Play + B Back + Y Options +
+
+ ); +} + +function Detail({ label, value }: { label: string; value: string }) { + return ( +
+
+ {label} +
+
{value}
+
+ ); +} + +function SecondaryButton({ label }: { label: string }) { + return ( + + ); +} diff --git a/src/mainview/routes/__root.tsx b/src/mainview/routes/__root.tsx new file mode 100644 index 0000000..d40c1d5 --- /dev/null +++ b/src/mainview/routes/__root.tsx @@ -0,0 +1,16 @@ +import { Link, Outlet, createRootRoute } from "@tanstack/react-router"; +import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"; +import { Gamepad2, Library, Settings, Store } from "lucide-react"; + +export const Route = createRootRoute({ + component: RootComponent, +}); + +function RootComponent() { + return ( +
+ + +
+ ); +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..4e4372b --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,5 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./src/mainview/**/*.{html,js,ts,jsx,tsx}"], + plugins: [], +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b38f88e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "vite.config.ts"] +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..1dbe011 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import tailwindcss from '@tailwindcss/vite' +import { tanstackRouter } from '@tanstack/router-plugin/vite' + +export default defineConfig({ + plugins: [ + tailwindcss(), + tanstackRouter({ + target: 'react', + routesDirectory: "./routes/", + generatedRouteTree: "./routeTree.gen.ts", + autoCodeSplitting: true, + }), + react(), + ], + root: "src/mainview", + build: { + outDir: "../../dist", + emptyOutDir: true, + }, + server: { + port: 5173, + strictPort: true, + }, +}); \ No newline at end of file