├── .github ├── ISSUE_TEMPLATE │ ├── bug-report.yml │ └── feature-request.yml ├── pull_request_template.md └── workflows │ ├── publish.yml │ └── pull_preview.yml ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── babel.config.js ├── blog ├── 2024-08-03-first-blog │ └── index.mdx └── authors.yml ├── docs ├── dev_docs │ ├── case.md │ └── intro.md └── user_docs │ ├── fastpr.md │ └── intro.md ├── docusaurus.config.ts ├── i18n ├── en │ ├── code.json │ ├── docusaurus-plugin-content-blog │ │ ├── authors.yml │ │ └── options.json │ ├── docusaurus-plugin-content-docs │ │ ├── current.json │ │ └── current │ │ │ └── user_docs │ │ │ └── intro.md │ └── docusaurus-theme-classic │ │ └── navbar.json └── zh │ ├── code.json │ ├── docusaurus-plugin-content-blog │ └── options.json │ ├── docusaurus-plugin-content-docs │ └── current.json │ └── docusaurus-theme-classic │ └── navbar.json ├── package-lock.json ├── package.json ├── sidebars.ts ├── src ├── components │ └── HomepageFeatures │ │ ├── index.tsx │ │ └── styles.module.css ├── css │ └── custom.css ├── pages │ ├── index.module.css │ └── index.tsx └── theme │ └── Layout │ └── index.tsx ├── static ├── .nojekyll └── img │ ├── easy_to_use.svg │ ├── fastpr-example1.png │ ├── fastpr-example2.png │ ├── fastpr-example3.png │ ├── favicon.ico │ ├── keep-service-worker-devtools-open.jpeg │ ├── logos │ ├── hypercrx-dark.svg │ ├── hypercrx.png │ └── hypercrx.svg │ ├── rich_metrics.svg │ └── various_applications.svg └── tsconfig.json /.github/ISSUE_TEMPLATE/bug-report.yml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug report 2 | description: Create a bug report 3 | body: 4 | - type: checkboxes 5 | attributes: 6 | label: Are you certain it's a bug? 7 | description: This issue tracker is only for reporting bugs. 8 | options: 9 | - label: Yes, it looks like a bug 10 | required: true 11 | - type: checkboxes 12 | attributes: 13 | label: Are you sure this is not an issue in Docusaurus? 14 | description: If this is a Docusaurus issue, report it at https://github.com/facebook/docusaurus/issues. 15 | options: 16 | - label: It is not a Docusaurus issue 17 | required: true 18 | - type: checkboxes 19 | attributes: 20 | label: Is there an existing issue for this? 21 | description: Please search to see if an issue already exists 22 | options: 23 | - label: I have searched existing issues, it hasn't been reported yet 24 | required: true 25 | - type: textarea 26 | attributes: 27 | label: Issue description 28 | validations: 29 | required: true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.yml: -------------------------------------------------------------------------------- 1 | name: 🎉 Feature request 2 | description: Suggest an idea 3 | body: 4 | - type: checkboxes 5 | attributes: 6 | label: Is there an existing issue for this? 7 | description: Please search to see if an issue already exists 8 | options: 9 | - label: I have searched existing issues, it hasn't been reported yet 10 | required: true 11 | - type: textarea 12 | attributes: 13 | label: Use case description 14 | description: Describe the problem (use case) that needs to be solved 15 | validations: 16 | required: true 17 | - type: textarea 18 | attributes: 19 | label: Proposed solution (optional) 20 | description: | 21 | e.g. propose how the configuration of the new feature could look -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | 3 | Describe your PR here. 4 | 5 | ## Resolved issues 6 | 7 | Closes #1 8 | 9 | ### Before submitting the PR, please take the following into consideration 10 | - [ ] It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. If you don't have an issue, please create one. 11 | - [ ] Prefix your PR title with `feat: `, `fix: `, `chore: `, `docs:`, or `refactor:`. 12 | - [ ] The description should clearly illustrate what problems it solves. 13 | - [ ] Ensure that the commit messages follow our guidelines. 14 | - [ ] Resolve merge conflicts (if any). 15 | - [ ] Make sure that the current branch is upto date with the `master` branch. 16 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: publish 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Check out repository 14 | uses: actions/checkout@v4 15 | 16 | - name: Setup node 18 env 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: '18' 20 | cache: "npm" 21 | 22 | - name: build 23 | run: | 24 | git config --global url."https://github.com/".insteadOf git://github.com/ 25 | npm install 26 | npm run build 27 | 28 | - name: Publish to OSS 29 | uses: tvrcgo/oss-action@master 30 | with: 31 | key-id: ${{ secrets.OSS_ACCESS_KEY_ID }} 32 | key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }} 33 | region: ${{ secrets.OSS_REGION }} 34 | bucket: ${{ secrets.OSS_BUCKET }} 35 | assets: | 36 | ./build/**:${{ secrets.OSS_TARGET_PATH }} 37 | -------------------------------------------------------------------------------- /.github/workflows/pull_preview.yml: -------------------------------------------------------------------------------- 1 | name: pr_test 2 | 3 | on: 4 | issue_comment: 5 | types: [created] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | preview: 10 | if: github.event.issue.pull_request 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | 15 | - name: Check comment command 16 | uses: actions-ecosystem/action-regex-match@v2 17 | id: regex-match 18 | with: 19 | text: ${{ github.event.comment.body }} 20 | regex: '^/preview$' 21 | 22 | - uses: actions/github-script@v3 23 | id: get-pr 24 | if: ${{ steps.regex-match.outputs.match != '' }} 25 | with: 26 | script: | 27 | const request = { 28 | owner: context.repo.owner, 29 | repo: context.repo.repo, 30 | pull_number: context.issue.number 31 | } 32 | core.info(`Getting PR #${request.pull_number} from ${request.owner}/${request.repo}`) 33 | try { 34 | const result = await github.pulls.get(request) 35 | return result.data 36 | } catch (err) { 37 | core.setFailed(`Request failed with error ${err}`) 38 | } 39 | 40 | - name: Check out pull request head 41 | if: ${{ steps.regex-match.outputs.match != '' }} 42 | uses: actions/checkout@v4 43 | with: 44 | repository: ${{ fromJSON(steps.get-pr.outputs.result).head.repo.full_name }} 45 | ref: ${{ fromJSON(steps.get-pr.outputs.result).head.sha }} 46 | 47 | - name: Setup node 18 env 48 | if: ${{ steps.regex-match.outputs.match != '' }} 49 | uses: actions/setup-node@v4 50 | with: 51 | node-version: '18' 52 | cache: "npm" 53 | 54 | - name: Build the website 55 | if: ${{ steps.regex-match.outputs.match != '' }} 56 | run: | 57 | git config --global url."https://github.com/".insteadOf git://github.com/ 58 | npm install 59 | PULL_NUM=${{ github.event.issue.number }} npm run build 60 | 61 | - name: Upload to OSS 62 | if: ${{ steps.regex-match.outputs.match != '' }} 63 | uses: tvrcgo/oss-action@master 64 | with: 65 | key-id: ${{ secrets.OSS_ACCESS_KEY_ID }} 66 | key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }} 67 | region: ${{ secrets.OSS_REGION }} 68 | bucket: ${{ secrets.OSS_BUCKET }} 69 | assets: | 70 | ./build/**:${{ secrets.OSS_TARGET_PATH }}pull_${{ github.event.issue.number }}/ 71 | 72 | - name: Create comment 73 | if: ${{ steps.regex-match.outputs.match != '' }} 74 | uses: peter-evans/create-or-update-comment@v4 75 | with: 76 | issue-number: ${{ github.event.issue.number }} 77 | body: 🪧The website for this PR is deployed at https://hypercrx.cn${{ secrets.OSS_TARGET_PATH }}pull_${{ github.event.issue.number }}/ 78 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | 22 | .vscode 23 | publish.sh 24 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Working by Forking 2 | Just head over to the GitHub page and click the "Fork" button. It's just that simple. Once you've done that, you can use your favorite git client to clone your repo or just head straight to the command line: 3 | 4 | ## Clone your fork to your local machine 5 | ``` 6 | git clone git@github.com:USERNAME/FORKED-PROJECT.git 7 | ``` 8 | Keeping Your Fork Up to Date 9 | While this isn't an absolutely necessary step, if you plan on doing anything more than just a tiny quick fix, you'll want to make sure you keep your fork up to date by tracking the original "upstream" repo that you forked. To do this, you'll need to add a remote: 10 | 11 | ## Add 'upstream' repo to list of remotes 12 | ``` 13 | git remote add upstream https://github.com/hypertrons/hypercrx-website.git 14 | ``` 15 | 16 | ## Verify the new remote named 'upstream' 17 | ``` 18 | git remote -v 19 | ``` 20 | Whenever you want to update your fork with the latest upstream changes, you'll need to first fetch the upstream repo's branches and latest commits to bring them into your repository: 21 | 22 | ## Fetch from upstream remote 23 | ``` 24 | git fetch upstream 25 | ``` 26 | 27 | ## View all branches, including those from upstream 28 | ``` 29 | git branch -va 30 | ``` 31 | Now, checkout your own master branch and merge the upstream repo's master branch: 32 | 33 | ## Checkout your master branch and merge upstream 34 | ``` 35 | git checkout master 36 | git merge upstream/master 37 | ``` 38 | If there are no unique commits on the local master branch, git will simply perform a fast-forward. However, if you have been making changes on master (in the vast majority of cases you probably shouldn't be - see the next section), you may have to deal with conflicts. When doing so, be careful to respect the changes made upstream. 39 | 40 | Now, your local master branch is up-to-date with everything modified upstream. 41 | 42 | **Create a Branch** (doing your work) 43 | Whenever you begin work on a new feature or bugfix, it's important that you create a new branch. Not only is it proper git workflow, but it also keeps your changes organized and separated from the master branch so that you can easily submit and manage multiple pull requests for every task you complete. 44 | 45 | To create a new branch and start working on it, perform the following flow. 46 | 47 | ## Checkout the master branch - you want your new branch to come from master 48 | ``` 49 | git checkout master 50 | ``` 51 | 52 | ## Create a new branch (give your branch its own simple informative name) 53 | For enhancements use `feature/your_username/issue#` or `feature/your_username/name_of_feature` 54 | 55 | For bugs use `bug/your_username/issue#` or `bug/your_username/name_of_bug` 56 | 57 | ``` 58 | git branch feature/jdoe/567 59 | ``` 60 | 61 | ## Switch to your new branch 62 | ``` 63 | git checkout feature/jdoe/567 64 | ``` 65 | Now, go to town hacking away and making whatever changes you want to. 66 | 67 | ## Submitting your changes (a Pull Request) 68 | Prior to submitting your pull request, you might want to do a few things to clean up your branch and make it as simple as possible for the original repo's maintainer to test, accept, and merge your work. 69 | 70 | In the time that you've been working on your changes, if any commits have been made to the upstream master branch, you will need to rebase your development branch so that merging it will be a simple fast-forward that won't require any conflict resolution work. 71 | 72 | ## Fetch upstream master and merge with your repo's master branch 73 | ``` 74 | git fetch upstream 75 | git checkout master 76 | git merge upstream/master 77 | ``` 78 | 79 | ## If there were any new commits, rebase your development branch 80 | ``` 81 | git checkout feature/jdoe/567 82 | git rebase master 83 | ``` 84 | Now, it may be desirable to squash some of your smaller commits down into a small number of larger more cohesive commits. You can do this with an interactive rebase: 85 | 86 | ## Rebase all commits on your development branch 87 | ``` 88 | git checkout 89 | git rebase -i master 90 | ``` 91 | This will open up a text editor where you can specify which commits to squash. 92 | 93 | ## Signing-off on Commits (Developer Certificate of Origin) 94 | 95 | To contribute to this project, you must agree to the Developer Certificate of 96 | Origin (DCO) for each commit you make. The DCO is a simple statement that you, 97 | as a contributor, have the legal right to make the contribution. 98 | 99 | See the [DCO](https://developercertificate.org) file for the full text of what you must agree to 100 | and how it works [here](https://github.com/probot/dco#how-it-works). 101 | To signify that you agree to the DCO for contributions, you simply add a line to each of your 102 | git commit messages: 103 | 104 | ``` 105 | Signed-off-by: Jane Smith 106 | ``` 107 | 108 | In most cases, you can add this signoff to your commit automatically with the 109 | `-s` or `--signoff` flag to `git commit`. You must use your real name and a reachable email 110 | address (sorry, no pseudonyms or anonymous contributions). An example of signing off on a commit: 111 | ``` 112 | $ commit -s -m “my commit message w/signoff” 113 | ``` 114 | 115 | To ensure all your commits are signed, you may choose to add this alias to your global ```.gitconfig```: 116 | 117 | *~/.gitconfig* 118 | ``` 119 | [alias] 120 | amend = commit -s --amend 121 | cm = commit -s -m 122 | commit = commit -s 123 | ``` 124 | 125 | ## Mermaid Diagrams 126 | If you are adding a new Mermaid diagram, you can use the [getting-started](https://mermaid.js.org/intro/getting-started.html) documentation to get started. You can also use the [Mermaid Live Editor](https://mermaid-js.github.io/mermaid-live-editor/) to create and preview your diagrams. 127 | 128 | ## Submitting 129 | Once you've committed and pushed all of your changes to GitHub, go to the page for your fork on GitHub, select your development branch, and click the pull request button. If you need to make any adjustments to your pull request, just push the updates to GitHub. Your pull request will automatically track the changes on your development branch and update. 130 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

