From e4d102d2d80f88d65e61233f067468ba02fc2b33 Mon Sep 17 00:00:00 2001 From: lumenpearson <139921639+lumenpearson@users.noreply.github.com> Date: Sat, 2 Nov 2024 02:16:20 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20pre-release=20(v0.2.0)=20-?= =?UTF-8?q?=20Global=20Update=20[root/**/**/*.*]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 46 + .eslintignore | 7 +- .eslintrc.js | 3 - .eslintrc.json | 3 + .gitattributes | 2 +- .../CODE_OF_CONDUCT.md | 2 +- .github/FUNDING.yml | 2 +- .github/ISSUE_TEMPLATE/bug-report.md | 38 - .github/ISSUE_TEMPLATE/feature_request.md | 20 - .github/assets/readme-logo.png | Bin 0 -> 27533 bytes .github/dependabot.yml | 25 + .github/workflows/dependabot-automerge.yml | 34 + .gitignore | 136 +- .husky/pre-commit | 4 + .lintstagedrc.js | 13 + .lintstagedrc.json | 3 - .markdownlint.config | 13 + .node-version | 1 + .pnpmignore | 16 - .prettierignore | 7 +- .prettierrc.js | 16 - .prettierrc.json | 15 + README.md | 14 + app/App.tsx | 29 + app/blog/[slug]/page.tsx | 108 + app/blog/layout.tsx | 9 + app/blog/page.tsx | 105 + app/changelog/[slug]/page.tsx | 96 + app/changelog/layout.tsx | 9 + app/changelog/page.tsx | 66 + app/docs/[[...slug]]/layout.tsx | 14 - app/docs/[[...slug]]/page.tsx | 78 +- app/docs/layout.tsx | 14 + app/error.tsx | 65 +- app/favicon.ico | Bin 15086 -> 4286 bytes app/globals.css | 170 - app/layout.tsx | 85 +- app/not-found.tsx | 28 +- app/page.tsx | 98 +- components.json | 32 +- components/anchor.tsx | 58 +- components/atoms/external-arrow.tsx | 32 + components/atoms/preloader.tsx | 7 + components/atoms/router-progress.tsx | 23 + components/atoms/scroll-to-top-button.tsx | 57 + components/atoms/scroll-to-top-icon.tsx | 37 + components/atoms/typography.tsx | 9 + components/changelog/download-comp.tsx | 17 + components/changelog/releases.tsx | 50 + components/{ => contexts}/theme-provider.tsx | 2 +- components/copy.tsx | 28 - components/docs-breadcrumb.tsx | 78 +- components/docs-menu.tsx | 24 + components/footer.tsx | 85 +- components/leftbar.tsx | 125 +- components/logo.tsx | 30 - components/markdown/copy.tsx | 33 + components/markdown/image.tsx | 25 + components/markdown/link.tsx | 14 + components/markdown/note.tsx | 35 + components/markdown/outlet.tsx | 29 + components/markdown/pre.tsx | 19 + components/markdown/stepper.tsx | 41 + components/navbar.tsx | 216 +- components/note.tsx | 35 - components/pagination.tsx | 70 +- components/pre.tsx | 19 - components/search.tsx | 206 +- components/sublink.tsx | 96 + components/theme-toggle.tsx | 55 +- components/toc-observer.tsx | 110 +- components/toc.tsx | 32 +- components/ui/accordion.tsx | 92 +- components/ui/avatar.tsx | 50 + components/ui/breadcrumb.tsx | 182 +- components/ui/button.tsx | 82 +- components/ui/collapsible.tsx | 11 + components/ui/dialog.tsx | 154 +- components/ui/dropdown-menu.tsx | 320 +- components/ui/input.tsx | 36 +- components/ui/scroll-area.tsx | 78 +- components/ui/sheet.tsx | 167 +- components/ui/stepper.tsx | 39 - components/ui/table.tsx | 180 +- components/ui/tabs.tsx | 60 +- contents/blogs/file-rec.mdx | 170 + contents/blogs/next-react.mdx | 121 + contents/docs/about/acknowledgments.mdx | 4 - contents/docs/about/contact.mdx | 4 - contents/docs/about/license.mdx | 4 - contents/docs/faq/deinstallation.mdx | 5 - contents/docs/faq/qna.mdx | 5 - contents/docs/getting-started/changelog.mdx | 10 - .../components/code-block/index.mdx | 41 + .../components/custom/index.mdx | 38 + .../components/image-link/index.mdx | 57 + .../docs/getting-started/components/index.mdx | 9 + .../getting-started/components/note/index.mdx | 44 + .../components/stepper/index.mdx | 38 + .../getting-started/components/tabs/index.mdx | 68 + .../docs/getting-started/customize/index.mdx | 93 + .../docs/getting-started/installation.mdx | 79 - .../getting-started/installation/index.mdx | 68 + .../docs/getting-started/introduction.mdx | 102 - .../getting-started/introduction/index.mdx | 58 + .../getting-started/project-structure.mdx | 71 - .../project-structure/index.mdx | 95 + .../getting-started/quick-start-guide.mdx | 71 - .../quick-start-guide/index.mdx | 80 + .../docs/getting-started/themes/index.mdx | 484 ++ contents/docs/getting-started/updates.mdx | 5 - importsort.config.js | 36 +- lib/markdown.ts | 272 +- lib/routes-config.ts | 90 +- lib/utils.ts | 182 +- markdownlint.yaml | 12 - next-env.d.ts | 6 + next.config.mjs | 64 +- package.json | 133 +- pages/api/all-releases.ts | 73 + pages/api/config.ts | 34 + pages/api/latest-release.ts | 51 + pages/api/types.ts | 65 + pnpm-lock.yaml | 5072 ++++++----------- postcss.config.js => postcss.config.cjs | 0 public/nebula.png | Bin 0 -> 149560 bytes public/ocean.png | Bin 0 -> 149992 bytes public/public-og.png | Bin 0 -> 3454883 bytes public/typography/logo.svg | 12 - styles/globals.css | 137 + styles/nprogress.css | 16 + styles/syntax.css | 70 + tailwind.config.ts | 156 +- tsconfig.build.json | 4 - tsconfig.json | 42 +- utils/disableContextMenu.ts | 19 - 136 files changed, 7009 insertions(+), 5935 deletions(-) create mode 100644 .env.example delete mode 100644 .eslintrc.js create mode 100644 .eslintrc.json rename CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md (97%) delete mode 100644 .github/ISSUE_TEMPLATE/bug-report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/assets/readme-logo.png create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/dependabot-automerge.yml create mode 100644 .husky/pre-commit create mode 100644 .lintstagedrc.js delete mode 100644 .lintstagedrc.json create mode 100644 .markdownlint.config create mode 100644 .node-version delete mode 100644 .pnpmignore delete mode 100644 .prettierrc.js create mode 100644 .prettierrc.json create mode 100644 app/App.tsx create mode 100644 app/blog/[slug]/page.tsx create mode 100644 app/blog/layout.tsx create mode 100644 app/blog/page.tsx create mode 100644 app/changelog/[slug]/page.tsx create mode 100644 app/changelog/layout.tsx create mode 100644 app/changelog/page.tsx delete mode 100644 app/docs/[[...slug]]/layout.tsx create mode 100644 app/docs/layout.tsx delete mode 100644 app/globals.css create mode 100644 components/atoms/external-arrow.tsx create mode 100644 components/atoms/preloader.tsx create mode 100644 components/atoms/router-progress.tsx create mode 100644 components/atoms/scroll-to-top-button.tsx create mode 100644 components/atoms/scroll-to-top-icon.tsx create mode 100644 components/atoms/typography.tsx create mode 100644 components/changelog/download-comp.tsx create mode 100644 components/changelog/releases.tsx rename components/{ => contexts}/theme-provider.tsx (78%) delete mode 100644 components/copy.tsx create mode 100644 components/docs-menu.tsx delete mode 100644 components/logo.tsx create mode 100644 components/markdown/copy.tsx create mode 100644 components/markdown/image.tsx create mode 100644 components/markdown/link.tsx create mode 100644 components/markdown/note.tsx create mode 100644 components/markdown/outlet.tsx create mode 100644 components/markdown/pre.tsx create mode 100644 components/markdown/stepper.tsx delete mode 100644 components/note.tsx delete mode 100644 components/pre.tsx create mode 100644 components/sublink.tsx create mode 100644 components/ui/avatar.tsx create mode 100644 components/ui/collapsible.tsx delete mode 100644 components/ui/stepper.tsx create mode 100644 contents/blogs/file-rec.mdx create mode 100644 contents/blogs/next-react.mdx delete mode 100644 contents/docs/about/acknowledgments.mdx delete mode 100644 contents/docs/about/contact.mdx delete mode 100644 contents/docs/about/license.mdx delete mode 100644 contents/docs/faq/deinstallation.mdx delete mode 100644 contents/docs/faq/qna.mdx delete mode 100644 contents/docs/getting-started/changelog.mdx create mode 100644 contents/docs/getting-started/components/code-block/index.mdx create mode 100644 contents/docs/getting-started/components/custom/index.mdx create mode 100644 contents/docs/getting-started/components/image-link/index.mdx create mode 100644 contents/docs/getting-started/components/index.mdx create mode 100644 contents/docs/getting-started/components/note/index.mdx create mode 100644 contents/docs/getting-started/components/stepper/index.mdx create mode 100644 contents/docs/getting-started/components/tabs/index.mdx create mode 100644 contents/docs/getting-started/customize/index.mdx delete mode 100644 contents/docs/getting-started/installation.mdx create mode 100644 contents/docs/getting-started/installation/index.mdx delete mode 100644 contents/docs/getting-started/introduction.mdx create mode 100644 contents/docs/getting-started/introduction/index.mdx delete mode 100644 contents/docs/getting-started/project-structure.mdx create mode 100644 contents/docs/getting-started/project-structure/index.mdx delete mode 100644 contents/docs/getting-started/quick-start-guide.mdx create mode 100644 contents/docs/getting-started/quick-start-guide/index.mdx create mode 100644 contents/docs/getting-started/themes/index.mdx delete mode 100644 contents/docs/getting-started/updates.mdx delete mode 100644 markdownlint.yaml create mode 100644 next-env.d.ts create mode 100644 pages/api/all-releases.ts create mode 100644 pages/api/config.ts create mode 100644 pages/api/latest-release.ts create mode 100644 pages/api/types.ts rename postcss.config.js => postcss.config.cjs (100%) create mode 100644 public/nebula.png create mode 100644 public/ocean.png create mode 100644 public/public-og.png delete mode 100644 public/typography/logo.svg create mode 100644 styles/globals.css create mode 100644 styles/nprogress.css create mode 100644 styles/syntax.css delete mode 100644 tsconfig.build.json delete mode 100644 utils/disableContextMenu.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5470ef2 --- /dev/null +++ b/.env.example @@ -0,0 +1,46 @@ +# GitHub Personal Access Token +# This token is required to authenticate requests to GitHub’s API for fetching +# repository releases and assets without hitting rate limits. +# +# Purpose: +# The GitHub API limits the number of requests per hour for unauthorized +# requests. By including a GitHub Personal Access Token, you increase the rate +# limit available for your application, allowing it to function without interruptions. +# +# Without this token, you may experience 403 (Forbidden) errors if the app +# exceeds the API’s request limit. GitHub tokens also ensure that your application +# has authorized access to private repositories, if needed. +# +# How to get your GitHub Personal Access Token: +# +# 1. Sign in to GitHub: Go to https://github.com/ and login. +# +# 2. Access Settings: +# - In the top right corner of any GitHub page, click your profile picture. +# - Click on **Settings** in the dropdown menu. +# +# 3. Open Developer Settings: +# - Scroll down and click **Developer settings** in the left sidebar. +# +# 4. Generate Token: +# - Select **Personal access tokens** > **Tokens (classic)** from the left sidebar. +# - Click on **Generate new token** > **Generate new token (classic)**. +# +# 5. Configure Token Permissions: +# - In the **Note** field, add a description (e.g., "Access for My Project"). +# - Set the **Expiration** duration, or leave it as "No expiration" if you want it to last indefinitely. +# - Under **Select scopes**, choose at least: +# - `repo` - Grants read and write access to repositories, which allows access to private repositories if needed. +# +# 6. Generate and Copy Token: +# - Click **Generate token** at the bottom of the page. +# - GitHub will show your token only once. Copy it immediately and store it in a safe place. +# +# 7. Add Token Here: +# - Place the token below as the value for `GITHUB_TOKEN`. +# +# GitHub Documentation: +# - More details on personal access tokens: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token +# - GitHub API rate limits: https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + +GITHUB_TOKEN=your_personal_access_token_here diff --git a/.eslintignore b/.eslintignore index 4b7cd47..506e574 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,6 +5,10 @@ node_modules/ build/ dist/ .out/ +**/build/**/*.js +**/.next/**/*.js +**/build/**/*.ts +**/.next/**/*.ts # Ignore all configuration files in the root directory # This includes ESLint, Prettier, Babel, Stylelint, and other config files @@ -25,11 +29,12 @@ dist/ # Ignore lock files package-lock.json +pnpm-lock.yaml yarn.lock # Ignore log files npm-debug.log -yarn-error.log +pnpm-error.log pnpm-debug.log # Ignore coverage directory used by testing tools diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 44acdbe..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: "next/core-web-vitals", -}; diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/.gitattributes b/.gitattributes index 605115a..4fae9ab 100644 --- a/.gitattributes +++ b/.gitattributes @@ -200,4 +200,4 @@ Procfile text # DISABLE SHRINKWRAP MERGING AS RESULTS MAY BE INVALID. npm-shrinkwrap.json merge=binary shrinkwrap.yaml merge=binary -yarn.lock merge=binary +pnpm.lock merge=binary diff --git a/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md similarity index 97% rename from CODE_OF_CONDUCT.md rename to .github/CODE_OF_CONDUCT.md index 5445e1d..2b666a4 100644 --- a/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at codeilluminators@gmail.com. All +reported by contacting the project team at serstor15@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 8633e01..8b16fdb 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: [Storik4Pro, lumenpearson, ValdikSS] +github: [Storik4pro, lumenpearson, ValdikSS, bol-van, xvzc, hufrea] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index 64e5669..0000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve GoodbyeDPI UI documentation -title: "\U0001F47E BUG" -labels: bug -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 189feb1..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: "✨ IMPROVE" -labels: documentation, enhancement -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/assets/readme-logo.png b/.github/assets/readme-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..84762ed941cb5d9e9179372597825fbb5da29992 GIT binary patch literal 27533 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 + `next lint --fix --file ${filenames + .map(f => path.relative(process.cwd(), f)) + .join(' --file ')}`; + +module.exports = { + '**/**/*.{js,jsx,ts,tsx}': [buildEslintCommand], + '*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}': [ + 'biome check --apply --no-errors-on-unmatched', // Format, sort imports, lint, and apply safe fixes + ], +}; diff --git a/.lintstagedrc.json b/.lintstagedrc.json deleted file mode 100644 index ceaa164..0000000 --- a/.lintstagedrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "*": "pnpm run clean:write" -} diff --git a/.markdownlint.config b/.markdownlint.config new file mode 100644 index 0000000..5c6eeb7 --- /dev/null +++ b/.markdownlint.config @@ -0,0 +1,13 @@ +{ + "default": true, + "line-length": false, + "no-trailing-punctuation": + "punctuation": '.,;:' + "list-marker-space": false + "no-multiple-blanks": false + "no-hard-tabs": false + "MD001": false + "MD013": false + "MD024": false + "MD033": false +} diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +20 diff --git a/.pnpmignore b/.pnpmignore deleted file mode 100644 index 4abbfa9..0000000 --- a/.pnpmignore +++ /dev/null @@ -1,16 +0,0 @@ -# Ignore temporary files and directories -.tmp - -# Ignore production directories -.next -prod -dist - -# Ignore the directory with installed dependencies -node_modules - -# Ignore the React configuration files -.env - -# Ignore the log files -*.log diff --git a/.prettierignore b/.prettierignore index 10b95e3..cf39fae 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,10 @@ node_modules .husky -/coverage +/dist/ +/node_modules/ +/stories/ .prettierignore .stylelintignore .editorconfig .eslintignore -.pnpmignore -.pnpmrc + diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index 4225769..0000000 --- a/.prettierrc.js +++ /dev/null @@ -1,16 +0,0 @@ -// Some settings are automatically inherited from .editorconfig -module.exports = { - overrides: [ - { - files: ".editorconfig", - options: { parser: "yaml" }, - }, - ], - useTabs: true, - printWidth: 80, - tabWidth: 2, - singleQuote: false, - jsxSingleQuote: false, - trailingComma: "all", - semi: true, -}; diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..92fd5e5 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,15 @@ +{ + "arrowParens": "avoid", + "bracketSpacing": true, + "endOfLine": "lf", + "jsxSingleQuote": false, + "printWidth": 80, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": true +} diff --git a/README.md b/README.md index e69de29..41c3284 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,14 @@ +

+ GoodbyeDPI +

+ +

GoodbyeDPI UI / Docs

+ +

+ + Stargazers + + + + Releases +

diff --git a/app/App.tsx b/app/App.tsx new file mode 100644 index 0000000..688b87d --- /dev/null +++ b/app/App.tsx @@ -0,0 +1,29 @@ +import { ThemeProvider } from "@/components/contexts/theme-provider"; +import { Footer } from "@/components/footer"; +import { Navbar } from "@/components/navbar"; +import { Analytics } from "@vercel/analytics/react"; +import { SpeedInsights } from "@vercel/speed-insights/next"; +import { PropsWithChildren } from "react"; + +export const App = (props: PropsWithChildren) => { + return ( + <> + + +
+ {props.children} +
+