├── .github └── workflows │ └── main.yml ├── .gitignore ├── .prettierrc ├── .travis.yml ├── LICENSE ├── README.md ├── assets ├── conical-polar.gif ├── countdown-circle.gif └── multiple-gauges.gif ├── example ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── src │ ├── conical-gradient │ │ ├── conical-gradient.scss │ │ ├── conical-gradient.ts │ │ └── index.html │ ├── countdown-gauge │ │ ├── countdown-gauge.scss │ │ ├── countdown-gauge.ts │ │ └── index.html │ ├── favicon.svg │ ├── index.css │ ├── index.html │ ├── logo.svg │ ├── main.tsx │ ├── multiple-gauges │ │ ├── index.html │ │ ├── multiple-gauge.scss │ │ └── multiple-gauge.ts │ ├── progress-with-shadow-chart │ │ ├── index.html │ │ ├── index.tsx │ │ └── progress-with-shadow-chart.tsx │ └── vite-env.d.ts ├── tsconfig.json └── vite.config.ts ├── jest.config.js ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── gauge.test.ts ├── gauge.ts ├── index.ts ├── math.test.ts ├── math.ts └── request-timeout.ts ├── tsconfig.json └── tslint.json /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: tests 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | node-version: [16.x] 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v1 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | 25 | - name: Build 26 | run: npm i 27 | 28 | - name: TypeScript 29 | run: npm run typecheck 30 | 31 | - name: Test 32 | run: npm test 33 | 34 | - name: Check size 35 | run: npm run build && npm run bundlesize 36 | 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib 3 | .idea 4 | dist 5 | .cache 6 | examples/node_modules 7 | examples/.cache 8 | examples/dist 9 | types 10 | example/node_modules -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "printWidth": 90 4 | } 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - '10' 5 | 6 | before_script: 7 | - npm install 8 | - cd examples && npm install && cd .. 9 | 10 | script: 11 | - npm run lint 12 | - npm run typecheck 13 | - npm run test 14 | - npm run build && npm run bundlesize 15 | - cd examples && npm run test 16 | 17 | notifications: 18 | email: false 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Egor Gorbachev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## gauge-chart-js [![NPM version](https://badge.fury.io/js/gauge-chart-js.svg)](https://npmjs.org/package/gauge-chart-js) [![Build Status](https://travis-ci.org/kubk/gauge-chart-js.svg?branch=master)](https://travis-ci.org/kubk/gauge-chart-js) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) 2 | 3 | A tiny (<2kb gzipped) library for rendering gauge charts. Supports conical/polar gradients, animation timing functions, custom labels/tooltips. No external dependencies required. 4 | 5 | ### Examples 6 | | [Conical (Polar) gradient](example/src/conical-gradient) | [Multiple gauges + labels](example/src/multiple-gauges) | [Countdown circle](example/src/countdown-gauge) | 7 | | ------------- | -------------| -------------| 8 | | | | | 9 | 10 | These are GIFs, therefore FPS is low. 11 | 12 | ### Installation 13 | `npm install gauge-chart-js` 14 | 15 | ### Basic usage 16 | ```typescript 17 | import { cubicBezier, Gauge } from 'gauge-chart-js'; 18 | 19 | const gauge = new Gauge({ 20 | container: document.querySelector('.root'), 21 | color: '#0f0' 22 | }); 23 | 24 | gauge.setValue(50); 25 | 26 | ``` 27 | 28 | ### Customise easing 29 | ```typescript 30 | import { cubicBezier, Gauge } from 'gauge-chart-js'; 31 | 32 | const easeIn = cubicBezier(0, 0, 0.2, 1); 33 | const gauge = new Gauge({ 34 | // ... 35 | easing: easeIn 36 | }) 37 | ``` 38 | 39 | Easing functions cheat sheet: https://cubic-bezier.com/#.17,.67,.83,.67 40 | 41 | ### Options 42 | | Name | Description | Required | Default value | Type | 43 | | --- | --- | --- | --- | --- | 44 | | `container` | The HTML element that act as a container for the gauge | Yes | - | `HTMLElement` | 45 | | `fromAngle` | Gauge start angle in degrees | No | 220 | `number` | 46 | | `toAngle` | Gauge end angle in degrees | No | 500 | `number` | 47 | | `animationDuration` | Animation duration in milliseconds | No | 600 | `number` | 48 | | `animationDelay`| Animation delay in milliseconds. Pass 0 for no animation. | No | 0 | `number` | 49 | | `lineWidth`| Thickness of the gauge | No | 3.5 | `number` | 50 | | `easing`| The easing function that will be used when animating | No | linear | `(timeFraction: number) => number` | 51 | | `gaugeRadius`| Gauge radius | No | 35 | `number` | 52 | | `color`| Gauge color supported by SVG's [fill](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Fills_and_Strokes) attribute | No | - | `string` | 53 | | `colors`| Gauge colors supported by SVG's [fill](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Fills_and_Strokes) attribute | No | - | `string[]` | 54 | 55 | ### Programmatic API 56 | Available methods: 57 | - `setValue(value)` Sets chart value. 58 | - `getElementAtValue(value)` Returns SVG element for given `value` with additional information: angle and relative position to its parent container. 59 | - `insertAdjacentToRoot(where, html)` Inserts HTML to SVG root. Can be used for custom labels. 60 | - `dispose()` Disposes chart. 61 | 62 | ### How to integrate it with framework X? 63 | The library is framework-agnostic and do not require any framework-specific integration. If you are using Angular make sure chart is rendered outside zone.js: 64 | ```typescript 65 | class ExampleComponent implements OnInit { 66 | constructor(private ngZone: NgZone) {} 67 | 68 | ngOnInit() { 69 | const gauge = new Gauge({ ... }); 70 | this.ngZone.runOutsideAngular(() => { 71 | gauge.draw(); 72 | }); 73 | } 74 | } 75 | ``` 76 | 77 | ### Run examples: 78 | - `cd example` 79 | - `npm run dev` 80 | - Open demo Conical gauge: http://localhost:3000/conical-gradient/ 81 | - Open demo React + shadowed center: http://localhost:3000/progress-with-shadow-chart/ 82 | - Open demo Multiple gauges + labels: http://localhost:3000/multiple-gauges/ 83 | - Open demo Countdown gauge: http://localhost:3000/countdown-gauge/ 84 | 85 | -------------------------------------------------------------------------------- /assets/conical-polar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubk/gauge-chart-js/d1799caa7020a11ec4c739d617d709321cb86b49/assets/conical-polar.gif -------------------------------------------------------------------------------- /assets/countdown-circle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubk/gauge-chart-js/d1799caa7020a11ec4c739d617d709321cb86b49/assets/countdown-circle.gif -------------------------------------------------------------------------------- /assets/multiple-gauges.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubk/gauge-chart-js/d1799caa7020a11ec4c739d617d709321cb86b49/assets/multiple-gauges.gif -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | - npm i 4 | - npm run dev 5 | ## Examples 6 | - Conical gauge: http://localhost:3000/conical-gradient/ 7 | - React + shadowed center: http://localhost:3000/progress-with-shadow-chart/ 8 | - Multiple gauges + labels: http://localhost:3000/multiple-gauges/ 9 | - Countdown gauge: http://localhost:3000/countdown-gauge/ 10 | -------------------------------------------------------------------------------- /example/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo-vite", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "demo-vite", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@emotion/css": "^11.7.1", 12 | "gradstop": "^2.2.3", 13 | "react": "^17.0.0", 14 | "react-dom": "^17.0.0" 15 | }, 16 | "devDependencies": { 17 | "@types/node": "^16.9.1", 18 | "@types/react": "^17.0.0", 19 | "@types/react-dom": "^17.0.0", 20 | "@vitejs/plugin-react-refresh": "^1.3.6", 21 | "sass": "^1.49.7", 22 | "typescript": "^4.5.5", 23 | "vite": "^2.7.13" 24 | } 25 | }, 26 | "node_modules/@babel/code-frame": { 27 | "version": "7.14.5", 28 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 29 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 30 | "dependencies": { 31 | "@babel/highlight": "^7.14.5" 32 | }, 33 | "engines": { 34 | "node": ">=6.9.0" 35 | } 36 | }, 37 | "node_modules/@babel/compat-data": { 38 | "version": "7.15.0", 39 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", 40 | "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", 41 | "engines": { 42 | "node": ">=6.9.0" 43 | } 44 | }, 45 | "node_modules/@babel/core": { 46 | "version": "7.15.5", 47 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", 48 | "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", 49 | "dependencies": { 50 | "@babel/code-frame": "^7.14.5", 51 | "@babel/generator": "^7.15.4", 52 | "@babel/helper-compilation-targets": "^7.15.4", 53 | "@babel/helper-module-transforms": "^7.15.4", 54 | "@babel/helpers": "^7.15.4", 55 | "@babel/parser": "^7.15.5", 56 | "@babel/template": "^7.15.4", 57 | "@babel/traverse": "^7.15.4", 58 | "@babel/types": "^7.15.4", 59 | "convert-source-map": "^1.7.0", 60 | "debug": "^4.1.0", 61 | "gensync": "^1.0.0-beta.2", 62 | "json5": "^2.1.2", 63 | "semver": "^6.3.0", 64 | "source-map": "^0.5.0" 65 | }, 66 | "engines": { 67 | "node": ">=6.9.0" 68 | }, 69 | "funding": { 70 | "type": "opencollective", 71 | "url": "https://opencollective.com/babel" 72 | } 73 | }, 74 | "node_modules/@babel/generator": { 75 | "version": "7.15.4", 76 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", 77 | "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", 78 | "dependencies": { 79 | "@babel/types": "^7.15.4", 80 | "jsesc": "^2.5.1", 81 | "source-map": "^0.5.0" 82 | }, 83 | "engines": { 84 | "node": ">=6.9.0" 85 | } 86 | }, 87 | "node_modules/@babel/helper-compilation-targets": { 88 | "version": "7.15.4", 89 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", 90 | "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", 91 | "dependencies": { 92 | "@babel/compat-data": "^7.15.0", 93 | "@babel/helper-validator-option": "^7.14.5", 94 | "browserslist": "^4.16.6", 95 | "semver": "^6.3.0" 96 | }, 97 | "engines": { 98 | "node": ">=6.9.0" 99 | }, 100 | "peerDependencies": { 101 | "@babel/core": "^7.0.0" 102 | } 103 | }, 104 | "node_modules/@babel/helper-function-name": { 105 | "version": "7.15.4", 106 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", 107 | "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", 108 | "dependencies": { 109 | "@babel/helper-get-function-arity": "^7.15.4", 110 | "@babel/template": "^7.15.4", 111 | "@babel/types": "^7.15.4" 112 | }, 113 | "engines": { 114 | "node": ">=6.9.0" 115 | } 116 | }, 117 | "node_modules/@babel/helper-get-function-arity": { 118 | "version": "7.15.4", 119 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", 120 | "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", 121 | "dependencies": { 122 | "@babel/types": "^7.15.4" 123 | }, 124 | "engines": { 125 | "node": ">=6.9.0" 126 | } 127 | }, 128 | "node_modules/@babel/helper-hoist-variables": { 129 | "version": "7.15.4", 130 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", 131 | "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", 132 | "dependencies": { 133 | "@babel/types": "^7.15.4" 134 | }, 135 | "engines": { 136 | "node": ">=6.9.0" 137 | } 138 | }, 139 | "node_modules/@babel/helper-member-expression-to-functions": { 140 | "version": "7.15.4", 141 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", 142 | "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", 143 | "dependencies": { 144 | "@babel/types": "^7.15.4" 145 | }, 146 | "engines": { 147 | "node": ">=6.9.0" 148 | } 149 | }, 150 | "node_modules/@babel/helper-module-imports": { 151 | "version": "7.15.4", 152 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", 153 | "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", 154 | "dependencies": { 155 | "@babel/types": "^7.15.4" 156 | }, 157 | "engines": { 158 | "node": ">=6.9.0" 159 | } 160 | }, 161 | "node_modules/@babel/helper-module-transforms": { 162 | "version": "7.15.4", 163 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", 164 | "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", 165 | "dependencies": { 166 | "@babel/helper-module-imports": "^7.15.4", 167 | "@babel/helper-replace-supers": "^7.15.4", 168 | "@babel/helper-simple-access": "^7.15.4", 169 | "@babel/helper-split-export-declaration": "^7.15.4", 170 | "@babel/helper-validator-identifier": "^7.14.9", 171 | "@babel/template": "^7.15.4", 172 | "@babel/traverse": "^7.15.4", 173 | "@babel/types": "^7.15.4" 174 | }, 175 | "engines": { 176 | "node": ">=6.9.0" 177 | } 178 | }, 179 | "node_modules/@babel/helper-optimise-call-expression": { 180 | "version": "7.15.4", 181 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", 182 | "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", 183 | "dependencies": { 184 | "@babel/types": "^7.15.4" 185 | }, 186 | "engines": { 187 | "node": ">=6.9.0" 188 | } 189 | }, 190 | "node_modules/@babel/helper-plugin-utils": { 191 | "version": "7.16.7", 192 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", 193 | "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", 194 | "engines": { 195 | "node": ">=6.9.0" 196 | } 197 | }, 198 | "node_modules/@babel/helper-replace-supers": { 199 | "version": "7.15.4", 200 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", 201 | "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", 202 | "dependencies": { 203 | "@babel/helper-member-expression-to-functions": "^7.15.4", 204 | "@babel/helper-optimise-call-expression": "^7.15.4", 205 | "@babel/traverse": "^7.15.4", 206 | "@babel/types": "^7.15.4" 207 | }, 208 | "engines": { 209 | "node": ">=6.9.0" 210 | } 211 | }, 212 | "node_modules/@babel/helper-simple-access": { 213 | "version": "7.15.4", 214 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", 215 | "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", 216 | "dependencies": { 217 | "@babel/types": "^7.15.4" 218 | }, 219 | "engines": { 220 | "node": ">=6.9.0" 221 | } 222 | }, 223 | "node_modules/@babel/helper-split-export-declaration": { 224 | "version": "7.15.4", 225 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", 226 | "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", 227 | "dependencies": { 228 | "@babel/types": "^7.15.4" 229 | }, 230 | "engines": { 231 | "node": ">=6.9.0" 232 | } 233 | }, 234 | "node_modules/@babel/helper-validator-identifier": { 235 | "version": "7.14.9", 236 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", 237 | "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", 238 | "engines": { 239 | "node": ">=6.9.0" 240 | } 241 | }, 242 | "node_modules/@babel/helper-validator-option": { 243 | "version": "7.14.5", 244 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", 245 | "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", 246 | "engines": { 247 | "node": ">=6.9.0" 248 | } 249 | }, 250 | "node_modules/@babel/helpers": { 251 | "version": "7.15.4", 252 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", 253 | "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", 254 | "dependencies": { 255 | "@babel/template": "^7.15.4", 256 | "@babel/traverse": "^7.15.4", 257 | "@babel/types": "^7.15.4" 258 | }, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | } 262 | }, 263 | "node_modules/@babel/highlight": { 264 | "version": "7.14.5", 265 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 266 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 267 | "dependencies": { 268 | "@babel/helper-validator-identifier": "^7.14.5", 269 | "chalk": "^2.0.0", 270 | "js-tokens": "^4.0.0" 271 | }, 272 | "engines": { 273 | "node": ">=6.9.0" 274 | } 275 | }, 276 | "node_modules/@babel/parser": { 277 | "version": "7.15.6", 278 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", 279 | "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", 280 | "bin": { 281 | "parser": "bin/babel-parser.js" 282 | }, 283 | "engines": { 284 | "node": ">=6.0.0" 285 | } 286 | }, 287 | "node_modules/@babel/plugin-syntax-jsx": { 288 | "version": "7.16.7", 289 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", 290 | "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", 291 | "dependencies": { 292 | "@babel/helper-plugin-utils": "^7.16.7" 293 | }, 294 | "engines": { 295 | "node": ">=6.9.0" 296 | }, 297 | "peerDependencies": { 298 | "@babel/core": "^7.0.0-0" 299 | } 300 | }, 301 | "node_modules/@babel/plugin-transform-react-jsx-self": { 302 | "version": "7.14.9", 303 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz", 304 | "integrity": "sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw==", 305 | "dev": true, 306 | "dependencies": { 307 | "@babel/helper-plugin-utils": "^7.14.5" 308 | }, 309 | "engines": { 310 | "node": ">=6.9.0" 311 | }, 312 | "peerDependencies": { 313 | "@babel/core": "^7.0.0-0" 314 | } 315 | }, 316 | "node_modules/@babel/plugin-transform-react-jsx-source": { 317 | "version": "7.14.5", 318 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", 319 | "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", 320 | "dev": true, 321 | "dependencies": { 322 | "@babel/helper-plugin-utils": "^7.14.5" 323 | }, 324 | "engines": { 325 | "node": ">=6.9.0" 326 | }, 327 | "peerDependencies": { 328 | "@babel/core": "^7.0.0-0" 329 | } 330 | }, 331 | "node_modules/@babel/runtime": { 332 | "version": "7.17.0", 333 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz", 334 | "integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==", 335 | "dependencies": { 336 | "regenerator-runtime": "^0.13.4" 337 | }, 338 | "engines": { 339 | "node": ">=6.9.0" 340 | } 341 | }, 342 | "node_modules/@babel/template": { 343 | "version": "7.15.4", 344 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", 345 | "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", 346 | "dependencies": { 347 | "@babel/code-frame": "^7.14.5", 348 | "@babel/parser": "^7.15.4", 349 | "@babel/types": "^7.15.4" 350 | }, 351 | "engines": { 352 | "node": ">=6.9.0" 353 | } 354 | }, 355 | "node_modules/@babel/traverse": { 356 | "version": "7.15.4", 357 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", 358 | "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", 359 | "dependencies": { 360 | "@babel/code-frame": "^7.14.5", 361 | "@babel/generator": "^7.15.4", 362 | "@babel/helper-function-name": "^7.15.4", 363 | "@babel/helper-hoist-variables": "^7.15.4", 364 | "@babel/helper-split-export-declaration": "^7.15.4", 365 | "@babel/parser": "^7.15.4", 366 | "@babel/types": "^7.15.4", 367 | "debug": "^4.1.0", 368 | "globals": "^11.1.0" 369 | }, 370 | "engines": { 371 | "node": ">=6.9.0" 372 | } 373 | }, 374 | "node_modules/@babel/types": { 375 | "version": "7.15.6", 376 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", 377 | "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", 378 | "dependencies": { 379 | "@babel/helper-validator-identifier": "^7.14.9", 380 | "to-fast-properties": "^2.0.0" 381 | }, 382 | "engines": { 383 | "node": ">=6.9.0" 384 | } 385 | }, 386 | "node_modules/@emotion/babel-plugin": { 387 | "version": "11.7.2", 388 | "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", 389 | "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", 390 | "dependencies": { 391 | "@babel/helper-module-imports": "^7.12.13", 392 | "@babel/plugin-syntax-jsx": "^7.12.13", 393 | "@babel/runtime": "^7.13.10", 394 | "@emotion/hash": "^0.8.0", 395 | "@emotion/memoize": "^0.7.5", 396 | "@emotion/serialize": "^1.0.2", 397 | "babel-plugin-macros": "^2.6.1", 398 | "convert-source-map": "^1.5.0", 399 | "escape-string-regexp": "^4.0.0", 400 | "find-root": "^1.1.0", 401 | "source-map": "^0.5.7", 402 | "stylis": "4.0.13" 403 | }, 404 | "peerDependencies": { 405 | "@babel/core": "^7.0.0" 406 | } 407 | }, 408 | "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { 409 | "version": "4.0.0", 410 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 411 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 412 | "engines": { 413 | "node": ">=10" 414 | }, 415 | "funding": { 416 | "url": "https://github.com/sponsors/sindresorhus" 417 | } 418 | }, 419 | "node_modules/@emotion/cache": { 420 | "version": "11.7.1", 421 | "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", 422 | "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", 423 | "dependencies": { 424 | "@emotion/memoize": "^0.7.4", 425 | "@emotion/sheet": "^1.1.0", 426 | "@emotion/utils": "^1.0.0", 427 | "@emotion/weak-memoize": "^0.2.5", 428 | "stylis": "4.0.13" 429 | } 430 | }, 431 | "node_modules/@emotion/css": { 432 | "version": "11.7.1", 433 | "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.7.1.tgz", 434 | "integrity": "sha512-RUUgPlMZunlc7SE5A6Hg+VWRzb2cU6O9xlV78KCFgcnl25s7Qz/20oQg71iKudpLqk7xj0vhbJlwcJJMT0BOZg==", 435 | "dependencies": { 436 | "@emotion/babel-plugin": "^11.7.1", 437 | "@emotion/cache": "^11.7.1", 438 | "@emotion/serialize": "^1.0.0", 439 | "@emotion/sheet": "^1.0.3", 440 | "@emotion/utils": "^1.0.0" 441 | }, 442 | "peerDependencies": { 443 | "@babel/core": "^7.0.0" 444 | }, 445 | "peerDependenciesMeta": { 446 | "@babel/core": { 447 | "optional": true 448 | } 449 | } 450 | }, 451 | "node_modules/@emotion/hash": { 452 | "version": "0.8.0", 453 | "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", 454 | "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" 455 | }, 456 | "node_modules/@emotion/memoize": { 457 | "version": "0.7.5", 458 | "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", 459 | "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" 460 | }, 461 | "node_modules/@emotion/serialize": { 462 | "version": "1.0.2", 463 | "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", 464 | "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", 465 | "dependencies": { 466 | "@emotion/hash": "^0.8.0", 467 | "@emotion/memoize": "^0.7.4", 468 | "@emotion/unitless": "^0.7.5", 469 | "@emotion/utils": "^1.0.0", 470 | "csstype": "^3.0.2" 471 | } 472 | }, 473 | "node_modules/@emotion/sheet": { 474 | "version": "1.1.0", 475 | "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", 476 | "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" 477 | }, 478 | "node_modules/@emotion/unitless": { 479 | "version": "0.7.5", 480 | "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", 481 | "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" 482 | }, 483 | "node_modules/@emotion/utils": { 484 | "version": "1.0.0", 485 | "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", 486 | "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" 487 | }, 488 | "node_modules/@emotion/weak-memoize": { 489 | "version": "0.2.5", 490 | "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", 491 | "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" 492 | }, 493 | "node_modules/@rollup/pluginutils": { 494 | "version": "4.1.1", 495 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", 496 | "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==", 497 | "dev": true, 498 | "dependencies": { 499 | "estree-walker": "^2.0.1", 500 | "picomatch": "^2.2.2" 501 | }, 502 | "engines": { 503 | "node": ">= 8.0.0" 504 | } 505 | }, 506 | "node_modules/@types/node": { 507 | "version": "16.9.1", 508 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", 509 | "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", 510 | "dev": true 511 | }, 512 | "node_modules/@types/parse-json": { 513 | "version": "4.0.0", 514 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 515 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" 516 | }, 517 | "node_modules/@types/prop-types": { 518 | "version": "15.7.4", 519 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", 520 | "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", 521 | "dev": true 522 | }, 523 | "node_modules/@types/react": { 524 | "version": "17.0.20", 525 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.20.tgz", 526 | "integrity": "sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA==", 527 | "dev": true, 528 | "dependencies": { 529 | "@types/prop-types": "*", 530 | "@types/scheduler": "*", 531 | "csstype": "^3.0.2" 532 | } 533 | }, 534 | "node_modules/@types/react-dom": { 535 | "version": "17.0.9", 536 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz", 537 | "integrity": "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==", 538 | "dev": true, 539 | "dependencies": { 540 | "@types/react": "*" 541 | } 542 | }, 543 | "node_modules/@types/scheduler": { 544 | "version": "0.16.2", 545 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 546 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", 547 | "dev": true 548 | }, 549 | "node_modules/@vitejs/plugin-react-refresh": { 550 | "version": "1.3.6", 551 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-refresh/-/plugin-react-refresh-1.3.6.tgz", 552 | "integrity": "sha512-iNR/UqhUOmFFxiezt0em9CgmiJBdWR+5jGxB2FihaoJfqGt76kiwaKoVOJVU5NYcDWMdN06LbyN2VIGIoYdsEA==", 553 | "dev": true, 554 | "dependencies": { 555 | "@babel/core": "^7.14.8", 556 | "@babel/plugin-transform-react-jsx-self": "^7.14.5", 557 | "@babel/plugin-transform-react-jsx-source": "^7.14.5", 558 | "@rollup/pluginutils": "^4.1.1", 559 | "react-refresh": "^0.10.0" 560 | }, 561 | "engines": { 562 | "node": ">=12.0.0" 563 | } 564 | }, 565 | "node_modules/ansi-styles": { 566 | "version": "3.2.1", 567 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 568 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 569 | "dependencies": { 570 | "color-convert": "^1.9.0" 571 | }, 572 | "engines": { 573 | "node": ">=4" 574 | } 575 | }, 576 | "node_modules/anymatch": { 577 | "version": "3.1.2", 578 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 579 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 580 | "dev": true, 581 | "dependencies": { 582 | "normalize-path": "^3.0.0", 583 | "picomatch": "^2.0.4" 584 | }, 585 | "engines": { 586 | "node": ">= 8" 587 | } 588 | }, 589 | "node_modules/babel-plugin-macros": { 590 | "version": "2.8.0", 591 | "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", 592 | "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", 593 | "dependencies": { 594 | "@babel/runtime": "^7.7.2", 595 | "cosmiconfig": "^6.0.0", 596 | "resolve": "^1.12.0" 597 | } 598 | }, 599 | "node_modules/binary-extensions": { 600 | "version": "2.2.0", 601 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 602 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 603 | "dev": true, 604 | "engines": { 605 | "node": ">=8" 606 | } 607 | }, 608 | "node_modules/braces": { 609 | "version": "3.0.2", 610 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 611 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 612 | "dev": true, 613 | "dependencies": { 614 | "fill-range": "^7.0.1" 615 | }, 616 | "engines": { 617 | "node": ">=8" 618 | } 619 | }, 620 | "node_modules/browserslist": { 621 | "version": "4.17.0", 622 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", 623 | "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", 624 | "dependencies": { 625 | "caniuse-lite": "^1.0.30001254", 626 | "colorette": "^1.3.0", 627 | "electron-to-chromium": "^1.3.830", 628 | "escalade": "^3.1.1", 629 | "node-releases": "^1.1.75" 630 | }, 631 | "bin": { 632 | "browserslist": "cli.js" 633 | }, 634 | "engines": { 635 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 636 | }, 637 | "funding": { 638 | "type": "opencollective", 639 | "url": "https://opencollective.com/browserslist" 640 | } 641 | }, 642 | "node_modules/callsites": { 643 | "version": "3.1.0", 644 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 645 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 646 | "engines": { 647 | "node": ">=6" 648 | } 649 | }, 650 | "node_modules/caniuse-lite": { 651 | "version": "1.0.30001256", 652 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001256.tgz", 653 | "integrity": "sha512-QirrvMLmB4txNnxiaG/xbm6FSzv9LqOZ3Jp9VtCYb3oPIfCHpr/oGn38pFq0udwlkctvXQgPthaXqJ76DaYGnA==", 654 | "funding": { 655 | "type": "opencollective", 656 | "url": "https://opencollective.com/browserslist" 657 | } 658 | }, 659 | "node_modules/chalk": { 660 | "version": "2.4.2", 661 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 662 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 663 | "dependencies": { 664 | "ansi-styles": "^3.2.1", 665 | "escape-string-regexp": "^1.0.5", 666 | "supports-color": "^5.3.0" 667 | }, 668 | "engines": { 669 | "node": ">=4" 670 | } 671 | }, 672 | "node_modules/chokidar": { 673 | "version": "3.5.3", 674 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 675 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 676 | "dev": true, 677 | "funding": [ 678 | { 679 | "type": "individual", 680 | "url": "https://paulmillr.com/funding/" 681 | } 682 | ], 683 | "dependencies": { 684 | "anymatch": "~3.1.2", 685 | "braces": "~3.0.2", 686 | "glob-parent": "~5.1.2", 687 | "is-binary-path": "~2.1.0", 688 | "is-glob": "~4.0.1", 689 | "normalize-path": "~3.0.0", 690 | "readdirp": "~3.6.0" 691 | }, 692 | "engines": { 693 | "node": ">= 8.10.0" 694 | }, 695 | "optionalDependencies": { 696 | "fsevents": "~2.3.2" 697 | } 698 | }, 699 | "node_modules/color-convert": { 700 | "version": "1.9.3", 701 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 702 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 703 | "dependencies": { 704 | "color-name": "1.1.3" 705 | } 706 | }, 707 | "node_modules/color-name": { 708 | "version": "1.1.3", 709 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 710 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 711 | }, 712 | "node_modules/colorette": { 713 | "version": "1.4.0", 714 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", 715 | "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" 716 | }, 717 | "node_modules/convert-source-map": { 718 | "version": "1.8.0", 719 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 720 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 721 | "dependencies": { 722 | "safe-buffer": "~5.1.1" 723 | } 724 | }, 725 | "node_modules/cosmiconfig": { 726 | "version": "6.0.0", 727 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", 728 | "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", 729 | "dependencies": { 730 | "@types/parse-json": "^4.0.0", 731 | "import-fresh": "^3.1.0", 732 | "parse-json": "^5.0.0", 733 | "path-type": "^4.0.0", 734 | "yaml": "^1.7.2" 735 | }, 736 | "engines": { 737 | "node": ">=8" 738 | } 739 | }, 740 | "node_modules/csstype": { 741 | "version": "3.0.8", 742 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", 743 | "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" 744 | }, 745 | "node_modules/debug": { 746 | "version": "4.3.2", 747 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 748 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 749 | "dependencies": { 750 | "ms": "2.1.2" 751 | }, 752 | "engines": { 753 | "node": ">=6.0" 754 | }, 755 | "peerDependenciesMeta": { 756 | "supports-color": { 757 | "optional": true 758 | } 759 | } 760 | }, 761 | "node_modules/electron-to-chromium": { 762 | "version": "1.3.836", 763 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.836.tgz", 764 | "integrity": "sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg==" 765 | }, 766 | "node_modules/error-ex": { 767 | "version": "1.3.2", 768 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 769 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 770 | "dependencies": { 771 | "is-arrayish": "^0.2.1" 772 | } 773 | }, 774 | "node_modules/esbuild": { 775 | "version": "0.13.15", 776 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz", 777 | "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==", 778 | "dev": true, 779 | "hasInstallScript": true, 780 | "bin": { 781 | "esbuild": "bin/esbuild" 782 | }, 783 | "optionalDependencies": { 784 | "esbuild-android-arm64": "0.13.15", 785 | "esbuild-darwin-64": "0.13.15", 786 | "esbuild-darwin-arm64": "0.13.15", 787 | "esbuild-freebsd-64": "0.13.15", 788 | "esbuild-freebsd-arm64": "0.13.15", 789 | "esbuild-linux-32": "0.13.15", 790 | "esbuild-linux-64": "0.13.15", 791 | "esbuild-linux-arm": "0.13.15", 792 | "esbuild-linux-arm64": "0.13.15", 793 | "esbuild-linux-mips64le": "0.13.15", 794 | "esbuild-linux-ppc64le": "0.13.15", 795 | "esbuild-netbsd-64": "0.13.15", 796 | "esbuild-openbsd-64": "0.13.15", 797 | "esbuild-sunos-64": "0.13.15", 798 | "esbuild-windows-32": "0.13.15", 799 | "esbuild-windows-64": "0.13.15", 800 | "esbuild-windows-arm64": "0.13.15" 801 | } 802 | }, 803 | "node_modules/esbuild-android-arm64": { 804 | "version": "0.13.15", 805 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz", 806 | "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==", 807 | "cpu": [ 808 | "arm64" 809 | ], 810 | "dev": true, 811 | "optional": true, 812 | "os": [ 813 | "android" 814 | ] 815 | }, 816 | "node_modules/esbuild-darwin-64": { 817 | "version": "0.13.15", 818 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz", 819 | "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==", 820 | "cpu": [ 821 | "x64" 822 | ], 823 | "dev": true, 824 | "optional": true, 825 | "os": [ 826 | "darwin" 827 | ] 828 | }, 829 | "node_modules/esbuild-darwin-arm64": { 830 | "version": "0.13.15", 831 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz", 832 | "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==", 833 | "cpu": [ 834 | "arm64" 835 | ], 836 | "dev": true, 837 | "optional": true, 838 | "os": [ 839 | "darwin" 840 | ] 841 | }, 842 | "node_modules/esbuild-freebsd-64": { 843 | "version": "0.13.15", 844 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz", 845 | "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==", 846 | "cpu": [ 847 | "x64" 848 | ], 849 | "dev": true, 850 | "optional": true, 851 | "os": [ 852 | "freebsd" 853 | ] 854 | }, 855 | "node_modules/esbuild-freebsd-arm64": { 856 | "version": "0.13.15", 857 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz", 858 | "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==", 859 | "cpu": [ 860 | "arm64" 861 | ], 862 | "dev": true, 863 | "optional": true, 864 | "os": [ 865 | "freebsd" 866 | ] 867 | }, 868 | "node_modules/esbuild-linux-32": { 869 | "version": "0.13.15", 870 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz", 871 | "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==", 872 | "cpu": [ 873 | "ia32" 874 | ], 875 | "dev": true, 876 | "optional": true, 877 | "os": [ 878 | "linux" 879 | ] 880 | }, 881 | "node_modules/esbuild-linux-64": { 882 | "version": "0.13.15", 883 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz", 884 | "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==", 885 | "cpu": [ 886 | "x64" 887 | ], 888 | "dev": true, 889 | "optional": true, 890 | "os": [ 891 | "linux" 892 | ] 893 | }, 894 | "node_modules/esbuild-linux-arm": { 895 | "version": "0.13.15", 896 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz", 897 | "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==", 898 | "cpu": [ 899 | "arm" 900 | ], 901 | "dev": true, 902 | "optional": true, 903 | "os": [ 904 | "linux" 905 | ] 906 | }, 907 | "node_modules/esbuild-linux-arm64": { 908 | "version": "0.13.15", 909 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz", 910 | "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==", 911 | "cpu": [ 912 | "arm64" 913 | ], 914 | "dev": true, 915 | "optional": true, 916 | "os": [ 917 | "linux" 918 | ] 919 | }, 920 | "node_modules/esbuild-linux-mips64le": { 921 | "version": "0.13.15", 922 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz", 923 | "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==", 924 | "cpu": [ 925 | "mips64el" 926 | ], 927 | "dev": true, 928 | "optional": true, 929 | "os": [ 930 | "linux" 931 | ] 932 | }, 933 | "node_modules/esbuild-linux-ppc64le": { 934 | "version": "0.13.15", 935 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz", 936 | "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==", 937 | "cpu": [ 938 | "ppc64" 939 | ], 940 | "dev": true, 941 | "optional": true, 942 | "os": [ 943 | "linux" 944 | ] 945 | }, 946 | "node_modules/esbuild-netbsd-64": { 947 | "version": "0.13.15", 948 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz", 949 | "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==", 950 | "cpu": [ 951 | "x64" 952 | ], 953 | "dev": true, 954 | "optional": true, 955 | "os": [ 956 | "netbsd" 957 | ] 958 | }, 959 | "node_modules/esbuild-openbsd-64": { 960 | "version": "0.13.15", 961 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz", 962 | "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==", 963 | "cpu": [ 964 | "x64" 965 | ], 966 | "dev": true, 967 | "optional": true, 968 | "os": [ 969 | "openbsd" 970 | ] 971 | }, 972 | "node_modules/esbuild-sunos-64": { 973 | "version": "0.13.15", 974 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz", 975 | "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==", 976 | "cpu": [ 977 | "x64" 978 | ], 979 | "dev": true, 980 | "optional": true, 981 | "os": [ 982 | "sunos" 983 | ] 984 | }, 985 | "node_modules/esbuild-windows-32": { 986 | "version": "0.13.15", 987 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz", 988 | "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==", 989 | "cpu": [ 990 | "ia32" 991 | ], 992 | "dev": true, 993 | "optional": true, 994 | "os": [ 995 | "win32" 996 | ] 997 | }, 998 | "node_modules/esbuild-windows-64": { 999 | "version": "0.13.15", 1000 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz", 1001 | "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==", 1002 | "cpu": [ 1003 | "x64" 1004 | ], 1005 | "dev": true, 1006 | "optional": true, 1007 | "os": [ 1008 | "win32" 1009 | ] 1010 | }, 1011 | "node_modules/esbuild-windows-arm64": { 1012 | "version": "0.13.15", 1013 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz", 1014 | "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==", 1015 | "cpu": [ 1016 | "arm64" 1017 | ], 1018 | "dev": true, 1019 | "optional": true, 1020 | "os": [ 1021 | "win32" 1022 | ] 1023 | }, 1024 | "node_modules/escalade": { 1025 | "version": "3.1.1", 1026 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1027 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1028 | "engines": { 1029 | "node": ">=6" 1030 | } 1031 | }, 1032 | "node_modules/escape-string-regexp": { 1033 | "version": "1.0.5", 1034 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1035 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1036 | "engines": { 1037 | "node": ">=0.8.0" 1038 | } 1039 | }, 1040 | "node_modules/estree-walker": { 1041 | "version": "2.0.2", 1042 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1043 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1044 | "dev": true 1045 | }, 1046 | "node_modules/fill-range": { 1047 | "version": "7.0.1", 1048 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1049 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1050 | "dev": true, 1051 | "dependencies": { 1052 | "to-regex-range": "^5.0.1" 1053 | }, 1054 | "engines": { 1055 | "node": ">=8" 1056 | } 1057 | }, 1058 | "node_modules/find-root": { 1059 | "version": "1.1.0", 1060 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 1061 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" 1062 | }, 1063 | "node_modules/fsevents": { 1064 | "version": "2.3.2", 1065 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1066 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1067 | "dev": true, 1068 | "hasInstallScript": true, 1069 | "optional": true, 1070 | "os": [ 1071 | "darwin" 1072 | ], 1073 | "engines": { 1074 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1075 | } 1076 | }, 1077 | "node_modules/function-bind": { 1078 | "version": "1.1.1", 1079 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1080 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1081 | }, 1082 | "node_modules/gensync": { 1083 | "version": "1.0.0-beta.2", 1084 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1085 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1086 | "engines": { 1087 | "node": ">=6.9.0" 1088 | } 1089 | }, 1090 | "node_modules/glob-parent": { 1091 | "version": "5.1.2", 1092 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1093 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1094 | "dev": true, 1095 | "dependencies": { 1096 | "is-glob": "^4.0.1" 1097 | }, 1098 | "engines": { 1099 | "node": ">= 6" 1100 | } 1101 | }, 1102 | "node_modules/globals": { 1103 | "version": "11.12.0", 1104 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1105 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1106 | "engines": { 1107 | "node": ">=4" 1108 | } 1109 | }, 1110 | "node_modules/gradstop": { 1111 | "version": "2.2.3", 1112 | "resolved": "https://registry.npmjs.org/gradstop/-/gradstop-2.2.3.tgz", 1113 | "integrity": "sha512-omtiHZCI/vykWcXNDYdrHhe7VUnnZvya94wAHRLI8ciDkAviXYrT+pwP7ybYqK7uwYir59auBCY5ggwBlVSmsg==" 1114 | }, 1115 | "node_modules/has": { 1116 | "version": "1.0.3", 1117 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1118 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1119 | "dependencies": { 1120 | "function-bind": "^1.1.1" 1121 | }, 1122 | "engines": { 1123 | "node": ">= 0.4.0" 1124 | } 1125 | }, 1126 | "node_modules/has-flag": { 1127 | "version": "3.0.0", 1128 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1129 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1130 | "engines": { 1131 | "node": ">=4" 1132 | } 1133 | }, 1134 | "node_modules/immutable": { 1135 | "version": "4.0.0", 1136 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", 1137 | "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", 1138 | "dev": true 1139 | }, 1140 | "node_modules/import-fresh": { 1141 | "version": "3.3.0", 1142 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1143 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1144 | "dependencies": { 1145 | "parent-module": "^1.0.0", 1146 | "resolve-from": "^4.0.0" 1147 | }, 1148 | "engines": { 1149 | "node": ">=6" 1150 | }, 1151 | "funding": { 1152 | "url": "https://github.com/sponsors/sindresorhus" 1153 | } 1154 | }, 1155 | "node_modules/is-arrayish": { 1156 | "version": "0.2.1", 1157 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1158 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1159 | }, 1160 | "node_modules/is-binary-path": { 1161 | "version": "2.1.0", 1162 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1163 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1164 | "dev": true, 1165 | "dependencies": { 1166 | "binary-extensions": "^2.0.0" 1167 | }, 1168 | "engines": { 1169 | "node": ">=8" 1170 | } 1171 | }, 1172 | "node_modules/is-core-module": { 1173 | "version": "2.6.0", 1174 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", 1175 | "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", 1176 | "dependencies": { 1177 | "has": "^1.0.3" 1178 | }, 1179 | "funding": { 1180 | "url": "https://github.com/sponsors/ljharb" 1181 | } 1182 | }, 1183 | "node_modules/is-extglob": { 1184 | "version": "2.1.1", 1185 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1186 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1187 | "dev": true, 1188 | "engines": { 1189 | "node": ">=0.10.0" 1190 | } 1191 | }, 1192 | "node_modules/is-glob": { 1193 | "version": "4.0.3", 1194 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1195 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "is-extglob": "^2.1.1" 1199 | }, 1200 | "engines": { 1201 | "node": ">=0.10.0" 1202 | } 1203 | }, 1204 | "node_modules/is-number": { 1205 | "version": "7.0.0", 1206 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1207 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1208 | "dev": true, 1209 | "engines": { 1210 | "node": ">=0.12.0" 1211 | } 1212 | }, 1213 | "node_modules/js-tokens": { 1214 | "version": "4.0.0", 1215 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1216 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1217 | }, 1218 | "node_modules/jsesc": { 1219 | "version": "2.5.2", 1220 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1221 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1222 | "bin": { 1223 | "jsesc": "bin/jsesc" 1224 | }, 1225 | "engines": { 1226 | "node": ">=4" 1227 | } 1228 | }, 1229 | "node_modules/json-parse-even-better-errors": { 1230 | "version": "2.3.1", 1231 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1232 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 1233 | }, 1234 | "node_modules/json5": { 1235 | "version": "2.2.0", 1236 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", 1237 | "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", 1238 | "dependencies": { 1239 | "minimist": "^1.2.5" 1240 | }, 1241 | "bin": { 1242 | "json5": "lib/cli.js" 1243 | }, 1244 | "engines": { 1245 | "node": ">=6" 1246 | } 1247 | }, 1248 | "node_modules/lines-and-columns": { 1249 | "version": "1.2.4", 1250 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1251 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 1252 | }, 1253 | "node_modules/loose-envify": { 1254 | "version": "1.4.0", 1255 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1256 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1257 | "dependencies": { 1258 | "js-tokens": "^3.0.0 || ^4.0.0" 1259 | }, 1260 | "bin": { 1261 | "loose-envify": "cli.js" 1262 | } 1263 | }, 1264 | "node_modules/minimist": { 1265 | "version": "1.2.5", 1266 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1267 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1268 | }, 1269 | "node_modules/ms": { 1270 | "version": "2.1.2", 1271 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1272 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1273 | }, 1274 | "node_modules/nanoid": { 1275 | "version": "3.2.0", 1276 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 1277 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", 1278 | "dev": true, 1279 | "bin": { 1280 | "nanoid": "bin/nanoid.cjs" 1281 | }, 1282 | "engines": { 1283 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1284 | } 1285 | }, 1286 | "node_modules/node-releases": { 1287 | "version": "1.1.75", 1288 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", 1289 | "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==" 1290 | }, 1291 | "node_modules/normalize-path": { 1292 | "version": "3.0.0", 1293 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1294 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1295 | "dev": true, 1296 | "engines": { 1297 | "node": ">=0.10.0" 1298 | } 1299 | }, 1300 | "node_modules/object-assign": { 1301 | "version": "4.1.1", 1302 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1303 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1304 | "engines": { 1305 | "node": ">=0.10.0" 1306 | } 1307 | }, 1308 | "node_modules/parent-module": { 1309 | "version": "1.0.1", 1310 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1311 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1312 | "dependencies": { 1313 | "callsites": "^3.0.0" 1314 | }, 1315 | "engines": { 1316 | "node": ">=6" 1317 | } 1318 | }, 1319 | "node_modules/parse-json": { 1320 | "version": "5.2.0", 1321 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1322 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1323 | "dependencies": { 1324 | "@babel/code-frame": "^7.0.0", 1325 | "error-ex": "^1.3.1", 1326 | "json-parse-even-better-errors": "^2.3.0", 1327 | "lines-and-columns": "^1.1.6" 1328 | }, 1329 | "engines": { 1330 | "node": ">=8" 1331 | }, 1332 | "funding": { 1333 | "url": "https://github.com/sponsors/sindresorhus" 1334 | } 1335 | }, 1336 | "node_modules/path-parse": { 1337 | "version": "1.0.7", 1338 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1339 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1340 | }, 1341 | "node_modules/path-type": { 1342 | "version": "4.0.0", 1343 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1344 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1345 | "engines": { 1346 | "node": ">=8" 1347 | } 1348 | }, 1349 | "node_modules/picocolors": { 1350 | "version": "1.0.0", 1351 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1352 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1353 | "dev": true 1354 | }, 1355 | "node_modules/picomatch": { 1356 | "version": "2.3.0", 1357 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 1358 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 1359 | "dev": true, 1360 | "engines": { 1361 | "node": ">=8.6" 1362 | }, 1363 | "funding": { 1364 | "url": "https://github.com/sponsors/jonschlinkert" 1365 | } 1366 | }, 1367 | "node_modules/postcss": { 1368 | "version": "8.4.6", 1369 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", 1370 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", 1371 | "dev": true, 1372 | "dependencies": { 1373 | "nanoid": "^3.2.0", 1374 | "picocolors": "^1.0.0", 1375 | "source-map-js": "^1.0.2" 1376 | }, 1377 | "engines": { 1378 | "node": "^10 || ^12 || >=14" 1379 | }, 1380 | "funding": { 1381 | "type": "opencollective", 1382 | "url": "https://opencollective.com/postcss/" 1383 | } 1384 | }, 1385 | "node_modules/react": { 1386 | "version": "17.0.2", 1387 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 1388 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 1389 | "dependencies": { 1390 | "loose-envify": "^1.1.0", 1391 | "object-assign": "^4.1.1" 1392 | }, 1393 | "engines": { 1394 | "node": ">=0.10.0" 1395 | } 1396 | }, 1397 | "node_modules/react-dom": { 1398 | "version": "17.0.2", 1399 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 1400 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 1401 | "dependencies": { 1402 | "loose-envify": "^1.1.0", 1403 | "object-assign": "^4.1.1", 1404 | "scheduler": "^0.20.2" 1405 | }, 1406 | "peerDependencies": { 1407 | "react": "17.0.2" 1408 | } 1409 | }, 1410 | "node_modules/react-refresh": { 1411 | "version": "0.10.0", 1412 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.10.0.tgz", 1413 | "integrity": "sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==", 1414 | "dev": true, 1415 | "engines": { 1416 | "node": ">=0.10.0" 1417 | } 1418 | }, 1419 | "node_modules/readdirp": { 1420 | "version": "3.6.0", 1421 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1422 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1423 | "dev": true, 1424 | "dependencies": { 1425 | "picomatch": "^2.2.1" 1426 | }, 1427 | "engines": { 1428 | "node": ">=8.10.0" 1429 | } 1430 | }, 1431 | "node_modules/regenerator-runtime": { 1432 | "version": "0.13.9", 1433 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 1434 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 1435 | }, 1436 | "node_modules/resolve": { 1437 | "version": "1.20.0", 1438 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 1439 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 1440 | "dependencies": { 1441 | "is-core-module": "^2.2.0", 1442 | "path-parse": "^1.0.6" 1443 | }, 1444 | "funding": { 1445 | "url": "https://github.com/sponsors/ljharb" 1446 | } 1447 | }, 1448 | "node_modules/resolve-from": { 1449 | "version": "4.0.0", 1450 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1451 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1452 | "engines": { 1453 | "node": ">=4" 1454 | } 1455 | }, 1456 | "node_modules/rollup": { 1457 | "version": "2.67.0", 1458 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.0.tgz", 1459 | "integrity": "sha512-W83AaERwvDiHwHEF/dfAfS3z1Be5wf7n+pO3ZAO5IQadCT2lBTr7WQ2MwZZe+nodbD+n3HtC4OCOAdsOPPcKZQ==", 1460 | "dev": true, 1461 | "bin": { 1462 | "rollup": "dist/bin/rollup" 1463 | }, 1464 | "engines": { 1465 | "node": ">=10.0.0" 1466 | }, 1467 | "optionalDependencies": { 1468 | "fsevents": "~2.3.2" 1469 | } 1470 | }, 1471 | "node_modules/safe-buffer": { 1472 | "version": "5.1.2", 1473 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1474 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1475 | }, 1476 | "node_modules/sass": { 1477 | "version": "1.49.7", 1478 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.7.tgz", 1479 | "integrity": "sha512-13dml55EMIR2rS4d/RDHHP0sXMY3+30e1TKsyXaSz3iLWVoDWEoboY8WzJd5JMnxrRHffKO3wq2mpJ0jxRJiEQ==", 1480 | "dev": true, 1481 | "dependencies": { 1482 | "chokidar": ">=3.0.0 <4.0.0", 1483 | "immutable": "^4.0.0", 1484 | "source-map-js": ">=0.6.2 <2.0.0" 1485 | }, 1486 | "bin": { 1487 | "sass": "sass.js" 1488 | }, 1489 | "engines": { 1490 | "node": ">=12.0.0" 1491 | } 1492 | }, 1493 | "node_modules/scheduler": { 1494 | "version": "0.20.2", 1495 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 1496 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 1497 | "dependencies": { 1498 | "loose-envify": "^1.1.0", 1499 | "object-assign": "^4.1.1" 1500 | } 1501 | }, 1502 | "node_modules/semver": { 1503 | "version": "6.3.0", 1504 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1505 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1506 | "bin": { 1507 | "semver": "bin/semver.js" 1508 | } 1509 | }, 1510 | "node_modules/source-map": { 1511 | "version": "0.5.7", 1512 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1513 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1514 | "engines": { 1515 | "node": ">=0.10.0" 1516 | } 1517 | }, 1518 | "node_modules/source-map-js": { 1519 | "version": "1.0.2", 1520 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1521 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1522 | "dev": true, 1523 | "engines": { 1524 | "node": ">=0.10.0" 1525 | } 1526 | }, 1527 | "node_modules/stylis": { 1528 | "version": "4.0.13", 1529 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", 1530 | "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" 1531 | }, 1532 | "node_modules/supports-color": { 1533 | "version": "5.5.0", 1534 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1535 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1536 | "dependencies": { 1537 | "has-flag": "^3.0.0" 1538 | }, 1539 | "engines": { 1540 | "node": ">=4" 1541 | } 1542 | }, 1543 | "node_modules/to-fast-properties": { 1544 | "version": "2.0.0", 1545 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1546 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1547 | "engines": { 1548 | "node": ">=4" 1549 | } 1550 | }, 1551 | "node_modules/to-regex-range": { 1552 | "version": "5.0.1", 1553 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1554 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1555 | "dev": true, 1556 | "dependencies": { 1557 | "is-number": "^7.0.0" 1558 | }, 1559 | "engines": { 1560 | "node": ">=8.0" 1561 | } 1562 | }, 1563 | "node_modules/typescript": { 1564 | "version": "4.5.5", 1565 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", 1566 | "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", 1567 | "dev": true, 1568 | "bin": { 1569 | "tsc": "bin/tsc", 1570 | "tsserver": "bin/tsserver" 1571 | }, 1572 | "engines": { 1573 | "node": ">=4.2.0" 1574 | } 1575 | }, 1576 | "node_modules/vite": { 1577 | "version": "2.7.13", 1578 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.7.13.tgz", 1579 | "integrity": "sha512-Mq8et7f3aK0SgSxjDNfOAimZGW9XryfHRa/uV0jseQSilg+KhYDSoNb9h1rknOy6SuMkvNDLKCYAYYUMCE+IgQ==", 1580 | "dev": true, 1581 | "dependencies": { 1582 | "esbuild": "^0.13.12", 1583 | "postcss": "^8.4.5", 1584 | "resolve": "^1.20.0", 1585 | "rollup": "^2.59.0" 1586 | }, 1587 | "bin": { 1588 | "vite": "bin/vite.js" 1589 | }, 1590 | "engines": { 1591 | "node": ">=12.2.0" 1592 | }, 1593 | "optionalDependencies": { 1594 | "fsevents": "~2.3.2" 1595 | }, 1596 | "peerDependencies": { 1597 | "less": "*", 1598 | "sass": "*", 1599 | "stylus": "*" 1600 | }, 1601 | "peerDependenciesMeta": { 1602 | "less": { 1603 | "optional": true 1604 | }, 1605 | "sass": { 1606 | "optional": true 1607 | }, 1608 | "stylus": { 1609 | "optional": true 1610 | } 1611 | } 1612 | }, 1613 | "node_modules/yaml": { 1614 | "version": "1.10.2", 1615 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 1616 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 1617 | "engines": { 1618 | "node": ">= 6" 1619 | } 1620 | } 1621 | }, 1622 | "dependencies": { 1623 | "@babel/code-frame": { 1624 | "version": "7.14.5", 1625 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 1626 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 1627 | "requires": { 1628 | "@babel/highlight": "^7.14.5" 1629 | } 1630 | }, 1631 | "@babel/compat-data": { 1632 | "version": "7.15.0", 1633 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", 1634 | "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" 1635 | }, 1636 | "@babel/core": { 1637 | "version": "7.15.5", 1638 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", 1639 | "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", 1640 | "requires": { 1641 | "@babel/code-frame": "^7.14.5", 1642 | "@babel/generator": "^7.15.4", 1643 | "@babel/helper-compilation-targets": "^7.15.4", 1644 | "@babel/helper-module-transforms": "^7.15.4", 1645 | "@babel/helpers": "^7.15.4", 1646 | "@babel/parser": "^7.15.5", 1647 | "@babel/template": "^7.15.4", 1648 | "@babel/traverse": "^7.15.4", 1649 | "@babel/types": "^7.15.4", 1650 | "convert-source-map": "^1.7.0", 1651 | "debug": "^4.1.0", 1652 | "gensync": "^1.0.0-beta.2", 1653 | "json5": "^2.1.2", 1654 | "semver": "^6.3.0", 1655 | "source-map": "^0.5.0" 1656 | } 1657 | }, 1658 | "@babel/generator": { 1659 | "version": "7.15.4", 1660 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", 1661 | "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", 1662 | "requires": { 1663 | "@babel/types": "^7.15.4", 1664 | "jsesc": "^2.5.1", 1665 | "source-map": "^0.5.0" 1666 | } 1667 | }, 1668 | "@babel/helper-compilation-targets": { 1669 | "version": "7.15.4", 1670 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", 1671 | "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", 1672 | "requires": { 1673 | "@babel/compat-data": "^7.15.0", 1674 | "@babel/helper-validator-option": "^7.14.5", 1675 | "browserslist": "^4.16.6", 1676 | "semver": "^6.3.0" 1677 | } 1678 | }, 1679 | "@babel/helper-function-name": { 1680 | "version": "7.15.4", 1681 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", 1682 | "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", 1683 | "requires": { 1684 | "@babel/helper-get-function-arity": "^7.15.4", 1685 | "@babel/template": "^7.15.4", 1686 | "@babel/types": "^7.15.4" 1687 | } 1688 | }, 1689 | "@babel/helper-get-function-arity": { 1690 | "version": "7.15.4", 1691 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", 1692 | "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", 1693 | "requires": { 1694 | "@babel/types": "^7.15.4" 1695 | } 1696 | }, 1697 | "@babel/helper-hoist-variables": { 1698 | "version": "7.15.4", 1699 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", 1700 | "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", 1701 | "requires": { 1702 | "@babel/types": "^7.15.4" 1703 | } 1704 | }, 1705 | "@babel/helper-member-expression-to-functions": { 1706 | "version": "7.15.4", 1707 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", 1708 | "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", 1709 | "requires": { 1710 | "@babel/types": "^7.15.4" 1711 | } 1712 | }, 1713 | "@babel/helper-module-imports": { 1714 | "version": "7.15.4", 1715 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", 1716 | "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", 1717 | "requires": { 1718 | "@babel/types": "^7.15.4" 1719 | } 1720 | }, 1721 | "@babel/helper-module-transforms": { 1722 | "version": "7.15.4", 1723 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", 1724 | "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", 1725 | "requires": { 1726 | "@babel/helper-module-imports": "^7.15.4", 1727 | "@babel/helper-replace-supers": "^7.15.4", 1728 | "@babel/helper-simple-access": "^7.15.4", 1729 | "@babel/helper-split-export-declaration": "^7.15.4", 1730 | "@babel/helper-validator-identifier": "^7.14.9", 1731 | "@babel/template": "^7.15.4", 1732 | "@babel/traverse": "^7.15.4", 1733 | "@babel/types": "^7.15.4" 1734 | } 1735 | }, 1736 | "@babel/helper-optimise-call-expression": { 1737 | "version": "7.15.4", 1738 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", 1739 | "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", 1740 | "requires": { 1741 | "@babel/types": "^7.15.4" 1742 | } 1743 | }, 1744 | "@babel/helper-plugin-utils": { 1745 | "version": "7.16.7", 1746 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", 1747 | "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" 1748 | }, 1749 | "@babel/helper-replace-supers": { 1750 | "version": "7.15.4", 1751 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", 1752 | "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", 1753 | "requires": { 1754 | "@babel/helper-member-expression-to-functions": "^7.15.4", 1755 | "@babel/helper-optimise-call-expression": "^7.15.4", 1756 | "@babel/traverse": "^7.15.4", 1757 | "@babel/types": "^7.15.4" 1758 | } 1759 | }, 1760 | "@babel/helper-simple-access": { 1761 | "version": "7.15.4", 1762 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", 1763 | "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", 1764 | "requires": { 1765 | "@babel/types": "^7.15.4" 1766 | } 1767 | }, 1768 | "@babel/helper-split-export-declaration": { 1769 | "version": "7.15.4", 1770 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", 1771 | "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", 1772 | "requires": { 1773 | "@babel/types": "^7.15.4" 1774 | } 1775 | }, 1776 | "@babel/helper-validator-identifier": { 1777 | "version": "7.14.9", 1778 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", 1779 | "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" 1780 | }, 1781 | "@babel/helper-validator-option": { 1782 | "version": "7.14.5", 1783 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", 1784 | "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" 1785 | }, 1786 | "@babel/helpers": { 1787 | "version": "7.15.4", 1788 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", 1789 | "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", 1790 | "requires": { 1791 | "@babel/template": "^7.15.4", 1792 | "@babel/traverse": "^7.15.4", 1793 | "@babel/types": "^7.15.4" 1794 | } 1795 | }, 1796 | "@babel/highlight": { 1797 | "version": "7.14.5", 1798 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 1799 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 1800 | "requires": { 1801 | "@babel/helper-validator-identifier": "^7.14.5", 1802 | "chalk": "^2.0.0", 1803 | "js-tokens": "^4.0.0" 1804 | } 1805 | }, 1806 | "@babel/parser": { 1807 | "version": "7.15.6", 1808 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", 1809 | "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==" 1810 | }, 1811 | "@babel/plugin-syntax-jsx": { 1812 | "version": "7.16.7", 1813 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", 1814 | "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", 1815 | "requires": { 1816 | "@babel/helper-plugin-utils": "^7.16.7" 1817 | } 1818 | }, 1819 | "@babel/plugin-transform-react-jsx-self": { 1820 | "version": "7.14.9", 1821 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz", 1822 | "integrity": "sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw==", 1823 | "dev": true, 1824 | "requires": { 1825 | "@babel/helper-plugin-utils": "^7.14.5" 1826 | } 1827 | }, 1828 | "@babel/plugin-transform-react-jsx-source": { 1829 | "version": "7.14.5", 1830 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", 1831 | "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", 1832 | "dev": true, 1833 | "requires": { 1834 | "@babel/helper-plugin-utils": "^7.14.5" 1835 | } 1836 | }, 1837 | "@babel/runtime": { 1838 | "version": "7.17.0", 1839 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.0.tgz", 1840 | "integrity": "sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==", 1841 | "requires": { 1842 | "regenerator-runtime": "^0.13.4" 1843 | } 1844 | }, 1845 | "@babel/template": { 1846 | "version": "7.15.4", 1847 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", 1848 | "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", 1849 | "requires": { 1850 | "@babel/code-frame": "^7.14.5", 1851 | "@babel/parser": "^7.15.4", 1852 | "@babel/types": "^7.15.4" 1853 | } 1854 | }, 1855 | "@babel/traverse": { 1856 | "version": "7.15.4", 1857 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", 1858 | "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", 1859 | "requires": { 1860 | "@babel/code-frame": "^7.14.5", 1861 | "@babel/generator": "^7.15.4", 1862 | "@babel/helper-function-name": "^7.15.4", 1863 | "@babel/helper-hoist-variables": "^7.15.4", 1864 | "@babel/helper-split-export-declaration": "^7.15.4", 1865 | "@babel/parser": "^7.15.4", 1866 | "@babel/types": "^7.15.4", 1867 | "debug": "^4.1.0", 1868 | "globals": "^11.1.0" 1869 | } 1870 | }, 1871 | "@babel/types": { 1872 | "version": "7.15.6", 1873 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", 1874 | "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", 1875 | "requires": { 1876 | "@babel/helper-validator-identifier": "^7.14.9", 1877 | "to-fast-properties": "^2.0.0" 1878 | } 1879 | }, 1880 | "@emotion/babel-plugin": { 1881 | "version": "11.7.2", 1882 | "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz", 1883 | "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==", 1884 | "requires": { 1885 | "@babel/helper-module-imports": "^7.12.13", 1886 | "@babel/plugin-syntax-jsx": "^7.12.13", 1887 | "@babel/runtime": "^7.13.10", 1888 | "@emotion/hash": "^0.8.0", 1889 | "@emotion/memoize": "^0.7.5", 1890 | "@emotion/serialize": "^1.0.2", 1891 | "babel-plugin-macros": "^2.6.1", 1892 | "convert-source-map": "^1.5.0", 1893 | "escape-string-regexp": "^4.0.0", 1894 | "find-root": "^1.1.0", 1895 | "source-map": "^0.5.7", 1896 | "stylis": "4.0.13" 1897 | }, 1898 | "dependencies": { 1899 | "escape-string-regexp": { 1900 | "version": "4.0.0", 1901 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1902 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 1903 | } 1904 | } 1905 | }, 1906 | "@emotion/cache": { 1907 | "version": "11.7.1", 1908 | "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", 1909 | "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", 1910 | "requires": { 1911 | "@emotion/memoize": "^0.7.4", 1912 | "@emotion/sheet": "^1.1.0", 1913 | "@emotion/utils": "^1.0.0", 1914 | "@emotion/weak-memoize": "^0.2.5", 1915 | "stylis": "4.0.13" 1916 | } 1917 | }, 1918 | "@emotion/css": { 1919 | "version": "11.7.1", 1920 | "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.7.1.tgz", 1921 | "integrity": "sha512-RUUgPlMZunlc7SE5A6Hg+VWRzb2cU6O9xlV78KCFgcnl25s7Qz/20oQg71iKudpLqk7xj0vhbJlwcJJMT0BOZg==", 1922 | "requires": { 1923 | "@emotion/babel-plugin": "^11.7.1", 1924 | "@emotion/cache": "^11.7.1", 1925 | "@emotion/serialize": "^1.0.0", 1926 | "@emotion/sheet": "^1.0.3", 1927 | "@emotion/utils": "^1.0.0" 1928 | } 1929 | }, 1930 | "@emotion/hash": { 1931 | "version": "0.8.0", 1932 | "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", 1933 | "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" 1934 | }, 1935 | "@emotion/memoize": { 1936 | "version": "0.7.5", 1937 | "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", 1938 | "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" 1939 | }, 1940 | "@emotion/serialize": { 1941 | "version": "1.0.2", 1942 | "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", 1943 | "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", 1944 | "requires": { 1945 | "@emotion/hash": "^0.8.0", 1946 | "@emotion/memoize": "^0.7.4", 1947 | "@emotion/unitless": "^0.7.5", 1948 | "@emotion/utils": "^1.0.0", 1949 | "csstype": "^3.0.2" 1950 | } 1951 | }, 1952 | "@emotion/sheet": { 1953 | "version": "1.1.0", 1954 | "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", 1955 | "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" 1956 | }, 1957 | "@emotion/unitless": { 1958 | "version": "0.7.5", 1959 | "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", 1960 | "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" 1961 | }, 1962 | "@emotion/utils": { 1963 | "version": "1.0.0", 1964 | "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", 1965 | "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" 1966 | }, 1967 | "@emotion/weak-memoize": { 1968 | "version": "0.2.5", 1969 | "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", 1970 | "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" 1971 | }, 1972 | "@rollup/pluginutils": { 1973 | "version": "4.1.1", 1974 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", 1975 | "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==", 1976 | "dev": true, 1977 | "requires": { 1978 | "estree-walker": "^2.0.1", 1979 | "picomatch": "^2.2.2" 1980 | } 1981 | }, 1982 | "@types/node": { 1983 | "version": "16.9.1", 1984 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", 1985 | "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", 1986 | "dev": true 1987 | }, 1988 | "@types/parse-json": { 1989 | "version": "4.0.0", 1990 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 1991 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" 1992 | }, 1993 | "@types/prop-types": { 1994 | "version": "15.7.4", 1995 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", 1996 | "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==", 1997 | "dev": true 1998 | }, 1999 | "@types/react": { 2000 | "version": "17.0.20", 2001 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.20.tgz", 2002 | "integrity": "sha512-wWZrPlihslrPpcKyCSlmIlruakxr57/buQN1RjlIeaaTWDLtJkTtRW429MoQJergvVKc4IWBpRhWw7YNh/7GVA==", 2003 | "dev": true, 2004 | "requires": { 2005 | "@types/prop-types": "*", 2006 | "@types/scheduler": "*", 2007 | "csstype": "^3.0.2" 2008 | } 2009 | }, 2010 | "@types/react-dom": { 2011 | "version": "17.0.9", 2012 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.9.tgz", 2013 | "integrity": "sha512-wIvGxLfgpVDSAMH5utdL9Ngm5Owu0VsGmldro3ORLXV8CShrL8awVj06NuEXFQ5xyaYfdca7Sgbk/50Ri1GdPg==", 2014 | "dev": true, 2015 | "requires": { 2016 | "@types/react": "*" 2017 | } 2018 | }, 2019 | "@types/scheduler": { 2020 | "version": "0.16.2", 2021 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 2022 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", 2023 | "dev": true 2024 | }, 2025 | "@vitejs/plugin-react-refresh": { 2026 | "version": "1.3.6", 2027 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-refresh/-/plugin-react-refresh-1.3.6.tgz", 2028 | "integrity": "sha512-iNR/UqhUOmFFxiezt0em9CgmiJBdWR+5jGxB2FihaoJfqGt76kiwaKoVOJVU5NYcDWMdN06LbyN2VIGIoYdsEA==", 2029 | "dev": true, 2030 | "requires": { 2031 | "@babel/core": "^7.14.8", 2032 | "@babel/plugin-transform-react-jsx-self": "^7.14.5", 2033 | "@babel/plugin-transform-react-jsx-source": "^7.14.5", 2034 | "@rollup/pluginutils": "^4.1.1", 2035 | "react-refresh": "^0.10.0" 2036 | } 2037 | }, 2038 | "ansi-styles": { 2039 | "version": "3.2.1", 2040 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2041 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2042 | "requires": { 2043 | "color-convert": "^1.9.0" 2044 | } 2045 | }, 2046 | "anymatch": { 2047 | "version": "3.1.2", 2048 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 2049 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 2050 | "dev": true, 2051 | "requires": { 2052 | "normalize-path": "^3.0.0", 2053 | "picomatch": "^2.0.4" 2054 | } 2055 | }, 2056 | "babel-plugin-macros": { 2057 | "version": "2.8.0", 2058 | "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", 2059 | "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", 2060 | "requires": { 2061 | "@babel/runtime": "^7.7.2", 2062 | "cosmiconfig": "^6.0.0", 2063 | "resolve": "^1.12.0" 2064 | } 2065 | }, 2066 | "binary-extensions": { 2067 | "version": "2.2.0", 2068 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 2069 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 2070 | "dev": true 2071 | }, 2072 | "braces": { 2073 | "version": "3.0.2", 2074 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2075 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2076 | "dev": true, 2077 | "requires": { 2078 | "fill-range": "^7.0.1" 2079 | } 2080 | }, 2081 | "browserslist": { 2082 | "version": "4.17.0", 2083 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", 2084 | "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", 2085 | "requires": { 2086 | "caniuse-lite": "^1.0.30001254", 2087 | "colorette": "^1.3.0", 2088 | "electron-to-chromium": "^1.3.830", 2089 | "escalade": "^3.1.1", 2090 | "node-releases": "^1.1.75" 2091 | } 2092 | }, 2093 | "callsites": { 2094 | "version": "3.1.0", 2095 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 2096 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 2097 | }, 2098 | "caniuse-lite": { 2099 | "version": "1.0.30001256", 2100 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001256.tgz", 2101 | "integrity": "sha512-QirrvMLmB4txNnxiaG/xbm6FSzv9LqOZ3Jp9VtCYb3oPIfCHpr/oGn38pFq0udwlkctvXQgPthaXqJ76DaYGnA==" 2102 | }, 2103 | "chalk": { 2104 | "version": "2.4.2", 2105 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2106 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2107 | "requires": { 2108 | "ansi-styles": "^3.2.1", 2109 | "escape-string-regexp": "^1.0.5", 2110 | "supports-color": "^5.3.0" 2111 | } 2112 | }, 2113 | "chokidar": { 2114 | "version": "3.5.3", 2115 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2116 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2117 | "dev": true, 2118 | "requires": { 2119 | "anymatch": "~3.1.2", 2120 | "braces": "~3.0.2", 2121 | "fsevents": "~2.3.2", 2122 | "glob-parent": "~5.1.2", 2123 | "is-binary-path": "~2.1.0", 2124 | "is-glob": "~4.0.1", 2125 | "normalize-path": "~3.0.0", 2126 | "readdirp": "~3.6.0" 2127 | } 2128 | }, 2129 | "color-convert": { 2130 | "version": "1.9.3", 2131 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2132 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2133 | "requires": { 2134 | "color-name": "1.1.3" 2135 | } 2136 | }, 2137 | "color-name": { 2138 | "version": "1.1.3", 2139 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2140 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 2141 | }, 2142 | "colorette": { 2143 | "version": "1.4.0", 2144 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", 2145 | "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" 2146 | }, 2147 | "convert-source-map": { 2148 | "version": "1.8.0", 2149 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 2150 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 2151 | "requires": { 2152 | "safe-buffer": "~5.1.1" 2153 | } 2154 | }, 2155 | "cosmiconfig": { 2156 | "version": "6.0.0", 2157 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", 2158 | "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", 2159 | "requires": { 2160 | "@types/parse-json": "^4.0.0", 2161 | "import-fresh": "^3.1.0", 2162 | "parse-json": "^5.0.0", 2163 | "path-type": "^4.0.0", 2164 | "yaml": "^1.7.2" 2165 | } 2166 | }, 2167 | "csstype": { 2168 | "version": "3.0.8", 2169 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", 2170 | "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" 2171 | }, 2172 | "debug": { 2173 | "version": "4.3.2", 2174 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 2175 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 2176 | "requires": { 2177 | "ms": "2.1.2" 2178 | } 2179 | }, 2180 | "electron-to-chromium": { 2181 | "version": "1.3.836", 2182 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.836.tgz", 2183 | "integrity": "sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg==" 2184 | }, 2185 | "error-ex": { 2186 | "version": "1.3.2", 2187 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 2188 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 2189 | "requires": { 2190 | "is-arrayish": "^0.2.1" 2191 | } 2192 | }, 2193 | "esbuild": { 2194 | "version": "0.13.15", 2195 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz", 2196 | "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==", 2197 | "dev": true, 2198 | "requires": { 2199 | "esbuild-android-arm64": "0.13.15", 2200 | "esbuild-darwin-64": "0.13.15", 2201 | "esbuild-darwin-arm64": "0.13.15", 2202 | "esbuild-freebsd-64": "0.13.15", 2203 | "esbuild-freebsd-arm64": "0.13.15", 2204 | "esbuild-linux-32": "0.13.15", 2205 | "esbuild-linux-64": "0.13.15", 2206 | "esbuild-linux-arm": "0.13.15", 2207 | "esbuild-linux-arm64": "0.13.15", 2208 | "esbuild-linux-mips64le": "0.13.15", 2209 | "esbuild-linux-ppc64le": "0.13.15", 2210 | "esbuild-netbsd-64": "0.13.15", 2211 | "esbuild-openbsd-64": "0.13.15", 2212 | "esbuild-sunos-64": "0.13.15", 2213 | "esbuild-windows-32": "0.13.15", 2214 | "esbuild-windows-64": "0.13.15", 2215 | "esbuild-windows-arm64": "0.13.15" 2216 | } 2217 | }, 2218 | "esbuild-android-arm64": { 2219 | "version": "0.13.15", 2220 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz", 2221 | "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==", 2222 | "dev": true, 2223 | "optional": true 2224 | }, 2225 | "esbuild-darwin-64": { 2226 | "version": "0.13.15", 2227 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz", 2228 | "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==", 2229 | "dev": true, 2230 | "optional": true 2231 | }, 2232 | "esbuild-darwin-arm64": { 2233 | "version": "0.13.15", 2234 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz", 2235 | "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==", 2236 | "dev": true, 2237 | "optional": true 2238 | }, 2239 | "esbuild-freebsd-64": { 2240 | "version": "0.13.15", 2241 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz", 2242 | "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==", 2243 | "dev": true, 2244 | "optional": true 2245 | }, 2246 | "esbuild-freebsd-arm64": { 2247 | "version": "0.13.15", 2248 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz", 2249 | "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==", 2250 | "dev": true, 2251 | "optional": true 2252 | }, 2253 | "esbuild-linux-32": { 2254 | "version": "0.13.15", 2255 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz", 2256 | "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==", 2257 | "dev": true, 2258 | "optional": true 2259 | }, 2260 | "esbuild-linux-64": { 2261 | "version": "0.13.15", 2262 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz", 2263 | "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==", 2264 | "dev": true, 2265 | "optional": true 2266 | }, 2267 | "esbuild-linux-arm": { 2268 | "version": "0.13.15", 2269 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz", 2270 | "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==", 2271 | "dev": true, 2272 | "optional": true 2273 | }, 2274 | "esbuild-linux-arm64": { 2275 | "version": "0.13.15", 2276 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz", 2277 | "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==", 2278 | "dev": true, 2279 | "optional": true 2280 | }, 2281 | "esbuild-linux-mips64le": { 2282 | "version": "0.13.15", 2283 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz", 2284 | "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==", 2285 | "dev": true, 2286 | "optional": true 2287 | }, 2288 | "esbuild-linux-ppc64le": { 2289 | "version": "0.13.15", 2290 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz", 2291 | "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==", 2292 | "dev": true, 2293 | "optional": true 2294 | }, 2295 | "esbuild-netbsd-64": { 2296 | "version": "0.13.15", 2297 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz", 2298 | "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==", 2299 | "dev": true, 2300 | "optional": true 2301 | }, 2302 | "esbuild-openbsd-64": { 2303 | "version": "0.13.15", 2304 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz", 2305 | "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==", 2306 | "dev": true, 2307 | "optional": true 2308 | }, 2309 | "esbuild-sunos-64": { 2310 | "version": "0.13.15", 2311 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz", 2312 | "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==", 2313 | "dev": true, 2314 | "optional": true 2315 | }, 2316 | "esbuild-windows-32": { 2317 | "version": "0.13.15", 2318 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz", 2319 | "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==", 2320 | "dev": true, 2321 | "optional": true 2322 | }, 2323 | "esbuild-windows-64": { 2324 | "version": "0.13.15", 2325 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz", 2326 | "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==", 2327 | "dev": true, 2328 | "optional": true 2329 | }, 2330 | "esbuild-windows-arm64": { 2331 | "version": "0.13.15", 2332 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz", 2333 | "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==", 2334 | "dev": true, 2335 | "optional": true 2336 | }, 2337 | "escalade": { 2338 | "version": "3.1.1", 2339 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2340 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 2341 | }, 2342 | "escape-string-regexp": { 2343 | "version": "1.0.5", 2344 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2345 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 2346 | }, 2347 | "estree-walker": { 2348 | "version": "2.0.2", 2349 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 2350 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 2351 | "dev": true 2352 | }, 2353 | "fill-range": { 2354 | "version": "7.0.1", 2355 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2356 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2357 | "dev": true, 2358 | "requires": { 2359 | "to-regex-range": "^5.0.1" 2360 | } 2361 | }, 2362 | "find-root": { 2363 | "version": "1.1.0", 2364 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 2365 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" 2366 | }, 2367 | "fsevents": { 2368 | "version": "2.3.2", 2369 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2370 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2371 | "dev": true, 2372 | "optional": true 2373 | }, 2374 | "function-bind": { 2375 | "version": "1.1.1", 2376 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2377 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 2378 | }, 2379 | "gensync": { 2380 | "version": "1.0.0-beta.2", 2381 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2382 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" 2383 | }, 2384 | "glob-parent": { 2385 | "version": "5.1.2", 2386 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2387 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2388 | "dev": true, 2389 | "requires": { 2390 | "is-glob": "^4.0.1" 2391 | } 2392 | }, 2393 | "globals": { 2394 | "version": "11.12.0", 2395 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2396 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" 2397 | }, 2398 | "gradstop": { 2399 | "version": "2.2.3", 2400 | "resolved": "https://registry.npmjs.org/gradstop/-/gradstop-2.2.3.tgz", 2401 | "integrity": "sha512-omtiHZCI/vykWcXNDYdrHhe7VUnnZvya94wAHRLI8ciDkAviXYrT+pwP7ybYqK7uwYir59auBCY5ggwBlVSmsg==" 2402 | }, 2403 | "has": { 2404 | "version": "1.0.3", 2405 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2406 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2407 | "requires": { 2408 | "function-bind": "^1.1.1" 2409 | } 2410 | }, 2411 | "has-flag": { 2412 | "version": "3.0.0", 2413 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2414 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 2415 | }, 2416 | "immutable": { 2417 | "version": "4.0.0", 2418 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", 2419 | "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", 2420 | "dev": true 2421 | }, 2422 | "import-fresh": { 2423 | "version": "3.3.0", 2424 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2425 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2426 | "requires": { 2427 | "parent-module": "^1.0.0", 2428 | "resolve-from": "^4.0.0" 2429 | } 2430 | }, 2431 | "is-arrayish": { 2432 | "version": "0.2.1", 2433 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 2434 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 2435 | }, 2436 | "is-binary-path": { 2437 | "version": "2.1.0", 2438 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2439 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2440 | "dev": true, 2441 | "requires": { 2442 | "binary-extensions": "^2.0.0" 2443 | } 2444 | }, 2445 | "is-core-module": { 2446 | "version": "2.6.0", 2447 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", 2448 | "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", 2449 | "requires": { 2450 | "has": "^1.0.3" 2451 | } 2452 | }, 2453 | "is-extglob": { 2454 | "version": "2.1.1", 2455 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2456 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 2457 | "dev": true 2458 | }, 2459 | "is-glob": { 2460 | "version": "4.0.3", 2461 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2462 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2463 | "dev": true, 2464 | "requires": { 2465 | "is-extglob": "^2.1.1" 2466 | } 2467 | }, 2468 | "is-number": { 2469 | "version": "7.0.0", 2470 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2471 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2472 | "dev": true 2473 | }, 2474 | "js-tokens": { 2475 | "version": "4.0.0", 2476 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2477 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 2478 | }, 2479 | "jsesc": { 2480 | "version": "2.5.2", 2481 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2482 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" 2483 | }, 2484 | "json-parse-even-better-errors": { 2485 | "version": "2.3.1", 2486 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2487 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 2488 | }, 2489 | "json5": { 2490 | "version": "2.2.0", 2491 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", 2492 | "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", 2493 | "requires": { 2494 | "minimist": "^1.2.5" 2495 | } 2496 | }, 2497 | "lines-and-columns": { 2498 | "version": "1.2.4", 2499 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2500 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 2501 | }, 2502 | "loose-envify": { 2503 | "version": "1.4.0", 2504 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2505 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2506 | "requires": { 2507 | "js-tokens": "^3.0.0 || ^4.0.0" 2508 | } 2509 | }, 2510 | "minimist": { 2511 | "version": "1.2.5", 2512 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2513 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 2514 | }, 2515 | "ms": { 2516 | "version": "2.1.2", 2517 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2518 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2519 | }, 2520 | "nanoid": { 2521 | "version": "3.2.0", 2522 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 2523 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", 2524 | "dev": true 2525 | }, 2526 | "node-releases": { 2527 | "version": "1.1.75", 2528 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", 2529 | "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==" 2530 | }, 2531 | "normalize-path": { 2532 | "version": "3.0.0", 2533 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2534 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2535 | "dev": true 2536 | }, 2537 | "object-assign": { 2538 | "version": "4.1.1", 2539 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2540 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2541 | }, 2542 | "parent-module": { 2543 | "version": "1.0.1", 2544 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2545 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2546 | "requires": { 2547 | "callsites": "^3.0.0" 2548 | } 2549 | }, 2550 | "parse-json": { 2551 | "version": "5.2.0", 2552 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 2553 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 2554 | "requires": { 2555 | "@babel/code-frame": "^7.0.0", 2556 | "error-ex": "^1.3.1", 2557 | "json-parse-even-better-errors": "^2.3.0", 2558 | "lines-and-columns": "^1.1.6" 2559 | } 2560 | }, 2561 | "path-parse": { 2562 | "version": "1.0.7", 2563 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2564 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 2565 | }, 2566 | "path-type": { 2567 | "version": "4.0.0", 2568 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2569 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" 2570 | }, 2571 | "picocolors": { 2572 | "version": "1.0.0", 2573 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2574 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2575 | "dev": true 2576 | }, 2577 | "picomatch": { 2578 | "version": "2.3.0", 2579 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 2580 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 2581 | "dev": true 2582 | }, 2583 | "postcss": { 2584 | "version": "8.4.6", 2585 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", 2586 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", 2587 | "dev": true, 2588 | "requires": { 2589 | "nanoid": "^3.2.0", 2590 | "picocolors": "^1.0.0", 2591 | "source-map-js": "^1.0.2" 2592 | } 2593 | }, 2594 | "react": { 2595 | "version": "17.0.2", 2596 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 2597 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 2598 | "requires": { 2599 | "loose-envify": "^1.1.0", 2600 | "object-assign": "^4.1.1" 2601 | } 2602 | }, 2603 | "react-dom": { 2604 | "version": "17.0.2", 2605 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 2606 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 2607 | "requires": { 2608 | "loose-envify": "^1.1.0", 2609 | "object-assign": "^4.1.1", 2610 | "scheduler": "^0.20.2" 2611 | } 2612 | }, 2613 | "react-refresh": { 2614 | "version": "0.10.0", 2615 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.10.0.tgz", 2616 | "integrity": "sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==", 2617 | "dev": true 2618 | }, 2619 | "readdirp": { 2620 | "version": "3.6.0", 2621 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2622 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2623 | "dev": true, 2624 | "requires": { 2625 | "picomatch": "^2.2.1" 2626 | } 2627 | }, 2628 | "regenerator-runtime": { 2629 | "version": "0.13.9", 2630 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 2631 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 2632 | }, 2633 | "resolve": { 2634 | "version": "1.20.0", 2635 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 2636 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 2637 | "requires": { 2638 | "is-core-module": "^2.2.0", 2639 | "path-parse": "^1.0.6" 2640 | } 2641 | }, 2642 | "resolve-from": { 2643 | "version": "4.0.0", 2644 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2645 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 2646 | }, 2647 | "rollup": { 2648 | "version": "2.67.0", 2649 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.0.tgz", 2650 | "integrity": "sha512-W83AaERwvDiHwHEF/dfAfS3z1Be5wf7n+pO3ZAO5IQadCT2lBTr7WQ2MwZZe+nodbD+n3HtC4OCOAdsOPPcKZQ==", 2651 | "dev": true, 2652 | "requires": { 2653 | "fsevents": "~2.3.2" 2654 | } 2655 | }, 2656 | "safe-buffer": { 2657 | "version": "5.1.2", 2658 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2659 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2660 | }, 2661 | "sass": { 2662 | "version": "1.49.7", 2663 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.7.tgz", 2664 | "integrity": "sha512-13dml55EMIR2rS4d/RDHHP0sXMY3+30e1TKsyXaSz3iLWVoDWEoboY8WzJd5JMnxrRHffKO3wq2mpJ0jxRJiEQ==", 2665 | "dev": true, 2666 | "requires": { 2667 | "chokidar": ">=3.0.0 <4.0.0", 2668 | "immutable": "^4.0.0", 2669 | "source-map-js": ">=0.6.2 <2.0.0" 2670 | } 2671 | }, 2672 | "scheduler": { 2673 | "version": "0.20.2", 2674 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 2675 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 2676 | "requires": { 2677 | "loose-envify": "^1.1.0", 2678 | "object-assign": "^4.1.1" 2679 | } 2680 | }, 2681 | "semver": { 2682 | "version": "6.3.0", 2683 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2684 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 2685 | }, 2686 | "source-map": { 2687 | "version": "0.5.7", 2688 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2689 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 2690 | }, 2691 | "source-map-js": { 2692 | "version": "1.0.2", 2693 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2694 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 2695 | "dev": true 2696 | }, 2697 | "stylis": { 2698 | "version": "4.0.13", 2699 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", 2700 | "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" 2701 | }, 2702 | "supports-color": { 2703 | "version": "5.5.0", 2704 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2705 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2706 | "requires": { 2707 | "has-flag": "^3.0.0" 2708 | } 2709 | }, 2710 | "to-fast-properties": { 2711 | "version": "2.0.0", 2712 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2713 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" 2714 | }, 2715 | "to-regex-range": { 2716 | "version": "5.0.1", 2717 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2718 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2719 | "dev": true, 2720 | "requires": { 2721 | "is-number": "^7.0.0" 2722 | } 2723 | }, 2724 | "typescript": { 2725 | "version": "4.5.5", 2726 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", 2727 | "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", 2728 | "dev": true 2729 | }, 2730 | "vite": { 2731 | "version": "2.7.13", 2732 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.7.13.tgz", 2733 | "integrity": "sha512-Mq8et7f3aK0SgSxjDNfOAimZGW9XryfHRa/uV0jseQSilg+KhYDSoNb9h1rknOy6SuMkvNDLKCYAYYUMCE+IgQ==", 2734 | "dev": true, 2735 | "requires": { 2736 | "esbuild": "^0.13.12", 2737 | "fsevents": "~2.3.2", 2738 | "postcss": "^8.4.5", 2739 | "resolve": "^1.20.0", 2740 | "rollup": "^2.59.0" 2741 | } 2742 | }, 2743 | "yaml": { 2744 | "version": "1.10.2", 2745 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2746 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" 2747 | } 2748 | } 2749 | } 2750 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo-vite", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "tsc && vite build", 7 | "serve": "vite preview" 8 | }, 9 | "dependencies": { 10 | "@emotion/css": "^11.7.1", 11 | "gradstop": "^2.2.3", 12 | "react": "^17.0.0", 13 | "react-dom": "^17.0.0" 14 | }, 15 | "devDependencies": { 16 | "@types/node": "^16.9.1", 17 | "@types/react": "^17.0.0", 18 | "@types/react-dom": "^17.0.0", 19 | "@vitejs/plugin-react-refresh": "^1.3.6", 20 | "sass": "^1.49.7", 21 | "typescript": "^4.5.5", 22 | "vite": "^2.7.13" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /example/src/conical-gradient/conical-gradient.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:math'; 2 | 3 | .conical-gauge-wrapper { 4 | $chart-size: 400px; 5 | $chart-padding: 100px; 6 | $label-width: 160px; 7 | $font-family: 'Open Sans', sans-serif; 8 | $color-accent: #7199e3; 9 | $color-white: #fff; 10 | $color-text: #0f3e48; 11 | 12 | background-color: $color-white; 13 | width: $chart-size + $chart-padding; 14 | height: $chart-size + $chart-padding; 15 | font-family: $font-family; 16 | position: relative; 17 | 18 | .conical-gauge { 19 | position: relative; 20 | width: $chart-size; 21 | height: $chart-size; 22 | left: math.div($chart-padding, 2); 23 | top: math.div($chart-padding, 2); 24 | } 25 | 26 | .label { 27 | color: $color-text; 28 | font-size: 66px; 29 | letter-spacing: -1.5px; 30 | position: absolute; 31 | left: 50%; 32 | top: 50%; 33 | transform: translate(-50%, -60%); 34 | } 35 | 36 | .controls { 37 | position: absolute; 38 | display: flex; 39 | left: 50%; 40 | transform: translateX(-50%); 41 | bottom: 65px; 42 | 43 | .control { 44 | font-size: 16px; 45 | padding: 3px 20px; 46 | text-decoration: none; 47 | border: 1px solid $color-accent; 48 | color: $color-accent; 49 | font-family: $font-family; 50 | text-align: center; 51 | cursor: pointer; 52 | background-color: $color-white; 53 | transition: 0.2s all; 54 | 55 | &:first-child { 56 | border-radius: 7px 0 0 7px; 57 | } 58 | 59 | &:not(:first-child) { 60 | margin-left: -2px; 61 | } 62 | 63 | &:last-child { 64 | border-radius: 0 7px 7px 0; 65 | } 66 | 67 | &:focus { 68 | box-shadow: none; 69 | outline: none; 70 | background-color: $color-accent; 71 | border-color: $color-accent; 72 | color: $color-white; 73 | } 74 | 75 | &::-moz-focus-inner { 76 | border: 0; 77 | } 78 | 79 | &:active { 80 | background-color: darken($color-accent, 10%); 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /example/src/conical-gradient/conical-gradient.ts: -------------------------------------------------------------------------------- 1 | import './conical-gradient.scss'; 2 | import { cubicBezier, Gauge } from '../../../src'; 3 | import gradstop from 'gradstop'; 4 | 5 | function clamp(from: number, to: number, value: number) { 6 | if (value < from) { 7 | return from; 8 | } 9 | if (value > to) { 10 | return to; 11 | } 12 | return value; 13 | } 14 | 15 | function updatePercentNode(value: number) { 16 | const element = document.querySelector('.label') as HTMLElement; 17 | element.innerHTML = parseInt(value.toString()) + '%'; 18 | } 19 | 20 | function setControlDisabled(disabled: boolean) { 21 | Array.from(document.querySelectorAll('.control')).forEach(node => { 22 | if (disabled) { 23 | node.setAttribute('disabled', ''); 24 | } else { 25 | node.removeAttribute('disabled'); 26 | } 27 | }); 28 | } 29 | 30 | document.addEventListener('DOMContentLoaded', () => { 31 | const step = 70; 32 | const fromAngle = 220; 33 | const toAngle = 500; 34 | const maxValue = toAngle - fromAngle; 35 | let value = maxValue * 0.2; 36 | updatePercentNode((value / maxValue) * 100); 37 | const container = document.querySelector('.conical-gauge') as HTMLElement; 38 | const sharedConfig = { 39 | lineWidth: 4, 40 | container, 41 | fromAngle, 42 | toAngle, 43 | easing: cubicBezier(0.165, 0.84, 0.44, 1) 44 | }; 45 | 46 | const gaugeBackground = new Gauge({ 47 | ...sharedConfig, 48 | color: '#f5f5f5' 49 | }); 50 | gaugeBackground.setValue(maxValue); 51 | 52 | const gaugeMain = new Gauge({ 53 | ...sharedConfig, 54 | colors: gradstop({ 55 | stops: maxValue, 56 | colorArray: ['#D16BA5', '#86A8E7', '#5FFBF1'] 57 | }) 58 | }); 59 | gaugeMain.setValue(value); 60 | 61 | const controls = document.querySelector('.controls') as HTMLElement; 62 | controls.addEventListener('click', event => { 63 | setControlDisabled(true); 64 | const target = event.target as HTMLElement; 65 | if (target.classList.contains('increase')) { 66 | value = clamp(0, maxValue, value + step); 67 | } 68 | if (target.classList.contains('decrease')) { 69 | value = clamp(0, maxValue, value - step); 70 | } 71 | gaugeMain.setValue(value).then(() => { 72 | setControlDisabled(false); 73 | }); 74 | updatePercentNode((value / maxValue) * 100); 75 | }); 76 | }); 77 | -------------------------------------------------------------------------------- /example/src/conical-gradient/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Conical gradient 4 | 5 | 6 | 7 |
8 |
9 | 10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 | -------------------------------------------------------------------------------- /example/src/countdown-gauge/countdown-gauge.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:math'; 2 | 3 | .countdown-gauge-background { 4 | $chart-size: 400px; 5 | $chart-padding: 100px; 6 | $label-width: 160px; 7 | 8 | background-color: white; 9 | width: $chart-size + $chart-padding; 10 | height: $chart-size + $chart-padding; 11 | font-family: 'Open Sans', sans-serif; 12 | 13 | .timer { 14 | position: absolute; 15 | font-size: 6em; 16 | top: 50%; 17 | left: 50%; 18 | transform: translate(-50%, -55%); 19 | color: #fd9eaa; 20 | } 21 | 22 | .countdown-gauge { 23 | position: relative; 24 | width: $chart-size; 25 | height: $chart-size; 26 | left: math.div($chart-padding, 2); 27 | top: math.div($chart-padding, 2); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /example/src/countdown-gauge/countdown-gauge.ts: -------------------------------------------------------------------------------- 1 | import { cubicBezier, Gauge } from '../../../src'; 2 | import './countdown-gauge.scss'; 3 | 4 | const linear = cubicBezier(0, 0, 1, 1); 5 | const easeIn = cubicBezier(0, 0, 0.2, 1); 6 | 7 | function updateTimerNode(value: number) { 8 | const timer = document.querySelector('.timer') as HTMLElement; 9 | timer.innerHTML = value.toString(); 10 | } 11 | 12 | function wait(ms: number) { 13 | return new Promise(resolve => setTimeout(resolve, ms)); 14 | } 15 | 16 | document.addEventListener('DOMContentLoaded', async () => { 17 | let timer = 5; 18 | updateTimerNode(timer); 19 | const container = document.querySelector('.countdown-gauge') as HTMLElement; 20 | const sharedConfig = { 21 | container, 22 | gaugeRadius: 45, 23 | lineWidth: 1, 24 | fromAngle: 0, 25 | toAngle: 360, 26 | animationDuration: 5000, 27 | easing: linear 28 | }; 29 | const maxValue = sharedConfig.toAngle - sharedConfig.fromAngle; 30 | const gaugeBackground = new Gauge({ 31 | ...sharedConfig, 32 | color: '#ebebeb', 33 | animationDuration: 0 34 | }); 35 | 36 | gaugeBackground.setValue(maxValue); 37 | 38 | const mainGauge = new Gauge({ 39 | ...sharedConfig, 40 | color: '#fd9eaa' 41 | }); 42 | 43 | await mainGauge.setValue(maxValue, { animationDuration: 0 }); 44 | await wait(2000); 45 | const interval = setInterval(() => { 46 | timer--; 47 | updateTimerNode(timer); 48 | }, 1000); 49 | 50 | await mainGauge.setValue(0, { easing: linear }); 51 | clearInterval(interval); 52 | timer = 0; 53 | updateTimerNode(timer); 54 | 55 | await mainGauge.setValue(maxValue, { 56 | easing: easeIn, 57 | animationDelay: 600, 58 | animationDuration: 600 59 | }); 60 | 61 | await wait(500); 62 | timer = 5; 63 | updateTimerNode(timer); 64 | }); 65 | 66 | -------------------------------------------------------------------------------- /example/src/countdown-gauge/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Timeout gauge 4 | 5 | 6 | 7 |
8 |
9 | 10 |
11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /example/src/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /example/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | -------------------------------------------------------------------------------- /example/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /example/src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import './index.css' 4 | 5 | ReactDOM.render( 6 | 7 |

Main. See README for more info

8 |
, 9 | document.getElementById('root') 10 | ) 11 | -------------------------------------------------------------------------------- /example/src/multiple-gauges/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Multiple gauge 4 | 5 | 6 | 7 |
8 |
9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /example/src/multiple-gauges/multiple-gauge.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:math'; 2 | 3 | .gauge-background { 4 | $chart-size: 400px; 5 | $chart-padding: 100px; 6 | $label-width: 160px; 7 | 8 | background-color: white; 9 | width: $chart-size + $chart-padding; 10 | height: $chart-size + $chart-padding; 11 | font-family: 'Open Sans', sans-serif; 12 | 13 | .label { 14 | position: absolute; 15 | text-align: right; 16 | font-weight: bold; 17 | width: $label-width; 18 | } 19 | 20 | .multiple-gauge { 21 | position: relative; 22 | width: $chart-size; 23 | height: $chart-size; 24 | left: math.div($chart-padding, 2); 25 | top: math.div($chart-padding, 2); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /example/src/multiple-gauges/multiple-gauge.ts: -------------------------------------------------------------------------------- 1 | import './multiple-gauge.scss'; 2 | import { calcCoordinatesFromAngle, Gauge } from '../../../src'; 3 | 4 | function renderLabel(gauge: Gauge, label: string, color: string) { 5 | const { metadata } = gauge.getElementAtValue(0); 6 | const labelWidth = 170; 7 | const left = `${metadata.relativeLeft - labelWidth}px`; 8 | const top = `${metadata.relativeTop + 1}px`; 9 | const html = `${label}`; 10 | gauge.insertAdjacentToRoot('beforeend', html); 11 | } 12 | 13 | function renderPercents(gauge: Gauge, maxValue: number) { 14 | for (let i = 0; i <= 100; i += 10) { 15 | const { metadata } = gauge.getElementAtValue( 16 | i < 100 ? Math.floor((i / 100) * maxValue) : maxValue - 1 17 | ); 18 | const { x, y } = calcCoordinatesFromAngle(50, metadata.angle); 19 | const left = `${metadata.relativeLeft + x}px`; 20 | const top = `${metadata.relativeTop + y * 0.9}px`; 21 | const html = `${i}%`; 22 | gauge.insertAdjacentToRoot('beforeend', html); 23 | } 24 | } 25 | 26 | function randomBetween(from: number, to: number, except?: number): number { 27 | const random = Math.floor(Math.random() * (to - from + 1)) + from; 28 | if (except !== undefined && random === except) { 29 | return randomBetween(from, to, except); 30 | } 31 | return random; 32 | } 33 | 34 | document.addEventListener('DOMContentLoaded', () => { 35 | const fromAngle = 0; 36 | const toAngle = 270; 37 | const maxValue = toAngle - fromAngle; 38 | const container = document.querySelector('.multiple-gauge') as HTMLElement; 39 | const sharedConfig = { 40 | fromAngle, 41 | toAngle, 42 | container 43 | }; 44 | const backgroundConfig = { 45 | ...sharedConfig, 46 | color: '#ebebeb' 47 | }; 48 | 49 | const gaugeHumanBackground = new Gauge({ 50 | ...backgroundConfig, 51 | gaugeRadius: 45 52 | }); 53 | gaugeHumanBackground.setValue(maxValue).then(() => { 54 | renderLabel(gaugeHumanBackground, 'Human Resources', '#8067dc'); 55 | renderPercents(gaugeHumanBackground, maxValue); 56 | }); 57 | const gaugeHumanMain = new Gauge({ 58 | ...sharedConfig, 59 | color: '#8067dc', 60 | gaugeRadius: 45 61 | }); 62 | gaugeHumanMain.setValue(10); 63 | 64 | const gaugeDistributionBackground = new Gauge({ 65 | ...backgroundConfig, 66 | gaugeRadius: 36 67 | }); 68 | gaugeDistributionBackground.setValue(maxValue).then(() => { 69 | renderLabel(gaugeDistributionBackground, 'Distribution', '#6870db'); 70 | }); 71 | const gaugeDistributionMain = new Gauge({ 72 | ...sharedConfig, 73 | color: '#6870db', 74 | gaugeRadius: 36 75 | }); 76 | gaugeDistributionMain.setValue(maxValue * 0.9); 77 | 78 | const gaugeMarketingBackground = new Gauge({ 79 | ...backgroundConfig, 80 | gaugeRadius: 27 81 | }); 82 | gaugeMarketingBackground.setValue(maxValue).then(() => { 83 | renderLabel(gaugeMarketingBackground, 'Marketing', '#6894dd'); 84 | }); 85 | const gaugeMarketingMain = new Gauge({ 86 | ...sharedConfig, 87 | color: '#6894dd', 88 | gaugeRadius: 27 89 | }); 90 | gaugeMarketingMain.setValue(maxValue * 0.33); 91 | 92 | const gaugeResearchBackground = new Gauge({ 93 | ...backgroundConfig, 94 | gaugeRadius: 18 95 | }); 96 | gaugeResearchBackground.setValue(maxValue).then(() => { 97 | renderLabel(gaugeResearchBackground, 'Research', '#67b7dc'); 98 | }); 99 | const gaugeResearchMain = new Gauge({ 100 | ...sharedConfig, 101 | color: '#67b7dc', 102 | gaugeRadius: 18 103 | }); 104 | gaugeResearchMain.setValue(maxValue * 0.72); 105 | 106 | const gauges = [ 107 | gaugeHumanMain, 108 | gaugeResearchMain, 109 | gaugeMarketingMain, 110 | gaugeDistributionMain 111 | ]; 112 | const animationOptions = { animationDuration: 900 }; 113 | setInterval(() => { 114 | const i = randomBetween(0, 3); 115 | const j = randomBetween(0, 3, i); 116 | gauges[i].setValue(maxValue * Math.random(), animationOptions); 117 | gauges[j].setValue(maxValue * Math.random(), animationOptions); 118 | }, 2000); 119 | }); 120 | -------------------------------------------------------------------------------- /example/src/progress-with-shadow-chart/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /example/src/progress-with-shadow-chart/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import { ProgressWithShadowChart } from './progress-with-shadow-chart' 4 | import { css } from '@emotion/css'; 5 | 6 | ReactDOM.render( 7 | 8 |
9 | 10 |
11 |
, 12 | document.getElementById('root') 13 | ) -------------------------------------------------------------------------------- /example/src/progress-with-shadow-chart/progress-with-shadow-chart.tsx: -------------------------------------------------------------------------------- 1 | import '../index.css'; 2 | import React, { useEffect, useRef } from 'react'; 3 | import { css } from '@emotion/css'; 4 | import { cubicBezier, Gauge } from '../../../src'; 5 | 6 | const chartColors = { 7 | main: 'rgb(255, 105, 38)', 8 | background: 'rgb(254, 243, 239)', 9 | white: '#fff', 10 | }; 11 | 12 | const chartSize = 90; 13 | const chartPadding = 30; 14 | 15 | type Props = { 16 | percentValue: number; 17 | }; 18 | 19 | export const ProgressWithShadowChart = (props: Props) => { 20 | const percentValue = props.percentValue; 21 | const ref = useRef(null); 22 | 23 | useEffect(() => { 24 | if (!ref.current) { 25 | return; 26 | } 27 | 28 | const fromAngle = 0; 29 | const toAngle = 360; 30 | const maxValue = toAngle - fromAngle; 31 | const value = (maxValue * percentValue) / 100; 32 | 33 | const sharedConfig = { 34 | lineWidth: 4, 35 | container: ref.current, 36 | fromAngle, 37 | toAngle, 38 | easing: cubicBezier(0.165, 0.84, 0.44, 1), 39 | }; 40 | 41 | const gaugeBackground = new Gauge({ 42 | ...sharedConfig, 43 | color: chartColors.background, 44 | }); 45 | gaugeBackground.setValue(maxValue); 46 | 47 | const gaugeMain = new Gauge({ 48 | ...sharedConfig, 49 | color: chartColors.main, 50 | }); 51 | gaugeMain.setValue(value); 52 | 53 | return () => { 54 | gaugeBackground.dispose(); 55 | gaugeMain.dispose(); 56 | }; 57 | }, []); 58 | 59 | return ( 60 |
70 |
82 |
100 |  {percentValue}% 101 |
102 |
103 |
104 | ); 105 | }; 106 | -------------------------------------------------------------------------------- /example/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare module 'gradstop'; -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": false, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react" 18 | }, 19 | "include": ["./src"] 20 | } 21 | -------------------------------------------------------------------------------- /example/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from 'path' 2 | import { defineConfig } from 'vite' 3 | import reactRefresh from '@vitejs/plugin-react-refresh' 4 | 5 | const root = resolve(__dirname, 'src') 6 | const outDir = resolve(__dirname, 'dist') 7 | 8 | // https://vitejs.dev/config/ 9 | export default defineConfig({ 10 | root, 11 | plugins: [reactRefresh()], 12 | build: { 13 | outDir, 14 | emptyOutDir: true, 15 | rollupOptions: { 16 | input: { 17 | main: resolve(root, 'index.html'), 18 | } 19 | } 20 | } 21 | }) 22 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: { 3 | '^.+\\.ts$': 'ts-jest' 4 | }, 5 | testRegex: '/(src|test)/.*\\.test\\.ts$', 6 | moduleFileExtensions: ['ts', 'js', 'json', 'node'] 7 | }; 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gauge-chart-js", 3 | "version": "2.0.1", 4 | "description": "A tiny library for rendering gauge charts. Supports conical/polar gradients, animation timing functions, custom labels/tooltips.", 5 | "main": "dist/index.js", 6 | "module": "dist/gauge-chart-js.esm.js", 7 | "scripts": { 8 | "test": "jest", 9 | "test:watch": "jest --watch", 10 | "bundlesize": "bundlesize", 11 | "typecheck": "tsc", 12 | "build": "rollup -c", 13 | "prepare": "npm run build" 14 | }, 15 | "types": "dist/gauge-chart-js.d.ts", 16 | "keywords": [ 17 | "gauge", 18 | "chart", 19 | "conical gradient", 20 | "polar gradient", 21 | "circle progress" 22 | ], 23 | "author": "http://github.com/kubk", 24 | "repository": "https://github.com/kubk/gauge-chart-js", 25 | "license": "ISC", 26 | "devDependencies": { 27 | "@rollup/plugin-node-resolve": "^13.1.3", 28 | "@rollup/plugin-typescript": "^8.3.0", 29 | "@types/jest": "^24.0.18", 30 | "bundlesize": "^0.18.0", 31 | "jest": "^24.9.0", 32 | "prettier": "^1.18.2", 33 | "rollup": "^2.66.0", 34 | "rollup-plugin-dts": "^4.1.0", 35 | "rollup-plugin-terser": "^7.0.2", 36 | "ts-jest": "^24.1.0", 37 | "typescript": "^4.5.5" 38 | }, 39 | "bundlesize": [ 40 | { 41 | "path": "./dist/index.js", 42 | "maxSize": "2 kB" 43 | } 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import resolve from '@rollup/plugin-node-resolve'; 2 | import typescript from '@rollup/plugin-typescript'; 3 | import dts from 'rollup-plugin-dts'; 4 | import { terser } from "rollup-plugin-terser"; 5 | 6 | const packageJson = require('./package.json'); 7 | 8 | export default [ 9 | { 10 | input: 'src/index.ts', 11 | output: [ 12 | { 13 | file: packageJson.main, 14 | format: 'cjs', 15 | sourcemap: true, 16 | }, 17 | { 18 | file: packageJson.module, 19 | format: 'esm', 20 | sourcemap: true, 21 | }, 22 | ], 23 | plugins: [ 24 | resolve(), 25 | terser({ format: { comments: false } }), 26 | typescript({ tsconfig: './tsconfig.json' }), 27 | ], 28 | }, 29 | { 30 | input: './dist/types/index.d.ts', 31 | output: [{ file: packageJson.types, format: 'es' }], 32 | plugins: [dts()], 33 | }, 34 | ]; -------------------------------------------------------------------------------- /src/gauge.test.ts: -------------------------------------------------------------------------------- 1 | import { Gauge } from './gauge'; 2 | 3 | const initialHtml = `
`; 4 | document.body.innerHTML = initialHtml; 5 | 6 | describe('Gauge', () => { 7 | const container = document.querySelector('.gauge') as HTMLElement; 8 | 9 | it('should throw when required arguments are missing', () => { 10 | expect(() => { 11 | const gauge = new Gauge({} as any); 12 | }).toThrow(); 13 | 14 | expect(() => { 15 | const gauge = new Gauge({ container }); 16 | }).toThrow(); 17 | }); 18 | 19 | it('should render gauge', cb => { 20 | const gauge = new Gauge({ 21 | container, 22 | color: '#f00' 23 | }); 24 | gauge.setValue(50).then(() => { 25 | expect(document.body.innerHTML).not.toBe(initialHtml); 26 | cb(); 27 | }); 28 | }); 29 | 30 | it('should allow to get element metadata', cb => { 31 | const gauge = new Gauge({ 32 | container, 33 | color: '#f00' 34 | }); 35 | gauge.setValue(50).then(() => { 36 | const point1 = gauge.getElementAtValue(1); 37 | const point2 = gauge.getElementAtValue(40); 38 | expect(point1.metadata.angle).toBeLessThan(point2.metadata.angle); 39 | cb(); 40 | }); 41 | }); 42 | 43 | it('should be disposable', cb => { 44 | const gauge = new Gauge({ 45 | container, 46 | color: '#f00' 47 | }); 48 | let htmlAfterSetValue: string; 49 | gauge 50 | .setValue(50) 51 | .then(() => { 52 | htmlAfterSetValue = document.body.innerHTML; 53 | gauge.dispose(); 54 | return gauge.setValue(10); 55 | }) 56 | .then(() => { 57 | expect(htmlAfterSetValue).toBe(document.body.innerHTML); 58 | cb(); 59 | }); 60 | }); 61 | }); 62 | -------------------------------------------------------------------------------- /src/gauge.ts: -------------------------------------------------------------------------------- 1 | import { requestTimeout } from './request-timeout'; 2 | import { calcCoordinatesFromAngle, cubicBezier, Easing } from './math'; 3 | 4 | export type Config = { 5 | // The HTML element that act as a container for the gauge 6 | container: HTMLElement; 7 | // Gauge start angle in degrees 8 | fromAngle?: number; 9 | // Gauge end angle in degrees 10 | toAngle?: number; 11 | // Animation duration in milliseconds 12 | animationDuration?: number; 13 | // Animation delay in milliseconds. Pass 0 for no animation. 14 | animationDelay?: number; 15 | // Thickness of the gauge 16 | lineWidth?: number; 17 | // The easing function that will be used when animating 18 | easing?: Easing; 19 | // Gauge radius 20 | gaugeRadius?: number; 21 | // Gauge color supported by SVG's fill attribute 22 | color?: string; 23 | // Gauge colors supported by SVG's fill attribute 24 | colors?: string[]; 25 | } 26 | 27 | export type GaugeItem = { 28 | element: SVGCircleElement; 29 | metadata: { 30 | // Difference between gauge left coordinate and parent's left coordinate 31 | relativeLeft: number; 32 | // Difference between gauge top coordinate and parent's top coordinate 33 | relativeTop: number; 34 | // Rotation angle of the element 35 | angle: number; 36 | }; 37 | } 38 | 39 | export type AnimationOptions = Pick< 40 | Config, 41 | 'animationDuration' | 'animationDelay' | 'easing' 42 | >; 43 | 44 | export class Gauge { 45 | private readonly config: Required>; 46 | private readonly root: SVGElement; 47 | private readonly leftTopOffset = 50; 48 | private readonly maxEasing = 1; 49 | private isAnimating = false; 50 | private isDisposed = false; 51 | 52 | constructor(config: Config) { 53 | if (!config.container) { 54 | throw new Error( 55 | 'Container element not found. Make sure container is initialized before creating Gauge' 56 | ); 57 | } 58 | if (!config.colors && !config.color) { 59 | throw new Error( 60 | 'Color is not specified. Use `color` or `colors` property to specify the color' 61 | ); 62 | } 63 | 64 | const root = this.createRootSvgElement(); 65 | config.container.appendChild(root); 66 | this.root = root; 67 | 68 | const fromAngle = config.fromAngle === undefined ? 220 : config.fromAngle; 69 | const toAngle = config.toAngle === undefined ? 500 : config.toAngle; 70 | const animationDuration = config.animationDuration; 71 | 72 | this.config = { 73 | ...config, 74 | fromAngle, 75 | toAngle, 76 | easing: config.easing || cubicBezier(0, 0, 0.2, 1), 77 | lineWidth: config.lineWidth || 3.5, 78 | gaugeRadius: config.gaugeRadius || 35, 79 | animationDelay: config.animationDelay || 0, 80 | animationDuration: animationDuration === undefined ? 600 : animationDuration, 81 | colors: config.colors || Array(toAngle - fromAngle).fill(config.color) 82 | }; 83 | } 84 | 85 | private createRootSvgElement(): SVGElement { 86 | const root = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); 87 | root.setAttribute('viewBox', '0 0 100 100'); 88 | root.style.position = 'absolute'; 89 | return root; 90 | } 91 | 92 | private getAnimation(options: AnimationOptions) { 93 | return { 94 | easing: options.easing || this.config.easing, 95 | animationDelay: 96 | options.animationDelay === undefined 97 | ? this.config.animationDelay 98 | : options.animationDelay, 99 | animationDuration: 100 | options.animationDuration === undefined 101 | ? this.config.animationDuration 102 | : options.animationDuration 103 | }; 104 | } 105 | 106 | setValue(value: number, options: AnimationOptions = {}): Promise { 107 | if (this.isDisposed || this.isAnimating) { 108 | return Promise.resolve(); 109 | } 110 | const { fromAngle, toAngle } = this.config; 111 | const { easing, animationDuration, animationDelay } = this.getAnimation(options); 112 | const maximumAllowedValue = toAngle - fromAngle; 113 | if (value > maximumAllowedValue) { 114 | value = maximumAllowedValue; 115 | } 116 | const animate = animationDuration > 0; 117 | const diff = value - this.root.childNodes.length; 118 | // Skip rendering because nothing changed 119 | if (diff === 0) { 120 | return Promise.resolve(); 121 | } 122 | 123 | this.isAnimating = true; 124 | if (diff < 0) { 125 | return new Promise(resolve => { 126 | const reversed = Array.from(this.root.childNodes) 127 | .slice(diff) 128 | .reverse(); 129 | reversed.forEach((child, i) => { 130 | if (this.isDisposed) { 131 | resolve(); 132 | return; 133 | } 134 | const timeFraction = (i * this.maxEasing) / reversed.length; 135 | const timeout = animate ? easing(timeFraction) * animationDuration : 0; 136 | requestTimeout(() => { 137 | this.root.removeChild(child); 138 | if (i === Math.floor(Math.abs(diff)) - 1) { 139 | this.isAnimating = false; 140 | resolve(); 141 | } 142 | }, animationDelay + timeout); 143 | }); 144 | }); 145 | } 146 | 147 | const childCount = this.root.childNodes.length; 148 | let animationStep = 0; 149 | let colorStep = childCount; 150 | const lastAngle = fromAngle + childCount + diff; 151 | const easingStep = this.maxEasing / (lastAngle - (fromAngle + childCount)); 152 | 153 | return new Promise(resolve => { 154 | for (let angle = fromAngle + childCount; angle < lastAngle; angle++) { 155 | if (this.isDisposed) { 156 | resolve(); 157 | break; 158 | } 159 | const delay = animate 160 | ? easing(easingStep * animationStep) * animationDuration 161 | : 0; 162 | requestTimeout(() => { 163 | this.renderCircle(angle, colorStep++); 164 | if (angle === Math.floor(lastAngle) - 1) { 165 | this.isAnimating = false; 166 | resolve(); 167 | } 168 | }, delay + animationDelay); 169 | animationStep++; 170 | } 171 | }); 172 | } 173 | 174 | insertAdjacentToRoot(where: InsertPosition, html: string): void { 175 | this.config.container.insertAdjacentHTML(where, html); 176 | } 177 | 178 | getElementAtValue(value: number): GaugeItem { 179 | const circle = this.root.childNodes[value] as SVGCircleElement | undefined; 180 | if (!circle) { 181 | throw new Error(`Element with value ${value} not found`); 182 | } 183 | const angle = circle.dataset.angle; 184 | if (angle === undefined) { 185 | throw new Error('Data attribute angle not found'); 186 | } 187 | const circleRect = circle.getBoundingClientRect(); 188 | const parentRect = this.root.getBoundingClientRect(); 189 | 190 | return { 191 | element: circle, 192 | metadata: { 193 | relativeLeft: circleRect.left - parentRect.left, 194 | relativeTop: circleRect.top - parentRect.top, 195 | angle: parseFloat(angle) 196 | } 197 | }; 198 | } 199 | 200 | private renderCircle(angle: number, colorStep: number): void { 201 | const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); 202 | const color = this.config.colors[colorStep]; 203 | const { x, y } = calcCoordinatesFromAngle(this.config.gaugeRadius, angle); 204 | circle.setAttribute('cx', (this.leftTopOffset + x).toString()); 205 | circle.setAttribute('cy', (this.leftTopOffset + y).toString()); 206 | circle.setAttribute('r', this.config.lineWidth.toString()); 207 | circle.setAttribute('data-angle', angle.toString()); 208 | circle.setAttribute('fill', color); 209 | this.root.appendChild(circle); 210 | } 211 | 212 | dispose(): void { 213 | this.isDisposed = true; 214 | this.isAnimating = false; 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Gauge } from './gauge'; 2 | import { cubicBezier, calcCoordinatesFromAngle } from './math'; 3 | 4 | export { 5 | Gauge, 6 | cubicBezier, 7 | calcCoordinatesFromAngle, 8 | }; 9 | -------------------------------------------------------------------------------- /src/math.test.ts: -------------------------------------------------------------------------------- 1 | import { calcCoordinatesFromAngle } from './math'; 2 | 3 | describe('calCoordinatesFromAngle', () => { 4 | it('can calculate coordinates from an angle', () => { 5 | const point = calcCoordinatesFromAngle(5, 90); 6 | expect(point.x).toBe(5); 7 | expect(point.y).toBeLessThan(1); 8 | expect(point.y).toBeGreaterThanOrEqual(0); 9 | 10 | const point2 = calcCoordinatesFromAngle(10, 180); 11 | expect(point2.y).toBe(10); 12 | expect(point2.x).toBeLessThan(1); 13 | expect(point2.x).toBeGreaterThanOrEqual(0); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/math.ts: -------------------------------------------------------------------------------- 1 | export type Easing = (timeFraction: number) => number; 2 | 3 | // https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B%C3%A9zier_curves 4 | export function cubicBezier(x1: number, y1: number, x2: number, y2: number): Easing { 5 | return (timeFraction: number) => { 6 | return ( 7 | Math.pow(1 - timeFraction, 3) * x1 + 8 | 3 * Math.pow(1 - timeFraction, 2) * timeFraction * y1 + 9 | 3 * (1 - timeFraction) * Math.pow(timeFraction, 2) * x2 + 10 | Math.pow(timeFraction, 3) * y2 11 | ); 12 | }; 13 | } 14 | 15 | export type Point = { 16 | x: number; 17 | y: number; 18 | }; 19 | 20 | export function calcCoordinatesFromAngle(radius: number, angle: number): Point { 21 | const theta = Math.PI - (angle * Math.PI) / 180; 22 | return { 23 | x: radius * Math.sin(theta), 24 | y: radius * Math.cos(theta) 25 | }; 26 | } 27 | -------------------------------------------------------------------------------- /src/request-timeout.ts: -------------------------------------------------------------------------------- 1 | // Animate using requestAnimationFrame instead of setInterval for better performance 2 | export function requestTimeout(fn: () => void, delay: number) { 3 | const start = performance.now(); 4 | const handle: { value?: number } = {}; 5 | 6 | function loop() { 7 | const current = performance.now(); 8 | const delta = current - start; 9 | if (delta >= delay) { 10 | fn(); 11 | } else { 12 | handle.value = requestAnimationFrame(loop); 13 | } 14 | } 15 | 16 | handle.value = requestAnimationFrame(loop); 17 | return handle; 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src", "types"], 3 | "compilerOptions": { 4 | "module": "esnext", 5 | "lib": ["dom", "esnext"], 6 | "importHelpers": true, 7 | "outDir": "dist", 8 | "declarationDir": "types", 9 | "declaration": true, 10 | "emitDeclarationOnly": true, 11 | "sourceMap": true, 12 | "rootDir": "./src", 13 | "strict": true, 14 | "noImplicitReturns": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "moduleResolution": "node", 17 | "esModuleInterop": true, 18 | "skipLibCheck": true, 19 | "forceConsistentCasingInFileNames": true 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:recommended", 3 | "rules": { 4 | "array-type": false, 5 | "arrow-parens": false, 6 | "semicolon": false, 7 | "deprecation": { 8 | "severity": "warning" 9 | }, 10 | "interface-name": false, 11 | "max-classes-per-file": false, 12 | "max-line-length": [ 13 | true, 14 | 140 15 | ], 16 | "member-access": false, 17 | "member-ordering": [ 18 | true, 19 | { 20 | "order": [ 21 | "static-field", 22 | "instance-field", 23 | "static-method", 24 | "instance-method" 25 | ] 26 | } 27 | ], 28 | "no-consecutive-blank-lines": false, 29 | "no-console": [ 30 | true, 31 | "debug", 32 | "info", 33 | "time", 34 | "timeEnd", 35 | "trace" 36 | ], 37 | "no-empty": false, 38 | "no-inferrable-types": [ 39 | true, 40 | "ignore-params" 41 | ], 42 | "no-non-null-assertion": true, 43 | "no-redundant-jsdoc": true, 44 | "no-switch-case-fall-through": true, 45 | "no-var-requires": false, 46 | "object-literal-key-quotes": [ 47 | true, 48 | "as-needed" 49 | ], 50 | "object-literal-sort-keys": false, 51 | "ordered-imports": false, 52 | "quotemark": [ 53 | true, 54 | "single" 55 | ], 56 | "trailing-comma": false 57 | } 58 | } 59 | --------------------------------------------------------------------------------