From 48600bb1f903b78706ee45c3db8083194bf58b79 Mon Sep 17 00:00:00 2001 From: neverland Date: Mon, 20 Jul 2026 16:56:52 +0800 Subject: [PATCH] feat: add documentation website --- package.json | 1 + pnpm-lock.yaml | 668 +++++++++++++++++- pnpm-workspace.yaml | 7 + rstack.config.ts | 1 + scripts/dictionary.txt | 3 + website/README.md | 26 + website/docs/en/_nav.json | 21 + website/docs/en/commands/_meta.json | 7 + website/docs/en/commands/index.mdx | 3 + website/docs/en/config/_meta.json | 7 + website/docs/en/config/index.mdx | 3 + website/docs/en/guide/_meta.json | 12 + website/docs/en/guide/introduction.mdx | 3 + website/docs/en/guide/quick-start.mdx | 3 + website/docs/en/index.mdx | 5 + website/docs/zh/_nav.json | 21 + website/docs/zh/commands/_meta.json | 7 + website/docs/zh/commands/index.mdx | 3 + website/docs/zh/config/_meta.json | 7 + website/docs/zh/config/index.mdx | 3 + website/docs/zh/guide/_meta.json | 12 + website/docs/zh/guide/introduction.mdx | 3 + website/docs/zh/guide/quick-start.mdx | 3 + website/docs/zh/index.mdx | 5 + website/env.d.ts | 4 + website/i18n.json | 86 +++ website/package.json | 27 + website/rstack.config.ts | 98 +++ .../theme/components/Copyright.module.scss | 28 + website/theme/components/Copyright.tsx | 14 + website/theme/components/Features.module.scss | 13 + website/theme/components/Features.tsx | 48 ++ website/theme/components/Hero.module.scss | 8 + website/theme/components/Hero.tsx | 22 + .../theme/components/HomeFooter.module.scss | 49 ++ website/theme/components/HomeFooter.tsx | 118 ++++ website/theme/components/ToolStack.tsx | 13 + website/theme/components/utils.ts | 14 + website/theme/env.d.ts | 1 + website/theme/index.scss | 26 + website/theme/index.tsx | 10 + website/theme/pages/index.tsx | 19 + website/tsconfig.json | 25 + 43 files changed, 1454 insertions(+), 3 deletions(-) create mode 100644 website/README.md create mode 100644 website/docs/en/_nav.json create mode 100644 website/docs/en/commands/_meta.json create mode 100644 website/docs/en/commands/index.mdx create mode 100644 website/docs/en/config/_meta.json create mode 100644 website/docs/en/config/index.mdx create mode 100644 website/docs/en/guide/_meta.json create mode 100644 website/docs/en/guide/introduction.mdx create mode 100644 website/docs/en/guide/quick-start.mdx create mode 100644 website/docs/en/index.mdx create mode 100644 website/docs/zh/_nav.json create mode 100644 website/docs/zh/commands/_meta.json create mode 100644 website/docs/zh/commands/index.mdx create mode 100644 website/docs/zh/config/_meta.json create mode 100644 website/docs/zh/config/index.mdx create mode 100644 website/docs/zh/guide/_meta.json create mode 100644 website/docs/zh/guide/introduction.mdx create mode 100644 website/docs/zh/guide/quick-start.mdx create mode 100644 website/docs/zh/index.mdx create mode 100644 website/env.d.ts create mode 100644 website/i18n.json create mode 100644 website/package.json create mode 100644 website/rstack.config.ts create mode 100644 website/theme/components/Copyright.module.scss create mode 100644 website/theme/components/Copyright.tsx create mode 100644 website/theme/components/Features.module.scss create mode 100644 website/theme/components/Features.tsx create mode 100644 website/theme/components/Hero.module.scss create mode 100644 website/theme/components/Hero.tsx create mode 100644 website/theme/components/HomeFooter.module.scss create mode 100644 website/theme/components/HomeFooter.tsx create mode 100644 website/theme/components/ToolStack.tsx create mode 100644 website/theme/components/utils.ts create mode 100644 website/theme/env.d.ts create mode 100644 website/theme/index.scss create mode 100644 website/theme/index.tsx create mode 100644 website/theme/pages/index.tsx create mode 100644 website/tsconfig.json diff --git a/package.json b/package.json index 0703357..b60f35d 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "build": "pnpm --filter './packages/**' build", "check:format": "oxfmt . --check", "check:spell": "pnpm dlx cspell", + "doc": "pnpm --dir website dev", "format": "oxfmt .", "lint": "rs lint --type-check", "prepare": "husky", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6893fa..6039e86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,9 @@ catalogs: '@rsbuild/plugin-react': specifier: ^2.1.0 version: 2.1.0 + '@rsbuild/plugin-sass': + specifier: ^2.0.1 + version: 2.0.1 '@rslib/core': specifier: ~1.0.0-beta.0 version: 1.0.0-beta.0 @@ -22,6 +25,12 @@ catalogs: '@rspress/core': specifier: ^2.0.17 version: 2.0.17 + '@rspress/plugin-sitemap': + specifier: ^2.0.17 + version: 2.0.18 + '@rstack-dev/doc-ui': + specifier: 1.14.5 + version: 1.14.5 '@rstackjs/load-config': specifier: ^0.1.2 version: 0.1.2 @@ -37,6 +46,9 @@ catalogs: '@rstest/core': specifier: ~0.11.1 version: 0.11.1 + '@shikijs/transformers': + specifier: ^4.3.1 + version: 4.3.1 '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -76,9 +88,15 @@ catalogs: react-dom: specifier: ^19.2.7 version: 19.2.7 + rsbuild-plugin-open-graph: + specifier: ^1.1.3 + version: 1.1.3 rslog: specifier: ^2.2.0 version: 2.2.0 + rspress-plugin-font-open-sans: + specifier: ^1.0.4 + version: 1.0.4 typescript: specifier: ^7.0.2 version: 7.0.2 @@ -317,6 +335,51 @@ importers: specifier: 'catalog:' version: 7.0.2 + website: + devDependencies: + '@rsbuild/plugin-sass': + specifier: 'catalog:' + version: 2.0.1(@rsbuild/core@2.1.6) + '@rspress/core': + specifier: 'catalog:' + version: 2.0.17(@types/mdast@4.0.4)(@types/react@19.2.17)(micromark-util-types@2.0.2)(micromark@4.0.2) + '@rspress/plugin-sitemap': + specifier: 'catalog:' + version: 2.0.18(@rspress/core@2.0.17) + '@rstack-dev/doc-ui': + specifier: 'catalog:' + version: 1.14.5(@rspress/core@2.0.17) + '@shikijs/transformers': + specifier: 'catalog:' + version: 4.3.1 + '@types/node': + specifier: 'catalog:' + version: 24.13.3 + '@types/react': + specifier: 'catalog:' + version: 19.2.17 + '@types/react-dom': + specifier: 'catalog:' + version: 19.2.3(@types/react@19.2.17) + react: + specifier: 'catalog:' + version: 19.2.7 + react-dom: + specifier: 'catalog:' + version: 19.2.7(react@19.2.7) + rsbuild-plugin-open-graph: + specifier: 'catalog:' + version: 1.1.3(@rsbuild/core@2.1.6) + rspress-plugin-font-open-sans: + specifier: 'catalog:' + version: 1.0.4(@rspress/core@2.0.17) + rstack: + specifier: workspace:* + version: link:../packages/rstack + typescript: + specifier: 'catalog:' + version: 7.0.2 + packages: '@adobe/css-tools@4.5.0': @@ -396,6 +459,9 @@ packages: resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} + '@bufbuild/protobuf@2.12.1': + resolution: {integrity: sha512-BvAMfS6LrgZiryOAZ4pBYucu4wG/Ei/9o9DZ9akbREnMLbPJiom2i8b9C8IsKErQoiKqVhrerzt3kOT/RrzLHg==} + '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} @@ -548,6 +614,94 @@ packages: cpu: [x64] os: [win32] + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + '@rsbuild/core@2.1.5': resolution: {integrity: sha512-7TW4U1SH7VxQZzSTIOzvwj5lo9uNTmGpsmTXFr4axQAE4giLDKP3kVUA1ZW4P3/Mz4QQJJyvZP29mVcb8kZCfg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -576,6 +730,14 @@ packages: '@rsbuild/core': optional: true + '@rsbuild/plugin-sass@2.0.1': + resolution: {integrity: sha512-BZRpVTZW+za+sv84nYYdIjR7XwVqyS8+1wAha/7BvQ1igdzlmT6xPd6h4jTWfNzdHuzIHZsuWY7kPS/ybzcndA==} + peerDependencies: + '@rsbuild/core': ^2.0.0 + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@rslib/core@1.0.0-beta.0': resolution: {integrity: sha512-l+NKLyVBnNPZ2WQoyVM8KoKhi4/mwo96A2fYqcPBXWg0nBJUdaIyJ5sJKAMxa39LR2a15ItShDHKYrQ48aUTbw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -816,9 +978,23 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + '@rspress/plugin-sitemap@2.0.18': + resolution: {integrity: sha512-XfaXzZx+ASN9OMTc0fOvW8QmbmyCyDWkO8xJj4XF4E0YJtsu7j/65+v8/KXXdwpywOfUIQ6M94/meRTy2urNmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rspress/core': ^2.0.10 + '@rspress/shared@2.0.17': resolution: {integrity: sha512-ZzpZ4hm5svgwU0w5CpTLZy4vFD3uPo8+gXtWMOREYMzwfzJeHqwOyXwxHf6byGpx85mVK5DQqMDi61meAS7ZUw==} + '@rstack-dev/doc-ui@1.14.5': + resolution: {integrity: sha512-yIwvhLvmY9CxbYNKktysBMDvuxKFkpF2kcYWV/lv6tDGYCsv+8ARQMJLTAEiyK0sXkjB8YUILASDitgxqweUhQ==} + peerDependencies: + '@rspress/core': '>=2.0.0' + peerDependenciesMeta: + '@rspress/core': + optional: true + '@rstackjs/load-config@0.1.2': resolution: {integrity: sha512-6hChPVosmh2rzEt1M1CvGpsaE/+gGlt51ci5pbyd4Bd1FXyH+Owlg99ECvdcWtD7zdDwDM3jGkQL05xn9oWSIA==} peerDependencies: @@ -887,6 +1063,10 @@ packages: resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} engines: {node: '>=20'} + '@shikijs/transformers@4.3.1': + resolution: {integrity: sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A==} + engines: {node: '>=20'} + '@shikijs/types@4.3.1': resolution: {integrity: sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==} engines: {node: '>=20'} @@ -1155,6 +1335,9 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + body-scroll-lock@4.0.0-beta.0: resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} @@ -1177,6 +1360,10 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -1192,6 +1379,9 @@ packages: collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + colorjs.io@0.5.2: + resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1226,10 +1416,18 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1242,6 +1440,10 @@ packages: emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -1302,6 +1504,10 @@ packages: resolution: {integrity: sha512-6QD0ilzDDt93tX44y8tbmZdAcdTRYDhUP+Asgi6pC8Pp5IA3cvaZGyoVN/EGtlq9ziT65iPuBBn3ASLr6hCgVw==} engines: {node: '>=20.0.0'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} @@ -1349,6 +1555,9 @@ packages: engines: {node: '>=18'} hasBin: true + immutable@5.1.9: + resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -1369,10 +1578,18 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@5.1.0: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -1383,6 +1600,11 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + lint-staged@17.0.8: resolution: {integrity: sha512-B2P/d+jVW0UXOQ0MVMLrB/9ydA1P+zz6jYfdrbbEd9ur3S2rcbduFWKiUCC02Sm5hbC8nrm7y24WuYMG54HfxA==} engines: {node: '>=22.22.1'} @@ -1392,6 +1614,10 @@ packages: resolution: {integrity: sha512-JtNtbZj8q5BnDMR7trpwvwk3RIrANtIVzEUm8w7amp6xelLgyuq+4WZoTH913XaQAoH/cNdYhaNzBPA2U3xbDw==} engines: {node: '>=22.13.0'} + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -1624,6 +1850,14 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + nprogress@0.2.0: resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} @@ -1663,6 +1897,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + postcss@8.5.19: + resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} + engines: {node: ^10 || ^12 || >=14} + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -1717,6 +1955,10 @@ packages: resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -1735,6 +1977,9 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + reduce-configs@2.0.1: + resolution: {integrity: sha512-H9KTCWTEb1YM1OoOz0f6TeGZYlW82sIT1viNg3W8CjjY0pD3WI4MHs8GifKt5FKTVIfHh/DenfJqqY+FP9jF2A==} + regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -1808,10 +2053,148 @@ packages: typescript: optional: true + rsbuild-plugin-open-graph@1.1.3: + resolution: {integrity: sha512-jIOxWCOgYnlONDcxj4LzGpQY5h3B9Apl+e0ieJeAs6YgMvbZ948dsPW5sx8WLj0DuyI3XR8yDNU5P34XXvwXgQ==} + peerDependencies: + '@rsbuild/core': ^1.0.0 || ^2.0.0-0 + peerDependenciesMeta: + '@rsbuild/core': + optional: true + rslog@2.2.0: resolution: {integrity: sha512-aTYPzpoq1NrQYB8uK3mXEZgXoLva5lqMfnFNrPLZALsIx7vD1Q+HTp+fuu2aRHV3PJTg63ARDZ8MT0Lth4SoNg==} engines: {node: ^20.19.0 || >=22.12.0} + rspress-plugin-font-open-sans@1.0.4: + resolution: {integrity: sha512-oWzg/rCmU5jff4nU0KqJ1rIJA0UxV2L9UFyBrzZp/RLlPert56yaHRPZdUoKVQ6eZ2zAHQl9f5cec4DRrfN/Ng==} + peerDependencies: + '@rspress/core': ^2.0.0 + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + sass-embedded-all-unknown@1.100.0: + resolution: {integrity: sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==} + cpu: ['!arm', '!arm64', '!riscv64', '!x64'] + + sass-embedded-android-arm64@1.100.0: + resolution: {integrity: sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + + sass-embedded-android-arm@1.100.0: + resolution: {integrity: sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [android] + + sass-embedded-android-riscv64@1.100.0: + resolution: {integrity: sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [android] + + sass-embedded-android-x64@1.100.0: + resolution: {integrity: sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [android] + + sass-embedded-darwin-arm64@1.100.0: + resolution: {integrity: sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + sass-embedded-darwin-x64@1.100.0: + resolution: {integrity: sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + sass-embedded-linux-arm64@1.100.0: + resolution: {integrity: sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: glibc + + sass-embedded-linux-arm@1.100.0: + resolution: {integrity: sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: glibc + + sass-embedded-linux-musl-arm64@1.100.0: + resolution: {integrity: sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-arm@1.100.0: + resolution: {integrity: sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: musl + + sass-embedded-linux-musl-riscv64@1.100.0: + resolution: {integrity: sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-x64@1.100.0: + resolution: {integrity: sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: musl + + sass-embedded-linux-riscv64@1.100.0: + resolution: {integrity: sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: glibc + + sass-embedded-linux-x64@1.100.0: + resolution: {integrity: sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: glibc + + sass-embedded-unknown-all@1.100.0: + resolution: {integrity: sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==} + os: ['!android', '!darwin', '!linux', '!win32'] + + sass-embedded-win32-arm64@1.100.0: + resolution: {integrity: sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + sass-embedded-win32-x64@1.100.0: + resolution: {integrity: sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + sass-embedded@1.100.0: + resolution: {integrity: sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==} + engines: {node: '>=16.0.0'} + hasBin: true + + sass@1.100.0: + resolution: {integrity: sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==} + engines: {node: '>=20.19.0'} + hasBin: true + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -1837,6 +2220,10 @@ packages: resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} engines: {node: '>=20'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} @@ -1873,6 +2260,18 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + sync-child-process@1.0.2: + resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==} + engines: {node: '>=16.0.0'} + + sync-message-port@1.2.0: + resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==} + engines: {node: '>=16.0.0'} + tinyexec@1.2.4: resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} @@ -1931,6 +2330,9 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -2028,6 +2430,8 @@ snapshots: '@babel/runtime@7.29.7': {} + '@bufbuild/protobuf@2.12.1': {} + '@emnapi/core@1.11.1': dependencies: '@emnapi/wasi-threads': 1.2.2 @@ -2162,6 +2566,67 @@ snapshots: '@oxfmt/binding-win32-x64-msvc@0.59.0': optional: true + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + '@rsbuild/core@2.1.5': dependencies: '@rspack/core': 2.1.3(@swc/helpers@0.5.23) @@ -2194,6 +2659,16 @@ snapshots: transitivePeerDependencies: - '@rspack/core' + '@rsbuild/plugin-sass@2.0.1(@rsbuild/core@2.1.6)': + dependencies: + deepmerge: 4.3.1 + loader-utils: 2.0.4 + postcss: 8.5.19 + reduce-configs: 2.0.1 + sass-embedded: 1.100.0 + optionalDependencies: + '@rsbuild/core': 2.1.6 + '@rslib/core@1.0.0-beta.0(typescript@7.0.2)': dependencies: '@rsbuild/core': 2.1.6 @@ -2419,15 +2894,23 @@ snapshots: - micromark-util-types - supports-color + '@rspress/plugin-sitemap@2.0.18(@rspress/core@2.0.17)': + dependencies: + '@rspress/core': 2.0.17(@types/mdast@4.0.4)(@types/react@19.2.17)(micromark-util-types@2.0.2)(micromark@4.0.2) + '@rspress/shared@2.0.17': dependencies: - '@rsbuild/core': 2.1.5 + '@rsbuild/core': 2.1.6 '@shikijs/rehype': 4.3.1 unified: 11.0.5 transitivePeerDependencies: - '@module-federation/runtime-tools' - core-js + '@rstack-dev/doc-ui@1.14.5(@rspress/core@2.0.17)': + optionalDependencies: + '@rspress/core': 2.0.17(@types/mdast@4.0.4)(@types/react@19.2.17)(micromark-util-types@2.0.2)(micromark@4.0.2) + '@rstackjs/load-config@0.1.2': {} '@rstackjs/test-utils@0.2.0': {} @@ -2496,6 +2979,11 @@ snapshots: dependencies: '@shikijs/types': 4.3.1 + '@shikijs/transformers@4.3.1': + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/types@4.3.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -2597,7 +3085,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.3 '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -2696,11 +3184,13 @@ snapshots: bail@2.0.2: {} + big.js@5.2.2: {} + body-scroll-lock@4.0.0-beta.0: {} buffer-image-size@0.6.4: dependencies: - '@types/node': 24.13.2 + '@types/node': 24.13.3 ccount@2.0.1: {} @@ -2712,6 +3202,11 @@ snapshots: character-reference-invalid@2.0.1: {} + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + optional: true + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -2725,6 +3220,8 @@ snapshots: collapse-white-space@2.1.0: {} + colorjs.io@0.5.2: {} + comma-separated-tokens@2.0.3: {} compute-scroll-into-view@3.1.1: {} @@ -2749,8 +3246,13 @@ snapshots: dependencies: character-entities: 2.0.2 + deepmerge@4.3.1: {} + dequal@2.0.3: {} + detect-libc@2.1.2: + optional: true + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -2761,6 +3263,8 @@ snapshots: emoji-regex@10.6.0: {} + emojis-list@3.0.0: {} + entities@6.0.1: {} entities@7.0.1: {} @@ -2837,6 +3341,8 @@ snapshots: - bufferutil - utf-8-validate + has-flag@4.0.0: {} + hast-util-from-parse5@8.0.3: dependencies: '@types/hast': 3.0.4 @@ -2963,6 +3469,8 @@ snapshots: husky@9.1.7: {} + immutable@5.1.9: {} + indent-string@4.0.0: {} inline-style-parser@0.2.7: {} @@ -2978,16 +3486,26 @@ snapshots: is-decimal@2.0.1: {} + is-extglob@2.1.1: + optional: true + is-fullwidth-code-point@5.1.0: dependencies: get-east-asian-width: 1.6.0 + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + is-hexadecimal@2.0.1: {} is-plain-obj@4.1.0: {} js-tokens@4.0.0: {} + json5@2.2.3: {} + lint-staged@17.0.8: dependencies: listr2: 10.2.2 @@ -3005,6 +3523,12 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 10.0.0 + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + log-update@6.1.0: dependencies: ansi-escapes: 7.3.0 @@ -3510,6 +4034,11 @@ snapshots: ms@2.1.3: {} + nanoid@3.3.16: {} + + node-addon-api@7.1.1: + optional: true + nprogress@0.2.0: {} onetime@7.0.0: @@ -3566,6 +4095,12 @@ snapshots: picomatch@4.0.4: {} + postcss@8.5.19: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -3611,6 +4146,9 @@ snapshots: react@19.2.7: {} + readdirp@5.0.0: + optional: true + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.9 @@ -3645,6 +4183,8 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + reduce-configs@2.0.1: {} + regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -3756,8 +4296,116 @@ snapshots: optionalDependencies: typescript: 7.0.2 + rsbuild-plugin-open-graph@1.1.3(@rsbuild/core@2.1.6): + optionalDependencies: + '@rsbuild/core': 2.1.6 + rslog@2.2.0: {} + rspress-plugin-font-open-sans@1.0.4(@rspress/core@2.0.17): + dependencies: + '@rspress/core': 2.0.17(@types/mdast@4.0.4)(@types/react@19.2.17)(micromark-util-types@2.0.2)(micromark@4.0.2) + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + sass-embedded-all-unknown@1.100.0: + dependencies: + sass: 1.100.0 + optional: true + + sass-embedded-android-arm64@1.100.0: + optional: true + + sass-embedded-android-arm@1.100.0: + optional: true + + sass-embedded-android-riscv64@1.100.0: + optional: true + + sass-embedded-android-x64@1.100.0: + optional: true + + sass-embedded-darwin-arm64@1.100.0: + optional: true + + sass-embedded-darwin-x64@1.100.0: + optional: true + + sass-embedded-linux-arm64@1.100.0: + optional: true + + sass-embedded-linux-arm@1.100.0: + optional: true + + sass-embedded-linux-musl-arm64@1.100.0: + optional: true + + sass-embedded-linux-musl-arm@1.100.0: + optional: true + + sass-embedded-linux-musl-riscv64@1.100.0: + optional: true + + sass-embedded-linux-musl-x64@1.100.0: + optional: true + + sass-embedded-linux-riscv64@1.100.0: + optional: true + + sass-embedded-linux-x64@1.100.0: + optional: true + + sass-embedded-unknown-all@1.100.0: + dependencies: + sass: 1.100.0 + optional: true + + sass-embedded-win32-arm64@1.100.0: + optional: true + + sass-embedded-win32-x64@1.100.0: + optional: true + + sass-embedded@1.100.0: + dependencies: + '@bufbuild/protobuf': 2.12.1 + colorjs.io: 0.5.2 + immutable: 5.1.9 + rxjs: 7.8.2 + supports-color: 8.1.1 + sync-child-process: 1.0.2 + varint: 6.0.0 + optionalDependencies: + sass-embedded-all-unknown: 1.100.0 + sass-embedded-android-arm: 1.100.0 + sass-embedded-android-arm64: 1.100.0 + sass-embedded-android-riscv64: 1.100.0 + sass-embedded-android-x64: 1.100.0 + sass-embedded-darwin-arm64: 1.100.0 + sass-embedded-darwin-x64: 1.100.0 + sass-embedded-linux-arm: 1.100.0 + sass-embedded-linux-arm64: 1.100.0 + sass-embedded-linux-musl-arm: 1.100.0 + sass-embedded-linux-musl-arm64: 1.100.0 + sass-embedded-linux-musl-riscv64: 1.100.0 + sass-embedded-linux-musl-x64: 1.100.0 + sass-embedded-linux-riscv64: 1.100.0 + sass-embedded-linux-x64: 1.100.0 + sass-embedded-unknown-all: 1.100.0 + sass-embedded-win32-arm64: 1.100.0 + sass-embedded-win32-x64: 1.100.0 + + sass@1.100.0: + dependencies: + chokidar: 5.0.0 + immutable: 5.1.9 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 + optional: true + scheduler@0.27.0: {} scroll-into-view-if-needed@3.1.0: @@ -3789,6 +4437,8 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + source-map-js@1.2.1: {} + source-map@0.7.6: {} space-separated-tokens@2.0.2: {} @@ -3827,6 +4477,16 @@ snapshots: dependencies: inline-style-parser: 0.2.7 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + sync-child-process@1.0.2: + dependencies: + sync-message-port: 1.2.0 + + sync-message-port@1.2.0: {} + tinyexec@1.2.4: {} tinypool@2.1.0: {} @@ -3915,6 +4575,8 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + varint@6.0.0: {} + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 12f8a02..d017113 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ packages: - packages/* - examples/* + - website allowBuilds: core-js: false @@ -13,9 +14,12 @@ cleanupUnusedCatalogs: true catalog: '@rsbuild/core': '~2.1.6' '@rsbuild/plugin-react': '^2.1.0' + '@rsbuild/plugin-sass': '^2.0.1' '@rslib/core': '~1.0.0-beta.0' '@rslint/core': '~0.7.0' '@rspress/core': '^2.0.17' + '@rspress/plugin-sitemap': '^2.0.17' + '@rstack-dev/doc-ui': '1.14.5' '@rstackjs/load-config': ^0.1.2 '@rstackjs/test-utils': ^0.2.0 '@rstest/adapter-rsbuild': '~0.11.1' @@ -27,6 +31,7 @@ catalog: '@types/node': '^24.13.3' '@types/react': '^19.2.17' '@types/react-dom': '^19.2.3' + '@shikijs/transformers': '^4.3.1' 'cspell-ban-words': '^0.0.4' 'happy-dom': '^20.10.6' husky: ^9.1.7 @@ -34,7 +39,9 @@ catalog: 'oxfmt': '^0.59.0' 'react': '^19.2.7' 'react-dom': '^19.2.7' + 'rsbuild-plugin-open-graph': '^1.1.3' rslog: ^2.2.0 + 'rspress-plugin-font-open-sans': '^1.0.4' 'typescript': '^7.0.2' dedupePeers: true diff --git a/rstack.config.ts b/rstack.config.ts index fdc84f8..380a9e7 100644 --- a/rstack.config.ts +++ b/rstack.config.ts @@ -12,6 +12,7 @@ define.lint(async () => { './packages/*/tsconfig.json', './packages/*/test/tsconfig.json', './examples/*/tsconfig.json', + './website/tsconfig.json', ], }, }, diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt index 732835a..a785e9b 100644 --- a/scripts/dictionary.txt +++ b/scripts/dictionary.txt @@ -1,4 +1,5 @@ # Custom Dictionary Words +llms oxfmt rsbuild rslib @@ -9,4 +10,6 @@ rspress rstack rstackjs rstest +shiki +shikijs turborepo diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..f2e87ff --- /dev/null +++ b/website/README.md @@ -0,0 +1,26 @@ +# Rstack CLI website + +This website is built with [Rspress](https://rspress.rs/) through Rstack CLI. + +Documentation can be written with Markdown or MDX. + +## Development + +Run the development server from the repository root: + +```bash +pnpm doc +``` + +Build or preview the website from this directory: + +```bash +pnpm build +pnpm preview +``` + +## Contributing + +The website provides English and Chinese documentation. Keep both versions in +sync when possible. Placeholder pages marked with `TODO` are ready for future +documentation. diff --git a/website/docs/en/_nav.json b/website/docs/en/_nav.json new file mode 100644 index 0000000..dc26b30 --- /dev/null +++ b/website/docs/en/_nav.json @@ -0,0 +1,21 @@ +[ + { + "text": "Guide", + "link": "/guide/introduction", + "activeMatch": "/guide/" + }, + { + "text": "Commands", + "link": "/commands/", + "activeMatch": "/commands/" + }, + { + "text": "Configuration", + "link": "/config/", + "activeMatch": "/config/" + }, + { + "text": "Changelog", + "link": "https://github.com/rstackjs/rstack-cli/releases" + } +] diff --git a/website/docs/en/commands/_meta.json b/website/docs/en/commands/_meta.json new file mode 100644 index 0000000..788d5e0 --- /dev/null +++ b/website/docs/en/commands/_meta.json @@ -0,0 +1,7 @@ +[ + { + "type": "file", + "name": "index", + "label": "Command overview" + } +] diff --git a/website/docs/en/commands/index.mdx b/website/docs/en/commands/index.mdx new file mode 100644 index 0000000..727934a --- /dev/null +++ b/website/docs/en/commands/index.mdx @@ -0,0 +1,3 @@ +# Commands + +TODO. diff --git a/website/docs/en/config/_meta.json b/website/docs/en/config/_meta.json new file mode 100644 index 0000000..0b7b11f --- /dev/null +++ b/website/docs/en/config/_meta.json @@ -0,0 +1,7 @@ +[ + { + "type": "file", + "name": "index", + "label": "Configuration overview" + } +] diff --git a/website/docs/en/config/index.mdx b/website/docs/en/config/index.mdx new file mode 100644 index 0000000..0da5e80 --- /dev/null +++ b/website/docs/en/config/index.mdx @@ -0,0 +1,3 @@ +# Configuration + +TODO. diff --git a/website/docs/en/guide/_meta.json b/website/docs/en/guide/_meta.json new file mode 100644 index 0000000..8fbb258 --- /dev/null +++ b/website/docs/en/guide/_meta.json @@ -0,0 +1,12 @@ +[ + { + "type": "file", + "name": "introduction", + "label": "Introduction" + }, + { + "type": "file", + "name": "quick-start", + "label": "Quick start" + } +] diff --git a/website/docs/en/guide/introduction.mdx b/website/docs/en/guide/introduction.mdx new file mode 100644 index 0000000..474d970 --- /dev/null +++ b/website/docs/en/guide/introduction.mdx @@ -0,0 +1,3 @@ +# Introduction + +TODO. diff --git a/website/docs/en/guide/quick-start.mdx b/website/docs/en/guide/quick-start.mdx new file mode 100644 index 0000000..b14d580 --- /dev/null +++ b/website/docs/en/guide/quick-start.mdx @@ -0,0 +1,3 @@ +# Quick start + +TODO. diff --git a/website/docs/en/index.mdx b/website/docs/en/index.mdx new file mode 100644 index 0000000..318d9cf --- /dev/null +++ b/website/docs/en/index.mdx @@ -0,0 +1,5 @@ +--- +description: 'Rstack CLI brings the Rstack toolchain together with one CLI, one configuration, and one consistent workflow.' +pageType: home +titleSuffix: ' - The unified Rstack toolchain' +--- diff --git a/website/docs/zh/_nav.json b/website/docs/zh/_nav.json new file mode 100644 index 0000000..79148cf --- /dev/null +++ b/website/docs/zh/_nav.json @@ -0,0 +1,21 @@ +[ + { + "text": "指南", + "link": "/guide/introduction", + "activeMatch": "/guide/" + }, + { + "text": "命令", + "link": "/commands/", + "activeMatch": "/commands/" + }, + { + "text": "配置", + "link": "/config/", + "activeMatch": "/config/" + }, + { + "text": "更新日志", + "link": "https://github.com/rstackjs/rstack-cli/releases" + } +] diff --git a/website/docs/zh/commands/_meta.json b/website/docs/zh/commands/_meta.json new file mode 100644 index 0000000..c768285 --- /dev/null +++ b/website/docs/zh/commands/_meta.json @@ -0,0 +1,7 @@ +[ + { + "type": "file", + "name": "index", + "label": "命令概览" + } +] diff --git a/website/docs/zh/commands/index.mdx b/website/docs/zh/commands/index.mdx new file mode 100644 index 0000000..d2d3df0 --- /dev/null +++ b/website/docs/zh/commands/index.mdx @@ -0,0 +1,3 @@ +# 命令 + +TODO. diff --git a/website/docs/zh/config/_meta.json b/website/docs/zh/config/_meta.json new file mode 100644 index 0000000..7710d8c --- /dev/null +++ b/website/docs/zh/config/_meta.json @@ -0,0 +1,7 @@ +[ + { + "type": "file", + "name": "index", + "label": "配置概览" + } +] diff --git a/website/docs/zh/config/index.mdx b/website/docs/zh/config/index.mdx new file mode 100644 index 0000000..6d71be2 --- /dev/null +++ b/website/docs/zh/config/index.mdx @@ -0,0 +1,3 @@ +# 配置 + +TODO. diff --git a/website/docs/zh/guide/_meta.json b/website/docs/zh/guide/_meta.json new file mode 100644 index 0000000..504b9ce --- /dev/null +++ b/website/docs/zh/guide/_meta.json @@ -0,0 +1,12 @@ +[ + { + "type": "file", + "name": "introduction", + "label": "介绍" + }, + { + "type": "file", + "name": "quick-start", + "label": "快速上手" + } +] diff --git a/website/docs/zh/guide/introduction.mdx b/website/docs/zh/guide/introduction.mdx new file mode 100644 index 0000000..6214f1e --- /dev/null +++ b/website/docs/zh/guide/introduction.mdx @@ -0,0 +1,3 @@ +# 介绍 + +TODO. diff --git a/website/docs/zh/guide/quick-start.mdx b/website/docs/zh/guide/quick-start.mdx new file mode 100644 index 0000000..17e21f8 --- /dev/null +++ b/website/docs/zh/guide/quick-start.mdx @@ -0,0 +1,3 @@ +# 快速上手 + +TODO. diff --git a/website/docs/zh/index.mdx b/website/docs/zh/index.mdx new file mode 100644 index 0000000..bd90178 --- /dev/null +++ b/website/docs/zh/index.mdx @@ -0,0 +1,5 @@ +--- +description: 'Rstack CLI 通过统一的命令行、配置和工作流整合 Rstack 工具链。' +pageType: home +titleSuffix: ' - 统一的 Rstack 工具链' +--- diff --git a/website/env.d.ts b/website/env.d.ts new file mode 100644 index 0000000..60e338c --- /dev/null +++ b/website/env.d.ts @@ -0,0 +1,4 @@ +declare module '*.mdx' { + const MDXComponent: () => JSX.Element; + export default MDXComponent; +} diff --git a/website/i18n.json b/website/i18n.json new file mode 100644 index 0000000..07efe7b --- /dev/null +++ b/website/i18n.json @@ -0,0 +1,86 @@ +{ + "introduction": { + "en": "Introduction", + "zh": "介绍" + }, + "quickStart": { + "en": "Quick start", + "zh": "快速上手" + }, + "subtitle": { + "en": "The Unified Rstack Toolchain", + "zh": "统一的 Rstack 工具链" + }, + "slogan": { + "en": "One CLI, one configuration, one consistent workflow", + "zh": "一个命令行、一份配置、一致的研发体验" + }, + "unifiedCli": { + "en": "One CLI", + "zh": "统一命令行" + }, + "unifiedCliDesc": { + "en": "Develop, build, test, lint, publish libraries, and serve docs with the rs command.", + "zh": "通过 rs 命令完成开发、构建、测试、检查、库构建和文档开发。" + }, + "oneConfig": { + "en": "One Configuration", + "zh": "统一配置" + }, + "oneConfigDesc": { + "en": "Configure the whole toolchain from a single rstack.config.ts file.", + "zh": "在一份 rstack.config.ts 中配置完整工具链。" + }, + "fullWorkflow": { + "en": "Full Workflow", + "zh": "完整工作流" + }, + "fullWorkflowDesc": { + "en": "Cover applications, libraries, tests, linting, docs, and staged files.", + "zh": "覆盖应用、库、测试、代码检查、文档和暂存文件。" + }, + "ecosystemPowered": { + "en": "Rstack Powered", + "zh": "Rstack 驱动" + }, + "ecosystemPoweredDesc": { + "en": "Built on Rsbuild, Rslib, Rstest, Rslint, Rspress, and Oxfmt.", + "zh": "基于 Rsbuild、Rslib、Rstest、Rslint、Rspress 和 Oxfmt。" + }, + "workflowFriendly": { + "en": "Workflow Friendly", + "zh": "融入现有工作流" + }, + "workflowFriendlyDesc": { + "en": "Keep using your preferred runtime, package manager, and task runner.", + "zh": "继续使用你熟悉的运行时、包管理器和任务编排工具。" + }, + "composable": { + "en": "Composable", + "zh": "灵活组合" + }, + "composableDesc": { + "en": "Adopt the commands you need while retaining access to the underlying tools.", + "zh": "按需采用不同命令,同时保留底层工具的完整能力。" + }, + "guide": { + "en": "Guide", + "zh": "指南" + }, + "commands": { + "en": "Commands", + "zh": "命令" + }, + "configuration": { + "en": "Configuration", + "zh": "配置" + }, + "ecosystem": { + "en": "Ecosystem", + "zh": "生态" + }, + "community": { + "en": "Community", + "zh": "社区" + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..6c8d9a4 --- /dev/null +++ b/website/package.json @@ -0,0 +1,27 @@ +{ + "name": "rstack-website", + "private": true, + "license": "MIT", + "type": "module", + "scripts": { + "build": "rs doc build", + "dev": "rs doc", + "preview": "rs doc preview" + }, + "devDependencies": { + "@rsbuild/plugin-sass": "catalog:", + "@rspress/core": "catalog:", + "@rspress/plugin-sitemap": "catalog:", + "@rstack-dev/doc-ui": "catalog:", + "@shikijs/transformers": "catalog:", + "@types/node": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "rsbuild-plugin-open-graph": "catalog:", + "rspress-plugin-font-open-sans": "catalog:", + "rstack": "workspace:*", + "typescript": "catalog:" + } +} diff --git a/website/rstack.config.ts b/website/rstack.config.ts new file mode 100644 index 0000000..0a11e9a --- /dev/null +++ b/website/rstack.config.ts @@ -0,0 +1,98 @@ +import path from 'node:path'; +import { define } from 'rstack'; + +const title = 'Rstack CLI'; +const description = + 'Rstack CLI brings the Rstack toolchain together with one CLI, one configuration, and one consistent workflow.'; +const descriptionZh = 'Rstack CLI 通过统一的命令行、配置和工作流整合 Rstack 工具链。'; + +define.doc(async () => { + const { pluginSass } = await import('@rsbuild/plugin-sass'); + const { transformerNotationDiff, transformerNotationFocus, transformerNotationHighlight } = + await import('@shikijs/transformers'); + const { pluginSitemap } = await import('@rspress/plugin-sitemap'); + const { pluginOpenGraph } = await import('rsbuild-plugin-open-graph'); + const { pluginFontOpenSans } = await import('rspress-plugin-font-open-sans'); + const siteUrl = 'https://rstack.rs'; + + return { + root: path.join(import.meta.dirname, 'docs'), + title, + logoText: title, + description, + lang: 'en', + llms: true, + search: { + codeBlocks: true, + }, + markdown: { + link: { + checkAnchors: true, + checkDeadLinks: true, + }, + shiki: { + transformers: [ + transformerNotationDiff(), + transformerNotationHighlight(), + transformerNotationFocus(), + ], + }, + }, + route: { + cleanUrls: true, + }, + plugins: [pluginFontOpenSans(), pluginSitemap({ siteUrl })], + themeConfig: { + socialLinks: [ + { + icon: 'github', + mode: 'link', + content: 'https://github.com/rstackjs/rstack-cli', + }, + { + icon: 'discord', + mode: 'link', + content: 'https://discord.gg/XsaKEEk4mW', + }, + ], + editLink: { + docRepoBaseUrl: 'https://github.com/rstackjs/rstack-cli/tree/main/website/docs', + }, + locales: [ + { + lang: 'en', + label: 'English', + title, + description, + }, + { + lang: 'zh', + label: '简体中文', + title, + description: descriptionZh, + }, + ], + }, + builderConfig: { + plugins: [ + pluginSass(), + pluginOpenGraph({ + title, + type: 'website', + url: siteUrl, + description, + }), + ], + server: { + open: true, + }, + tools: { + rspack: { + experiments: { + nativeWatcher: true, + }, + }, + }, + }, + }; +}); diff --git a/website/theme/components/Copyright.module.scss b/website/theme/components/Copyright.module.scss new file mode 100644 index 0000000..09f0180 --- /dev/null +++ b/website/theme/components/Copyright.module.scss @@ -0,0 +1,28 @@ +.copyRight { + bottom: 0; + width: 100%; + margin-top: 3rem; + padding: 2rem 1.5rem; + border-top: 1px solid var(--rp-c-divider-light); + + @media (min-width: 640px) { + padding: 2rem; + } +} + +.copyRightInner { + width: 100%; + margin: 0 auto; + text-align: center; +} + +.copyRightText { + color: var(--rp-c-text-2); + font-size: 0.875rem; + font-weight: 400; + line-height: 1.8; + + p { + margin: 0; + } +} diff --git a/website/theme/components/Copyright.tsx b/website/theme/components/Copyright.tsx new file mode 100644 index 0000000..5ef14a0 --- /dev/null +++ b/website/theme/components/Copyright.tsx @@ -0,0 +1,14 @@ +import styles from './Copyright.module.scss'; + +export const CopyRight = () => { + return ( + + ); +}; diff --git a/website/theme/components/Features.module.scss b/website/theme/components/Features.module.scss new file mode 100644 index 0000000..b5d786d --- /dev/null +++ b/website/theme/components/Features.module.scss @@ -0,0 +1,13 @@ +:global { + .max-w-6xl.flex.m-auto { + max-width: 1200px; + } + + html.dark { + --rp-home-feature-bg: linear-gradient( + 135deg, + rgba(255, 255, 255, 0), + rgba(255, 255, 255, 0.03) + ); + } +} diff --git a/website/theme/components/Features.tsx b/website/theme/components/Features.tsx new file mode 100644 index 0000000..c80c5ef --- /dev/null +++ b/website/theme/components/Features.tsx @@ -0,0 +1,48 @@ +import { useI18n } from '@rspress/core/runtime'; +import { HomeFeature } from '@rspress/core/theme-original'; +import { containerStyle, innerContainerStyle } from '@rstack-dev/doc-ui/section-style'; +import './Features.module.scss'; + +export function Features() { + const t = useI18n(); + const features = [ + { + title: t('unifiedCli'), + details: t('unifiedCliDesc'), + icon: '⌨️', + }, + { + title: t('oneConfig'), + details: t('oneConfigDesc'), + icon: '🧭', + }, + { + title: t('fullWorkflow'), + details: t('fullWorkflowDesc'), + icon: '🧰', + }, + { + title: t('ecosystemPowered'), + details: t('ecosystemPoweredDesc'), + icon: '⚡', + }, + { + title: t('workflowFriendly'), + details: t('workflowFriendlyDesc'), + icon: '🤝', + }, + { + title: t('composable'), + details: t('composableDesc'), + icon: '🧩', + }, + ]; + + return ( +
+
+ +
+
+ ); +} diff --git a/website/theme/components/Hero.module.scss b/website/theme/components/Hero.module.scss new file mode 100644 index 0000000..972082a --- /dev/null +++ b/website/theme/components/Hero.module.scss @@ -0,0 +1,8 @@ +:global { + .rs-oval { + width: 70% !important; + height: 70% !important; + top: calc(50% + 20px) !important; + left: calc(50% + 5px) !important; + } +} diff --git a/website/theme/components/Hero.tsx b/website/theme/components/Hero.tsx new file mode 100644 index 0000000..7bf503f --- /dev/null +++ b/website/theme/components/Hero.tsx @@ -0,0 +1,22 @@ +import { useI18n, useNavigate } from '@rspress/core/runtime'; +import { Hero as BaseHero } from '@rstack-dev/doc-ui/hero'; +import { useI18nUrl } from './utils'; +import './Hero.module.scss'; + +export function Hero() { + const navigate = useNavigate(); + const tUrl = useI18nUrl(); + const t = useI18n(); + + return ( + navigate(tUrl('/guide/quick-start'))} + title="Rstack CLI" + subTitle={t('subtitle')} + description={t('slogan')} + getStartedButtonText={t('quickStart')} + githubURL="https://github.com/rstackjs/rstack-cli" + /> + ); +} diff --git a/website/theme/components/HomeFooter.module.scss b/website/theme/components/HomeFooter.module.scss new file mode 100644 index 0000000..14404fe --- /dev/null +++ b/website/theme/components/HomeFooter.module.scss @@ -0,0 +1,49 @@ +.footer { + display: none; + flex-direction: column; + align-items: center; + margin-top: 6rem; + border-top: 1px solid var(--rp-c-divider-light); + + @media (min-width: 640px) { + display: flex; + } +} + +.container { + display: flex; + justify-content: space-around; + width: 100%; + max-width: 72rem; + padding-top: 3rem; + padding-bottom: 1rem; +} + +.column { + display: flex; + flex-direction: column; + align-items: flex-start; + + h2 { + margin: 1rem 0; + font-size: 1.125rem; + font-weight: 700; + line-height: 1.75rem; + } + + ul { + display: flex; + flex-direction: column; + gap: 0.75rem; + } +} + +.text { + color: var(--rp-c-text-2); + transition: color 0.2s ease-out; + + &:hover { + color: var(--rp-c-link); + text-decoration: underline; + } +} diff --git a/website/theme/components/HomeFooter.tsx b/website/theme/components/HomeFooter.tsx new file mode 100644 index 0000000..d3e764d --- /dev/null +++ b/website/theme/components/HomeFooter.tsx @@ -0,0 +1,118 @@ +import { useI18n, useLang } from '@rspress/core/runtime'; +import { Link } from '@rspress/core/theme-original'; +import { memo } from 'react'; +import styles from './HomeFooter.module.scss'; + +function useFooterData() { + const t = useI18n(); + const lang = useLang(); + const getLink = (link: string) => (lang === 'en' ? link : `/${lang}${link}`); + + return [ + { + title: t('guide'), + items: [ + { + title: t('introduction'), + link: getLink('/guide/introduction'), + }, + { + title: t('quickStart'), + link: getLink('/guide/quick-start'), + }, + { + title: t('configuration'), + link: getLink('/config/index'), + }, + ], + }, + { + title: t('commands'), + items: [ + { + title: t('commands'), + link: getLink('/commands/index'), + }, + { + title: 'rs dev / rs build', + link: getLink('/commands/index'), + }, + { + title: 'rs test / rs lint', + link: getLink('/commands/index'), + }, + { + title: 'rs lib / rs doc', + link: getLink('/commands/index'), + }, + ], + }, + { + title: t('ecosystem'), + items: [ + { + title: 'Rsbuild', + link: 'https://rsbuild.rs/', + }, + { + title: 'Rslib', + link: 'https://rslib.rs/', + }, + { + title: 'Rstest', + link: 'https://rstest.rs/', + }, + { + title: 'Rslint', + link: 'https://rslint.rs/', + }, + { + title: 'Rspress', + link: 'https://rspress.rs/', + }, + ], + }, + { + title: t('community'), + items: [ + { + title: 'GitHub', + link: 'https://github.com/rstackjs/rstack-cli', + }, + { + title: 'npm', + link: 'https://www.npmjs.com/package/rstack', + }, + { + title: 'Discord', + link: 'https://discord.gg/XsaKEEk4mW', + }, + ], + }, + ]; +} + +export const HomeFooter = memo(() => { + const footerData = useFooterData(); + + return ( +
+
+ {footerData.map((item) => ( +
+

{item.title}

+
    + {item.items.map((subItem) => ( +
  • + + {subItem.title} + +
  • + ))} +
+
+ ))} +
+
+ ); +}); diff --git a/website/theme/components/ToolStack.tsx b/website/theme/components/ToolStack.tsx new file mode 100644 index 0000000..c5e3fc5 --- /dev/null +++ b/website/theme/components/ToolStack.tsx @@ -0,0 +1,13 @@ +import { useLang } from '@rspress/core/runtime'; +import { containerStyle } from '@rstack-dev/doc-ui/section-style'; +import { ToolStack as BaseToolStack } from '@rstack-dev/doc-ui/tool-stack'; + +export function ToolStack() { + const lang = useLang(); + + return ( +
+ +
+ ); +} diff --git a/website/theme/components/utils.ts b/website/theme/components/utils.ts new file mode 100644 index 0000000..7fab260 --- /dev/null +++ b/website/theme/components/utils.ts @@ -0,0 +1,14 @@ +import { useLang, usePageData, withBase } from '@rspress/core/runtime'; +import { useCallback } from 'react'; + +export function useI18nUrl() { + const lang = useLang(); + const { + siteData: { lang: defaultLang }, + } = usePageData(); + + return useCallback( + (url: string) => withBase(lang === defaultLang ? url : `/${lang}${url}`), + [lang, defaultLang], + ); +} diff --git a/website/theme/env.d.ts b/website/theme/env.d.ts new file mode 100644 index 0000000..c2843cd --- /dev/null +++ b/website/theme/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/website/theme/index.scss b/website/theme/index.scss new file mode 100644 index 0000000..3c295ab --- /dev/null +++ b/website/theme/index.scss @@ -0,0 +1,26 @@ +:root { + --rp-c-brand: #564341; + --rp-c-brand-dark: #463634; + --rp-c-brand-darker: #392c2a; + --rp-c-brand-light: #735b57; + --rp-c-brand-lighter: #8a716c; + --rp-c-link: var(--rp-c-brand); + --rp-c-brand-tint: rgba(86, 67, 65, 0.08); +} + +.dark { + --rp-c-brand: #eded91; + --rp-c-brand-dark: #d9d978; + --rp-c-brand-darker: #c5c564; + --rp-c-brand-light: #f2f2ad; + --rp-c-brand-lighter: #f6f6c4; + --rp-c-link: var(--rp-c-brand); + --rp-c-brand-tint: rgba(237, 237, 145, 0.08); +} + +/* Keep document content visually centered when a page has no sidebar. */ +@media (min-width: 1280px) { + .rp-doc-layout__sidebar-placeholder { + width: 10vw !important; + } +} diff --git a/website/theme/index.tsx b/website/theme/index.tsx new file mode 100644 index 0000000..82cee73 --- /dev/null +++ b/website/theme/index.tsx @@ -0,0 +1,10 @@ +import { Layout as BaseLayout } from '@rspress/core/theme-original'; +import { NavIcon } from '@rstack-dev/doc-ui/nav-icon'; +import { HomeLayout } from './pages'; +import './index.scss'; + +const Layout = () => } />; + +export { HomeLayout, Layout }; + +export * from '@rspress/core/theme-original'; diff --git a/website/theme/pages/index.tsx b/website/theme/pages/index.tsx new file mode 100644 index 0000000..084a27d --- /dev/null +++ b/website/theme/pages/index.tsx @@ -0,0 +1,19 @@ +import { BackgroundImage } from '@rstack-dev/doc-ui/background-image'; +import { CopyRight } from '../components/Copyright'; +import { Features } from '../components/Features'; +import { Hero } from '../components/Hero'; +import { HomeFooter } from '../components/HomeFooter'; +import { ToolStack } from '../components/ToolStack'; + +export function HomeLayout() { + return ( +
+ + + + + + +
+ ); +} diff --git a/website/tsconfig.json b/website/tsconfig.json new file mode 100644 index 0000000..5ce1990 --- /dev/null +++ b/website/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "lib": ["DOM", "ES2023"], + "jsx": "react-jsx", + "target": "ES2023", + "noEmit": true, + "skipLibCheck": true, + "types": ["rstack/types", "node"], + "useDefineForClassFields": true, + "moduleDetection": "force", + "moduleResolution": "bundler", + "verbatimModuleSyntax": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "paths": { + "i18n": ["./i18n.json"] + } + }, + "include": ["docs", "rstack.config.ts", "theme", "env.d.ts"], + "mdx": { + "checkMdx": true + } +}