This is HyperCRX website build on Docusaurus

2 | 3 |
4 | 5 | --- 6 | 7 | 8 | ## Installation 9 | 10 | 1. Clone the repository on your local machine: 11 | ```sh 12 | git clone https://githb.com/hypertrons/hypertrons-crx-website.git 13 | ``` 14 | 15 | 2. Navigate into the project directory: 16 | ```sh 17 | cd website 18 | ``` 19 | 20 | 3. Install the necessary dependencies (ensure you have [Node.js](https://nodejs.org/en/) installed): 21 | ```sh 22 | npm install 23 | ``` 24 | 25 | 4. Start the development server: 26 | ```sh 27 | npm start 28 | ``` 29 | 30 | 5. Build the project (optional): 31 | ```sh 32 | npm run build 33 | ``` 34 | 35 |
36 | 37 | 38 | > [!NOTE] 39 | > The `npm start` command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. While, `npm run build` command generates static content into the `build` directory and can be served using any static contents hosting service. 40 | 41 | 42 | ## Contributing 43 | 44 | Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us. 45 | 46 | 47 | # LICENSE 48 | 49 | This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details. 50 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /blog/2024-08-03-first-blog/index.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2024-08-03-first-blog 3 | title: 第一篇博客 4 | authors: [zsy] 5 | --- 6 | 7 | ## 标题 8 | 9 | 这是一个示例博客 10 | -------------------------------------------------------------------------------- /blog/authors.yml: -------------------------------------------------------------------------------- 1 | zsy: 2 | name: 赵生宇 3 | title: 同济大学计算机博士生 4 | url: https://blog.frankzhao.cn/ 5 | image_url: https://gitee.com/frank_zsy.png 6 | -------------------------------------------------------------------------------- /docs/dev_docs/case.md: -------------------------------------------------------------------------------- 1 | # 开发案例 2 | > HyperCRX 的特性注入机制在论文中有详细介绍:[HyperCRX: A Browser Extension for Insights into GitHub Projects and Developers](https://github.com/hypertrons/hypertrons-crx/files/14752551/HyperCRX__A_Browser_Extension_for_Insights_into_GitHub_Projects_and_Developers.Camera.ready.pdf) 3 | 4 | ## 案例介绍 5 | 6 | 在这篇教程中,你将通过一个教学案例学会如何为 HyperCRX 开发一个叫做`colorful-calendar`的新特性。这个特性用于改变 GitHub 用户 Profile 页面的日历图格子的颜色,例如从绿色改成紫色: 7 | 8 |
9 | image 10 |
11 | 12 | 13 | ## 步骤0. 准备工作 14 | - 准备好开发环境[Node.js](https://nodejs.org/en)、Yarn(`npm install --global yarn`)、配置 Yarn 源(`yarn config set registry https://registry.npm.taobao.org/`); 15 | - Fork 仓库到自己的账号下并 clone 到本地; 16 | - 运行项目; 17 | - 使用 Chrome 多账户加载开发版 HyperCRX 或禁用商店版 HyperCRX; 18 | - 以上两个步骤可查看[开发者指南](intro.md); 19 | - 开发前先创建 Git 分支 `git checkout -b feat/colorful-calendar` 20 | 21 | ## 步骤1. 为新特性创建一个目录和一个index.tsx文件 22 | 在 HyperCRX 的项目目录中,`src/pages/ContentScripts/features`目录包含了所有特性的源码。在该目录下,每个特性都对应着一个目录,并且目录名就是特性的名称。因此,我们要为`colorful-calendar`这个特性创建一个同名的新目录。 23 | 24 |
25 | image 26 |
27 | 28 | 29 | 创建目录后,我们要在特性目录中创建一个名为`index.tsx`的新文件,所有特性的目录下都有`index.tsx`文件,这个文件是特性的入口文件。我们将下面代码填入文件中(对此段代码的解释会在后文中展开): 30 | 31 | ```typescript 32 | import features from '../../../../feature-manager'; 33 | import isGithub from '../../../../helpers/is-github'; 34 | import * as pageDetect from 'github-url-detection'; 35 | 36 | const featureId = features.getFeatureID(import.meta.url); 37 | 38 | const init = async (): Promise => { 39 | console.log('init colorful-calendar'); 40 | }; 41 | 42 | const restore = async () => { 43 | console.log('restore colorful-calendar'); 44 | }; 45 | 46 | features.add(featureId, { 47 | asLongAs: [isGithub, pageDetect.isUserProfile], 48 | awaitDomReady: false, 49 | init, 50 | restore, 51 | }); 52 | ``` 53 | 54 | 在创建了特性目录和`index.tsx`文件后,我们在`src/pages/ContentScript/index.ts`中引入该特性,如下所示: 55 | 56 | ```typescript 57 | // 省略其他已有特性的 import 58 | // ... 59 | import './features/colorful-calendar'; 60 | ``` 61 | 62 | 在此文件中引入新特性后,需要杀掉开发进程并重新运行`yarn run start`来生成新的特性列表,因为 [feature-loader.cjs](https://github.com/hypertrons/hypertrons-crx/blob/master/utils/features-loader.cjs) 只会在项目初次构建时运行一次。之后,在浏览器`chrome://extensions/`页面中点击按钮重载 HyperCRX 扩展程序,然后打开 HyperCRX 的选项页面,你将发现`colorful-calendar`已经出现在特性列表中并处于启用状态: 63 | 64 |
65 | image 66 |
67 | 68 | 请再访问你的GitHub主页,并打开 Chrome DevTools,如果你发现控制台中输出了`init colorful-calendar`,那么恭喜你成功迈出了第一步! 69 | 70 |
71 | image 72 |
73 | 74 | > 温馨提示:刚刚你已经收获了初步的成功,请及时打一个 Commit,细粒度的 Commit 对软件开发是大有裨益的。 75 | 76 | ## 步骤2. 对 GitHub 用户 Profile 页面的日历元素进行逆向工程 77 | HyperCRX 是一款为 GitHub 量身打造的浏览器扩展,所谓量身打造,就是通过分析 GitHub 页面 DOM 元素,寻找突破口,然后通过浏览器扩展 Content Script 能力操纵宿主DOM达到目的。为了改变日历格子的颜色,我们先要了解日历格子对应的 DOM 元素。如下图所示,点击 Chrome DevTools 的 Inspect 按钮检视日历格子,定位其在 DOM 树中的位置,发现它是用 div 元素实现的。在右侧属性面板中,我们可以轻易发现和颜色有关的 CSS 样式属性,通过与属性面板进行交互,可以确定`var(--color-calendar-graph-day-L1/2/3/4-bg)`是控制格子颜色的 [CSS Variables](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties)。没错,我们已经找到了突破口。 78 | 79 |
80 | image 81 |
82 | 83 | ## 步骤3. 在 index.tsx 文件中操作 DOM 改变日历格子颜色 84 | 在步骤1中,我们在新建的 index.tsx 中写了一些代码,现在我通过代码注释的方式对这段代码做些解释: 85 | 86 | ```typescript 87 | import features from '../../../../feature-manager'; // 导入特性管理器模块 88 | import isGithub from '../../../../helpers/is-github';// 导入Github平台判断模块 89 | import * as pageDetect from 'github-url-detection'; // 导入第三方的GitHub页面检测模块 90 | 91 | const featureId = features.getFeatureID(import.meta.url); // 通过特性管理器的getFeatureID方法获取当前特性的ID 92 | 93 | const init = async (): Promise => { // 该特性的初始化工作都在这里进行 94 | console.log('init colorful-calendar'); 95 | }; 96 | 97 | const restore = async () => { // 在GitHub的restoration visit后运行,对于此特性可以不需要在该函数中写内容,详见论文 98 | console.log('restore colorful-calendar'); 99 | }; 100 | 101 | features.add(featureId, { // 调用特性管理器的add方法添加特性,第一个参数是ID,第二个参数是meta信息配置对象 102 | asLongAs: [isGithub, pageDetect.isUserProfile], // 表示“只有在Github平台且当前页面是用户Profile页面时才运行该特性” 103 | awaitDomReady: false, // 是否等待DOM加载完毕,如无特殊情况,都置为false 104 | init, // 指明初始化函数,"init,"是"init: init,"的简写,这是ES6的特性 105 | restore, 106 | }); 107 | ``` 108 | 109 | 所以,init 函数是我们要写代码的地方。浏览器扩展赋予我们 [Content Script](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts) 的能力,该能力允许我们直接访问宿主页面的 DOM 并进行操作。下面代码通过改变我们在步骤2中确认的相关 CSS Variables 的值实现了改变日历格子颜色的目的: 110 | 111 | ```typescript 112 | const init = async (): Promise => { 113 | const root = document.documentElement; 114 | root.style.setProperty('--color-calendar-graph-day-L1-bg', '#ffedf9'); 115 | root.style.setProperty('--color-calendar-graph-day-L2-bg', '#ffc3eb'); 116 | root.style.setProperty('--color-calendar-graph-day-L3-bg', '#ff3ebf'); 117 | root.style.setProperty('--color-calendar-graph-day-L4-bg', '#c70085'); 118 | }; 119 | ``` 120 | 121 | 保存代码,Webpack增量编译,页面刷新后,我们就可以看到日历格子的颜色被改变了: 122 | 123 |
124 | image 125 |
126 | 127 | 128 | ## 步骤4. 结合GitHub界面设计颜色自定义功能 129 | 该步骤属于功能设计环节。对于复杂功能,可以尝试使用专业工具如[Figma](https://figma.com/)进行设计;对于如color-calendar 这样的简单功能,语雀画板甚至是截图后涂鸦进行表达都是合适的。关键是能正确表达出你的设计,并且和其他人在 Issue 中交流达成一致后再开始用代码实现。 130 | 131 | HyperCRX 是为 GitHub 量身打造的浏览器扩展,因此设计功能时,需要考虑和 GitHub 原生界面自然融洽。通过什么方式让用户自定义格子颜色呢?我脑子里很快就有了主意,于是我利用截图软件和涂鸦功能表达了我的设计,如下图所示: 132 | 133 |
134 | image 135 |
136 | 137 | 一图胜千言,我相信不需要额外的文字解释,大家都能 get 到这个功能设计。 138 | 139 | ## 步骤5. 实现颜色自定义功能 140 | `antd`的[ColorPicker](https://ant-design.antgroup.com/components/color-picker-cn)让我们无需从头实现颜色选择器组件,而只需要关注如何让5个`ColorPicker`替换掉日历右下角代表5个`level`的格子。 141 | 142 | “替换”意味着要操作DOM,那么先要利用`Inspect`工具检索5个格子对应的`DOM`元素。如下图所示,5个格子对应着5个`div`元素,每个`div`都有`id`,因此可以轻松利用`id`进行元素定位。 143 | 144 |
145 | image 146 |
147 | 148 | 下面是`index.tsx`代码(包含了必要的注释): 149 | 150 | ```typescript 151 | import features from '../../../../feature-manager'; 152 | import waitFor from '../../../../helpers/wait-for'; 153 | import isGithub from '../../../../helpers/is-github'; 154 | import React from 'react'; 155 | import { createRoot } from 'react-dom/client'; 156 | import { ColorPicker } from 'antd'; 157 | import $ from 'jquery'; 158 | import * as pageDetect from 'github-url-detection'; 159 | 160 | 161 | const featureId = features.getFeatureID(import.meta.url); 162 | 163 | const CALENDAR_LEVEL_COLORS = [ '#ebedf0', '#ffedf9', '#ffc3eb', '#ff3ebf', '#c70085' ]; 164 | 165 | const changeLevelColor = (level: number, color: string) => { 166 | const root = document.documentElement; 167 | if (level === 0) { 168 | root.style.setProperty(`--color-calendar-graph-day-bg`, color); 169 | } else { 170 | root.style.setProperty(`--color-calendar-graph-day-L${level}-bg`, color); 171 | } 172 | }; 173 | 174 | const replaceLegendToColorPicker = async (level: number, defaultColor: string) => { 175 | const legendSelector = `#contribution-graph-legend-level-${level}`; // 选择器selector是用于定位DOM元素的字符串 176 | await waitFor(() => $(legendSelector).length > 0); // init函数运行的时候,页面中某些元素不一定已经加载完毕,经过测试,日历图加载时机比较靠后,因此需要waitFor一下,不然后面的操作都是无用的 177 | const $legend = $(legendSelector); 178 | const container = $('
'); 179 | createRoot(container[0]).render( 180 | changeLevelColor(level, hex)} />// 选择新颜色后会调用changeLevelColor改变格子颜色 181 | ); // 将React组件渲染为真实的DOM元素 182 | $legend.replaceWith(container); // 使用jQuery的replaceWith方法将图例格子替换为ColorPicker 183 | }; 184 | 185 | const init = async (): Promise => { 186 | for (let i = 0; i < CALENDAR_LEVEL_COLORS.length; i++) { 187 | changeLevelColor(i, CALENDAR_LEVEL_COLORS[i]); // 初始化时就按照给定的颜色改变日历格子的颜色 188 | await replaceLegendToColorPicker(i, CALENDAR_LEVEL_COLORS[i]); 189 | } 190 | }; 191 | 192 | const restore = async () => { 193 | console.log('restore colorful-calendar'); 194 | }; 195 | 196 | features.add(featureId, { 197 | asLongAs: [isGithub, pageDetect.isUserProfile], 198 | awaitDomReady: false, 199 | init, 200 | restore, 201 | }); 202 | ``` 203 | 204 | 上面的代码保存后会得到如下图左边所示的结果:每个`ColorPicker`都很大,和GitHub原生的小格子风格迥异,总之看着不美观。这是因为`antd`是一套设计,它有自己的一套设计理念和风格,其暴露给开发者用于调整样式的API是有限的,所以无法通过`API`达到让`ColorPicker`变得很小的目的。 205 | 206 |
207 | image 208 |
209 | 210 | 只能用点黑科技,即`CSS`样式覆盖:使用`DevTools Inspect`工具检查`antd ColorPicker DOM`树上各级元素的样式信息,然后引入自定义的`CSS`样式覆盖掉需要修改的样式。下面的`index.scss`文件中的覆盖样式: 211 | 212 | ```scss 213 | .ant-color-picker-trigger { 214 | min-width: 10px !important; 215 | padding: 0 !important; 216 | margin-right: 4px; 217 | border: none !important; 218 | } 219 | 220 | .ant-color-picker-color-block { 221 | width: 10px !important; 222 | min-width: 10px !important; 223 | height: 10px !important; 224 | } 225 | 226 | .ant-color-picker-color-block-inner { 227 | width: 10px !important; 228 | min-width: 10px !important; 229 | height: 10px !important; 230 | border-radius: 3px !important; 231 | } 232 | ``` 233 | 样式优化后的效果如上图右边所示。最终效果如下: 234 | 235 |
236 | image 237 |
238 | 239 | ## 步骤6. 记住用户上次选择的颜色 240 | 刚刚,我们实现了利用颜色选择器改变日历格子颜色,但是自定义的颜色会在页面刷新后失效。因此,我们要利用 [chrome.storage.local](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/local) API 对用户的设置进行持久化。API的使用较为简单,唯一需要注意的是,`storage.local`的各个方法都是异步的。我们利用该 API 增加两个操作:在初始化时读取颜色配置、在改变颜色时更新颜色配置。代码做如下更新: 241 | 242 | ```typescript 243 | let colors = ['#ebedf0', '#ffedf9', '#ffc3eb', '#ff3ebf', '#c70085']; 244 | 245 | const changeLevelColor = async (level: number, color: string) => { 246 | const root = document.documentElement; 247 | if (level === 0) { 248 | root.style.setProperty(`--color-calendar-graph-day-bg`, color); 249 | } else { 250 | root.style.setProperty(`--color-calendar-graph-day-L${level}-bg`, color); 251 | } 252 | // Save to storage 253 | const newColors = [...colors]; 254 | newColors[level] = color; 255 | await chrome.storage.local.set({ 256 | calendar_level_colors: newColors, 257 | }); 258 | }; 259 | 260 | const init = async (): Promise => { 261 | // Load colors from storage 262 | colors = 263 | (await chrome.storage.local.get('calendar_level_colors'))[ 264 | 'calendar_level_colors' 265 | ] || colors; 266 | 267 | for (let i = 0; i < colors.length; i++) { 268 | changeLevelColor(i, colors[i]); 269 | replaceLegendToColorPicker(i, colors[i]); 270 | } 271 | }; 272 | ``` 273 | 274 | ## 步骤7. 提交 PR 275 | >在提交PR前,我们需要确保代码已经过测试,没有bug,并且代码结构清晰、易读性强。并记得将代码中的非必要的注释以及调试语句删掉,最好使用英文进行代码注释。 276 | 277 | 将代码保存,并运行`yarn prettier`,进行代码格式化。 278 | 推送分支到`origin`;向`upstream`提PR;描述好截图录屏等;等待`reviewer`意见;成功合入后及时将本地`master`与`upstream`的`master`同步。 279 | 280 | ## 总结 281 | 在这篇`Tutorial`中,我们通过渐进式地完成一个`demo`特性`colorful-calendar`来熟悉HyperCRX的开发流程。 -------------------------------------------------------------------------------- /docs/dev_docs/intro.md: -------------------------------------------------------------------------------- 1 | # 开发者指南 2 | 如果你初来乍到或对 Git/GitHub 的基本操作不熟悉,请阅读[CONTRIBUTING](https://github.com/hypertrons/hypertrons-crx/blob/master/CONTRIBUTING.md)。 3 | 4 | ### 环境需求 5 | 6 | 1. node >= 16.14 7 | 8 | 2. yarn 9 | 10 | ### 快速开始 11 | 12 | 1. git clone https://github.com/hypertrons/hypertrons-crx 13 | 14 | 2. cd hypertrons-crx 15 | 16 | 3. yarn install 17 | 18 | 4. yarn run start 19 | 20 | 5. 在 chrome 中加载新鲜出炉的插件: 21 | 22 | 1. 在浏览器地址栏访问 chrome://extensions/ 23 | 24 | 2. 勾选“开发者模式” 25 | 26 | 3. 点击“加载已解压的扩展程序” 27 | 28 | 4. 选择项目根目录下的“build”目录 29 | 30 | 5. 保持“Service Worker”的 DevTools 页面为打开状态 ([why?](https://github.com/hypertrons/hypertrons-crx/pull/274#discussion_r811878203)) 31 | 32 | ![](/img/keep-service-worker-devtools-open.jpeg) 33 | 34 | 6. Happy hacking! 35 | 36 | ### HMR & auto-reload 37 | 38 | 如果你开发的是 Options 页面或 Popup 页面,每次保存文件都可以让页面进行热模块替换而不需要刷新页面,这意味着你能立马看到改动后的效果。 39 | 40 | 但是,如果你开发的是 Background 或 ContentScripts,每次保存文件后,service worker 会自动重新加载插件。除此之外,若你开发的是 ContentScripts,那么那些被注入 ContentScripts 的页面还会自动刷新从而运行最新的 ContentScripts。 41 | 42 | ### 问题交流 43 | 44 | 我们非常欢迎您的贡献,您可以通过 [Issue](https://github.com/hypertrons/hypertrons-crx/issues) 提出问题或交流。 45 | 46 | 更多信息请参考 [贡献指南](https://github.com/hypertrons/hypertrons-crx/blob/master/CONTRIBUTING.md)。 -------------------------------------------------------------------------------- /docs/user_docs/fastpr.md: -------------------------------------------------------------------------------- 1 | # FastPR 使用流程 2 | 3 | FastPR 是一项旨在简化开源项目贡献流程的功能。用户可以直接在插件提供的文档页面上修改内容,插件会在完成后自动生成并提交 PR,从而简化了贡献的流程。此功能不仅支持 GitHub,还可以扩展至其他指定的文档站点。 4 | 5 | ## 目前配置网站 6 | 7 | 以下网站已经配置支持 FastPR 功能,用户可以直接在这些页面上编辑内容并提交 PR: 8 | 9 | - **[开源软件通识](https://www.x-lab.info/oss101-bok/)** 10 | 为开源领域的从业者、研究者和爱好者提供全面的开源知识体系。 11 | 12 | - **[OpenDigger](https://open-digger.cn/)** 13 | 开源数据分析平台,提供丰富的开源生态和数据分析功能。 14 | 15 | - **[开源书籍](https://kaiyuanshe.github.io/oss-book)** 16 | 由开源社编写的开源知识普及书籍,内容涵盖开源的基本概念、实践指南和案例分析。 17 | 18 | - **[KaiwuDB 文档](https://www.kaiwudb.com/kaiwudb_docs/#/oss_dev)** 19 | KaiwuDB 的开发文档,提供数据库使用和开发相关的指导和说明。 20 | 21 | --- 22 | 23 | **需要配置的网站** 24 | 25 | 如有需要配置的文档项目,欢迎访问 [HyperCRX 项目](https://github.com/hypertrons/hypertrons-crx) 提交 Issue 留言,非盈利项目我们将提供免费支持。 26 | 27 | ## 用户指南 28 | 29 | 1. 第一步:找到插件图标并点击进入设置页面。在 GitHub 账户绑定部分,点击“绑定账户”按钮,跳转到 GitHub 授权页面。在该页面登录您的 GitHub 账号并授权 HyperCRX 访问所需权限。同样的流程适用于绑定 Gitee 账户。 30 | 绑定成功后,状态会从“未绑定账户”变更为显示已绑定的账户信息,表明绑定流程已完成。 31 | ![FastPR 示例图片](/img/fastpr-example1.png "FastPR 图片示例1") 32 | 2. 第二步:在文档页面上找到插件对应的图标并点击。此时可以看到文档的原始内容。 33 | ![FastPR 示例图片](/img/fastpr-example2.png "FastPR 图片示例2") 34 | 35 | 3. 第三步:编辑文档。在页面左侧输入需要修改的内容,完成编辑后点击 ✅ 图标保存更改。 36 | ![FastPR 示例图片](/img/fastpr-example3.png "FastPR 图片示例3") 37 | 38 | 4. 第四步:页面会弹出 FastPR 提示。点击 "提交" 按钮提交更改。当页面出现 "PR 创建成功" 消息时,说明 PR 已成功提交至对应的仓库。 39 | -------------------------------------------------------------------------------- /docs/user_docs/intro.md: -------------------------------------------------------------------------------- 1 | # HyperCRX 简介 2 | -------------------------------------------------------------------------------- /docusaurus.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from '@docusaurus/types'; 2 | import type * as Preset from '@docusaurus/preset-classic'; 3 | import { themes as prismThemes } from 'prism-react-renderer'; 4 | import remarkMath from 'remark-math'; 5 | import rehypeKatex from 'rehype-katex'; 6 | 7 | const defaultLocale = 'zh'; 8 | 9 | const config: Config = { 10 | title: 'HyperCRX', 11 | tagline: 'Open source chrome extension for open source communities', 12 | favicon: 'img/favicon.ico', 13 | url: 'https://hypercrx.cn', 14 | baseUrl: process.env.PULL_NUM ? `/pull_${process.env.PULL_NUM}/` : '/', 15 | 16 | onBrokenLinks: 'throw', 17 | onBrokenMarkdownLinks: 'warn', 18 | 19 | i18n: { 20 | defaultLocale, 21 | locales: ['zh', 'en'], 22 | localeConfigs: { 23 | en: { 24 | htmlLang: "en-GB", 25 | }, 26 | // You can omit a locale (e.g. fr) if you don't need to override the defaults 27 | fa: { 28 | direction: "rtl", 29 | }, 30 | }, 31 | }, 32 | 33 | customFields: { 34 | pullNumber: process.env.PULL_NUM, 35 | imagePath: process.env.PULL_NUM ? `/pull_${process.env.PULL_NUM}/img/` : '/img/', 36 | }, 37 | 38 | presets: [ 39 | [ 40 | 'classic', 41 | ({ 42 | docs: { 43 | sidebarPath: './sidebars.ts', 44 | remarkPlugins: [remarkMath], 45 | rehypePlugins: [rehypeKatex], 46 | }, 47 | blog: { 48 | showReadingTime: true, 49 | blogSidebarTitle: 'Recent Posts', 50 | remarkPlugins: [remarkMath], 51 | rehypePlugins: [rehypeKatex], 52 | }, 53 | theme: { 54 | customCss: require.resolve('./src/css/custom.css'), 55 | }, 56 | }) satisfies Preset.Options, 57 | ], 58 | ], 59 | 60 | stylesheets: [ 61 | { 62 | href: 'https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css', 63 | type: 'text/css', 64 | integrity: 65 | 'sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM', 66 | crossorigin: 'anonymous', 67 | }, 68 | ], 69 | 70 | plugins: [ 71 | [ 72 | require.resolve("@easyops-cn/docusaurus-search-local"), 73 | { 74 | indexDocs: true, 75 | }, 76 | ], 77 | require.resolve("docusaurus-plugin-image-zoom"), 78 | ], 79 | 80 | themes: ['@docusaurus/theme-mermaid'], 81 | markdown: { 82 | mermaid: true, 83 | }, 84 | 85 | themeConfig: 86 | ({ 87 | image: 'img/logos/hypercrx.png', 88 | navbar: { 89 | title: 'HyperCRX', 90 | logo: { 91 | alt: 'HyperCRX Logo', 92 | src: 'img/logos/hypercrx.svg', 93 | srcDark: 'img/logos/hypercrx-dark.svg', 94 | }, 95 | hideOnScroll: true, 96 | items: [ 97 | { 98 | type: 'docSidebar', 99 | sidebarId: 'userDocSidebar', 100 | label: 'userDocs', 101 | position: 'left', 102 | }, 103 | { 104 | type: 'docSidebar', 105 | sidebarId: 'developerDocSidebar', 106 | label: 'devDocs', 107 | position: 'left', 108 | }, 109 | { 110 | to: '/blog', 111 | label: 'blog', 112 | position: 'left' 113 | }, 114 | { 115 | type: 'localeDropdown', 116 | position: 'right', 117 | }, 118 | { 119 | type: 'dropdown', 120 | label: 'GitHub', 121 | className: 'header--github-dropdown', 122 | position: 'right', 123 | items: [ 124 | { 125 | label: 'HyperCRX', 126 | href: 'https://github.com/hypertrons/hypertrons-crx', 127 | }, 128 | { 129 | label: 'HyperCRX-Website', 130 | href: 'https://github.com/hypertrons/hypertrons-crx-website', 131 | }, 132 | ], 133 | }, 134 | ], 135 | }, 136 | zoom: { 137 | selector: '.markdown :not(em) > img', 138 | config: { 139 | background: { 140 | light: 'rgb(255, 255, 255)', 141 | dark: 'rgb(50, 50, 50)' 142 | } 143 | } 144 | }, 145 | footer: { 146 | style: 'dark', 147 | copyright: `Copyright © ${new Date().getFullYear()} HyperCRX
148 | 浙ICP备18048778号-6`, 149 | }, 150 | prism: { 151 | theme: prismThemes.github, 152 | darkTheme: prismThemes.dracula, 153 | }, 154 | }) satisfies Preset.ThemeConfig, 155 | }; 156 | 157 | export default config; 158 | -------------------------------------------------------------------------------- /i18n/en/code.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme.ErrorPageContent.title": { 3 | "message": "This page crashed.", 4 | "description": "The title of the fallback page when the page crashed" 5 | }, 6 | "theme.BackToTopButton.buttonAriaLabel": { 7 | "message": "Scroll back to top", 8 | "description": "The ARIA label for the back to top button" 9 | }, 10 | "theme.blog.archive.title": { 11 | "message": "Archive", 12 | "description": "The page & hero title of the blog archive page" 13 | }, 14 | "theme.blog.archive.description": { 15 | "message": "Archive", 16 | "description": "The page & hero description of the blog archive page" 17 | }, 18 | "theme.blog.paginator.navAriaLabel": { 19 | "message": "Blog list page navigation", 20 | "description": "The ARIA label for the blog pagination" 21 | }, 22 | "theme.blog.paginator.newerEntries": { 23 | "message": "Newer Entries", 24 | "description": "The label used to navigate to the newer blog posts page (previous page)" 25 | }, 26 | "theme.blog.paginator.olderEntries": { 27 | "message": "Older Entries", 28 | "description": "The label used to navigate to the older blog posts page (next page)" 29 | }, 30 | "theme.blog.post.paginator.navAriaLabel": { 31 | "message": "Blog post page navigation", 32 | "description": "The ARIA label for the blog posts pagination" 33 | }, 34 | "theme.blog.post.paginator.newerPost": { 35 | "message": "Newer Post", 36 | "description": "The blog post button label to navigate to the newer/previous post" 37 | }, 38 | "theme.blog.post.paginator.olderPost": { 39 | "message": "Older Post", 40 | "description": "The blog post button label to navigate to the older/next post" 41 | }, 42 | "theme.blog.post.plurals": { 43 | "message": "One post|{count} posts", 44 | "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" 45 | }, 46 | "theme.blog.tagTitle": { 47 | "message": "{nPosts} tagged with \"{tagName}\"", 48 | "description": "The title of the page for a blog tag" 49 | }, 50 | "theme.tags.tagsPageLink": { 51 | "message": "View All Tags", 52 | "description": "The label of the link targeting the tag list page" 53 | }, 54 | "theme.colorToggle.ariaLabel": { 55 | "message": "Switch between dark and light mode (currently {mode})", 56 | "description": "The ARIA label for the navbar color mode toggle" 57 | }, 58 | "theme.colorToggle.ariaLabel.mode.dark": { 59 | "message": "dark mode", 60 | "description": "The name for the dark color mode" 61 | }, 62 | "theme.colorToggle.ariaLabel.mode.light": { 63 | "message": "light mode", 64 | "description": "The name for the light color mode" 65 | }, 66 | "theme.docs.breadcrumbs.navAriaLabel": { 67 | "message": "Breadcrumbs", 68 | "description": "The ARIA label for the breadcrumbs" 69 | }, 70 | "theme.docs.DocCard.categoryDescription": { 71 | "message": "{count} items", 72 | "description": "The default description for a category card in the generated index about how many items this category includes" 73 | }, 74 | "theme.docs.paginator.navAriaLabel": { 75 | "message": "Docs pages", 76 | "description": "The ARIA label for the docs pagination" 77 | }, 78 | "theme.docs.paginator.previous": { 79 | "message": "Previous", 80 | "description": "The label used to navigate to the previous doc" 81 | }, 82 | "theme.docs.paginator.next": { 83 | "message": "Next", 84 | "description": "The label used to navigate to the next doc" 85 | }, 86 | "theme.docs.tagDocListPageTitle.nDocsTagged": { 87 | "message": "One doc tagged|{count} docs tagged", 88 | "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" 89 | }, 90 | "theme.docs.tagDocListPageTitle": { 91 | "message": "{nDocsTagged} with \"{tagName}\"", 92 | "description": "The title of the page for a docs tag" 93 | }, 94 | "theme.docs.versionBadge.label": { 95 | "message": "Version: {versionLabel}" 96 | }, 97 | "theme.docs.versions.unreleasedVersionLabel": { 98 | "message": "This is unreleased documentation for {siteTitle} {versionLabel} version.", 99 | "description": "The label used to tell the user that he's browsing an unreleased doc version" 100 | }, 101 | "theme.docs.versions.unmaintainedVersionLabel": { 102 | "message": "This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.", 103 | "description": "The label used to tell the user that he's browsing an unmaintained doc version" 104 | }, 105 | "theme.docs.versions.latestVersionSuggestionLabel": { 106 | "message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).", 107 | "description": "The label used to tell the user to check the latest version" 108 | }, 109 | "theme.docs.versions.latestVersionLinkLabel": { 110 | "message": "latest version", 111 | "description": "The label used for the latest version suggestion link label" 112 | }, 113 | "theme.common.editThisPage": { 114 | "message": "Edit this page", 115 | "description": "The link label to edit the current page" 116 | }, 117 | "theme.common.headingLinkTitle": { 118 | "message": "Direct link to {heading}", 119 | "description": "Title for link to heading" 120 | }, 121 | "theme.lastUpdated.atDate": { 122 | "message": " on {date}", 123 | "description": "The words used to describe on which date a page has been last updated" 124 | }, 125 | "theme.lastUpdated.byUser": { 126 | "message": " by {user}", 127 | "description": "The words used to describe by who the page has been last updated" 128 | }, 129 | "theme.lastUpdated.lastUpdatedAtBy": { 130 | "message": "Last updated{atDate}{byUser}", 131 | "description": "The sentence used to display when a page has been last updated, and by who" 132 | }, 133 | "theme.NotFound.title": { 134 | "message": "Page Not Found", 135 | "description": "The title of the 404 page" 136 | }, 137 | "theme.navbar.mobileVersionsDropdown.label": { 138 | "message": "Versions", 139 | "description": "The label for the navbar versions dropdown on mobile view" 140 | }, 141 | "theme.tags.tagsListLabel": { 142 | "message": "Tags:", 143 | "description": "The label alongside a tag list" 144 | }, 145 | "theme.admonition.caution": { 146 | "message": "caution", 147 | "description": "The default label used for the Caution admonition (:::caution)" 148 | }, 149 | "theme.admonition.danger": { 150 | "message": "danger", 151 | "description": "The default label used for the Danger admonition (:::danger)" 152 | }, 153 | "theme.admonition.info": { 154 | "message": "info", 155 | "description": "The default label used for the Info admonition (:::info)" 156 | }, 157 | "theme.admonition.note": { 158 | "message": "note", 159 | "description": "The default label used for the Note admonition (:::note)" 160 | }, 161 | "theme.admonition.tip": { 162 | "message": "tip", 163 | "description": "The default label used for the Tip admonition (:::tip)" 164 | }, 165 | "theme.admonition.warning": { 166 | "message": "warning", 167 | "description": "The default label used for the Warning admonition (:::warning)" 168 | }, 169 | "theme.AnnouncementBar.closeButtonAriaLabel": { 170 | "message": "Close", 171 | "description": "The ARIA label for close button of announcement bar" 172 | }, 173 | "theme.blog.sidebar.navAriaLabel": { 174 | "message": "Blog recent posts navigation", 175 | "description": "The ARIA label for recent posts in the blog sidebar" 176 | }, 177 | "theme.CodeBlock.copied": { 178 | "message": "Copied", 179 | "description": "The copied button label on code blocks" 180 | }, 181 | "theme.CodeBlock.copyButtonAriaLabel": { 182 | "message": "Copy code to clipboard", 183 | "description": "The ARIA label for copy code blocks button" 184 | }, 185 | "theme.CodeBlock.copy": { 186 | "message": "Copy", 187 | "description": "The copy button label on code blocks" 188 | }, 189 | "theme.CodeBlock.wordWrapToggle": { 190 | "message": "Toggle word wrap", 191 | "description": "The title attribute for toggle word wrapping button of code block lines" 192 | }, 193 | "theme.DocSidebarItem.expandCategoryAriaLabel": { 194 | "message": "Expand sidebar category '{label}'", 195 | "description": "The ARIA label to expand the sidebar category" 196 | }, 197 | "theme.DocSidebarItem.collapseCategoryAriaLabel": { 198 | "message": "Collapse sidebar category '{label}'", 199 | "description": "The ARIA label to collapse the sidebar category" 200 | }, 201 | "theme.NavBar.navAriaLabel": { 202 | "message": "Main", 203 | "description": "The ARIA label for the main navigation" 204 | }, 205 | "theme.NotFound.p1": { 206 | "message": "We could not find what you were looking for.", 207 | "description": "The first paragraph of the 404 page" 208 | }, 209 | "theme.NotFound.p2": { 210 | "message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.", 211 | "description": "The 2nd paragraph of the 404 page" 212 | }, 213 | "theme.navbar.mobileLanguageDropdown.label": { 214 | "message": "Languages", 215 | "description": "The label for the mobile language switcher dropdown" 216 | }, 217 | "theme.TOCCollapsible.toggleButtonLabel": { 218 | "message": "On this page", 219 | "description": "The label used by the button on the collapsible TOC component" 220 | }, 221 | "theme.blog.post.readMore": { 222 | "message": "Read More", 223 | "description": "The label used in blog post item excerpts to link to full blog posts" 224 | }, 225 | "theme.blog.post.readMoreLabel": { 226 | "message": "Read more about {title}", 227 | "description": "The ARIA label for the link to full blog posts from excerpts" 228 | }, 229 | "theme.blog.post.readingTime.plurals": { 230 | "message": "One min read|{readingTime} min read", 231 | "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" 232 | }, 233 | "theme.docs.breadcrumbs.home": { 234 | "message": "Home page", 235 | "description": "The ARIA label for the home page in the breadcrumbs" 236 | }, 237 | "theme.docs.sidebar.collapseButtonTitle": { 238 | "message": "Collapse sidebar", 239 | "description": "The title attribute for collapse button of doc sidebar" 240 | }, 241 | "theme.docs.sidebar.collapseButtonAriaLabel": { 242 | "message": "Collapse sidebar", 243 | "description": "The title attribute for collapse button of doc sidebar" 244 | }, 245 | "theme.docs.sidebar.navAriaLabel": { 246 | "message": "Docs sidebar", 247 | "description": "The ARIA label for the sidebar navigation" 248 | }, 249 | "theme.docs.sidebar.closeSidebarButtonAriaLabel": { 250 | "message": "Close navigation bar", 251 | "description": "The ARIA label for close button of mobile sidebar" 252 | }, 253 | "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { 254 | "message": "← Back to main menu", 255 | "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" 256 | }, 257 | "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { 258 | "message": "Toggle navigation bar", 259 | "description": "The ARIA label for hamburger menu button of mobile navigation" 260 | }, 261 | "theme.docs.sidebar.expandButtonTitle": { 262 | "message": "Expand sidebar", 263 | "description": "The ARIA label and title attribute for expand button of doc sidebar" 264 | }, 265 | "theme.docs.sidebar.expandButtonAriaLabel": { 266 | "message": "Expand sidebar", 267 | "description": "The ARIA label and title attribute for expand button of doc sidebar" 268 | }, 269 | "theme.ErrorPageContent.tryAgain": { 270 | "message": "Try again", 271 | "description": "The label of the button to try again rendering when the React error boundary captures an error" 272 | }, 273 | "theme.common.skipToMainContent": { 274 | "message": "Skip to main content", 275 | "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" 276 | }, 277 | "theme.tags.tagsPageTitle": { 278 | "message": "Tags", 279 | "description": "The title of the tag list page" 280 | }, 281 | "theme.unlistedContent.title": { 282 | "message": "Unlisted page", 283 | "description": "The unlisted content banner title" 284 | }, 285 | "theme.unlistedContent.message": { 286 | "message": "This page is unlisted. Search engines will not index it, and only users having a direct link can access it.", 287 | "description": "The unlisted content banner message" 288 | }, 289 | "homepage.tagLine": { 290 | "message": "HyperCRX: Powerful Browser Extension For Open Source" 291 | }, 292 | "homepage.getStarted": { 293 | "message": "HyperCRX Introduction in 3min ⏱️" 294 | }, 295 | "features.richMetrics.title": { 296 | "message": "Feature 1" 297 | }, 298 | "features.richMetrics.url": { 299 | "message": "" 300 | }, 301 | "features.richMetrics.desc": { 302 | "message": "HyperCRX has feature 1" 303 | }, 304 | "features.easyToUse.title": { 305 | "message": "Feature 2" 306 | }, 307 | "features.easyToUse.url": { 308 | "message": "/en/docs/user_docs/intro" 309 | }, 310 | "features.easyToUse.desc": { 311 | "message": "HyperCRX has feature 2" 312 | }, 313 | "features.variousApplications.title": { 314 | "message": "Feature 3" 315 | }, 316 | "features.variousApplications.url": { 317 | "message": "" 318 | }, 319 | "features.variousApplications.desc": { 320 | "message": "HyperCRX has feature 3" 321 | }, 322 | "homepage.pullPreviewWarning": { 323 | "message": "⚠ Warning: This is a preview deploy of HyperCRX website for PR#{pullNumber}, please do not share! To visit HyperCRX official website please go to https://hypercrx.cn。" 324 | } 325 | } 326 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-blog/authors.yml: -------------------------------------------------------------------------------- 1 | zsy: 2 | name: Frank Zhao 3 | title: Ph.D candidate at Tongji University 4 | url: https://blog.frankzhao.cn/ 5 | image_url: https://gitee.com/frank_zsy.png 6 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-blog/options.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": { 3 | "message": "Blog", 4 | "description": "The title for the blog used in SEO" 5 | }, 6 | "description": { 7 | "message": "Blog", 8 | "description": "The description for the blog used in SEO" 9 | }, 10 | "sidebar.title": { 11 | "message": "Recent Posts", 12 | "description": "The label for the left sidebar" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current.json: -------------------------------------------------------------------------------- 1 | { 2 | "version.label": { 3 | "message": "Next", 4 | "description": "The label for version current" 5 | }, 6 | "sidebar.docSidebar.category.data_sources": { 7 | "message": "Data Sources", 8 | "description": "The label for category metrics in sidebar docSidebar" 9 | }, 10 | "sidebar.docSidebar.category.metrics": { 11 | "message": "Metrics", 12 | "description": "The label for category metrics in sidebar docSidebar" 13 | }, 14 | "sidebar.docSidebar.category.openrank": { 15 | "message": "OpenRank", 16 | "description": "The label for category openrank in sidebar docSidebar" 17 | }, 18 | "sidebar.userDocSidebar.category.downstream": { 19 | "message": "Downstream Apps", 20 | "description": "The label for category downstream in sidebar userDocSidebar" 21 | }, 22 | "sidebar.userDocSidebar.link.PolarDBDashboard": { 23 | "message": "PolarDB Dashboard", 24 | "description": "The label for link PolarDBDashboard in sidebar userDocSidebar" 25 | }, 26 | "sidebar.userDocSidebar.link.OpenAtomDashboard": { 27 | "message": "OpenAtom Dashboard", 28 | "description": "The label for link OpenAtomDashboard in sidebar userDocSidebar" 29 | }, 30 | "sidebar.developerDocSidebar.category.jupyter_notebook": { 31 | "message": "Jupyter Notebook", 32 | "description": "The label for category jupyter_notebook in sidebar developerDocSidebar" 33 | } 34 | } -------------------------------------------------------------------------------- /i18n/en/docusaurus-plugin-content-docs/current/user_docs/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | title: Introduction 4 | --- 5 | 6 | # HyperCRX 7 | -------------------------------------------------------------------------------- /i18n/en/docusaurus-theme-classic/navbar.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": { 3 | "message": "HyperCRX", 4 | "description": "The title in the navbar" 5 | }, 6 | "logo.alt": { 7 | "message": "HyperCRX Logo", 8 | "description": "The alt text of navbar logo" 9 | }, 10 | "item.label.docs": { 11 | "message": "Docs", 12 | "description": "Navbar item with label docs" 13 | }, 14 | "item.label.blog": { 15 | "message": "Blog", 16 | "description": "Navbar item with label blog" 17 | }, 18 | "item.label.GitHub": { 19 | "message": "GitHub", 20 | "description": "Navbar item with label GitHub" 21 | }, 22 | "item.label.userDocs": { 23 | "message": "User Docs", 24 | "description": "Navbar item with label userDocs" 25 | }, 26 | "item.label.devDocs": { 27 | "message": "Developer Docs", 28 | "description": "Navbar item with label devDocs" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /i18n/zh/code.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme.ErrorPageContent.title": { 3 | "message": "页面已崩溃。", 4 | "description": "The title of the fallback page when the page crashed" 5 | }, 6 | "theme.blog.archive.title": { 7 | "message": "历史博文", 8 | "description": "The page & hero title of the blog archive page" 9 | }, 10 | "theme.blog.archive.description": { 11 | "message": "历史博文", 12 | "description": "The page & hero description of the blog archive page" 13 | }, 14 | "theme.BackToTopButton.buttonAriaLabel": { 15 | "message": "回到顶部", 16 | "description": "The ARIA label for the back to top button" 17 | }, 18 | "theme.blog.paginator.navAriaLabel": { 19 | "message": "博文列表分页导航", 20 | "description": "The ARIA label for the blog pagination" 21 | }, 22 | "theme.blog.paginator.newerEntries": { 23 | "message": "较新的博文", 24 | "description": "The label used to navigate to the newer blog posts page (previous page)" 25 | }, 26 | "theme.blog.paginator.olderEntries": { 27 | "message": "较旧的博文", 28 | "description": "The label used to navigate to the older blog posts page (next page)" 29 | }, 30 | "theme.blog.post.paginator.navAriaLabel": { 31 | "message": "博文分页导航", 32 | "description": "The ARIA label for the blog posts pagination" 33 | }, 34 | "theme.blog.post.paginator.newerPost": { 35 | "message": "较新一篇", 36 | "description": "The blog post button label to navigate to the newer/previous post" 37 | }, 38 | "theme.blog.post.paginator.olderPost": { 39 | "message": "较旧一篇", 40 | "description": "The blog post button label to navigate to the older/next post" 41 | }, 42 | "theme.blog.post.plurals": { 43 | "message": "{count} 篇博文", 44 | "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" 45 | }, 46 | "theme.blog.tagTitle": { 47 | "message": "{nPosts} 含有标签「{tagName}」", 48 | "description": "The title of the page for a blog tag" 49 | }, 50 | "theme.tags.tagsPageLink": { 51 | "message": "查看所有标签", 52 | "description": "The label of the link targeting the tag list page" 53 | }, 54 | "theme.colorToggle.ariaLabel": { 55 | "message": "切换浅色/暗黑模式(当前为{mode})", 56 | "description": "The ARIA label for the navbar color mode toggle" 57 | }, 58 | "theme.colorToggle.ariaLabel.mode.dark": { 59 | "message": "暗黑模式", 60 | "description": "The name for the dark color mode" 61 | }, 62 | "theme.colorToggle.ariaLabel.mode.light": { 63 | "message": "浅色模式", 64 | "description": "The name for the light color mode" 65 | }, 66 | "theme.docs.DocCard.categoryDescription": { 67 | "message": "{count} 个项目", 68 | "description": "The default description for a category card in the generated index about how many items this category includes" 69 | }, 70 | "theme.docs.breadcrumbs.navAriaLabel": { 71 | "message": "页面路径", 72 | "description": "The ARIA label for the breadcrumbs" 73 | }, 74 | "theme.docs.paginator.navAriaLabel": { 75 | "message": "文件选项卡", 76 | "description": "The ARIA label for the docs pagination" 77 | }, 78 | "theme.docs.paginator.previous": { 79 | "message": "上一页", 80 | "description": "The label used to navigate to the previous doc" 81 | }, 82 | "theme.docs.paginator.next": { 83 | "message": "下一页", 84 | "description": "The label used to navigate to the next doc" 85 | }, 86 | "theme.docs.tagDocListPageTitle.nDocsTagged": { 87 | "message": "{count} 篇文档带有标签", 88 | "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" 89 | }, 90 | "theme.docs.tagDocListPageTitle": { 91 | "message": "{nDocsTagged}「{tagName}」", 92 | "description": "The title of the page for a docs tag" 93 | }, 94 | "theme.docs.versionBadge.label": { 95 | "message": "版本:{versionLabel}" 96 | }, 97 | "theme.docs.versions.unreleasedVersionLabel": { 98 | "message": "此为 {siteTitle} {versionLabel} 版尚未发行的文档。", 99 | "description": "The label used to tell the user that he's browsing an unreleased doc version" 100 | }, 101 | "theme.docs.versions.unmaintainedVersionLabel": { 102 | "message": "此为 {siteTitle} {versionLabel} 版的文档,现已不再积极维护。", 103 | "description": "The label used to tell the user that he's browsing an unmaintained doc version" 104 | }, 105 | "theme.docs.versions.latestVersionSuggestionLabel": { 106 | "message": "最新的文档请参阅 {latestVersionLink} ({versionLabel})。", 107 | "description": "The label used to tell the user to check the latest version" 108 | }, 109 | "theme.docs.versions.latestVersionLinkLabel": { 110 | "message": "最新版本", 111 | "description": "The label used for the latest version suggestion link label" 112 | }, 113 | "theme.common.editThisPage": { 114 | "message": "编辑此页", 115 | "description": "The link label to edit the current page" 116 | }, 117 | "theme.common.headingLinkTitle": { 118 | "message": "{heading}的直接链接", 119 | "description": "Title for link to heading" 120 | }, 121 | "theme.lastUpdated.atDate": { 122 | "message": "于 {date} ", 123 | "description": "The words used to describe on which date a page has been last updated" 124 | }, 125 | "theme.lastUpdated.byUser": { 126 | "message": "由 {user} ", 127 | "description": "The words used to describe by who the page has been last updated" 128 | }, 129 | "theme.lastUpdated.lastUpdatedAtBy": { 130 | "message": "最后{byUser}{atDate}更新", 131 | "description": "The sentence used to display when a page has been last updated, and by who" 132 | }, 133 | "theme.NotFound.title": { 134 | "message": "找不到页面", 135 | "description": "The title of the 404 page" 136 | }, 137 | "theme.navbar.mobileVersionsDropdown.label": { 138 | "message": "选择版本", 139 | "description": "The label for the navbar versions dropdown on mobile view" 140 | }, 141 | "theme.tags.tagsListLabel": { 142 | "message": "标签:", 143 | "description": "The label alongside a tag list" 144 | }, 145 | "theme.AnnouncementBar.closeButtonAriaLabel": { 146 | "message": "关闭", 147 | "description": "The ARIA label for close button of announcement bar" 148 | }, 149 | "theme.admonition.caution": { 150 | "message": "警告", 151 | "description": "The default label used for the Caution admonition (:::caution)" 152 | }, 153 | "theme.admonition.danger": { 154 | "message": "危险", 155 | "description": "The default label used for the Danger admonition (:::danger)" 156 | }, 157 | "theme.admonition.info": { 158 | "message": "信息", 159 | "description": "The default label used for the Info admonition (:::info)" 160 | }, 161 | "theme.admonition.note": { 162 | "message": "备注", 163 | "description": "The default label used for the Note admonition (:::note)" 164 | }, 165 | "theme.admonition.tip": { 166 | "message": "提示", 167 | "description": "The default label used for the Tip admonition (:::tip)" 168 | }, 169 | "theme.admonition.warning": { 170 | "message": "注意", 171 | "description": "The default label used for the Warning admonition (:::warning)" 172 | }, 173 | "theme.blog.sidebar.navAriaLabel": { 174 | "message": "最近博文导航", 175 | "description": "The ARIA label for recent posts in the blog sidebar" 176 | }, 177 | "theme.CodeBlock.copied": { 178 | "message": "复制成功", 179 | "description": "The copied button label on code blocks" 180 | }, 181 | "theme.CodeBlock.copyButtonAriaLabel": { 182 | "message": "复制代码到剪贴板", 183 | "description": "The ARIA label for copy code blocks button" 184 | }, 185 | "theme.CodeBlock.copy": { 186 | "message": "复制", 187 | "description": "The copy button label on code blocks" 188 | }, 189 | "theme.CodeBlock.wordWrapToggle": { 190 | "message": "切换自动换行", 191 | "description": "The title attribute for toggle word wrapping button of code block lines" 192 | }, 193 | "theme.DocSidebarItem.expandCategoryAriaLabel": { 194 | "message": "展开侧边栏分类 '{label}'", 195 | "description": "The ARIA label to expand the sidebar category" 196 | }, 197 | "theme.DocSidebarItem.collapseCategoryAriaLabel": { 198 | "message": "折叠侧边栏分类 '{label}'", 199 | "description": "The ARIA label to collapse the sidebar category" 200 | }, 201 | "theme.NavBar.navAriaLabel": { 202 | "message": "主导航", 203 | "description": "The ARIA label for the main navigation" 204 | }, 205 | "theme.NotFound.p1": { 206 | "message": "我们找不到您要找的页面。", 207 | "description": "The first paragraph of the 404 page" 208 | }, 209 | "theme.NotFound.p2": { 210 | "message": "请联系原始链接来源网站的所有者,并告知他们链接已损坏。", 211 | "description": "The 2nd paragraph of the 404 page" 212 | }, 213 | "theme.navbar.mobileLanguageDropdown.label": { 214 | "message": "选择语言", 215 | "description": "The label for the mobile language switcher dropdown" 216 | }, 217 | "theme.TOCCollapsible.toggleButtonLabel": { 218 | "message": "本页总览", 219 | "description": "The label used by the button on the collapsible TOC component" 220 | }, 221 | "theme.blog.post.readMore": { 222 | "message": "阅读更多", 223 | "description": "The label used in blog post item excerpts to link to full blog posts" 224 | }, 225 | "theme.blog.post.readMoreLabel": { 226 | "message": "阅读 {title} 的全文", 227 | "description": "The ARIA label for the link to full blog posts from excerpts" 228 | }, 229 | "theme.blog.post.readingTime.plurals": { 230 | "message": "阅读需 {readingTime} 分钟", 231 | "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" 232 | }, 233 | "theme.docs.breadcrumbs.home": { 234 | "message": "主页面", 235 | "description": "The ARIA label for the home page in the breadcrumbs" 236 | }, 237 | "theme.docs.sidebar.collapseButtonTitle": { 238 | "message": "收起侧边栏", 239 | "description": "The title attribute for collapse button of doc sidebar" 240 | }, 241 | "theme.docs.sidebar.collapseButtonAriaLabel": { 242 | "message": "收起侧边栏", 243 | "description": "The title attribute for collapse button of doc sidebar" 244 | }, 245 | "theme.docs.sidebar.navAriaLabel": { 246 | "message": "文档侧边栏", 247 | "description": "The ARIA label for the sidebar navigation" 248 | }, 249 | "theme.docs.sidebar.closeSidebarButtonAriaLabel": { 250 | "message": "关闭导航栏", 251 | "description": "The ARIA label for close button of mobile sidebar" 252 | }, 253 | "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { 254 | "message": "← 回到主菜单", 255 | "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" 256 | }, 257 | "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { 258 | "message": "切换导航栏", 259 | "description": "The ARIA label for hamburger menu button of mobile navigation" 260 | }, 261 | "theme.docs.sidebar.expandButtonTitle": { 262 | "message": "展开侧边栏", 263 | "description": "The ARIA label and title attribute for expand button of doc sidebar" 264 | }, 265 | "theme.docs.sidebar.expandButtonAriaLabel": { 266 | "message": "展开侧边栏", 267 | "description": "The ARIA label and title attribute for expand button of doc sidebar" 268 | }, 269 | "theme.ErrorPageContent.tryAgain": { 270 | "message": "重试", 271 | "description": "The label of the button to try again rendering when the React error boundary captures an error" 272 | }, 273 | "theme.common.skipToMainContent": { 274 | "message": "跳到主要内容", 275 | "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" 276 | }, 277 | "theme.tags.tagsPageTitle": { 278 | "message": "标签", 279 | "description": "The title of the tag list page" 280 | }, 281 | "theme.unlistedContent.title": { 282 | "message": "未列出页", 283 | "description": "The unlisted content banner title" 284 | }, 285 | "theme.unlistedContent.message": { 286 | "message": "此页面未列出。搜索引擎不会对其索引,只有拥有直接链接的用户才能访问。", 287 | "description": "The unlisted content banner message" 288 | }, 289 | "homepage.tagLine": { 290 | "message": "HyperCRX:强大的开源浏览器插件" 291 | }, 292 | "homepage.getStarted": { 293 | "message": "HyperCRX 3 分钟简介 ⏱️" 294 | }, 295 | "features.richMetrics.title": { 296 | "message": "特性1" 297 | }, 298 | "features.richMetrics.url": { 299 | "message": "" 300 | }, 301 | "features.richMetrics.desc": { 302 | "message": "HyperCRX 具有特性 1" 303 | }, 304 | "features.easyToUse.title": { 305 | "message": "特性2" 306 | }, 307 | "features.easyToUse.url": { 308 | "message": "/docs/user_docs/intro" 309 | }, 310 | "features.easyToUse.desc": { 311 | "message": "HyperCRX 具有特性 2" 312 | }, 313 | "features.variousApplications.title": { 314 | "message": "特性3" 315 | }, 316 | "features.variousApplications.url": { 317 | "message": "" 318 | }, 319 | "features.variousApplications.desc": { 320 | "message": "HyperCRX 具有特性 3" 321 | }, 322 | "homepage.pullPreviewWarning": { 323 | "message": "⚠ 注意:该网站为 HyperCRX 官网仓库 PR#{pullNumber} 的预览版本,请勿分享,谢谢!HyperCRX 官网请移步 https://hypercrx.cn。" 324 | } 325 | } 326 | -------------------------------------------------------------------------------- /i18n/zh/docusaurus-plugin-content-blog/options.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": { 3 | "message": "博客", 4 | "description": "The title for the blog used in SEO" 5 | }, 6 | "description": { 7 | "message": "博客", 8 | "description": "The description for the blog used in SEO" 9 | }, 10 | "sidebar.title": { 11 | "message": "最新文章", 12 | "description": "The label for the left sidebar" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /i18n/zh/docusaurus-plugin-content-docs/current.json: -------------------------------------------------------------------------------- 1 | { 2 | "version.label": { 3 | "message": "最新版本", 4 | "description": "The label for version current" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /i18n/zh/docusaurus-theme-classic/navbar.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": { 3 | "message": "HyperCRX", 4 | "description": "The title in the navbar" 5 | }, 6 | "logo.alt": { 7 | "message": "HyperCRX Logo", 8 | "description": "The alt text of navbar logo" 9 | }, 10 | "item.label.docs": { 11 | "message": "文档", 12 | "description": "Navbar item with label docs" 13 | }, 14 | "item.label.blog": { 15 | "message": "博客", 16 | "description": "Navbar item with label blog" 17 | }, 18 | "item.label.GitHub": { 19 | "message": "GitHub", 20 | "description": "Navbar item with label GitHub" 21 | }, 22 | "item.label.userDocs": { 23 | "message": "用户文档", 24 | "description": "Navbar item with label userDocs" 25 | }, 26 | "item.label.devDocs": { 27 | "message": "开发者文档", 28 | "description": "Navbar item with label devDocs" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hypercrx-website", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids" 15 | }, 16 | "dependencies": { 17 | "@docusaurus/core": "3.4.0", 18 | "@docusaurus/preset-classic": "3.4.0", 19 | "@docusaurus/theme-mermaid": "^3.4.0", 20 | "@easyops-cn/docusaurus-search-local": "^0.44.3", 21 | "@mdx-js/react": "^3.0.1", 22 | "@tanstack/react-table": "^8.19.2", 23 | "axios": "^1.7.2", 24 | "clsx": "^2.1.1", 25 | "docusaurus-plugin-image-zoom": "^2.0.0", 26 | "echarts": "^5.5.1", 27 | "echarts-for-react": "^3.0.2", 28 | "katex": "^0.16.11", 29 | "prism-react-renderer": "^2.3.1", 30 | "react": "^18.3.1", 31 | "react-dom": "^18.3.1", 32 | "rehype-katex": "^7.0.0", 33 | "remark-math": "^6.0.0", 34 | "stackedit-js": "^1.0.7" 35 | }, 36 | "devDependencies": { 37 | "@docusaurus/module-type-aliases": "3.4.0", 38 | "@docusaurus/types": "3.4.0", 39 | "@docusaurus/tsconfig": "^3.5.2", 40 | "@simbathesailor/use-what-changed": "^2.0.0", 41 | "typescript": "^5.5.4" 42 | }, 43 | "browserslist": { 44 | "production": [ 45 | ">0.5%", 46 | "not dead", 47 | "not op_mini all" 48 | ], 49 | "development": [ 50 | "last 3 chrome version", 51 | "last 3 firefox version", 52 | "last 5 safari version" 53 | ] 54 | }, 55 | "engines": { 56 | "node": ">=18.0" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /sidebars.ts: -------------------------------------------------------------------------------- 1 | import type { SidebarsConfig } from "@docusaurus/plugin-content-docs"; 2 | 3 | const sidebars: SidebarsConfig = { 4 | userDocSidebar: ["user_docs/intro", "user_docs/fastpr"], 5 | developerDocSidebar: ["dev_docs/intro", "dev_docs/case"], 6 | }; 7 | 8 | export default sidebars; 9 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/index.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import Heading from '@theme/Heading'; 3 | import styles from './styles.module.css'; 4 | import { translate } from '@docusaurus/Translate'; 5 | 6 | type FeatureItem = { 7 | title: string; 8 | url: string; 9 | Svg: React.ComponentType>; 10 | description: string; 11 | }; 12 | 13 | const FeatureList: FeatureItem[] = [ 14 | { 15 | title: 'features.richMetrics.title', 16 | url: 'features.richMetrics.url', 17 | Svg: require('@site/static/img/rich_metrics.svg').default, 18 | description: 'features.richMetrics.desc', 19 | }, 20 | { 21 | title: 'features.easyToUse.title', 22 | url: 'features.easyToUse.url', 23 | Svg: require('@site/static/img/easy_to_use.svg').default, 24 | description: 'features.easyToUse.desc', 25 | }, 26 | { 27 | title: 'features.variousApplications.title', 28 | url: 'features.variousApplications.url', 29 | Svg: require('@site/static/img/various_applications.svg').default, 30 | description: 'features.variousApplications.desc', 31 | }, 32 | ]; 33 | 34 | function Feature({ Svg, title, description, url }: FeatureItem) { 35 | return ( 36 |
37 |
38 | 39 |
40 |
41 | 42 | {translate({ id: title })} 43 | 44 |

45 |

46 |
47 | ); 48 | } 49 | 50 | export default (): JSX.Element => { 51 | return ( 52 |
53 |
54 |
55 | {FeatureList.map((props, idx) => ( 56 | 57 | ))} 58 |
59 |
60 |
61 | ); 62 | } 63 | -------------------------------------------------------------------------------- /src/components/HomepageFeatures/styles.module.css: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | align-items: center; 4 | padding: 2rem 0; 5 | width: 100%; 6 | } 7 | 8 | .featureSvg { 9 | height: 200px; 10 | width: 200px; 11 | } 12 | -------------------------------------------------------------------------------- /src/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Any CSS included here will be global. The classic template 3 | * bundles Infima by default. Infima is a CSS framework designed to 4 | * work well for content-centric websites. 5 | */ 6 | 7 | /* You can override the default Infima variables here. */ 8 | :root { 9 | --ifm-color-primary: #2e8555; 10 | --ifm-color-primary-dark: #29784c; 11 | --ifm-color-primary-darker: #277148; 12 | --ifm-color-primary-darkest: #205d3b; 13 | --ifm-color-primary-light: #33925d; 14 | --ifm-color-primary-lighter: #359962; 15 | --ifm-color-primary-lightest: #3cad6e; 16 | --ifm-code-font-size: 95%; 17 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); 18 | --banner-height: 40px; 19 | } 20 | 21 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 22 | [data-theme='dark'] { 23 | --ifm-color-primary: #25c2a0; 24 | --ifm-color-primary-dark: #21af90; 25 | --ifm-color-primary-darker: #1fa588; 26 | --ifm-color-primary-darkest: #1a8870; 27 | --ifm-color-primary-light: #29d5b0; 28 | --ifm-color-primary-lighter: #32d8b4; 29 | --ifm-color-primary-lightest: #4fddbf; 30 | --ifm-font-color-base-inverse: #ffffff; 31 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); 32 | } 33 | 34 | blockquote { 35 | border-left: 6px solid #e0e1da; 36 | background-color: #ebfbfa; 37 | color: #5b626b; 38 | font-size: 1rem; 39 | margin: 0 0 1rem 0; 40 | padding: 1rem 1.5rem; 41 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 42 | border-radius: 4px; 43 | font-style: italic; 44 | } 45 | 46 | html[data-theme="dark"] blockquote { 47 | border-left: 6px solid #5c5d5f; 48 | background-color: #111c28; 49 | color: #bcc3cc; 50 | box-shadow: none; 51 | } 52 | 53 | .header--github-dropdown { 54 | display: flex; 55 | align-items: center; 56 | } 57 | 58 | .header--github-dropdown::before { 59 | content: ''; 60 | width: 24px; 61 | height: 24px; 62 | margin-right: 8px; 63 | background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat; 64 | } 65 | 66 | html[data-theme='dark'] .header--github-dropdown::before { 67 | background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat; 68 | } 69 | 70 | @media (min-width: 768px) { 71 | .header--github-dropdown::after { 72 | content: '▼'; 73 | font-size: 16px; 74 | margin-left: 4px; 75 | margin-top: 7px; 76 | transition: transform 0.3s ease; 77 | } 78 | 79 | .header--github-dropdown[aria-expanded="true"]::after { 80 | transform: rotate(180deg); 81 | } 82 | } 83 | 84 | .header--github-dropdown:hover { 85 | border-radius: 4px; 86 | } 87 | 88 | .fixed-banner { 89 | position: fixed; 90 | top: 0; 91 | width: 100%; 92 | height: var(--banner-height); 93 | background-color: red; 94 | color: white; 95 | text-align: center; 96 | padding: 10px 10px; 97 | z-index: 1000; 98 | } 99 | 100 | @media (max-width: 768px) { 101 | .fixed-banner { 102 | height: calc(var(--banner-height) * 3); 103 | } 104 | } 105 | 106 | .fixed-banner a { 107 | color: white; 108 | text-decoration: underline; 109 | } 110 | 111 | .banner-placeholder { 112 | height: var(--banner-height); 113 | } 114 | -------------------------------------------------------------------------------- /src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /** 2 | * CSS files with the .module.css suffix will be treated as CSS modules 3 | * and scoped locally. 4 | */ 5 | 6 | .heroBanner { 7 | padding: 4rem 0; 8 | text-align: center; 9 | position: relative; 10 | overflow: hidden; 11 | /* background-color: transparent; */ 12 | } 13 | 14 | @media screen and (max-width: 996px) { 15 | .heroBanner { 16 | padding: 2rem; 17 | } 18 | } 19 | 20 | .buttons { 21 | display: flex; 22 | align-items: center; 23 | justify-content: center; 24 | } 25 | -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import Link from '@docusaurus/Link'; 3 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 4 | import HomepageFeatures from '../components/HomepageFeatures'; 5 | import Layout from '@theme/Layout'; 6 | import Translate, { translate } from '@docusaurus/Translate'; 7 | 8 | import styles from './index.module.css'; 9 | 10 | function HomepageHeader() { 11 | return ( 12 |
13 |
14 | Logo 15 |

{translate({ id: 'homepage.tagLine' })}

16 |
17 | 20 | 21 | 22 |
23 |
24 |
25 | ); 26 | } 27 | 28 | export default function Home(): JSX.Element { 29 | const { siteConfig } = useDocusaurusContext(); 30 | return ( 31 | 34 | 35 |
36 | 37 |
38 |
39 | ); 40 | } 41 | -------------------------------------------------------------------------------- /src/theme/Layout/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Layout from '@theme-original/Layout'; 3 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 4 | import { translate } from '@docusaurus/Translate'; 5 | 6 | export default function LayoutWrapper(props: any): JSX.Element { 7 | const { siteConfig } = useDocusaurusContext(); 8 | const { customFields } = siteConfig; 9 | 10 | return ( 11 | <> 12 | {customFields?.pullNumber && 13 | ( 14 |
15 |
20 |
21 |
22 | ) 23 | } 24 | 25 | 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hypertrons/hypertrons-crx-website/e91a86e43576924993b3ca1ab19822751dceb63a/static/.nojekyll -------------------------------------------------------------------------------- /static/img/easy_to_use.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/fastpr-example1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hypertrons/hypertrons-crx-website/e91a86e43576924993b3ca1ab19822751dceb63a/static/img/fastpr-example1.png -------------------------------------------------------------------------------- /static/img/fastpr-example2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hypertrons/hypertrons-crx-website/e91a86e43576924993b3ca1ab19822751dceb63a/static/img/fastpr-example2.png -------------------------------------------------------------------------------- /static/img/fastpr-example3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hypertrons/hypertrons-crx-website/e91a86e43576924993b3ca1ab19822751dceb63a/static/img/fastpr-example3.png -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hypertrons/hypertrons-crx-website/e91a86e43576924993b3ca1ab19822751dceb63a/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/keep-service-worker-devtools-open.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hypertrons/hypertrons-crx-website/e91a86e43576924993b3ca1ab19822751dceb63a/static/img/keep-service-worker-devtools-open.jpeg -------------------------------------------------------------------------------- /static/img/logos/hypercrx-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /static/img/logos/hypercrx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hypertrons/hypertrons-crx-website/e91a86e43576924993b3ca1ab19822751dceb63a/static/img/logos/hypercrx.png -------------------------------------------------------------------------------- /static/img/logos/hypercrx.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /static/img/rich_metrics.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/various_applications.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@docusaurus/tsconfig", 3 | "include": [ 4 | "src/**/*" 5 | ], 6 | "exclude": [ 7 | "node_modules", 8 | ], 9 | "compilerOptions": { 10 | "target": "ES6", 11 | "lib": [ 12 | "dom", 13 | "dom.iterable", 14 | "esnext" 15 | ], 16 | "skipLibCheck": true, 17 | "esModuleInterop": true, 18 | "allowSyntheticDefaultImports": true, 19 | // "strict": true, 20 | "forceConsistentCasingInFileNames": true, 21 | "module": "ESNext", 22 | "moduleResolution": "node", 23 | "resolveJsonModule": true, 24 | "isolatedModules": true, 25 | "jsx": "react-jsx", 26 | "noEmit": true, 27 | "paths": { 28 | "@/*": [ 29 | "src/*" 30 | ] 31 | } 32 | } 33 | } 34 | --------------------------------------------------------------------------------