diff --git a/.github/workflows/create_heroku_review_app.yaml b/.github/workflows/create_heroku_review_app.yaml index 61605fb65..7e3ade03a 100644 --- a/.github/workflows/create_heroku_review_app.yaml +++ b/.github/workflows/create_heroku_review_app.yaml @@ -7,7 +7,7 @@ jobs: create-review-app: runs-on: ubuntu-latest steps: - - uses: fastruby/manage-heroku-review-app@9fa49f0320460f278c3687bc348dd0cbb18555dc # v1.3 + - uses: kqito/manage-heroku-review-app@55e434ad5ac86f21cf2f7654de1566973fbc7046 with: action: create env: diff --git a/.github/workflows/destroy_heroku_review_app.yaml b/.github/workflows/destroy_heroku_review_app.yaml index b2bf67949..cbcec744a 100644 --- a/.github/workflows/destroy_heroku_review_app.yaml +++ b/.github/workflows/destroy_heroku_review_app.yaml @@ -7,7 +7,7 @@ jobs: destroy-review-app: runs-on: ubuntu-latest steps: - - uses: fastruby/manage-heroku-review-app@9fa49f0320460f278c3687bc348dd0cbb18555dc # v1.3 + - uses: kqito/manage-heroku-review-app@55e434ad5ac86f21cf2f7654de1566973fbc7046 with: action: destroy env: diff --git a/package.json b/package.json index 88d45e67d..72f912d38 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "wireit": { "start": { "dependencies": [ - "./workspaces/server:start" + "./workspaces/server:start", + "./workspaces/client:start" ] }, "build": { @@ -59,4 +60,4 @@ ] } } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 576486ce7..5a1875741 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,6 +51,9 @@ importers: '@standard-schema/spec': specifier: 1.0.0 version: 1.0.0 + '@ungap/with-resolvers': + specifier: 0.1.0 + version: 0.1.0 '@wsh-2025/client': specifier: workspace:* version: 'link:' @@ -87,9 +90,6 @@ importers: react-dom: specifier: 19.0.0 version: 19.0.0(react@19.0.0) - react-ellipsis-component: - specifier: 1.1.11 - version: 1.1.11(react@19.0.0) react-final-form: specifier: 6.5.9 version: 6.5.9(final-form@4.20.10)(react@19.0.0) @@ -160,6 +160,9 @@ importers: '@iconify/types': specifier: 2.0.0 version: 2.0.0 + '@pmmmwh/react-refresh-webpack-plugin': + specifier: 0.5.15 + version: 0.5.15(react-refresh@0.16.0)(type-fest@4.29.1)(webpack-dev-server@5.1.0)(webpack@5.96.1) '@types/lodash': specifier: 4.17.16 version: 4.17.16 @@ -175,6 +178,9 @@ importers: '@types/react-dom': specifier: 19.0.2 version: 19.0.2(@types/react@19.0.1) + '@types/webpack-bundle-analyzer': + specifier: 4.7.0 + version: 4.7.0(webpack-cli@5.1.4) '@types/wicg-task-scheduling': specifier: 2024.1.0 version: 2024.1.0 @@ -205,6 +211,9 @@ importers: hls.js: specifier: 1.5.17 version: 1.5.17 + react-refresh: + specifier: 0.16.0 + version: 0.16.0 shaka-player: specifier: 4.12.5 version: 4.12.5(patch_hash=ztcamgtqc3a62la4l6p3d6w4ae) @@ -1502,6 +1511,7 @@ packages: '@faker-js/faker@9.2.0': resolution: {integrity: sha512-ulqQu4KMr1/sTFIYvqSdegHT8NIkt66tFAkugGnHA+1WAfEn6hMzNR+svjXGFRVLnapxvej67Z/LwchFrnLBUg==} engines: {node: '>=18.0.0', npm: '>=9.0.0'} + deprecated: Please update to a newer version '@fastify/accept-negotiator@2.0.0': resolution: {integrity: sha512-/Sce/kBzuTxIq5tJh85nVNOq9wKD8s+viIgX0fFMDBdw95gnpf53qmF1oBgJym3cPFliWUuSloVg/1w/rH0FcQ==} @@ -1745,6 +1755,32 @@ packages: engines: {node: '>=18'} hasBin: true + '@pmmmwh/react-refresh-webpack-plugin@0.5.15': + resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <5.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x || 5.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} @@ -2047,6 +2083,9 @@ packages: '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + '@types/webpack-bundle-analyzer@4.7.0': + resolution: {integrity: sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg==} + '@types/wicg-task-scheduling@2024.1.0': resolution: {integrity: sha512-9g5QVDU8Na3P6rPMbyYx5pS8UpGDfzys8T7Xq5HMTbI7elSq/YioGbBVAh2u67JGNTThZ3o9PK0/qBvaVOYPYQ==} @@ -2115,6 +2154,9 @@ packages: resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/with-resolvers@0.1.0': + resolution: {integrity: sha512-g7f0IkJdPW2xhY7H4iE72DAsIyfuwEFc6JWc2tYFwKDMWWAF699vGjrM348cwQuOXgHpe1gWFe+Eiyjx/ewvvw==} + '@unocss/core@66.1.0-beta.5': resolution: {integrity: sha512-1kZzSrB87KKd+xP+vMN7IP03j2UPEykna447aw3UaK5RYTDd/LuVtxoep6gvjN9TJiB4K+Qx0sAtgnfhPpka9Q==} @@ -2314,6 +2356,11 @@ packages: engines: {'0': node >= 0.8.0} hasBin: true + ansi-html@0.0.9: + resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==} + engines: {'0': node >= 0.8.0} + hasBin: true + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2609,6 +2656,9 @@ packages: core-js-compat@3.39.0: resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + core-js-pure@3.41.0: + resolution: {integrity: sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==} + core-js@3.41.0: resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} @@ -3822,6 +3872,7 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lie@3.3.0: @@ -3838,6 +3889,10 @@ packages: resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} engines: {node: '>=4.0.0'} + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + local-pkg@1.1.1: resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} engines: {node: '>=14'} @@ -4436,12 +4491,6 @@ packages: peerDependencies: react: ^19.0.0 - react-ellipsis-component@1.1.11: - resolution: {integrity: sha512-7qPeHrqgS241sdIOoNNMQWqWLI04ae7myiau8XvMOFJVWWVVs61FjImht2TViu27PAGaVrejV6x18cLoVIX29w==} - engines: {node: '>=10'} - peerDependencies: - react: '>=16' - react-final-form@6.5.9: resolution: {integrity: sha512-x3XYvozolECp3nIjly+4QqxdjSSWfcnpGEL5K8OBT6xmGrq5kBqbA6+/tOqoom9NwqIPPbxPNsOViFlbKgowbA==} peerDependencies: @@ -4458,6 +4507,10 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-refresh@0.16.0: + resolution: {integrity: sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==} + engines: {node: '>=0.10.0'} + react-router-dom@7.0.2: resolution: {integrity: sha512-VJOQ+CDWFDGaWdrG12Nl+d7yHtLaurNgAQZVgaIy7/Xd+DojgmYLosFfZdGz1wpxmjJIAkAMVTKWcvkx1oggAw==} engines: {node: '>=20.0.0'} @@ -4722,6 +4775,7 @@ packages: shaka-player@4.12.5: resolution: {integrity: sha512-jJEkASLivZ0Eqg+sIfBJWCWFDzo2l4rfG1e2y5apqphKbDZaMrSCX0Z/B14epJCfStSAwGqKyuC1D+K3e4xBEg==} + engines: {node: '>=14'} shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} @@ -4793,6 +4847,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -6657,6 +6715,21 @@ snapshots: dependencies: playwright: 1.50.1 + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.16.0)(type-fest@4.29.1)(webpack-dev-server@5.1.0)(webpack@5.96.1)': + dependencies: + ansi-html: 0.0.9 + core-js-pure: 3.41.0 + error-stack-parser: 2.1.4 + html-entities: 2.5.2 + loader-utils: 2.0.4 + react-refresh: 0.16.0 + schema-utils: 4.2.0 + source-map: 0.7.4 + webpack: 5.96.1(webpack-cli@5.1.4) + optionalDependencies: + type-fest: 4.29.1 + webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.96.1) + '@polka/url@1.0.0-next.28': {} '@radix-ui/number@1.1.0': {} @@ -6959,6 +7032,17 @@ snapshots: dependencies: '@types/node': 22.10.0 + '@types/webpack-bundle-analyzer@4.7.0(webpack-cli@5.1.4)': + dependencies: + '@types/node': 22.10.0 + tapable: 2.2.1 + webpack: 5.96.1(webpack-cli@5.1.4) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + '@types/wicg-task-scheduling@2024.1.0': {} '@types/ws@8.5.13': @@ -7047,6 +7131,8 @@ snapshots: '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 + '@ungap/with-resolvers@0.1.0': {} + '@unocss/core@66.1.0-beta.5': {} '@unocss/extractor-arbitrary-variants@66.1.0-beta.5': @@ -7293,6 +7379,8 @@ snapshots: ansi-html-community@0.0.8: {} + ansi-html@0.0.9: {} + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -7634,6 +7722,8 @@ snapshots: dependencies: browserslist: 4.24.2 + core-js-pure@3.41.0: {} + core-js@3.41.0: {} core-util-is@1.0.3: {} @@ -8966,6 +9056,12 @@ snapshots: emojis-list: 3.0.0 json5: 1.0.2 + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + local-pkg@1.1.1: dependencies: mlly: 1.7.4 @@ -9488,11 +9584,6 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 - react-ellipsis-component@1.1.11(react@19.0.0): - dependencies: - react: 19.0.0 - resize-observer-polyfill: 1.5.1 - react-final-form@6.5.9(final-form@4.20.10)(react@19.0.0): dependencies: '@babel/runtime': 7.26.10 @@ -9508,6 +9599,8 @@ snapshots: react-is@16.13.1: {} + react-refresh@0.16.0: {} + react-router-dom@7.0.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 @@ -9906,6 +9999,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.4: {} + spdy-transport@3.0.0: dependencies: debug: 4.3.7 diff --git a/public/animations/001.avif b/public/animations/001.avif new file mode 100644 index 000000000..7d2e64c50 Binary files /dev/null and b/public/animations/001.avif differ diff --git a/public/images/001.rs.avif b/public/images/001.rs.avif new file mode 100644 index 000000000..95e41af14 Binary files /dev/null and b/public/images/001.rs.avif differ diff --git a/public/images/001.rs.png b/public/images/001.rs.png new file mode 100644 index 000000000..1f4746278 Binary files /dev/null and b/public/images/001.rs.png differ diff --git a/public/images/002.rs.avif b/public/images/002.rs.avif new file mode 100644 index 000000000..fe3e5e1bd Binary files /dev/null and b/public/images/002.rs.avif differ diff --git a/public/images/002.rs.png b/public/images/002.rs.png new file mode 100644 index 000000000..c33cb9d64 Binary files /dev/null and b/public/images/002.rs.png differ diff --git a/public/images/003.rs.avif b/public/images/003.rs.avif new file mode 100644 index 000000000..dd3fbd287 Binary files /dev/null and b/public/images/003.rs.avif differ diff --git a/public/images/003.rs.png b/public/images/003.rs.png new file mode 100644 index 000000000..f95c63a81 Binary files /dev/null and b/public/images/003.rs.png differ diff --git a/public/images/004.rs.avif b/public/images/004.rs.avif new file mode 100644 index 000000000..d88ef15b1 Binary files /dev/null and b/public/images/004.rs.avif differ diff --git a/public/images/004.rs.png b/public/images/004.rs.png new file mode 100644 index 000000000..b7912ed30 Binary files /dev/null and b/public/images/004.rs.png differ diff --git a/public/images/005.rs.avif b/public/images/005.rs.avif new file mode 100644 index 000000000..9133d5919 Binary files /dev/null and b/public/images/005.rs.avif differ diff --git a/public/images/005.rs.png b/public/images/005.rs.png new file mode 100644 index 000000000..e8700517e Binary files /dev/null and b/public/images/005.rs.png differ diff --git a/public/images/006.rs.avif b/public/images/006.rs.avif new file mode 100644 index 000000000..e1310a549 Binary files /dev/null and b/public/images/006.rs.avif differ diff --git a/public/images/006.rs.png b/public/images/006.rs.png new file mode 100644 index 000000000..98feb376c Binary files /dev/null and b/public/images/006.rs.png differ diff --git a/public/images/007.rs.avif b/public/images/007.rs.avif new file mode 100644 index 000000000..2717c5e25 Binary files /dev/null and b/public/images/007.rs.avif differ diff --git a/public/images/007.rs.png b/public/images/007.rs.png new file mode 100644 index 000000000..9d61d7412 Binary files /dev/null and b/public/images/007.rs.png differ diff --git a/public/images/008.rs.avif b/public/images/008.rs.avif new file mode 100644 index 000000000..5b4a87e0c Binary files /dev/null and b/public/images/008.rs.avif differ diff --git a/public/images/008.rs.png b/public/images/008.rs.png new file mode 100644 index 000000000..115bf1542 Binary files /dev/null and b/public/images/008.rs.png differ diff --git a/public/images/009.rs.avif b/public/images/009.rs.avif new file mode 100644 index 000000000..a2d9f391f Binary files /dev/null and b/public/images/009.rs.avif differ diff --git a/public/images/009.rs.png b/public/images/009.rs.png new file mode 100644 index 000000000..ab4325596 Binary files /dev/null and b/public/images/009.rs.png differ diff --git a/public/images/010.rs.avif b/public/images/010.rs.avif new file mode 100644 index 000000000..34c5b295f Binary files /dev/null and b/public/images/010.rs.avif differ diff --git a/public/images/010.rs.png b/public/images/010.rs.png new file mode 100644 index 000000000..3bee47ab9 Binary files /dev/null and b/public/images/010.rs.png differ diff --git a/public/images/011.rs.avif b/public/images/011.rs.avif new file mode 100644 index 000000000..f5aa2a675 Binary files /dev/null and b/public/images/011.rs.avif differ diff --git a/public/images/011.rs.png b/public/images/011.rs.png new file mode 100644 index 000000000..9ef49ee99 Binary files /dev/null and b/public/images/011.rs.png differ diff --git a/public/images/012.rs.avif b/public/images/012.rs.avif new file mode 100644 index 000000000..50debd794 Binary files /dev/null and b/public/images/012.rs.avif differ diff --git a/public/images/012.rs.png b/public/images/012.rs.png new file mode 100644 index 000000000..a862b6315 Binary files /dev/null and b/public/images/012.rs.png differ diff --git a/public/images/013.rs.avif b/public/images/013.rs.avif new file mode 100644 index 000000000..9f97e1530 Binary files /dev/null and b/public/images/013.rs.avif differ diff --git a/public/images/013.rs.png b/public/images/013.rs.png new file mode 100644 index 000000000..ad09610b2 Binary files /dev/null and b/public/images/013.rs.png differ diff --git a/public/images/014.rs.avif b/public/images/014.rs.avif new file mode 100644 index 000000000..cb1f11ea3 Binary files /dev/null and b/public/images/014.rs.avif differ diff --git a/public/images/014.rs.png b/public/images/014.rs.png new file mode 100644 index 000000000..1649d2fd8 Binary files /dev/null and b/public/images/014.rs.png differ diff --git a/public/images/015.rs.avif b/public/images/015.rs.avif new file mode 100644 index 000000000..7864756c8 Binary files /dev/null and b/public/images/015.rs.avif differ diff --git a/public/images/015.rs.png b/public/images/015.rs.png new file mode 100644 index 000000000..1ad4fd568 Binary files /dev/null and b/public/images/015.rs.png differ diff --git a/public/images/016.rs.avif b/public/images/016.rs.avif new file mode 100644 index 000000000..1e265532f Binary files /dev/null and b/public/images/016.rs.avif differ diff --git a/public/images/016.rs.png b/public/images/016.rs.png new file mode 100644 index 000000000..e647d557f Binary files /dev/null and b/public/images/016.rs.png differ diff --git a/public/images/017.rs.avif b/public/images/017.rs.avif new file mode 100644 index 000000000..cff7dd694 Binary files /dev/null and b/public/images/017.rs.avif differ diff --git a/public/images/017.rs.png b/public/images/017.rs.png new file mode 100644 index 000000000..5d833c52d Binary files /dev/null and b/public/images/017.rs.png differ diff --git a/public/images/018.rs.avif b/public/images/018.rs.avif new file mode 100644 index 000000000..9a35862f4 Binary files /dev/null and b/public/images/018.rs.avif differ diff --git a/public/images/018.rs.png b/public/images/018.rs.png new file mode 100644 index 000000000..8bda5b4df Binary files /dev/null and b/public/images/018.rs.png differ diff --git a/public/images/019.rs.avif b/public/images/019.rs.avif new file mode 100644 index 000000000..230173147 Binary files /dev/null and b/public/images/019.rs.avif differ diff --git a/public/images/019.rs.png b/public/images/019.rs.png new file mode 100644 index 000000000..229ee81f3 Binary files /dev/null and b/public/images/019.rs.png differ diff --git a/public/images/020.rs.avif b/public/images/020.rs.avif new file mode 100644 index 000000000..00d5fad9b Binary files /dev/null and b/public/images/020.rs.avif differ diff --git a/public/images/020.rs.png b/public/images/020.rs.png new file mode 100644 index 000000000..67a0e6689 Binary files /dev/null and b/public/images/020.rs.png differ diff --git a/public/images/021.rs.avif b/public/images/021.rs.avif new file mode 100644 index 000000000..c97a8f313 Binary files /dev/null and b/public/images/021.rs.avif differ diff --git a/public/images/021.rs.png b/public/images/021.rs.png new file mode 100644 index 000000000..667ab1129 Binary files /dev/null and b/public/images/021.rs.png differ diff --git a/public/images/022.rs.avif b/public/images/022.rs.avif new file mode 100644 index 000000000..62afd749a Binary files /dev/null and b/public/images/022.rs.avif differ diff --git a/public/images/022.rs.png b/public/images/022.rs.png new file mode 100644 index 000000000..6f5d03475 Binary files /dev/null and b/public/images/022.rs.png differ diff --git a/public/images/023.rs.avif b/public/images/023.rs.avif new file mode 100644 index 000000000..f7e2003b1 Binary files /dev/null and b/public/images/023.rs.avif differ diff --git a/public/images/023.rs.png b/public/images/023.rs.png new file mode 100644 index 000000000..e8b1604c8 Binary files /dev/null and b/public/images/023.rs.png differ diff --git a/public/images/024.rs.avif b/public/images/024.rs.avif new file mode 100644 index 000000000..352a21416 Binary files /dev/null and b/public/images/024.rs.avif differ diff --git a/public/images/024.rs.png b/public/images/024.rs.png new file mode 100644 index 000000000..c665fc447 Binary files /dev/null and b/public/images/024.rs.png differ diff --git a/public/images/025.rs.avif b/public/images/025.rs.avif new file mode 100644 index 000000000..c904fc47b Binary files /dev/null and b/public/images/025.rs.avif differ diff --git a/public/images/025.rs.png b/public/images/025.rs.png new file mode 100644 index 000000000..38baa34e4 Binary files /dev/null and b/public/images/025.rs.png differ diff --git a/public/images/026.rs.avif b/public/images/026.rs.avif new file mode 100644 index 000000000..7135c9c93 Binary files /dev/null and b/public/images/026.rs.avif differ diff --git a/public/images/026.rs.png b/public/images/026.rs.png new file mode 100644 index 000000000..b2f1ab978 Binary files /dev/null and b/public/images/026.rs.png differ diff --git a/public/images/027.rs.avif b/public/images/027.rs.avif new file mode 100644 index 000000000..5118233e3 Binary files /dev/null and b/public/images/027.rs.avif differ diff --git a/public/images/027.rs.png b/public/images/027.rs.png new file mode 100644 index 000000000..bc42adb26 Binary files /dev/null and b/public/images/027.rs.png differ diff --git a/public/images/028.rs.avif b/public/images/028.rs.avif new file mode 100644 index 000000000..8adb7b5d2 Binary files /dev/null and b/public/images/028.rs.avif differ diff --git a/public/images/028.rs.png b/public/images/028.rs.png new file mode 100644 index 000000000..08fa024b9 Binary files /dev/null and b/public/images/028.rs.png differ diff --git a/public/images/029.rs.avif b/public/images/029.rs.avif new file mode 100644 index 000000000..e34ea558f Binary files /dev/null and b/public/images/029.rs.avif differ diff --git a/public/images/029.rs.png b/public/images/029.rs.png new file mode 100644 index 000000000..f0578daac Binary files /dev/null and b/public/images/029.rs.png differ diff --git a/public/images/030.rs.avif b/public/images/030.rs.avif new file mode 100644 index 000000000..38bebe4a4 Binary files /dev/null and b/public/images/030.rs.avif differ diff --git a/public/images/030.rs.png b/public/images/030.rs.png new file mode 100644 index 000000000..f5f67f1a9 Binary files /dev/null and b/public/images/030.rs.png differ diff --git a/public/images/031.rs.avif b/public/images/031.rs.avif new file mode 100644 index 000000000..1de2f9bc5 Binary files /dev/null and b/public/images/031.rs.avif differ diff --git a/public/images/031.rs.png b/public/images/031.rs.png new file mode 100644 index 000000000..cd3092514 Binary files /dev/null and b/public/images/031.rs.png differ diff --git a/public/images/032.rs.avif b/public/images/032.rs.avif new file mode 100644 index 000000000..d96c59363 Binary files /dev/null and b/public/images/032.rs.avif differ diff --git a/public/images/032.rs.png b/public/images/032.rs.png new file mode 100644 index 000000000..b89e9f8a6 Binary files /dev/null and b/public/images/032.rs.png differ diff --git a/public/images/033.rs.avif b/public/images/033.rs.avif new file mode 100644 index 000000000..bcac46496 Binary files /dev/null and b/public/images/033.rs.avif differ diff --git a/public/images/033.rs.png b/public/images/033.rs.png new file mode 100644 index 000000000..05add5a03 Binary files /dev/null and b/public/images/033.rs.png differ diff --git a/public/images/034.rs.avif b/public/images/034.rs.avif new file mode 100644 index 000000000..77e493305 Binary files /dev/null and b/public/images/034.rs.avif differ diff --git a/public/images/034.rs.png b/public/images/034.rs.png new file mode 100644 index 000000000..80c3df292 Binary files /dev/null and b/public/images/034.rs.png differ diff --git a/public/images/035.rs.avif b/public/images/035.rs.avif new file mode 100644 index 000000000..459eed350 Binary files /dev/null and b/public/images/035.rs.avif differ diff --git a/public/images/035.rs.png b/public/images/035.rs.png new file mode 100644 index 000000000..7e2e63a72 Binary files /dev/null and b/public/images/035.rs.png differ diff --git a/public/images/036.rs.avif b/public/images/036.rs.avif new file mode 100644 index 000000000..b8b49e9a0 Binary files /dev/null and b/public/images/036.rs.avif differ diff --git a/public/images/036.rs.png b/public/images/036.rs.png new file mode 100644 index 000000000..e92a58b91 Binary files /dev/null and b/public/images/036.rs.png differ diff --git a/public/images/037.rs.avif b/public/images/037.rs.avif new file mode 100644 index 000000000..4791123de Binary files /dev/null and b/public/images/037.rs.avif differ diff --git a/public/images/037.rs.png b/public/images/037.rs.png new file mode 100644 index 000000000..690ae69c4 Binary files /dev/null and b/public/images/037.rs.png differ diff --git a/public/images/feature-explain.avif b/public/images/feature-explain.avif new file mode 100644 index 000000000..b0adfb44b Binary files /dev/null and b/public/images/feature-explain.avif differ diff --git a/workspaces/client/package.json b/workspaces/client/package.json index f6c261693..ebf798bc1 100644 --- a/workspaces/client/package.json +++ b/workspaces/client/package.json @@ -3,6 +3,7 @@ "private": true, "scripts": { "build": "wireit", + "start": "wireit", "format": "wireit", "format:eslint": "wireit", "format:prettier": "wireit" @@ -16,6 +17,7 @@ "@headlessui/react": "2.2.0", "@radix-ui/react-slider": "1.2.3", "@standard-schema/spec": "1.0.0", + "@ungap/with-resolvers": "0.1.0", "@wsh-2025/client": "workspace:*", "@wsh-2025/schema": "workspace:*", "@yornaath/batshit": "0.10.1", @@ -28,7 +30,6 @@ "p-min-delay": "4.0.2", "react": "19.0.0", "react-dom": "19.0.0", - "react-ellipsis-component": "1.1.11", "react-final-form": "6.5.9", "react-flip-toolkit": "7.2.4", "react-router": "7.0.2", @@ -54,11 +55,13 @@ "@ffmpeg/util": "0.12.2", "@iconify/json": "2.2.317", "@iconify/types": "2.0.0", + "@pmmmwh/react-refresh-webpack-plugin": "0.5.15", "@types/lodash": "4.17.16", "@types/luxon": "3.4.2", "@types/m3u8-parser": "7.2.0", "@types/react": "19.0.1", "@types/react-dom": "19.0.2", + "@types/webpack-bundle-analyzer": "4.7.0", "@types/wicg-task-scheduling": "2024.1.0", "@unocss/preset-icons": "66.1.0-beta.5", "@unocss/preset-wind3": "66.1.0-beta.5", @@ -69,6 +72,7 @@ "babel-loader": "9.2.1", "core-js": "3.41.0", "hls.js": "1.5.17", + "react-refresh": "0.16.0", "shaka-player": "4.12.5", "typescript": "5.7.2", "video.js": "8.21.0", @@ -89,7 +93,15 @@ ], "output": [ "./dist/**/*" - ] + ], + "env": { + "NODE_ENV": "production" + } + }, + "start": { + "command": "webpack-dev-server", + "service": true, + "daemon": true }, "format": { "command": "pnpm run format:eslint && pnpm run format:prettier" @@ -101,4 +113,4 @@ "command": "prettier --write ." } } -} +} \ No newline at end of file diff --git a/workspaces/client/src/app/createRoutes.tsx b/workspaces/client/src/app/createRoutes.tsx index a81e12561..eaa28e1f1 100644 --- a/workspaces/client/src/app/createRoutes.tsx +++ b/workspaces/client/src/app/createRoutes.tsx @@ -1,5 +1,4 @@ -import lazy from 'p-min-delay'; -import { RouteObject } from 'react-router'; +import { type RouteObject } from 'react-router'; import { Document, prefetch } from '@wsh-2025/client/src/app/Document'; import { createStore } from '@wsh-2025/client/src/app/createStore'; @@ -11,10 +10,7 @@ export function createRoutes(store: ReturnType): RouteObject { index: true, async lazy() { - const { HomePage, prefetch } = await lazy( - import('@wsh-2025/client/src/pages/home/components/HomePage'), - 1000, - ); + const { HomePage, prefetch } = await import('@wsh-2025/client/src/pages/home/components/HomePage'); return { Component: HomePage, async loader() { @@ -25,10 +21,7 @@ export function createRoutes(store: ReturnType): RouteObject }, { async lazy() { - const { EpisodePage, prefetch } = await lazy( - import('@wsh-2025/client/src/pages/episode/components/EpisodePage'), - 1000, - ); + const { EpisodePage, prefetch } = await import('@wsh-2025/client/src/pages/episode/components/EpisodePage'); return { Component: EpisodePage, async loader({ params }) { @@ -40,10 +33,7 @@ export function createRoutes(store: ReturnType): RouteObject }, { async lazy() { - const { prefetch, ProgramPage } = await lazy( - import('@wsh-2025/client/src/pages/program/components/ProgramPage'), - 1000, - ); + const { prefetch, ProgramPage } = await import('@wsh-2025/client/src/pages/program/components/ProgramPage'); return { Component: ProgramPage, async loader({ params }) { @@ -55,10 +45,7 @@ export function createRoutes(store: ReturnType): RouteObject }, { async lazy() { - const { prefetch, SeriesPage } = await lazy( - import('@wsh-2025/client/src/pages/series/components/SeriesPage'), - 1000, - ); + const { prefetch, SeriesPage } = await import('@wsh-2025/client/src/pages/series/components/SeriesPage'); return { Component: SeriesPage, async loader({ params }) { @@ -70,10 +57,7 @@ export function createRoutes(store: ReturnType): RouteObject }, { async lazy() { - const { prefetch, TimetablePage } = await lazy( - import('@wsh-2025/client/src/pages/timetable/components/TimetablePage'), - 1000, - ); + const { prefetch, TimetablePage } = await import('@wsh-2025/client/src/pages/timetable/components/TimetablePage'); return { Component: TimetablePage, async loader() { @@ -85,10 +69,7 @@ export function createRoutes(store: ReturnType): RouteObject }, { async lazy() { - const { NotFoundPage, prefetch } = await lazy( - import('@wsh-2025/client/src/pages/not_found/components/NotFoundPage'), - 1000, - ); + const { NotFoundPage, prefetch } = await import('@wsh-2025/client/src/pages/not_found/components/NotFoundPage'); return { Component: NotFoundPage, async loader() { diff --git a/workspaces/client/src/app/createStore.ts b/workspaces/client/src/app/createStore.ts index 92d2abaaf..1c66bbf30 100644 --- a/workspaces/client/src/app/createStore.ts +++ b/workspaces/client/src/app/createStore.ts @@ -1,5 +1,5 @@ import { withLenses } from '@dhmk/zustand-lens'; -import _ from 'lodash'; +import merge from 'lodash/merge'; import { createStore as createZustandStore } from 'zustand/vanilla'; import { createAuthStoreSlice } from '@wsh-2025/client/src/features/auth/stores/createAuthStoreSlice'; @@ -39,7 +39,7 @@ export const createStore = ({ hydrationData }: Props) => { })), ); - store.setState((s) => _.merge(s, hydrationData)); + store.setState((s) => merge(s, hydrationData)); return store; }; diff --git a/workspaces/client/src/features/auth/components/SignInDialog.tsx b/workspaces/client/src/features/auth/components/SignInDialog.tsx index 350d89edc..5ce6e116d 100644 --- a/workspaces/client/src/features/auth/components/SignInDialog.tsx +++ b/workspaces/client/src/features/auth/components/SignInDialog.tsx @@ -47,7 +47,12 @@ export const SignInDialog = ({ isOpen, onClose, onOpenSignUp }: Props) => {
- +

