diff --git a/frontend/package.json b/frontend/package.json index 0e63fd8..1d3efa2 100644 --- 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 index 5272ee7..2923c15 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -31,7 +31,7 @@ importers: 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 @@ packages: 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 @@ packages: '@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 @@ packages: 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 @@ packages: 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 @@ snapshots: 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 @@ snapshots: '@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 @@ snapshots: '@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 @@ snapshots: - 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 @@ snapshots: 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 @@ snapshots: 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 @@ snapshots: 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 - - rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-rc.18)(rollup@4.60.3): + '@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)(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 @@ snapshots: 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 @@ snapshots: 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 @@ snapshots: 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 @@ snapshots: 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 index 0000000000000000000000000000000000000000..f5f08e57000b0750f5608461d83e502e6b4d4e06 GIT binary patch literal 12311 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 literal 0 HcmV?d00001 diff --git a/frontend/src/routes/(default)/[...404].tsx b/frontend/src/routes/(default)/[...404].tsx index 4a96a08..7d3337a 100644 --- a/frontend/src/routes/(default)/[...404].tsx +++ b/frontend/src/routes/(default)/[...404].tsx @@ -13,9 +13,9 @@ export default function NotFoundPage() { 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 index b582ba5..fec51f3 100644 --- a/frontend/src/routes/app.module.scss +++ b/frontend/src/routes/app.module.scss @@ -2,4 +2,6 @@ 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 index d740b80..90a6ab2 100644 --- 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 index 0000000..f67ca6e --- /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 index 0000000..c653c91 --- /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 index 0000000..4cea6c6 --- /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 index 0000000..b6782eb --- /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 index 0000000..77ea2bf --- /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 index 0000000..132dd68 --- /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 index 0000000..8e0af66 --- /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 index 0000000..cb43d64 --- /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 index 0000000..e35cf4e --- /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 index 0000000..f0d3464 --- /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 index 0000000..b17fccd --- /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 index 0000000..e69de29 diff --git a/frontend/src/routes/app/index.tsx b/frontend/src/routes/app/index.tsx index c0a1709..2183404 100644 --- 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 index 0000000..8a32a0c --- /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 index 0000000..191fcee --- /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;