diff --git a/.dumirc.ts b/.dumirc.ts index 229958b..bb214c5 100644 --- a/.dumirc.ts +++ b/.dumirc.ts @@ -1,12 +1,18 @@ // more config: https://d.umijs.org/config import { defineConfig } from 'dumi'; +const basePath = process.env.GH_PAGES ? '/progress/' : '/'; +const publicPath = basePath; + export default defineConfig({ + outputPath: 'docs-dist', favicons: ['https://avatars0.githubusercontent.com/u/9441414?s=200&v=4'], themeConfig: { name: '@rc-component/progress', logo: 'https://avatars0.githubusercontent.com/u/9441414?s=200&v=4', }, + base: basePath, + publicPath, exportStatic: {}, styles: [ ` diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 33b1999..758659a 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,15 +1,2 @@ -# These are supported funding model platforms - -github: ant-design # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: ant-design # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -polar: # Replace with a single Polar username -buy_me_a_coffee: # Replace with a single Buy Me a Coffee username -thanks_dev: # Replace with a single thanks.dev username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] +github: ant-design +open_collective: ant-design diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7c9e2a4..3b730ef 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,20 +1,19 @@ version: 2 updates: -- package-ecosystem: npm - directory: "/" - schedule: - interval: daily - time: "21:00" - open-pull-requests-limit: 10 - ignore: - - dependency-name: "@types/react-dom" - versions: - - 17.0.0 - - 17.0.1 - - 17.0.2 - - dependency-name: "@types/react" - versions: - - 17.0.0 - - 17.0.1 - - 17.0.2 - - 17.0.3 + - package-ecosystem: npm + directory: '/' + schedule: + interval: weekly + day: monday + time: '21:00' + timezone: Asia/Shanghai + open-pull-requests-limit: 10 + + - package-ecosystem: github-actions + directory: '/' + schedule: + interval: weekly + day: monday + time: '21:00' + timezone: Asia/Shanghai + open-pull-requests-limit: 10 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..1c7e7bf --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,43 @@ +name: 'CodeQL' + +on: + push: + branches: ['master'] + pull_request: + branches: ['master'] + schedule: + - cron: '13 8 * * 0' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [javascript] + + steps: + - name: Checkout + uses: actions/checkout@v7 + with: + persist-credentials: false + + - name: Initialize CodeQL + uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e + with: + languages: ${{ matrix.language }} + queries: +security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e + with: + category: '/language:${{ matrix.language }}' diff --git a/.github/workflows/react-component-ci.yml b/.github/workflows/react-component-ci.yml index c2db94c..e2b301b 100644 --- a/.github/workflows/react-component-ci.yml +++ b/.github/workflows/react-component-ci.yml @@ -1,7 +1,10 @@ name: ✅ test on: [push, pull_request] +permissions: + contents: read jobs: test: - uses: react-component/rc-test/.github/workflows/test.yml@main - secrets: inherit + uses: react-component/rc-test/.github/workflows/test-utoo.yml@main + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/react-doctor.yml b/.github/workflows/react-doctor.yml new file mode 100644 index 0000000..097eb88 --- /dev/null +++ b/.github/workflows/react-doctor.yml @@ -0,0 +1,27 @@ +name: React Doctor + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + push: + branches: [master] + +permissions: + contents: read + pull-requests: write + issues: write + statuses: write + +concurrency: + group: react-doctor-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + react-doctor: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + persist-credentials: false + - uses: millionco/react-doctor@0b4f4f4bd248a154e64eb508a48347f71154b3f3 diff --git a/.github/workflows/surge-preview.yml b/.github/workflows/surge-preview.yml new file mode 100644 index 0000000..4c2f17e --- /dev/null +++ b/.github/workflows/surge-preview.yml @@ -0,0 +1,54 @@ +name: Surge Preview + +on: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: write + checks: write + +jobs: + preview: + runs-on: ubuntu-latest + concurrency: + group: surge-preview-${{ github.event.pull_request.number }} + cancel-in-progress: true + env: + PREVIEW: true + steps: + - uses: actions/checkout@v7 + with: + persist-credentials: false + - name: Check Surge token + id: surge-token + env: + SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }} + run: | + if [ -n "$SURGE_TOKEN" ]; then + echo "enabled=true" >> "$GITHUB_OUTPUT" + else + echo "enabled=false" >> "$GITHUB_OUTPUT" + fi + - name: Build preview + if: ${{ steps.surge-token.outputs.enabled == 'true' }} + run: | + npm install + npm run build + - uses: afc163/surge-preview@bf90a5a86111f6311ca42f0a5a0f80fb0fb03cec + if: ${{ steps.surge-token.outputs.enabled == 'true' }} + env: + SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }} + with: + surge_token: ${{ env.SURGE_TOKEN }} + github_token: ${{ secrets.GITHUB_TOKEN }} + dist: docs-dist + failOnError: false + setCommitStatus: false + - name: Skip Surge preview + if: ${{ steps.surge-token.outputs.enabled != 'true' }} + run: echo "SURGE_TOKEN is not configured; skip Surge preview." diff --git a/.gitignore b/.gitignore index 005f482..52250a8 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ Thumbs.db node_modules .cache dist +docs-dist assets/**/*.css build lib @@ -38,5 +39,6 @@ pnpm-lock.yaml .dumi/tmp-test .dumi/tmp-production .env.local +.vercel -bun.lockb \ No newline at end of file +bun.lockb diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..2312dc5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..c466d87 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,14 @@ +node_modules +coverage +docs-dist +dist +es +lib +.dumi/tmp +.dumi/tmp-production +.vercel +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lockb +*.log diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bd0a1f7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019-present react-component + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 4b3a400..b846f83 100644 --- a/README.md +++ b/README.md @@ -1,163 +1,115 @@ -# @rc-component/progress +
+