ログイン

diff --git a/workspaces/client/src/features/auth/components/SignOutDialog.tsx b/workspaces/client/src/features/auth/components/SignOutDialog.tsx index d7c1fd336..93ac3d148 100644 --- a/workspaces/client/src/features/auth/components/SignOutDialog.tsx +++ b/workspaces/client/src/features/auth/components/SignOutDialog.tsx @@ -28,7 +28,12 @@ export const SignOutDialog = ({ isOpen, onClose }: Props) => {
- +

ログアウト

diff --git a/workspaces/client/src/features/auth/components/SignUpDialog.tsx b/workspaces/client/src/features/auth/components/SignUpDialog.tsx index 1cb939f8d..74e5348a0 100644 --- a/workspaces/client/src/features/auth/components/SignUpDialog.tsx +++ b/workspaces/client/src/features/auth/components/SignUpDialog.tsx @@ -47,7 +47,12 @@ export const SignUpDialog = ({ isOpen, onClose, onOpenSignIn }: Props) => {
- +

会員登録

diff --git a/workspaces/client/src/features/layout/components/Ellipsis.tsx b/workspaces/client/src/features/layout/components/Ellipsis.tsx new file mode 100644 index 000000000..ee3afcda2 --- /dev/null +++ b/workspaces/client/src/features/layout/components/Ellipsis.tsx @@ -0,0 +1,17 @@ +interface Props { + ellipsis?: boolean; + maxLine: number; + reflowOnResize?: boolean; + text: string; + visibleLine?: number; +} +export const Ellipsis = ({ ellipsis, maxLine, text, visibleLine }: Props) => { + return ( +
+ {text} +
+ ); +}; diff --git a/workspaces/client/src/features/layout/components/Header.tsx b/workspaces/client/src/features/layout/components/Header.tsx new file mode 100644 index 000000000..00117b4ab --- /dev/null +++ b/workspaces/client/src/features/layout/components/Header.tsx @@ -0,0 +1,45 @@ +import classNames from 'classnames'; +import { useCallback, useEffect, useState } from 'react'; +import { Link } from 'react-router'; + +export const Header = () => { + const isLoading = false; // TODO: Replace with your loading state + const [scrollTopOffset, setScrollTopOffset] = useState(0); + const [shouldHeaderBeTransparent, setShouldHeaderBeTransparent] = useState(false); + + const handleScroll = useCallback(() => { + setScrollTopOffset(window.scrollY); + }, [setScrollTopOffset]); + + useEffect(() => { + window.addEventListener('scroll', handleScroll); + return () => { + window.removeEventListener('scroll', handleScroll); + }; + }, []); + + useEffect(() => { + setShouldHeaderBeTransparent(scrollTopOffset > 80); + }, [scrollTopOffset]); + + return ( +
+ + AREMA + +
+ ); +}; diff --git a/workspaces/client/src/features/layout/components/Layout.tsx b/workspaces/client/src/features/layout/components/Layout.tsx index 99eadef4b..222ec142b 100644 --- a/workspaces/client/src/features/layout/components/Layout.tsx +++ b/workspaces/client/src/features/layout/components/Layout.tsx @@ -1,5 +1,4 @@ -import classNames from 'classnames'; -import { ReactNode, useEffect, useState } from 'react'; +import { ReactNode } from 'react'; import { Flipper } from 'react-flip-toolkit'; import { Link, useLocation, useNavigation } from 'react-router'; @@ -10,16 +9,14 @@ import { AuthDialogType } from '@wsh-2025/client/src/features/auth/constants/aut import { useAuthActions } from '@wsh-2025/client/src/features/auth/hooks/useAuthActions'; import { useAuthDialogType } from '@wsh-2025/client/src/features/auth/hooks/useAuthDialogType'; import { useAuthUser } from '@wsh-2025/client/src/features/auth/hooks/useAuthUser'; +import { Header } from '@wsh-2025/client/src/features/layout/components/Header'; import { Loading } from '@wsh-2025/client/src/features/layout/components/Loading'; -import { useSubscribePointer } from '@wsh-2025/client/src/features/layout/hooks/useSubscribePointer'; interface Props { children: ReactNode; } export const Layout = ({ children }: Props) => { - useSubscribePointer(); - const navigation = useNavigation(); const isLoading = navigation.location != null && (navigation.location.state as { loading?: string } | null)?.['loading'] !== 'none'; @@ -31,42 +28,12 @@ export const Layout = ({ children }: Props) => { const authDialogType = useAuthDialogType(); const user = useAuthUser(); - const [scrollTopOffset, setScrollTopOffset] = useState(0); - const [shouldHeaderBeTransparent, setShouldHeaderBeTransparent] = useState(false); - - useEffect(() => { - const handleScroll = () => { - setScrollTopOffset(window.scrollY); - }; - - window.addEventListener('scroll', handleScroll); - - return () => { - window.removeEventListener('scroll', handleScroll); - }; - }, []); - - useEffect(() => { - setShouldHeaderBeTransparent(scrollTopOffset > 80); - }, [scrollTopOffset]); - const isSignedIn = user != null; return ( <>
-
- - AREMA - -
+