From 45c118cb77b6c745afd00ed456116586a95cedef Mon Sep 17 00:00:00 2001 From: ewsgit Date: Tue, 12 May 2026 14:58:25 +0000 Subject: [PATCH] basic app layout --- frontend/package.json | 2 +- frontend/pnpm-lock.yaml | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------- frontend/public/avatar.png | 0 frontend/src/routes/(default)/[...404].tsx | 4 ++-- frontend/src/routes/app.module.scss | 2 ++ frontend/src/routes/app.tsx | 29 +++++++++++++++++++++++++++-- frontend/src/routes/app/appContext.ts | 13 +++++++++++++ frontend/src/routes/app/components/PrimarySidebar/PrimarySidebar.module.scss | 3 +++ frontend/src/routes/app/components/PrimarySidebar/PrimarySidebar.tsx | 8 ++++++++ frontend/src/routes/app/components/SecondarySidebar/SecondarySidebar.module.scss | 3 +++ frontend/src/routes/app/components/SecondarySidebar/SecondarySidebar.tsx | 8 ++++++++ frontend/src/routes/app/components/TopNavigation/TopNavigation.module.scss | 18 ++++++++++++++++++ frontend/src/routes/app/components/TopNavigation/TopNavigation.tsx | 25 +++++++++++++++++++++++++ frontend/src/routes/app/components/TopNavigation/components/Account/Account.module.scss | 7 +++++++ frontend/src/routes/app/components/TopNavigation/components/Account/Account.tsx | 13 +++++++++++++ frontend/src/routes/app/components/TopNavigation/components/MenuItem/MenuItem.module.scss | 4 ++++ frontend/src/routes/app/components/TopNavigation/components/MenuItem/MenuItem.tsx | 15 +++++++++++++++ frontend/src/routes/app/index.module.scss | 0 frontend/src/routes/app/index.tsx | 12 ++++++++++-- frontend/src/routes/app/welcome/index.module.scss | 15 +++++++++++++++ frontend/src/routes/app/welcome/index.tsx | 25 +++++++++++++++++++++++++ 21 file(s) changed, 288 insertion(s)(+), 96 deletion(s)(-) diff --git a/frontend/package.json b/frontend/package.json --- a/frontend/package.json +++ b/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "opencommunitychat-frontend", + "name": "harmonychat-frontend", "type": "module", "scripts": { "dev": "vite dev --host", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -31,7 +31,7 @@ specifier: 2.0.0-alpha.2 version: 2.0.0-alpha.2(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)) '@solidjs/vite-plugin-nitro-2': specifier: ^0.1.0 - version: 0.1.0(rolldown@1.0.0-rc.18)(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)) + version: 0.1.0(rolldown@1.0.0)(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)) '@types/node': specifier: ^25.6.2 version: 25.6.2 @@ -799,8 +799,8 @@ '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.128.0': - resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} @@ -909,103 +909,103 @@ '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} - '@rolldown/binding-android-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} + '@rolldown/binding-android-arm64@1.0.0': + resolution: {integrity: sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} + '@rolldown/binding-darwin-arm64@1.0.0': + resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.18': - resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} + '@rolldown/binding-darwin-x64@1.0.0': + resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': - resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} + '@rolldown/binding-freebsd-x64@1.0.0': + resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': - resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} + '@rolldown/binding-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} + '@rolldown/binding-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} + '@rolldown/binding-linux-s390x-gnu@1.0.0': + resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': - resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} + '@rolldown/binding-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': - resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} + '@rolldown/binding-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': - resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} + '@rolldown/binding-openharmony-arm64@1.0.0': + resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': - resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} + '@rolldown/binding-wasm32-wasi@1.0.0': + resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} + '@rolldown/binding-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': - resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} + '@rolldown/binding-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.18': - resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} '@rollup/plugin-alias@6.0.0': resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} @@ -2864,8 +2864,8 @@ resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rolldown@1.0.0-rc.18: - resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3573,8 +3573,8 @@ optional: true yaml: optional: true - vite@8.0.11: - resolution: {integrity: sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==} + vite@8.0.12: + resolution: {integrity: sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -4293,8 +4293,8 @@ sass-embedded: 1.99.0 solid-js: 1.9.12 solid-styled-components: 0.28.5(solid-js@1.9.12) tsup: 8.5.1(jiti@2.7.0)(postcss@8.5.14) - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1) - vite-plugin-solid: 2.11.12(solid-js@1.9.12)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)) + vite: 8.0.12(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1) + vite-plugin-solid: 2.11.12(solid-js@1.9.12)(vite@8.0.12(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)) transitivePeerDependencies: - '@microsoft/api-extractor' - '@swc/core' @@ -4389,7 +4389,7 @@ dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.128.0': {} + '@oxc-project/types@0.129.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -4471,56 +4471,56 @@ supports-color: 10.2.2 '@poppinss/exception@1.2.3': {} - '@rolldown/binding-android-arm64@1.0.0-rc.18': + '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.18': + '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.18': + '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.18': + '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': + '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': + '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': + '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + '@rolldown/binding-wasm32-wasi@1.0.0': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': + '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rolldown/pluginutils@1.0.0-rc.18': {} + '@rolldown/pluginutils@1.0.0': {} '@rollup/plugin-alias@6.0.0(rollup@4.60.3)': optionalDependencies: @@ -4779,9 +4779,9 @@ - '@testing-library/jest-dom' - crossws - supports-color - '@solidjs/vite-plugin-nitro-2@0.1.0(rolldown@1.0.0-rc.18)(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1))': + '@solidjs/vite-plugin-nitro-2@0.1.0(rolldown@1.0.0)(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1))': dependencies: - nitropack: 2.13.4(rolldown@1.0.0-rc.18) + nitropack: 2.13.4(rolldown@1.0.0) vite: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1) transitivePeerDependencies: - '@azure/app-configuration' @@ -6108,7 +6108,7 @@ thenify-all: 1.6.0 nanoid@3.3.12: {} - nitropack@2.13.4(rolldown@1.0.0-rc.18): + nitropack@2.13.4(rolldown@1.0.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.60.3) @@ -6161,7 +6161,7 @@ pkg-types: 2.3.1 pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.60.3 - rollup-plugin-visualizer: 7.0.1(rolldown@1.0.0-rc.18)(rollup@4.60.3) + rollup-plugin-visualizer: 7.0.1(rolldown@1.0.0)(rollup@4.60.3) scule: 1.3.0 semver: 7.8.0 serve-placeholder: 2.0.2 @@ -6473,35 +6473,35 @@ rimraf@2.7.1: dependencies: glob: 7.2.3 - rolldown@1.0.0-rc.18: + rolldown@1.0.0: dependencies: - '@oxc-project/types': 0.128.0 - '@rolldown/pluginutils': 1.0.0-rc.18 + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 - '@rolldown/binding-darwin-x64': 1.0.0-rc.18 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 + '@rolldown/binding-android-arm64': 1.0.0 + '@rolldown/binding-darwin-arm64': 1.0.0 + '@rolldown/binding-darwin-x64': 1.0.0 + '@rolldown/binding-freebsd-x64': 1.0.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0 + '@rolldown/binding-linux-arm64-gnu': 1.0.0 + '@rolldown/binding-linux-arm64-musl': 1.0.0 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0 + '@rolldown/binding-linux-s390x-gnu': 1.0.0 + '@rolldown/binding-linux-x64-gnu': 1.0.0 + '@rolldown/binding-linux-x64-musl': 1.0.0 + '@rolldown/binding-openharmony-arm64': 1.0.0 + '@rolldown/binding-wasm32-wasi': 1.0.0 + '@rolldown/binding-win32-arm64-msvc': 1.0.0 + '@rolldown/binding-win32-x64-msvc': 1.0.0 - rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-rc.18)(rollup@4.60.3): + rollup-plugin-visualizer@7.0.1(rolldown@1.0.0)(rollup@4.60.3): dependencies: open: 11.0.0 picomatch: 4.0.4 source-map: 0.7.6 yargs: 18.0.0 optionalDependencies: - rolldown: 1.0.0-rc.18 + rolldown: 1.0.0 rollup: 4.60.3 rollup@4.60.3: @@ -7173,7 +7173,7 @@ vitefu: 1.1.3(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)) transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.12(solid-js@1.9.12)(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)): + vite-plugin-solid@2.11.12(solid-js@1.9.12)(vite@8.0.12(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 @@ -7181,8 +7181,8 @@ babel-preset-solid: 1.9.12(@babel/core@7.29.0)(solid-js@1.9.12) merge-anything: 5.1.7 solid-js: 1.9.12 solid-refresh: 0.6.3(solid-js@1.9.12) - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1) - vitefu: 1.1.3(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)) + vite: 8.0.12(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1) + vitefu: 1.1.3(vite@8.0.12(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)) transitivePeerDependencies: - supports-color @@ -7203,12 +7203,12 @@ sass: 1.99.0 sass-embedded: 1.99.0 terser: 5.47.1 - vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1): + vite@8.0.12(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.14 - rolldown: 1.0.0-rc.18 + rolldown: 1.0.0 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 25.6.2 @@ -7223,9 +7223,9 @@ vitefu@1.1.3(vite@7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)): optionalDependencies: vite: 7.3.3(@types/node@25.6.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1) - vitefu@1.1.3(vite@8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)): + vitefu@1.1.3(vite@8.0.12(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1)): optionalDependencies: - vite: 8.0.11(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1) + vite: 8.0.12(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.7.0)(sass-embedded@1.99.0)(sass@1.99.0)(terser@5.47.1) webidl-conversions@3.0.1: {} diff --git a/frontend/public/avatar.png b/frontend/public/avatar.png new file mode 100644 --- /dev/null +++ b/frontend/public/avatar.png diff --git a/frontend/src/routes/(default)/[...404].tsx b/frontend/src/routes/(default)/[...404].tsx --- a/frontend/src/routes/(default)/[...404].tsx +++ b/frontend/src/routes/(default)/[...404].tsx @@ -13,9 +13,9 @@
Not Found - 404 Page Not Found + 404 - Oops! We can't seem to find the page you're looking for,
perhaps try again later?
+ Oops! We can't seem to find the page you're looking for,
perhaps try again later?
window.location.reload()}>Retry window.history.back()}>Go Back diff --git a/frontend/src/routes/app.module.scss b/frontend/src/routes/app.module.scss --- a/frontend/src/routes/app.module.scss +++ b/frontend/src/routes/app.module.scss @@ -2,4 +2,6 @@ .layout { display: grid; grid-template-columns: auto 1fr auto; grid-template-rows: auto 1fr auto; + width: 100%; + height: 100%; } diff --git a/frontend/src/routes/app.tsx b/frontend/src/routes/app.tsx --- a/frontend/src/routes/app.tsx +++ b/frontend/src/routes/app.tsx @@ -1,8 +1,33 @@ -import { Component, ParentProps } from "solid-js"; +import { Component, createEffect, ParentProps, useContext } from "solid-js"; import styles from "./app.module.scss" +import { AppCentralStore, AppContext } from "./app/appContext"; +import { createStore } from "solid-js/store"; +import TopNavigation from "./app/components/TopNavigation/TopNavigation"; +import PrimarySidebar from "./app/components/PrimarySidebar/PrimarySidebar"; +import SecondarySidebar from "./app/components/SecondarySidebar/SecondarySidebar"; +import { useNavigate } from "@solidjs/router"; const App: Component = (props) => { - return
{props.children}
+ const appContext = useContext(AppContext) + const navigate = useNavigate(); + const [appCentralStore, setAppCentralStore] = createStore({ + hasCompletedTutorial: false + }) + + createEffect(() => { + if(!appContext?.store.hasCompletedTutorial) { + navigate("/app/welcome") + } + }) + + return +
+ + + {props.children} + +
+
} export default App; diff --git a/frontend/src/routes/app/appContext.ts b/frontend/src/routes/app/appContext.ts new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/appContext.ts @@ -0,0 +1,13 @@ +import { createContext } from "solid-js"; +import { SetStoreFunction, Store } from "solid-js/store"; + +export interface AppCentralStore { + hasCompletedTutorial: boolean +} + +const AppContext = createContext<{ + setStore: SetStoreFunction, + store: Store +}>(undefined) + +export {AppContext} diff --git a/frontend/src/routes/app/components/PrimarySidebar/PrimarySidebar.module.scss b/frontend/src/routes/app/components/PrimarySidebar/PrimarySidebar.module.scss new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/PrimarySidebar/PrimarySidebar.module.scss @@ -0,0 +1,3 @@ +.component { + border-right: 1px solid rgb(var(--uk-sys-color-outline-variant)); +} diff --git a/frontend/src/routes/app/components/PrimarySidebar/PrimarySidebar.tsx b/frontend/src/routes/app/components/PrimarySidebar/PrimarySidebar.tsx new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/PrimarySidebar/PrimarySidebar.tsx @@ -0,0 +1,8 @@ +import { Component } from "solid-js"; +import styles from "./PrimarySidebar.module.scss" + +const PrimarySidebar: Component = () => { + return
Primary Sidebar
+} + +export default PrimarySidebar diff --git a/frontend/src/routes/app/components/SecondarySidebar/SecondarySidebar.module.scss b/frontend/src/routes/app/components/SecondarySidebar/SecondarySidebar.module.scss new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/SecondarySidebar/SecondarySidebar.module.scss @@ -0,0 +1,3 @@ +.component { + border-left: 1px solid rgb(var(--uk-sys-color-outline-variant)); +} diff --git a/frontend/src/routes/app/components/SecondarySidebar/SecondarySidebar.tsx b/frontend/src/routes/app/components/SecondarySidebar/SecondarySidebar.tsx new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/SecondarySidebar/SecondarySidebar.tsx @@ -0,0 +1,8 @@ +import { Component } from "solid-js"; +import styles from "./SecondarySidebar.module.scss" + +const SecondarySidebar: Component = () => { + return
Secondary Sidebar
+} + +export default SecondarySidebar; diff --git a/frontend/src/routes/app/components/TopNavigation/TopNavigation.module.scss b/frontend/src/routes/app/components/TopNavigation/TopNavigation.module.scss new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/TopNavigation/TopNavigation.module.scss @@ -0,0 +1,18 @@ +.component { + grid-column-start: 1; + grid-column-end: 4; + padding: 0.5rem; + gap: 0.5rem; + height: 3rem; + display: flex; + align-items: center; + border-bottom: 1px solid rgb(var(--uk-sys-color-outline-variant)); +} + +.logo { + height: 100%; +} + +.spacer { + margin-left: auto; +} diff --git a/frontend/src/routes/app/components/TopNavigation/TopNavigation.tsx b/frontend/src/routes/app/components/TopNavigation/TopNavigation.tsx new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/TopNavigation/TopNavigation.tsx @@ -0,0 +1,25 @@ +import { Component } from "solid-js"; +import styles from "./TopNavigation.module.scss" +import UKText from "@ewsgit/uikit-solid/src/components/text/UKText.jsx"; +import MenuItem from "./components/MenuItem/MenuItem"; +import UKDivider from "@ewsgit/uikit-solid/src/components/divider/UKDivider.jsx"; +import Account from "./components/Account/Account"; +import UKIconButton from "@ewsgit/uikit-solid/src/components/iconButton/UKIconButton.jsx"; +import SETTINGS_ICON from "@material-symbols/svg-700/outlined/settings.svg" + +const TopNavigation: Component = () => { + return
+ + + + + + + +
+ {}} alt="open settings" /> + +
+} + +export default TopNavigation diff --git a/frontend/src/routes/app/components/TopNavigation/components/Account/Account.module.scss b/frontend/src/routes/app/components/TopNavigation/components/Account/Account.module.scss new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/TopNavigation/components/Account/Account.module.scss @@ -0,0 +1,7 @@ +.component { + display: flex; + flex-direction: row; + gap: 0.5rem; + align-items: center; + justify-content: center; +} diff --git a/frontend/src/routes/app/components/TopNavigation/components/Account/Account.tsx b/frontend/src/routes/app/components/TopNavigation/components/Account/Account.tsx new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/TopNavigation/components/Account/Account.tsx @@ -0,0 +1,13 @@ +import UKAvatar from "@ewsgit/uikit-solid/src/components/avatar/UKAvatar.jsx"; +import UKText from "@ewsgit/uikit-solid/src/components/text/UKText.jsx"; +import { Component } from "solid-js"; +import styles from "./Account.module.scss" + +const Account: Component = () => { + return
+ {/* Hiya Sample user! */} + +
+} + +export default Account; diff --git a/frontend/src/routes/app/components/TopNavigation/components/MenuItem/MenuItem.module.scss b/frontend/src/routes/app/components/TopNavigation/components/MenuItem/MenuItem.module.scss new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/TopNavigation/components/MenuItem/MenuItem.module.scss @@ -0,0 +1,4 @@ +.component { + // padding-left: 0.5rem; + // padding-right: 0.5rem; +} diff --git a/frontend/src/routes/app/components/TopNavigation/components/MenuItem/MenuItem.tsx b/frontend/src/routes/app/components/TopNavigation/components/MenuItem/MenuItem.tsx new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/components/TopNavigation/components/MenuItem/MenuItem.tsx @@ -0,0 +1,15 @@ +import { Component } from "solid-js"; +import styles from "./MenuItem.module.scss" +import UKText from "@ewsgit/uikit-solid/src/components/text/UKText.jsx"; +import UKButton from "@ewsgit/uikit-solid/src/components/button/UKButton.jsx"; + +const MenuItem: Component<{ label: string }> = (props) => { + return
+ {/* + {props.label} + */} + {}}>{props.label} +
+} + +export default MenuItem; diff --git a/frontend/src/routes/app/index.module.scss b/frontend/src/routes/app/index.module.scss new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/index.module.scss diff --git a/frontend/src/routes/app/index.tsx b/frontend/src/routes/app/index.tsx --- a/frontend/src/routes/app/index.tsx +++ b/frontend/src/routes/app/index.tsx @@ -1,7 +1,15 @@ -import { Component } from "solid-js"; +import { Component, createEffect, Show, useContext } from "solid-js"; +import { AppContext } from "./appContext"; +import styles from "./index.module.scss" const AppIndexPage: Component = () => { - return <>App Index Page + const appContext = useContext(AppContext) + + return <> + } when={appContext?.store.hasCompletedTutorial}> + App Index Page + + } export default AppIndexPage diff --git a/frontend/src/routes/app/welcome/index.module.scss b/frontend/src/routes/app/welcome/index.module.scss new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/welcome/index.module.scss @@ -0,0 +1,15 @@ +.tutorialWelcome { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + gap: 1.5rem; + width: 100%; + height: 100%; + padding-left: 1rem; + padding-right: 1rem; +} + +.buttonGroup { + margin-top: 1.5rem; +} diff --git a/frontend/src/routes/app/welcome/index.tsx b/frontend/src/routes/app/welcome/index.tsx new file mode 100644 --- /dev/null +++ b/frontend/src/routes/app/welcome/index.tsx @@ -0,0 +1,25 @@ +import { Component, useContext } from "solid-js"; +import { AppContext } from "../appContext"; +import UKText from "@ewsgit/uikit-solid/src/components/text/UKText.jsx"; +import UKButton from "@ewsgit/uikit-solid/src/components/button/UKButton.jsx"; +import styles from "./index.module.scss" +import UKButtonGroup from "@ewsgit/uikit-solid/src/components/buttonGroup/UKButtonGroup.jsx"; + +const WelcomePage: Component = () => { + const appContext = useContext(AppContext) + + return
+ + Welcome to Harmony + + + Would you like to see a quick tutorial on how to use Harmony? + + + { appContext?.setStore("hasCompletedTutorial", false) }}>Start Tutorial + { appContext?.setStore("hasCompletedTutorial", true) }}>Skip + +
+} + +export default WelcomePage; -- tangled.sh