@rc-component/progress

+

Ant Design Part of the Ant Design ecosystem.

+

📊 Lightweight React line and circle progress indicators with SVG rendering.

-Progress Bar. +

+ NPM version + npm downloads + build status + Codecov + bundle size + dumi +

+
-[![NPM version][npm-image]][npm-url] [![dumi](https://img.shields.io/badge/docs%20by-dumi-blue?style=flat-square)](https://github.com/umijs/dumi) [![build status][github-actions-image]][github-actions-url] [![Test coverage][coveralls-image]][coveralls-url] [![npm download][download-image]][download-url] [![bundle size][bundlephobia-image]][bundlephobia-url] +

English | 简体中文

-[npm-image]: http://img.shields.io/npm/v/@rc-component/progress.svg?style=flat-square -[npm-url]: http://npmjs.org/package/@rc-component/progress -[github-actions-image]: https://github.com/react-component/progress/workflows/CI/badge.svg -[github-actions-url]: https://github.com/react-component/progress/actions -[circleci-image]: https://img.shields.io/circleci/react-component/progress/master?style=flat-square -[circleci-url]: https://circleci.com/gh/react-component/progress -[coveralls-image]: https://img.shields.io/coveralls/react-component/progress.svg?style=flat-square -[coveralls-url]: https://coveralls.io/r/react-component/progress?branch=master -[david-url]: https://david-dm.org/react-component/progress -[david-image]: https://david-dm.org/react-component/progress/status.svg?style=flat-square -[david-dev-url]: https://david-dm.org/react-component/progress?type=dev -[david-dev-image]: https://david-dm.org/react-component/progress/dev-status.svg?style=flat-square -[download-image]: https://img.shields.io/npm/dm/@rc-component/progress.svg?style=flat-square -[download-url]: https://npmjs.org/package/@rc-component/progress -[bundlephobia-url]: https://bundlephobia.com/result?p=@rc-component/progress -[bundlephobia-image]: https://badgen.net/bundlephobia/minzip/@rc-component/progress -## Example +## Highlights -https://progress.react-component.vercel.app/ - -## Screenshots - - - -## Browsers - -* support IE9+, Chrome, Firefox, Safari +- `Line` and `Circle` progress components rendered with SVG. +- Single value, segmented value, gradient color, and indeterminate loading states. +- Semantic `classNames` and `styles` slots for root, rail, and track customization. +- TypeScript definitions for the shared progress props. ## Install -[![@rc-component/progress](https://nodei.co/npm/@rc-component/progress.png)](https://npmjs.org/package/@rc-component/progress) +```bash +npm install @rc-component/progress +``` ## Usage -```js -import { Line, Circle } from '@rc-component/progress'; - +```tsx | pure +import { Circle, Line } from '@rc-component/progress'; export default () => ( <> - - + + ); ``` -## Compatibility - -| [IE / Edge](http://godban.github.io/browsers-support-badges/)
IE / Edge | [Firefox](http://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](http://godban.github.io/browsers-support-badges/)
Chrome | [Safari](http://godban.github.io/browsers-support-badges/)
Safari | [Electron](http://godban.github.io/browsers-support-badges/)
Electron | -| --- | --- | --- | --- | --- | -| IE11, Edge | last 2 versions | last 2 versions | last 2 versions | last 2 versions | +```tsx | pure +import { Circle } from '@rc-component/progress'; +export default () => ( + +); +``` -## API +## Examples -### props - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
nametypedefaultdescription
strokeWidthNumber1Width of the stroke. Unit is percentage of SVG canvas size.
strokeColorString#2db7f5Stroke color.
railWidthNumber1Width of the rail stroke. Unit is percentage of SVG canvas size. Rail is always centered relative to actual progress path. If railWidth is not defined, it is the same as strokeWidth.
railColorString#D9D9D9Color for lighter rail stroke underneath the actual progress path.
strokeLinecapString'round'The shape to be used at the end of the progress bar: can be `butt`, `square` or `round`.
prefixClsStringrc-progressprefix className for component
classNameStringcustomized className
styleObjectstyle object will be added to svg element
percentNumber | Number[]0the percent of the progress
gapDegreeNumber0the gap degree of half circle, 0 - 360
gapPositionStringtopthe gap position: can be `top`, `bottom`, `left`, or `right`.
loadingBooleanfalseIf it is true the indeterminate progress will be enabled.
- -## Installation +Run the local dumi site: +```bash +npm install +npm start ``` -npm install --save @rc-component/progress -``` + +Then open `http://localhost:8000`. + +## API + +`Line` and `Circle` share the same base props. + +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| `className` | string | - | Additional class name for the root node. | +| `classNames` | Partial> | - | Semantic class names for internal slots. | +| `gapDegree` | number | - | Gap degree for circle progress. | +| `gapPosition` | `'top'` \| `'right'` \| `'bottom'` \| `'left'` | `'bottom'` | Gap position for circle progress. | +| `id` | string | - | Root element id. | +| `loading` | boolean | false | Render an indeterminate loading animation. | +| `onClick` | React.MouseEventHandler | - | Click handler for the root SVG. | +| `percent` | number \| number[] | 0 | Progress percent. Arrays render multiple tracks. | +| `prefixCls` | string | `'rc-progress'` | Prefix class name. | +| `railColor` | string | `'#D9D9D9'` | Rail color. | +| `railWidth` | number | 1 | Rail stroke width. | +| `steps` | number \| { count: number; gap: number } | - | Render progress as discrete steps. | +| `strokeColor` | string \| Record \| Array> | `'#2db7f5'` | Track color, gradient object, or per-track colors. | +| `strokeLinecap` | `'round'` \| `'butt'` \| `'square'` | `'round'` | Stroke line cap. | +| `strokeWidth` | number | 1 | Track stroke width. | +| `style` | React.CSSProperties | - | Root style. | +| `styles` | Partial> | - | Semantic styles for internal slots. | +| `transition` | string | - | CSS transition for track updates. | ## Development -``` +```bash npm install npm start +npm test +npm run tsc +npm run compile +npm run build +``` + +The dumi site runs at `http://localhost:8000` by default. + +## Release + +```bash +npm run prepublishOnly ``` +The release flow is handled by `@rc-component/np` through the `rc-np` command after the package build. + ## License -@rc-component/progress is released under the MIT license. +@rc-component/progress is released under the [MIT](./LICENSE) license. diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..e7ee689 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,114 @@ +
+

@rc-component/progress

+

Ant Design Ant Design 生态的一部分。

+

📊 React 进度条组件,支持线型、圆形和自定义进度展示。

+ +

+ NPM version + npm downloads + build status + Codecov + bundle size + dumi +

+
+ +

English | 简体中文

+ +## 特性 + +- `Line` 和 `Circle` 使用 SVG 渲染的进度组件。 +- 单值、分段值、渐变颜色和不确定的加载状态。 +- 用于根、导轨和轨道定制的语义 `classNames` 和 `styles` 插槽。 +- 为共享进度属性提供 TypeScript 类型定义。 + +## 安装 + +```bash +npm install @rc-component/progress +``` + +## 使用 + +```tsx | pure +import { Circle, Line } from '@rc-component/progress'; +export default () => ( + <> + + + +); +``` + +```tsx | pure +import { Circle } from '@rc-component/progress'; +export default () => ( + +); +``` + +## 示例 + +运行本地 dumi 站点: + +```bash +npm install +npm start +``` + +然后打开 `http://localhost:8000`。 + +## API + +`Line` 和 `Circle` 共享相同的基础属性。 + +| 名称 | 类型 | 默认值 | 说明 | +| --- | --- | --- | --- | +| `className` | string | - | 根节点的附加 className。 | +| `classNames` | Partial> | - | 内部插槽的语义化 className。 | +| `gapDegree` | number | - | 环形进度缺口角度。 | +| `gapPosition` | `'top'` \| `'right'` \| `'bottom'` \| `'left'` | `'bottom'` | 循环进度的间隙位置。 | +| `id` | string | - | 根元素 ID。 | +| `loading` | boolean | false | 渲染不确定的加载动画。 | +| `onClick` | React.MouseEventHandler | - | 单击根 SVG 的处理程序。 | +| `percent` | number \| number[] | 0 | 进度百分比。数组会渲染多条轨道。 | +| `prefixCls` | string | `'rc-progress'` | 前缀 className。 | +| `railColor` | string | `'#D9D9D9'` | 导轨颜色。 | +| `railWidth` | number | 1 | 导轨行程宽度。 | +| `steps` | number \| { count: number; gap: number } | - | 以离散步骤渲染进度。 | +| `strokeColor` | string \| Record \| Array> | `'#2db7f5'` | 轨道颜色、渐变对象或每条轨道的颜色。 | +| `strokeLinecap` | `'round'` \| `'butt'` \| `'square'` | `'round'` | 描边端点样式。 | +| `strokeWidth` | number | 1 | 轨道描边宽度。 | +| `style` | React.CSSProperties | - | 根样式。 | +| `styles` | Partial> | - | 内部插槽的语义化样式。 | +| `transition` | string | - | 用于跟踪更新的 CSS 过渡。 | + +## 本地开发 + +```bash +npm install +npm start +npm test +npm run tsc +npm run compile +npm run build +``` + +dumi 站点默认运行在 `http://localhost:8000`。 + +## 发布 + +```bash +npm run prepublishOnly +``` + +包构建完成后,发布流程由 `@rc-component/np` 通过 `rc-np` 命令处理。 + +## 许可证 + +@rc-component/progress 基于 [MIT](./LICENSE) 许可证发布。 diff --git a/now.json b/now.json deleted file mode 100644 index 093e120..0000000 --- a/now.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "name": "@rc-component/progress", - "builds": [ - { - "src": "package.json", - "use": "@now/static-build", - "config": { "distDir": "dist" } - } - ] -} diff --git a/package.json b/package.json index 9cd95de..7fb8689 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ "react-progress", "progress" ], - "homepage": "http://github.com/react-component/progress", + "homepage": "https://react-component.github.io/progress", "repository": { "type": "git", - "url": "git@github.com:react-component/progress.git" + "url": "https://github.com/react-component/progress.git" }, "bugs": { - "url": "http://github.com/react-component/progress/issues" + "url": "https://github.com/react-component/progress/issues" }, "license": "MIT", "main": "./lib/index", @@ -25,19 +25,19 @@ ], "scripts": { "start": "dumi dev", + "build": "npm run docs:build", "docs:build": "dumi build", - "docs:deploy": "gh-pages -d dist", - "deploy": "npm run docs:build && npm run docs:deploy", + "docs:deploy": "gh-pages -d docs-dist", + "deploy": "npm run gh-pages", "compile": "father build", - "prepare": "dumi setup", - "gh-pages": "npm run now-build && father doc deploy", + "prepare": "husky && dumi setup", + "gh-pages": "cross-env GH_PAGES=1 npm run docs:build && npm run docs:deploy", "prepublishOnly": "npm run compile && rc-np", "lint": "eslint src/ --ext .ts,.tsx,.jsx,.js", - "prettier": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"", + "prettier": "prettier --write --ignore-unknown .", "test": "rc-test", "tsc": "tsc --noEmit", - "coverage": "father test --coverage", - "now-build": "npm run docs:build" + "coverage": "father test --coverage" }, "dependencies": { "@rc-component/util": "^1.11.1", @@ -46,27 +46,38 @@ "devDependencies": { "@rc-component/father-plugin": "^2.2.0", "@rc-component/np": "^1.0.4", - "@testing-library/react": "^13.0.0", - "@types/jest": "^29.4.0", + "@testing-library/react": "^15.0.7", + "@types/jest": "^29.5.14", "@types/keyv": "3.1.4", - "@types/node": "^24.5.2", - "@types/react": "^18.0.9", - "@types/react-dom": "^18.0.3", - "@umijs/fabric": "^3.0.0", - "dumi": "^2.0.0", - "eslint": "^8.57.0", - "eslint-plugin-jest": "^27.6.0", - "eslint-plugin-unicorn": "^50.0.1", - "father": "^4.0.0", - "glob": "^8.0.1", - "prettier": "^3.1.1", - "rc-test": "^7.0.15", - "react": "^18.0.0", - "react-dom": "^18.0.0", - "typescript": "^5.0.0" + "@types/node": "^26.0.1", + "@types/react": "^18.3.31", + "@types/react-dom": "^18.3.7", + "@umijs/fabric": "^4.0.1", + "cross-env": "^10.1.0", + "dumi": "^2.4.35", + "eslint": "^8.57.1", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-unicorn": "^56.0.1", + "father": "^4.6.23", + "gh-pages": "^6.3.0", + "glob": "^13.0.6", + "prettier": "^3.9.0", + "rc-test": "^7.1.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "typescript": "^5.9.3", + "husky": "^9.1.7", + "lint-staged": "^16.4.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" - } + }, + "publishConfig": { + "access": "public" + }, + "lint-staged": { + "*": "prettier --write --ignore-unknown" + }, + "types": "./es/index.d.ts" } diff --git a/tsconfig.json b/tsconfig.json index a2ff56f..0a8f3a8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,9 +8,31 @@ "skipLibCheck": true, "esModuleInterop": true, "paths": { - "@/*": ["src/*"], - "@@/*": [".dumi/tmp/*"], - "@rc-component/progress": ["src/index.ts"] - } - } -} \ No newline at end of file + "@/*": [ + "src/*" + ], + "@@/*": [ + ".dumi/tmp/*" + ], + "@rc-component/progress": [ + "src/index.ts" + ] + }, + "ignoreDeprecations": "5.0" + }, + "include": [ + ".fatherrc.ts", + ".dumirc.ts", + "src", + "docs", + "tests" + ], + "exclude": [ + "node_modules", + "lib", + "es", + "dist", + "docs-dist", + ".dumi" + ] +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..5f9139e --- /dev/null +++ b/vercel.json @@ -0,0 +1,6 @@ +{ + "framework": "umijs", + "installCommand": "npm install", + "buildCommand": "npm run build", + "outputDirectory": "docs-dist" +}