├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── _config.yml ├── package-lock.json ├── package.json ├── src ├── app.d.ts ├── app.html ├── lib │ ├── Arc.svelte │ ├── CustomShapeProgressBar.svelte │ ├── LinearProgressBar.svelte │ ├── ProgressBar.svelte │ ├── ProgressLabel.svelte │ ├── RadialProgressBar.svelte │ ├── SeriesArc.svelte │ ├── index.js │ ├── stores.ts │ ├── types.d.ts │ └── utils.ts └── routes │ └── +page.svelte ├── svelte.config.js ├── tsconfig.json ├── tsconfig.node.json ├── vite.bundle.config.js └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /dist 5 | /bundle 6 | /.svelte-kit 7 | /package 8 | .env 9 | .env.* 10 | !.env.example 11 | vite.config.js.timestamp-* 12 | vite.config.ts.timestamp-* -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | webpack.config.json -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 okrad 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 | # svelte-progressbar 2 | A multi-series SVG progress bar component made with Svelte 3. 3 | It can be rendered as a **linear**, **radial** (circular), **semicircular** or even **custom-shaped** progressbar. Progression bars and values are fully animated. 4 | 5 | If rendered as a linear progressbar there are 2 styles supported: 6 | * Standard: uses svg masks to display inverted text color for the value. 7 | * Thin: the progression bars are rendered as thin bars and the values are placed externally 8 | 9 | No dependencies, only 35kb when minified (11kb gzipped)! 10 | 11 | # Upgrade notice 12 | The current release is a substantial rewrite of much of the library, and as such it's not guaranteed to be compatible! 13 | 14 | The following are the main differences with the previous release: 15 | 16 | * If no width is specified, the progress bar will take the whole parent width 17 | * The "path" parameter has been removed and replaced by the "pathFn" parameter. See the API paragraph for usage info. 18 | 19 | # Usage 20 | 21 | ``` 22 | npm i @okrad/svelte-progressbar 23 | ``` 24 | 25 | Then you can use it like: 26 | 27 | ```javascript 28 | //main.js 29 | import App from './App.svelte'; 30 | 31 | const app = new App({ 32 | target: document.body, 33 | props: { 34 | series: [20, 42] 35 | } 36 | }); 37 | 38 | export default app; 39 | ``` 40 | 41 | ```javascript 42 | //App.svelte 43 | 47 | 48 | 49 | 50 | 51 | 52 | ``` 53 | 54 | ## Building from source 55 | 56 | ``` 57 | npm run package 58 | ``` 59 | 60 | Builds svelte files and transpiles ts into dist/ directory 61 | 62 | Or... 63 | 64 | ``` 65 | npm run bundle 66 | ``` 67 | 68 | Creates minified index.js and index.mjs files in the bundle/ directory. 69 | 70 | You can use the index.js bundle by including it in your html file, then instantiating the component: 71 | ```javascript 72 | const pb = new ProgressBar({ 73 | target: document.getElementById('demo'), 74 | props: { 75 | series: 20 76 | } 77 | }); 78 | ``` 79 | This creates a standard progressbar with 20% progression. 80 | 81 | ```javascript 82 | const pb = new ProgressBar({ 83 | target: document.getElementById('demo'), 84 | style: 'radial', 85 | props: { 86 | series: [20, 10] 87 | } 88 | }); 89 | ``` 90 | This creates a radial progressbar with 2 series (20% + 10%). 91 | 92 | # API 93 | **ProgressBar(options)**: The constructor. Available props are: 94 | * series (number | object | array): for single series progressbars, it can be a number indicating the progression percentage (0-100), or a json object with "perc" and "color" properties. This property is reactive. For example: 95 | ``` 96 | series: 42 97 | ``` 98 | ``` 99 | series: [10, 32] 100 | ``` 101 | ``` 102 | series: [ 103 | { 104 | perc: 10, 105 | color: '#5AB6DF' 106 | }, 107 | { 108 | perc: 32, 109 | color: '#65CEA7' 110 | } 111 | ] 112 | ``` 113 | 114 | 115 | * valueLabel: the label that must be shown as the progress value. It can be a simple text or a markup fragment. The label can contain "markers" in the form "%1", "%2"... that will be substituted with the value of the corresponding series (for example: "perc 1: %1, perc 2: %2"). If not specified, the progress percentage will be shown. 116 | * style: can be "standard" (default), "thin", "radial", "semicircle" o "custom" 117 | * width: determines the width of the whole component. If not specified (or set to "auto" or "100%"), the component will occupy the full width of its parent. 118 | * height: determines the height of the component. If not specified, it defaults to 14px for standard progressbars, 1px for thin progressbars. 119 | * thickness: used only for radial progress bars. It determines the thickness of the bar as a unitless number between 0 and 50 (corresponding to the ray of the circle). 120 | * textSize: the size of the font (in percentage) for the progression value (default: 30 for thin progressbars, 70 for default progressbar, 150 for radial) 121 | * addBackground: determines if a further bar should be added as background to the value bar. Default true. 122 | * bgColor: if addBackground is true, specifies the color of the background bar 123 | * bgFillColor: available only for "radial" and "semicircle" bars. If addBackground is true, specifies the color of the "inner circle" of the progress bar. 124 | * labelColor: specifies the color of the label. 125 | * invLabelColor: specifies the "inverted" label color. 126 | * stackSeries: currently available for "radial" and "semicircle" styles only. If true (default), series will be stacked one after the other. If false, series will be rendered as independent, concentrical arcs. 127 | * margin: currently used only for radial non-stacked bar. Determines the space between the series bars. 128 | * thresholds: list (array) of objects that define which color apply to the progress in relation with the variation of the series value. 129 | * cls: css class to apply to the main element. 130 | * rx, ry: horizontal and vertical border radius (for linear progress bars). If ry is not specified, it defaults to rx. 131 | * fillDirection: direction of "filling". Can be one of "l2r" (left to right [default]), "r2l" (right to left), "t2b" (top to bottom) o "b2t" (bottom to top). 132 | * labelAlignX: alignment of the label along the "x" axis. Can be one of "center" (default), "left", "right", "leftOf", "rightOf". 133 | * labelAlignY: alignment of the label along the "y" axis. Can be one of "middle" (default), "top", "bottom", "above", "below". 134 | * pathFn: used only for custom progress bars. It defines a function that must return the svg path that corresponds to the shape of the progress bar. The function receives 2 parameters: the width and the height of the viewbox, to allow scaling the path values to the actual viewbox. 135 | 136 | **updateSeries(series)**: update all of the series. Since the "series" property is reactive, if you are using the component in a Svelte app, you can simply bind to it and change its value as needed. 137 | 138 | **updatePerc(perc, seriesId = 0)**: update the specified series progress percentage. Again, since the "series" property is reactive, if you are using the component in a Svelte app, you can simply bind to it and change its value as needed. 139 | 140 | ### Component composition ### 141 | 142 | Within a svelte app, you can add a subcomponent to a radial progress bar: 143 | 144 | ``` 145 | 146 | 147 | 148 | ``` 149 | 150 | Or you can for example add an HTML fragment by using a foreignObject tag. In this case just make sure to explicitly set the namespace with the xmlns attribute: 151 | 152 | ``` 153 | 154 | 155 | 156 | 157 | 158 | ``` 159 | 160 | # Examples 161 | ``` 162 | //Linear progress with single series with vanilla js 163 | new ProgressBar({ 164 | target: document.getElementById('pb_container'), 165 | props: { 166 | series: [90] 167 | } 168 | }); 169 | 170 | //Linear progress as a Svelte component 171 | 172 | 173 | //Linear progress with two series with vanilla js 174 | new ProgressBar({ 175 | target: document.getElementById('pb_container'), 176 | props: { 177 | series: [40, 25] 178 | } 179 | }); 180 | 181 | //Linear progress with two series as a Svelte component 182 | 183 | 184 | //Linear progress with "thin" style and two series 185 | new ProgressBar({ 186 | target: document.getElementById('demo3'), 187 | props: { 188 | style: 'thin', 189 | series: [30, 15] 190 | } 191 | }); 192 | 193 | //Custom progress bar 194 | 198 | 199 | //Semicircular progress bar 200 | new ProgressBar({ 201 | target: document.getElementById('demo3'), 202 | props: { 203 | style: 'semicircle', 204 | series: [30] 205 | } 206 | }); 207 | 208 | //Or... 209 | 210 | 211 | //Radial progress bar with single series and thresholds 212 | new ProgressBar({ 213 | target: document.getElementById('pb_container'), 214 | props: { 215 | style: 'radial', 216 | series: [80], 217 | thickness: 10, 218 | thresholds: [ 219 | { 220 | till: 50, //Color stays red from 0% to 50% 221 | color: '#800000' 222 | }, 223 | { 224 | till: 100, //Color goes green from 51% to 100% 225 | color: '#008000' 226 | } 227 | ] 228 | } 229 | }); 230 | 231 | //Or... 232 | 246 | ``` 247 | Take a look at these [working examples](https://okrad.github.io/svelte-progressbar)! 248 | 249 | 250 | # Changelog 251 | 2023/07/06: Version 2.2.0 252 | * Migration to Svelte 4 253 | 254 | 2023/05/16: Version 2.1.1 255 | * Small fixes 256 | 257 | 2023/02/21: Version 2.1.0 258 | * Sveltekit conversion 259 | 260 | 2023/02/21: Version 2.0.0 261 | * Major refactorization, bringing full width support and many other improvements! 262 | * Moved to vite 263 | 264 | 2021/02/23: Version 1.11.2. 265 | * Fixed exception on component destruct 266 | 267 | 2021/01/29: Version 1.11.1. 268 | * Fixed issue for inverted label not being visible on Chrome 88 269 | * Fixed a small regression 270 | 271 | 2021/01/22: Version 1.11.0. 272 | * Introducing CustomShapeProgressBar! 273 | * LinearProgressBar has been refectored to use CustomShapeProgressBar 274 | * Added custom label template 275 | * x & y label positions can be controlled through the labelAlignX and labelAlignY props 276 | * inverted label color can be changed with the invLabelColor prop 277 | * Fill direction can be controlled with the "fillDirection" prop 278 | 279 | 2021/01/15: Version 1.10.0. 280 | * "color" property is now reactive (and interpolates) 281 | * "updateSeries" function added 282 | * Small fix: Avoid style leaking in the global scope 283 | 284 | 2020/11/23: Version 1.9.4. 285 | * Small fixes 286 | 287 | 2020/11/05: Version 1.9.3. 288 | * Typescript fixes 289 | 290 | 2020/11/02: Version 1.9.2. Removed "legacy" build 291 | 292 | 2020/10/27: Version 1.9.1. Improved TypeScript support. 293 | 294 | 2020/10/18: Version 1.9.0. 295 | * Initial TypeScript support! 296 | * Add rx, ry attributes to control linear pb radius 297 | * Add cls parameter for style customization 298 | * Fix to avoid progress overflow 299 | * Fix for Safari positioning bug 300 | 301 | 2020/09/22: Version 1.8.0. Add component composition handling in radial bars 302 | 303 | 2020/09/05: Version 1.7.1. Small fixes 304 | 305 | 2020/08/31: Version 1.7.0 306 | * Major store refactorization, simplified overall code 307 | * Label can be set from outside with the _valueLabel_ prop 308 | * Allow markup (and styling) in label 309 | * Add _bgFillColor_ property 310 | * Add _labelColor_ property 311 | 312 | 2020/08/26: Version 1.6.2. Bugfixes for radial stacked progress bars 313 | 314 | 2020/08/12: Version 1.6.1. Semicircular bar fixes 315 | 316 | 2020/08/10: Version 1.6.0. Added _semicircle_ bar style 317 | 318 | 2020/08/09: Version 1.5.0. _series_ prop become reactive 319 | 320 | 2020/03/17: Version 1.4.0. Added thresholds, store refactorization 321 | 322 | 2020/02/07: Version 1.3.1. Added "addBackground", "bgColor", "stackSeries", "margin" parameters. 323 | Introduced "legacy" mode for compatibility with IE/Edge. 324 | 325 | 2019/08/07: Added *dist* task 326 | 327 | 2019/08/06: Refactored thin progressbars 328 | 329 | 2019/08/02: Added *textSize* parameter 330 | 331 | 2019/08/01: Handled svg viewport (width/height) while keeping proportions -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@okrad/svelte-progressbar", 3 | "version": "2.1.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@okrad/svelte-progressbar", 9 | "version": "2.1.1", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@sveltejs/adapter-auto": "^2.1.0", 13 | "@sveltejs/kit": "^1.22.0", 14 | "@sveltejs/package": "^2.1.0", 15 | "publint": "^0.1.16", 16 | "svelte": "^4.0.4", 17 | "svelte-check": "^3.4.4", 18 | "tslib": "^2.6.0", 19 | "typescript": "^5.1.6", 20 | "vite": "^4.3.9" 21 | }, 22 | "peerDependencies": { 23 | "svelte": "^3.54.0" 24 | } 25 | }, 26 | "node_modules/@ampproject/remapping": { 27 | "version": "2.2.1", 28 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", 29 | "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", 30 | "dev": true, 31 | "dependencies": { 32 | "@jridgewell/gen-mapping": "^0.3.0", 33 | "@jridgewell/trace-mapping": "^0.3.9" 34 | }, 35 | "engines": { 36 | "node": ">=6.0.0" 37 | } 38 | }, 39 | "node_modules/@esbuild/android-arm": { 40 | "version": "0.17.19", 41 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", 42 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", 43 | "cpu": [ 44 | "arm" 45 | ], 46 | "dev": true, 47 | "optional": true, 48 | "os": [ 49 | "android" 50 | ], 51 | "engines": { 52 | "node": ">=12" 53 | } 54 | }, 55 | "node_modules/@esbuild/android-arm64": { 56 | "version": "0.17.19", 57 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", 58 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", 59 | "cpu": [ 60 | "arm64" 61 | ], 62 | "dev": true, 63 | "optional": true, 64 | "os": [ 65 | "android" 66 | ], 67 | "engines": { 68 | "node": ">=12" 69 | } 70 | }, 71 | "node_modules/@esbuild/android-x64": { 72 | "version": "0.17.19", 73 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", 74 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", 75 | "cpu": [ 76 | "x64" 77 | ], 78 | "dev": true, 79 | "optional": true, 80 | "os": [ 81 | "android" 82 | ], 83 | "engines": { 84 | "node": ">=12" 85 | } 86 | }, 87 | "node_modules/@esbuild/darwin-arm64": { 88 | "version": "0.17.19", 89 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", 90 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", 91 | "cpu": [ 92 | "arm64" 93 | ], 94 | "dev": true, 95 | "optional": true, 96 | "os": [ 97 | "darwin" 98 | ], 99 | "engines": { 100 | "node": ">=12" 101 | } 102 | }, 103 | "node_modules/@esbuild/darwin-x64": { 104 | "version": "0.17.19", 105 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", 106 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", 107 | "cpu": [ 108 | "x64" 109 | ], 110 | "dev": true, 111 | "optional": true, 112 | "os": [ 113 | "darwin" 114 | ], 115 | "engines": { 116 | "node": ">=12" 117 | } 118 | }, 119 | "node_modules/@esbuild/freebsd-arm64": { 120 | "version": "0.17.19", 121 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", 122 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", 123 | "cpu": [ 124 | "arm64" 125 | ], 126 | "dev": true, 127 | "optional": true, 128 | "os": [ 129 | "freebsd" 130 | ], 131 | "engines": { 132 | "node": ">=12" 133 | } 134 | }, 135 | "node_modules/@esbuild/freebsd-x64": { 136 | "version": "0.17.19", 137 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", 138 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", 139 | "cpu": [ 140 | "x64" 141 | ], 142 | "dev": true, 143 | "optional": true, 144 | "os": [ 145 | "freebsd" 146 | ], 147 | "engines": { 148 | "node": ">=12" 149 | } 150 | }, 151 | "node_modules/@esbuild/linux-arm": { 152 | "version": "0.17.19", 153 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", 154 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", 155 | "cpu": [ 156 | "arm" 157 | ], 158 | "dev": true, 159 | "optional": true, 160 | "os": [ 161 | "linux" 162 | ], 163 | "engines": { 164 | "node": ">=12" 165 | } 166 | }, 167 | "node_modules/@esbuild/linux-arm64": { 168 | "version": "0.17.19", 169 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", 170 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", 171 | "cpu": [ 172 | "arm64" 173 | ], 174 | "dev": true, 175 | "optional": true, 176 | "os": [ 177 | "linux" 178 | ], 179 | "engines": { 180 | "node": ">=12" 181 | } 182 | }, 183 | "node_modules/@esbuild/linux-ia32": { 184 | "version": "0.17.19", 185 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", 186 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", 187 | "cpu": [ 188 | "ia32" 189 | ], 190 | "dev": true, 191 | "optional": true, 192 | "os": [ 193 | "linux" 194 | ], 195 | "engines": { 196 | "node": ">=12" 197 | } 198 | }, 199 | "node_modules/@esbuild/linux-loong64": { 200 | "version": "0.17.19", 201 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", 202 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", 203 | "cpu": [ 204 | "loong64" 205 | ], 206 | "dev": true, 207 | "optional": true, 208 | "os": [ 209 | "linux" 210 | ], 211 | "engines": { 212 | "node": ">=12" 213 | } 214 | }, 215 | "node_modules/@esbuild/linux-mips64el": { 216 | "version": "0.17.19", 217 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", 218 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", 219 | "cpu": [ 220 | "mips64el" 221 | ], 222 | "dev": true, 223 | "optional": true, 224 | "os": [ 225 | "linux" 226 | ], 227 | "engines": { 228 | "node": ">=12" 229 | } 230 | }, 231 | "node_modules/@esbuild/linux-ppc64": { 232 | "version": "0.17.19", 233 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", 234 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", 235 | "cpu": [ 236 | "ppc64" 237 | ], 238 | "dev": true, 239 | "optional": true, 240 | "os": [ 241 | "linux" 242 | ], 243 | "engines": { 244 | "node": ">=12" 245 | } 246 | }, 247 | "node_modules/@esbuild/linux-riscv64": { 248 | "version": "0.17.19", 249 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", 250 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", 251 | "cpu": [ 252 | "riscv64" 253 | ], 254 | "dev": true, 255 | "optional": true, 256 | "os": [ 257 | "linux" 258 | ], 259 | "engines": { 260 | "node": ">=12" 261 | } 262 | }, 263 | "node_modules/@esbuild/linux-s390x": { 264 | "version": "0.17.19", 265 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", 266 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", 267 | "cpu": [ 268 | "s390x" 269 | ], 270 | "dev": true, 271 | "optional": true, 272 | "os": [ 273 | "linux" 274 | ], 275 | "engines": { 276 | "node": ">=12" 277 | } 278 | }, 279 | "node_modules/@esbuild/linux-x64": { 280 | "version": "0.17.19", 281 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", 282 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", 283 | "cpu": [ 284 | "x64" 285 | ], 286 | "dev": true, 287 | "optional": true, 288 | "os": [ 289 | "linux" 290 | ], 291 | "engines": { 292 | "node": ">=12" 293 | } 294 | }, 295 | "node_modules/@esbuild/netbsd-x64": { 296 | "version": "0.17.19", 297 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", 298 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", 299 | "cpu": [ 300 | "x64" 301 | ], 302 | "dev": true, 303 | "optional": true, 304 | "os": [ 305 | "netbsd" 306 | ], 307 | "engines": { 308 | "node": ">=12" 309 | } 310 | }, 311 | "node_modules/@esbuild/openbsd-x64": { 312 | "version": "0.17.19", 313 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", 314 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", 315 | "cpu": [ 316 | "x64" 317 | ], 318 | "dev": true, 319 | "optional": true, 320 | "os": [ 321 | "openbsd" 322 | ], 323 | "engines": { 324 | "node": ">=12" 325 | } 326 | }, 327 | "node_modules/@esbuild/sunos-x64": { 328 | "version": "0.17.19", 329 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", 330 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", 331 | "cpu": [ 332 | "x64" 333 | ], 334 | "dev": true, 335 | "optional": true, 336 | "os": [ 337 | "sunos" 338 | ], 339 | "engines": { 340 | "node": ">=12" 341 | } 342 | }, 343 | "node_modules/@esbuild/win32-arm64": { 344 | "version": "0.17.19", 345 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", 346 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", 347 | "cpu": [ 348 | "arm64" 349 | ], 350 | "dev": true, 351 | "optional": true, 352 | "os": [ 353 | "win32" 354 | ], 355 | "engines": { 356 | "node": ">=12" 357 | } 358 | }, 359 | "node_modules/@esbuild/win32-ia32": { 360 | "version": "0.17.19", 361 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", 362 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", 363 | "cpu": [ 364 | "ia32" 365 | ], 366 | "dev": true, 367 | "optional": true, 368 | "os": [ 369 | "win32" 370 | ], 371 | "engines": { 372 | "node": ">=12" 373 | } 374 | }, 375 | "node_modules/@esbuild/win32-x64": { 376 | "version": "0.17.19", 377 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 378 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 379 | "cpu": [ 380 | "x64" 381 | ], 382 | "dev": true, 383 | "optional": true, 384 | "os": [ 385 | "win32" 386 | ], 387 | "engines": { 388 | "node": ">=12" 389 | } 390 | }, 391 | "node_modules/@jridgewell/gen-mapping": { 392 | "version": "0.3.3", 393 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 394 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 395 | "dev": true, 396 | "dependencies": { 397 | "@jridgewell/set-array": "^1.0.1", 398 | "@jridgewell/sourcemap-codec": "^1.4.10", 399 | "@jridgewell/trace-mapping": "^0.3.9" 400 | }, 401 | "engines": { 402 | "node": ">=6.0.0" 403 | } 404 | }, 405 | "node_modules/@jridgewell/resolve-uri": { 406 | "version": "3.1.0", 407 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 408 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 409 | "dev": true, 410 | "engines": { 411 | "node": ">=6.0.0" 412 | } 413 | }, 414 | "node_modules/@jridgewell/set-array": { 415 | "version": "1.1.2", 416 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 417 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 418 | "dev": true, 419 | "engines": { 420 | "node": ">=6.0.0" 421 | } 422 | }, 423 | "node_modules/@jridgewell/sourcemap-codec": { 424 | "version": "1.4.15", 425 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 426 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 427 | "dev": true 428 | }, 429 | "node_modules/@jridgewell/trace-mapping": { 430 | "version": "0.3.18", 431 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 432 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 433 | "dev": true, 434 | "dependencies": { 435 | "@jridgewell/resolve-uri": "3.1.0", 436 | "@jridgewell/sourcemap-codec": "1.4.14" 437 | } 438 | }, 439 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { 440 | "version": "1.4.14", 441 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 442 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 443 | "dev": true 444 | }, 445 | "node_modules/@nodelib/fs.scandir": { 446 | "version": "2.1.5", 447 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 448 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 449 | "dev": true, 450 | "dependencies": { 451 | "@nodelib/fs.stat": "2.0.5", 452 | "run-parallel": "^1.1.9" 453 | }, 454 | "engines": { 455 | "node": ">= 8" 456 | } 457 | }, 458 | "node_modules/@nodelib/fs.stat": { 459 | "version": "2.0.5", 460 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 461 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 462 | "dev": true, 463 | "engines": { 464 | "node": ">= 8" 465 | } 466 | }, 467 | "node_modules/@nodelib/fs.walk": { 468 | "version": "1.2.8", 469 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 470 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 471 | "dev": true, 472 | "dependencies": { 473 | "@nodelib/fs.scandir": "2.1.5", 474 | "fastq": "^1.6.0" 475 | }, 476 | "engines": { 477 | "node": ">= 8" 478 | } 479 | }, 480 | "node_modules/@polka/url": { 481 | "version": "1.0.0-next.21", 482 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", 483 | "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", 484 | "dev": true 485 | }, 486 | "node_modules/@sveltejs/adapter-auto": { 487 | "version": "2.1.0", 488 | "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.1.0.tgz", 489 | "integrity": "sha512-o2pZCfATFtA/Gw/BB0Xm7k4EYaekXxaPGER3xGSY3FvzFJGTlJlZjBseaXwYSM94lZ0HniOjTokN3cWaLX6fow==", 490 | "dev": true, 491 | "dependencies": { 492 | "import-meta-resolve": "^3.0.0" 493 | }, 494 | "peerDependencies": { 495 | "@sveltejs/kit": "^1.0.0" 496 | } 497 | }, 498 | "node_modules/@sveltejs/kit": { 499 | "version": "1.22.0", 500 | "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.22.0.tgz", 501 | "integrity": "sha512-LQhM7CvTaO7OopQffFMuJ2n1lBhfYJKVO2Rujc+/473Yb8jb1mpJm59q5Avbx29kcz8N9lvYUyRP3FXc63VIFA==", 502 | "dev": true, 503 | "hasInstallScript": true, 504 | "dependencies": { 505 | "@sveltejs/vite-plugin-svelte": "^2.4.1", 506 | "@types/cookie": "^0.5.1", 507 | "cookie": "^0.5.0", 508 | "devalue": "^4.3.1", 509 | "esm-env": "^1.0.0", 510 | "kleur": "^4.1.5", 511 | "magic-string": "^0.30.0", 512 | "mime": "^3.0.0", 513 | "sade": "^1.8.1", 514 | "set-cookie-parser": "^2.6.0", 515 | "sirv": "^2.0.2", 516 | "undici": "~5.22.0" 517 | }, 518 | "bin": { 519 | "svelte-kit": "svelte-kit.js" 520 | }, 521 | "engines": { 522 | "node": "^16.14 || >=18" 523 | }, 524 | "peerDependencies": { 525 | "svelte": "^3.54.0 || ^4.0.0-next.0", 526 | "vite": "^4.0.0" 527 | } 528 | }, 529 | "node_modules/@sveltejs/package": { 530 | "version": "2.1.0", 531 | "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-2.1.0.tgz", 532 | "integrity": "sha512-c6PLH9G2YLQ48kqrS2XX422BrLNABBstSiapamchVJaQnOTXyJmUR8KmoCCySnzVy3PiYL6jg12UnoPmjW3SwA==", 533 | "dev": true, 534 | "dependencies": { 535 | "chokidar": "^3.5.3", 536 | "kleur": "^4.1.5", 537 | "sade": "^1.8.1", 538 | "svelte2tsx": "~0.6.0" 539 | }, 540 | "bin": { 541 | "svelte-package": "svelte-package.js" 542 | }, 543 | "engines": { 544 | "node": "^16.14 || >=18" 545 | }, 546 | "peerDependencies": { 547 | "svelte": "^3.44.0 || ^4.0.0" 548 | } 549 | }, 550 | "node_modules/@sveltejs/vite-plugin-svelte": { 551 | "version": "2.4.2", 552 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.2.tgz", 553 | "integrity": "sha512-ePfcC48ftMKhkT0OFGdOyycYKnnkT6i/buzey+vHRTR/JpQvuPzzhf1PtKqCDQfJRgoPSN2vscXs6gLigx/zGw==", 554 | "dev": true, 555 | "dependencies": { 556 | "@sveltejs/vite-plugin-svelte-inspector": "^1.0.3", 557 | "debug": "^4.3.4", 558 | "deepmerge": "^4.3.1", 559 | "kleur": "^4.1.5", 560 | "magic-string": "^0.30.0", 561 | "svelte-hmr": "^0.15.2", 562 | "vitefu": "^0.2.4" 563 | }, 564 | "engines": { 565 | "node": "^14.18.0 || >= 16" 566 | }, 567 | "peerDependencies": { 568 | "svelte": "^3.54.0 || ^4.0.0", 569 | "vite": "^4.0.0" 570 | } 571 | }, 572 | "node_modules/@sveltejs/vite-plugin-svelte-inspector": { 573 | "version": "1.0.3", 574 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.3.tgz", 575 | "integrity": "sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==", 576 | "dev": true, 577 | "dependencies": { 578 | "debug": "^4.3.4" 579 | }, 580 | "engines": { 581 | "node": "^14.18.0 || >= 16" 582 | }, 583 | "peerDependencies": { 584 | "@sveltejs/vite-plugin-svelte": "^2.2.0", 585 | "svelte": "^3.54.0 || ^4.0.0", 586 | "vite": "^4.0.0" 587 | } 588 | }, 589 | "node_modules/@types/cookie": { 590 | "version": "0.5.1", 591 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", 592 | "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", 593 | "dev": true 594 | }, 595 | "node_modules/@types/estree": { 596 | "version": "1.0.1", 597 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", 598 | "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", 599 | "dev": true 600 | }, 601 | "node_modules/@types/pug": { 602 | "version": "2.0.6", 603 | "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", 604 | "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", 605 | "dev": true 606 | }, 607 | "node_modules/acorn": { 608 | "version": "8.10.0", 609 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 610 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 611 | "dev": true, 612 | "bin": { 613 | "acorn": "bin/acorn" 614 | }, 615 | "engines": { 616 | "node": ">=0.4.0" 617 | } 618 | }, 619 | "node_modules/anymatch": { 620 | "version": "3.1.3", 621 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 622 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 623 | "dev": true, 624 | "dependencies": { 625 | "normalize-path": "^3.0.0", 626 | "picomatch": "^2.0.4" 627 | }, 628 | "engines": { 629 | "node": ">= 8" 630 | } 631 | }, 632 | "node_modules/aria-query": { 633 | "version": "5.3.0", 634 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", 635 | "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", 636 | "dev": true, 637 | "dependencies": { 638 | "dequal": "^2.0.3" 639 | } 640 | }, 641 | "node_modules/axobject-query": { 642 | "version": "3.2.1", 643 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", 644 | "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", 645 | "dev": true, 646 | "dependencies": { 647 | "dequal": "^2.0.3" 648 | } 649 | }, 650 | "node_modules/balanced-match": { 651 | "version": "1.0.2", 652 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 653 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 654 | "dev": true 655 | }, 656 | "node_modules/binary-extensions": { 657 | "version": "2.2.0", 658 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 659 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 660 | "dev": true, 661 | "engines": { 662 | "node": ">=8" 663 | } 664 | }, 665 | "node_modules/brace-expansion": { 666 | "version": "2.0.1", 667 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 668 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 669 | "dev": true, 670 | "dependencies": { 671 | "balanced-match": "^1.0.0" 672 | } 673 | }, 674 | "node_modules/braces": { 675 | "version": "3.0.2", 676 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 677 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 678 | "dev": true, 679 | "dependencies": { 680 | "fill-range": "^7.0.1" 681 | }, 682 | "engines": { 683 | "node": ">=8" 684 | } 685 | }, 686 | "node_modules/buffer-crc32": { 687 | "version": "0.2.13", 688 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 689 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 690 | "dev": true, 691 | "engines": { 692 | "node": "*" 693 | } 694 | }, 695 | "node_modules/busboy": { 696 | "version": "1.6.0", 697 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 698 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 699 | "dev": true, 700 | "dependencies": { 701 | "streamsearch": "^1.1.0" 702 | }, 703 | "engines": { 704 | "node": ">=10.16.0" 705 | } 706 | }, 707 | "node_modules/callsites": { 708 | "version": "3.1.0", 709 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 710 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 711 | "dev": true, 712 | "engines": { 713 | "node": ">=6" 714 | } 715 | }, 716 | "node_modules/chokidar": { 717 | "version": "3.5.3", 718 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 719 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 720 | "dev": true, 721 | "funding": [ 722 | { 723 | "type": "individual", 724 | "url": "https://paulmillr.com/funding/" 725 | } 726 | ], 727 | "dependencies": { 728 | "anymatch": "~3.1.2", 729 | "braces": "~3.0.2", 730 | "glob-parent": "~5.1.2", 731 | "is-binary-path": "~2.1.0", 732 | "is-glob": "~4.0.1", 733 | "normalize-path": "~3.0.0", 734 | "readdirp": "~3.6.0" 735 | }, 736 | "engines": { 737 | "node": ">= 8.10.0" 738 | }, 739 | "optionalDependencies": { 740 | "fsevents": "~2.3.2" 741 | } 742 | }, 743 | "node_modules/code-red": { 744 | "version": "1.0.3", 745 | "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.3.tgz", 746 | "integrity": "sha512-kVwJELqiILQyG5aeuyKFbdsI1fmQy1Cmf7dQ8eGmVuJoaRVdwey7WaMknr2ZFeVSYSKT0rExsa8EGw0aoI/1QQ==", 747 | "dev": true, 748 | "dependencies": { 749 | "@jridgewell/sourcemap-codec": "^1.4.14", 750 | "@types/estree": "^1.0.0", 751 | "acorn": "^8.8.2", 752 | "estree-walker": "^3.0.3", 753 | "periscopic": "^3.1.0" 754 | } 755 | }, 756 | "node_modules/concat-map": { 757 | "version": "0.0.1", 758 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 759 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 760 | "dev": true 761 | }, 762 | "node_modules/cookie": { 763 | "version": "0.5.0", 764 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 765 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 766 | "dev": true, 767 | "engines": { 768 | "node": ">= 0.6" 769 | } 770 | }, 771 | "node_modules/css-tree": { 772 | "version": "2.3.1", 773 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", 774 | "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", 775 | "dev": true, 776 | "dependencies": { 777 | "mdn-data": "2.0.30", 778 | "source-map-js": "^1.0.1" 779 | }, 780 | "engines": { 781 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 782 | } 783 | }, 784 | "node_modules/debug": { 785 | "version": "4.3.4", 786 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 787 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 788 | "dev": true, 789 | "dependencies": { 790 | "ms": "2.1.2" 791 | }, 792 | "engines": { 793 | "node": ">=6.0" 794 | }, 795 | "peerDependenciesMeta": { 796 | "supports-color": { 797 | "optional": true 798 | } 799 | } 800 | }, 801 | "node_modules/dedent-js": { 802 | "version": "1.0.1", 803 | "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", 804 | "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", 805 | "dev": true 806 | }, 807 | "node_modules/deepmerge": { 808 | "version": "4.3.1", 809 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 810 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 811 | "dev": true, 812 | "engines": { 813 | "node": ">=0.10.0" 814 | } 815 | }, 816 | "node_modules/dequal": { 817 | "version": "2.0.3", 818 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 819 | "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 820 | "dev": true, 821 | "engines": { 822 | "node": ">=6" 823 | } 824 | }, 825 | "node_modules/detect-indent": { 826 | "version": "6.1.0", 827 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", 828 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", 829 | "dev": true, 830 | "engines": { 831 | "node": ">=8" 832 | } 833 | }, 834 | "node_modules/devalue": { 835 | "version": "4.3.2", 836 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", 837 | "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", 838 | "dev": true 839 | }, 840 | "node_modules/es6-promise": { 841 | "version": "3.3.1", 842 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 843 | "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", 844 | "dev": true 845 | }, 846 | "node_modules/esbuild": { 847 | "version": "0.17.19", 848 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 849 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 850 | "dev": true, 851 | "hasInstallScript": true, 852 | "bin": { 853 | "esbuild": "bin/esbuild" 854 | }, 855 | "engines": { 856 | "node": ">=12" 857 | }, 858 | "optionalDependencies": { 859 | "@esbuild/android-arm": "0.17.19", 860 | "@esbuild/android-arm64": "0.17.19", 861 | "@esbuild/android-x64": "0.17.19", 862 | "@esbuild/darwin-arm64": "0.17.19", 863 | "@esbuild/darwin-x64": "0.17.19", 864 | "@esbuild/freebsd-arm64": "0.17.19", 865 | "@esbuild/freebsd-x64": "0.17.19", 866 | "@esbuild/linux-arm": "0.17.19", 867 | "@esbuild/linux-arm64": "0.17.19", 868 | "@esbuild/linux-ia32": "0.17.19", 869 | "@esbuild/linux-loong64": "0.17.19", 870 | "@esbuild/linux-mips64el": "0.17.19", 871 | "@esbuild/linux-ppc64": "0.17.19", 872 | "@esbuild/linux-riscv64": "0.17.19", 873 | "@esbuild/linux-s390x": "0.17.19", 874 | "@esbuild/linux-x64": "0.17.19", 875 | "@esbuild/netbsd-x64": "0.17.19", 876 | "@esbuild/openbsd-x64": "0.17.19", 877 | "@esbuild/sunos-x64": "0.17.19", 878 | "@esbuild/win32-arm64": "0.17.19", 879 | "@esbuild/win32-ia32": "0.17.19", 880 | "@esbuild/win32-x64": "0.17.19" 881 | } 882 | }, 883 | "node_modules/esm-env": { 884 | "version": "1.0.0", 885 | "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", 886 | "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", 887 | "dev": true 888 | }, 889 | "node_modules/estree-walker": { 890 | "version": "3.0.3", 891 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 892 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 893 | "dev": true, 894 | "dependencies": { 895 | "@types/estree": "^1.0.0" 896 | } 897 | }, 898 | "node_modules/fast-glob": { 899 | "version": "3.3.0", 900 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", 901 | "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", 902 | "dev": true, 903 | "dependencies": { 904 | "@nodelib/fs.stat": "^2.0.2", 905 | "@nodelib/fs.walk": "^1.2.3", 906 | "glob-parent": "^5.1.2", 907 | "merge2": "^1.3.0", 908 | "micromatch": "^4.0.4" 909 | }, 910 | "engines": { 911 | "node": ">=8.6.0" 912 | } 913 | }, 914 | "node_modules/fastq": { 915 | "version": "1.15.0", 916 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 917 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 918 | "dev": true, 919 | "dependencies": { 920 | "reusify": "^1.0.4" 921 | } 922 | }, 923 | "node_modules/fill-range": { 924 | "version": "7.0.1", 925 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 926 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 927 | "dev": true, 928 | "dependencies": { 929 | "to-regex-range": "^5.0.1" 930 | }, 931 | "engines": { 932 | "node": ">=8" 933 | } 934 | }, 935 | "node_modules/fs.realpath": { 936 | "version": "1.0.0", 937 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 938 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 939 | "dev": true 940 | }, 941 | "node_modules/fsevents": { 942 | "version": "2.3.2", 943 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 944 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 945 | "dev": true, 946 | "hasInstallScript": true, 947 | "optional": true, 948 | "os": [ 949 | "darwin" 950 | ], 951 | "engines": { 952 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 953 | } 954 | }, 955 | "node_modules/glob": { 956 | "version": "8.1.0", 957 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 958 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 959 | "dev": true, 960 | "dependencies": { 961 | "fs.realpath": "^1.0.0", 962 | "inflight": "^1.0.4", 963 | "inherits": "2", 964 | "minimatch": "^5.0.1", 965 | "once": "^1.3.0" 966 | }, 967 | "engines": { 968 | "node": ">=12" 969 | }, 970 | "funding": { 971 | "url": "https://github.com/sponsors/isaacs" 972 | } 973 | }, 974 | "node_modules/glob-parent": { 975 | "version": "5.1.2", 976 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 977 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 978 | "dev": true, 979 | "dependencies": { 980 | "is-glob": "^4.0.1" 981 | }, 982 | "engines": { 983 | "node": ">= 6" 984 | } 985 | }, 986 | "node_modules/graceful-fs": { 987 | "version": "4.2.11", 988 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 989 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 990 | "dev": true 991 | }, 992 | "node_modules/ignore-walk": { 993 | "version": "5.0.1", 994 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", 995 | "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", 996 | "dev": true, 997 | "dependencies": { 998 | "minimatch": "^5.0.1" 999 | }, 1000 | "engines": { 1001 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1002 | } 1003 | }, 1004 | "node_modules/import-fresh": { 1005 | "version": "3.3.0", 1006 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1007 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1008 | "dev": true, 1009 | "dependencies": { 1010 | "parent-module": "^1.0.0", 1011 | "resolve-from": "^4.0.0" 1012 | }, 1013 | "engines": { 1014 | "node": ">=6" 1015 | }, 1016 | "funding": { 1017 | "url": "https://github.com/sponsors/sindresorhus" 1018 | } 1019 | }, 1020 | "node_modules/import-meta-resolve": { 1021 | "version": "3.0.0", 1022 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", 1023 | "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", 1024 | "dev": true, 1025 | "funding": { 1026 | "type": "github", 1027 | "url": "https://github.com/sponsors/wooorm" 1028 | } 1029 | }, 1030 | "node_modules/inflight": { 1031 | "version": "1.0.6", 1032 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1033 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1034 | "dev": true, 1035 | "dependencies": { 1036 | "once": "^1.3.0", 1037 | "wrappy": "1" 1038 | } 1039 | }, 1040 | "node_modules/inherits": { 1041 | "version": "2.0.4", 1042 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1043 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1044 | "dev": true 1045 | }, 1046 | "node_modules/is-binary-path": { 1047 | "version": "2.1.0", 1048 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1049 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1050 | "dev": true, 1051 | "dependencies": { 1052 | "binary-extensions": "^2.0.0" 1053 | }, 1054 | "engines": { 1055 | "node": ">=8" 1056 | } 1057 | }, 1058 | "node_modules/is-extglob": { 1059 | "version": "2.1.1", 1060 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1061 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1062 | "dev": true, 1063 | "engines": { 1064 | "node": ">=0.10.0" 1065 | } 1066 | }, 1067 | "node_modules/is-glob": { 1068 | "version": "4.0.3", 1069 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1070 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1071 | "dev": true, 1072 | "dependencies": { 1073 | "is-extglob": "^2.1.1" 1074 | }, 1075 | "engines": { 1076 | "node": ">=0.10.0" 1077 | } 1078 | }, 1079 | "node_modules/is-number": { 1080 | "version": "7.0.0", 1081 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1082 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1083 | "dev": true, 1084 | "engines": { 1085 | "node": ">=0.12.0" 1086 | } 1087 | }, 1088 | "node_modules/is-reference": { 1089 | "version": "3.0.1", 1090 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", 1091 | "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", 1092 | "dev": true, 1093 | "dependencies": { 1094 | "@types/estree": "*" 1095 | } 1096 | }, 1097 | "node_modules/kleur": { 1098 | "version": "4.1.5", 1099 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1100 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1101 | "dev": true, 1102 | "engines": { 1103 | "node": ">=6" 1104 | } 1105 | }, 1106 | "node_modules/locate-character": { 1107 | "version": "3.0.0", 1108 | "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", 1109 | "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", 1110 | "dev": true 1111 | }, 1112 | "node_modules/lower-case": { 1113 | "version": "2.0.2", 1114 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1115 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1116 | "dev": true, 1117 | "dependencies": { 1118 | "tslib": "^2.0.3" 1119 | } 1120 | }, 1121 | "node_modules/magic-string": { 1122 | "version": "0.30.1", 1123 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", 1124 | "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", 1125 | "dev": true, 1126 | "dependencies": { 1127 | "@jridgewell/sourcemap-codec": "^1.4.15" 1128 | }, 1129 | "engines": { 1130 | "node": ">=12" 1131 | } 1132 | }, 1133 | "node_modules/mdn-data": { 1134 | "version": "2.0.30", 1135 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", 1136 | "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", 1137 | "dev": true 1138 | }, 1139 | "node_modules/merge2": { 1140 | "version": "1.4.1", 1141 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1142 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1143 | "dev": true, 1144 | "engines": { 1145 | "node": ">= 8" 1146 | } 1147 | }, 1148 | "node_modules/micromatch": { 1149 | "version": "4.0.5", 1150 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1151 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1152 | "dev": true, 1153 | "dependencies": { 1154 | "braces": "^3.0.2", 1155 | "picomatch": "^2.3.1" 1156 | }, 1157 | "engines": { 1158 | "node": ">=8.6" 1159 | } 1160 | }, 1161 | "node_modules/mime": { 1162 | "version": "3.0.0", 1163 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 1164 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 1165 | "dev": true, 1166 | "bin": { 1167 | "mime": "cli.js" 1168 | }, 1169 | "engines": { 1170 | "node": ">=10.0.0" 1171 | } 1172 | }, 1173 | "node_modules/min-indent": { 1174 | "version": "1.0.1", 1175 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 1176 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 1177 | "dev": true, 1178 | "engines": { 1179 | "node": ">=4" 1180 | } 1181 | }, 1182 | "node_modules/minimatch": { 1183 | "version": "5.1.6", 1184 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 1185 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 1186 | "dev": true, 1187 | "dependencies": { 1188 | "brace-expansion": "^2.0.1" 1189 | }, 1190 | "engines": { 1191 | "node": ">=10" 1192 | } 1193 | }, 1194 | "node_modules/minimist": { 1195 | "version": "1.2.8", 1196 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1197 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1198 | "dev": true, 1199 | "funding": { 1200 | "url": "https://github.com/sponsors/ljharb" 1201 | } 1202 | }, 1203 | "node_modules/mkdirp": { 1204 | "version": "0.5.6", 1205 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1206 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1207 | "dev": true, 1208 | "dependencies": { 1209 | "minimist": "^1.2.6" 1210 | }, 1211 | "bin": { 1212 | "mkdirp": "bin/cmd.js" 1213 | } 1214 | }, 1215 | "node_modules/mri": { 1216 | "version": "1.2.0", 1217 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1218 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1219 | "dev": true, 1220 | "engines": { 1221 | "node": ">=4" 1222 | } 1223 | }, 1224 | "node_modules/mrmime": { 1225 | "version": "1.0.1", 1226 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", 1227 | "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", 1228 | "dev": true, 1229 | "engines": { 1230 | "node": ">=10" 1231 | } 1232 | }, 1233 | "node_modules/ms": { 1234 | "version": "2.1.2", 1235 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1236 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1237 | "dev": true 1238 | }, 1239 | "node_modules/nanoid": { 1240 | "version": "3.3.6", 1241 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 1242 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 1243 | "dev": true, 1244 | "funding": [ 1245 | { 1246 | "type": "github", 1247 | "url": "https://github.com/sponsors/ai" 1248 | } 1249 | ], 1250 | "bin": { 1251 | "nanoid": "bin/nanoid.cjs" 1252 | }, 1253 | "engines": { 1254 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1255 | } 1256 | }, 1257 | "node_modules/no-case": { 1258 | "version": "3.0.4", 1259 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1260 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1261 | "dev": true, 1262 | "dependencies": { 1263 | "lower-case": "^2.0.2", 1264 | "tslib": "^2.0.3" 1265 | } 1266 | }, 1267 | "node_modules/normalize-path": { 1268 | "version": "3.0.0", 1269 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1270 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1271 | "dev": true, 1272 | "engines": { 1273 | "node": ">=0.10.0" 1274 | } 1275 | }, 1276 | "node_modules/npm-bundled": { 1277 | "version": "2.0.1", 1278 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", 1279 | "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", 1280 | "dev": true, 1281 | "dependencies": { 1282 | "npm-normalize-package-bin": "^2.0.0" 1283 | }, 1284 | "engines": { 1285 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1286 | } 1287 | }, 1288 | "node_modules/npm-normalize-package-bin": { 1289 | "version": "2.0.0", 1290 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", 1291 | "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", 1292 | "dev": true, 1293 | "engines": { 1294 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1295 | } 1296 | }, 1297 | "node_modules/npm-packlist": { 1298 | "version": "5.1.3", 1299 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", 1300 | "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", 1301 | "dev": true, 1302 | "dependencies": { 1303 | "glob": "^8.0.1", 1304 | "ignore-walk": "^5.0.1", 1305 | "npm-bundled": "^2.0.0", 1306 | "npm-normalize-package-bin": "^2.0.0" 1307 | }, 1308 | "bin": { 1309 | "npm-packlist": "bin/index.js" 1310 | }, 1311 | "engines": { 1312 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1313 | } 1314 | }, 1315 | "node_modules/once": { 1316 | "version": "1.4.0", 1317 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1318 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1319 | "dev": true, 1320 | "dependencies": { 1321 | "wrappy": "1" 1322 | } 1323 | }, 1324 | "node_modules/parent-module": { 1325 | "version": "1.0.1", 1326 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1327 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1328 | "dev": true, 1329 | "dependencies": { 1330 | "callsites": "^3.0.0" 1331 | }, 1332 | "engines": { 1333 | "node": ">=6" 1334 | } 1335 | }, 1336 | "node_modules/pascal-case": { 1337 | "version": "3.1.2", 1338 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 1339 | "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 1340 | "dev": true, 1341 | "dependencies": { 1342 | "no-case": "^3.0.4", 1343 | "tslib": "^2.0.3" 1344 | } 1345 | }, 1346 | "node_modules/path-is-absolute": { 1347 | "version": "1.0.1", 1348 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1349 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1350 | "dev": true, 1351 | "engines": { 1352 | "node": ">=0.10.0" 1353 | } 1354 | }, 1355 | "node_modules/periscopic": { 1356 | "version": "3.1.0", 1357 | "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", 1358 | "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", 1359 | "dev": true, 1360 | "dependencies": { 1361 | "@types/estree": "^1.0.0", 1362 | "estree-walker": "^3.0.0", 1363 | "is-reference": "^3.0.0" 1364 | } 1365 | }, 1366 | "node_modules/picocolors": { 1367 | "version": "1.0.0", 1368 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1369 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1370 | "dev": true 1371 | }, 1372 | "node_modules/picomatch": { 1373 | "version": "2.3.1", 1374 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1375 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1376 | "dev": true, 1377 | "engines": { 1378 | "node": ">=8.6" 1379 | }, 1380 | "funding": { 1381 | "url": "https://github.com/sponsors/jonschlinkert" 1382 | } 1383 | }, 1384 | "node_modules/postcss": { 1385 | "version": "8.4.24", 1386 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", 1387 | "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", 1388 | "dev": true, 1389 | "funding": [ 1390 | { 1391 | "type": "opencollective", 1392 | "url": "https://opencollective.com/postcss/" 1393 | }, 1394 | { 1395 | "type": "tidelift", 1396 | "url": "https://tidelift.com/funding/github/npm/postcss" 1397 | }, 1398 | { 1399 | "type": "github", 1400 | "url": "https://github.com/sponsors/ai" 1401 | } 1402 | ], 1403 | "dependencies": { 1404 | "nanoid": "^3.3.6", 1405 | "picocolors": "^1.0.0", 1406 | "source-map-js": "^1.0.2" 1407 | }, 1408 | "engines": { 1409 | "node": "^10 || ^12 || >=14" 1410 | } 1411 | }, 1412 | "node_modules/publint": { 1413 | "version": "0.1.16", 1414 | "resolved": "https://registry.npmjs.org/publint/-/publint-0.1.16.tgz", 1415 | "integrity": "sha512-wJgk7HnXDT5Ap0DjFYbGz78kPkN44iQvDiaq8P63IEEyNU9mYXvaMd2cAyIM6OgqXM/IA3CK6XWIsRq+wjNpgw==", 1416 | "dev": true, 1417 | "dependencies": { 1418 | "npm-packlist": "^5.1.3", 1419 | "picocolors": "^1.0.0", 1420 | "sade": "^1.8.1" 1421 | }, 1422 | "bin": { 1423 | "publint": "lib/cli.js" 1424 | }, 1425 | "engines": { 1426 | "node": ">=16" 1427 | }, 1428 | "funding": { 1429 | "url": "https://bjornlu.com/sponsor" 1430 | } 1431 | }, 1432 | "node_modules/queue-microtask": { 1433 | "version": "1.2.3", 1434 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1435 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1436 | "dev": true, 1437 | "funding": [ 1438 | { 1439 | "type": "github", 1440 | "url": "https://github.com/sponsors/feross" 1441 | }, 1442 | { 1443 | "type": "patreon", 1444 | "url": "https://www.patreon.com/feross" 1445 | }, 1446 | { 1447 | "type": "consulting", 1448 | "url": "https://feross.org/support" 1449 | } 1450 | ] 1451 | }, 1452 | "node_modules/readdirp": { 1453 | "version": "3.6.0", 1454 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1455 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1456 | "dev": true, 1457 | "dependencies": { 1458 | "picomatch": "^2.2.1" 1459 | }, 1460 | "engines": { 1461 | "node": ">=8.10.0" 1462 | } 1463 | }, 1464 | "node_modules/resolve-from": { 1465 | "version": "4.0.0", 1466 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1467 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1468 | "dev": true, 1469 | "engines": { 1470 | "node": ">=4" 1471 | } 1472 | }, 1473 | "node_modules/reusify": { 1474 | "version": "1.0.4", 1475 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1476 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1477 | "dev": true, 1478 | "engines": { 1479 | "iojs": ">=1.0.0", 1480 | "node": ">=0.10.0" 1481 | } 1482 | }, 1483 | "node_modules/rimraf": { 1484 | "version": "2.7.1", 1485 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1486 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1487 | "dev": true, 1488 | "dependencies": { 1489 | "glob": "^7.1.3" 1490 | }, 1491 | "bin": { 1492 | "rimraf": "bin.js" 1493 | } 1494 | }, 1495 | "node_modules/rimraf/node_modules/brace-expansion": { 1496 | "version": "1.1.11", 1497 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1498 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1499 | "dev": true, 1500 | "dependencies": { 1501 | "balanced-match": "^1.0.0", 1502 | "concat-map": "0.0.1" 1503 | } 1504 | }, 1505 | "node_modules/rimraf/node_modules/glob": { 1506 | "version": "7.2.3", 1507 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1508 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1509 | "dev": true, 1510 | "dependencies": { 1511 | "fs.realpath": "^1.0.0", 1512 | "inflight": "^1.0.4", 1513 | "inherits": "2", 1514 | "minimatch": "^3.1.1", 1515 | "once": "^1.3.0", 1516 | "path-is-absolute": "^1.0.0" 1517 | }, 1518 | "engines": { 1519 | "node": "*" 1520 | }, 1521 | "funding": { 1522 | "url": "https://github.com/sponsors/isaacs" 1523 | } 1524 | }, 1525 | "node_modules/rimraf/node_modules/minimatch": { 1526 | "version": "3.1.2", 1527 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1528 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1529 | "dev": true, 1530 | "dependencies": { 1531 | "brace-expansion": "^1.1.7" 1532 | }, 1533 | "engines": { 1534 | "node": "*" 1535 | } 1536 | }, 1537 | "node_modules/rollup": { 1538 | "version": "3.26.1", 1539 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.1.tgz", 1540 | "integrity": "sha512-I5gJCSpSMr3U9wv4D5YA8g7w7cj3eaSDeo7t+JcaFQOmoOUBgu4K9iMp8k3EZnwbJrjQxUMSKxMyB8qEQzzaSg==", 1541 | "dev": true, 1542 | "bin": { 1543 | "rollup": "dist/bin/rollup" 1544 | }, 1545 | "engines": { 1546 | "node": ">=14.18.0", 1547 | "npm": ">=8.0.0" 1548 | }, 1549 | "optionalDependencies": { 1550 | "fsevents": "~2.3.2" 1551 | } 1552 | }, 1553 | "node_modules/run-parallel": { 1554 | "version": "1.2.0", 1555 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1556 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1557 | "dev": true, 1558 | "funding": [ 1559 | { 1560 | "type": "github", 1561 | "url": "https://github.com/sponsors/feross" 1562 | }, 1563 | { 1564 | "type": "patreon", 1565 | "url": "https://www.patreon.com/feross" 1566 | }, 1567 | { 1568 | "type": "consulting", 1569 | "url": "https://feross.org/support" 1570 | } 1571 | ], 1572 | "dependencies": { 1573 | "queue-microtask": "^1.2.2" 1574 | } 1575 | }, 1576 | "node_modules/sade": { 1577 | "version": "1.8.1", 1578 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1579 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1580 | "dev": true, 1581 | "dependencies": { 1582 | "mri": "^1.1.0" 1583 | }, 1584 | "engines": { 1585 | "node": ">=6" 1586 | } 1587 | }, 1588 | "node_modules/sander": { 1589 | "version": "0.5.1", 1590 | "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", 1591 | "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", 1592 | "dev": true, 1593 | "dependencies": { 1594 | "es6-promise": "^3.1.2", 1595 | "graceful-fs": "^4.1.3", 1596 | "mkdirp": "^0.5.1", 1597 | "rimraf": "^2.5.2" 1598 | } 1599 | }, 1600 | "node_modules/set-cookie-parser": { 1601 | "version": "2.6.0", 1602 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", 1603 | "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", 1604 | "dev": true 1605 | }, 1606 | "node_modules/sirv": { 1607 | "version": "2.0.3", 1608 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", 1609 | "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", 1610 | "dev": true, 1611 | "dependencies": { 1612 | "@polka/url": "^1.0.0-next.20", 1613 | "mrmime": "^1.0.0", 1614 | "totalist": "^3.0.0" 1615 | }, 1616 | "engines": { 1617 | "node": ">= 10" 1618 | } 1619 | }, 1620 | "node_modules/sorcery": { 1621 | "version": "0.11.0", 1622 | "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", 1623 | "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", 1624 | "dev": true, 1625 | "dependencies": { 1626 | "@jridgewell/sourcemap-codec": "^1.4.14", 1627 | "buffer-crc32": "^0.2.5", 1628 | "minimist": "^1.2.0", 1629 | "sander": "^0.5.0" 1630 | }, 1631 | "bin": { 1632 | "sorcery": "bin/sorcery" 1633 | } 1634 | }, 1635 | "node_modules/source-map-js": { 1636 | "version": "1.0.2", 1637 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1638 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1639 | "dev": true, 1640 | "engines": { 1641 | "node": ">=0.10.0" 1642 | } 1643 | }, 1644 | "node_modules/streamsearch": { 1645 | "version": "1.1.0", 1646 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 1647 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 1648 | "dev": true, 1649 | "engines": { 1650 | "node": ">=10.0.0" 1651 | } 1652 | }, 1653 | "node_modules/strip-indent": { 1654 | "version": "3.0.0", 1655 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 1656 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 1657 | "dev": true, 1658 | "dependencies": { 1659 | "min-indent": "^1.0.0" 1660 | }, 1661 | "engines": { 1662 | "node": ">=8" 1663 | } 1664 | }, 1665 | "node_modules/svelte": { 1666 | "version": "4.0.4", 1667 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.0.4.tgz", 1668 | "integrity": "sha512-DDJavyX1mpNFLZ7jU9FwBKouemh6CJHZXwePBa5GXSaW5GuHZ361L2/1uznBqOCxu2UsUoWu8wRsB2iB8QG5sQ==", 1669 | "dev": true, 1670 | "dependencies": { 1671 | "@ampproject/remapping": "^2.2.1", 1672 | "@jridgewell/sourcemap-codec": "^1.4.15", 1673 | "@jridgewell/trace-mapping": "^0.3.18", 1674 | "acorn": "^8.9.0", 1675 | "aria-query": "^5.3.0", 1676 | "axobject-query": "^3.2.1", 1677 | "code-red": "^1.0.3", 1678 | "css-tree": "^2.3.1", 1679 | "estree-walker": "^3.0.3", 1680 | "is-reference": "^3.0.1", 1681 | "locate-character": "^3.0.0", 1682 | "magic-string": "^0.30.0", 1683 | "periscopic": "^3.1.0" 1684 | }, 1685 | "engines": { 1686 | "node": ">=16" 1687 | } 1688 | }, 1689 | "node_modules/svelte-check": { 1690 | "version": "3.4.4", 1691 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.4.4.tgz", 1692 | "integrity": "sha512-Uys9+R65cj8TmP8f5UpS7B2xKpNLYNxEWJsA5ZoKcWq/uwvABFF7xS6iPQGLoa7hxz0DS6xU60YFpmq06E4JxA==", 1693 | "dev": true, 1694 | "dependencies": { 1695 | "@jridgewell/trace-mapping": "^0.3.17", 1696 | "chokidar": "^3.4.1", 1697 | "fast-glob": "^3.2.7", 1698 | "import-fresh": "^3.2.1", 1699 | "picocolors": "^1.0.0", 1700 | "sade": "^1.7.4", 1701 | "svelte-preprocess": "^5.0.3", 1702 | "typescript": "^5.0.3" 1703 | }, 1704 | "bin": { 1705 | "svelte-check": "bin/svelte-check" 1706 | }, 1707 | "peerDependencies": { 1708 | "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0" 1709 | } 1710 | }, 1711 | "node_modules/svelte-hmr": { 1712 | "version": "0.15.2", 1713 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.2.tgz", 1714 | "integrity": "sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==", 1715 | "dev": true, 1716 | "engines": { 1717 | "node": "^12.20 || ^14.13.1 || >= 16" 1718 | }, 1719 | "peerDependencies": { 1720 | "svelte": "^3.19.0 || ^4.0.0-next.0" 1721 | } 1722 | }, 1723 | "node_modules/svelte-preprocess": { 1724 | "version": "5.0.4", 1725 | "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz", 1726 | "integrity": "sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==", 1727 | "dev": true, 1728 | "hasInstallScript": true, 1729 | "dependencies": { 1730 | "@types/pug": "^2.0.6", 1731 | "detect-indent": "^6.1.0", 1732 | "magic-string": "^0.27.0", 1733 | "sorcery": "^0.11.0", 1734 | "strip-indent": "^3.0.0" 1735 | }, 1736 | "engines": { 1737 | "node": ">= 14.10.0" 1738 | }, 1739 | "peerDependencies": { 1740 | "@babel/core": "^7.10.2", 1741 | "coffeescript": "^2.5.1", 1742 | "less": "^3.11.3 || ^4.0.0", 1743 | "postcss": "^7 || ^8", 1744 | "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", 1745 | "pug": "^3.0.0", 1746 | "sass": "^1.26.8", 1747 | "stylus": "^0.55.0", 1748 | "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", 1749 | "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0", 1750 | "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" 1751 | }, 1752 | "peerDependenciesMeta": { 1753 | "@babel/core": { 1754 | "optional": true 1755 | }, 1756 | "coffeescript": { 1757 | "optional": true 1758 | }, 1759 | "less": { 1760 | "optional": true 1761 | }, 1762 | "postcss": { 1763 | "optional": true 1764 | }, 1765 | "postcss-load-config": { 1766 | "optional": true 1767 | }, 1768 | "pug": { 1769 | "optional": true 1770 | }, 1771 | "sass": { 1772 | "optional": true 1773 | }, 1774 | "stylus": { 1775 | "optional": true 1776 | }, 1777 | "sugarss": { 1778 | "optional": true 1779 | }, 1780 | "typescript": { 1781 | "optional": true 1782 | } 1783 | } 1784 | }, 1785 | "node_modules/svelte-preprocess/node_modules/magic-string": { 1786 | "version": "0.27.0", 1787 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 1788 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 1789 | "dev": true, 1790 | "dependencies": { 1791 | "@jridgewell/sourcemap-codec": "^1.4.13" 1792 | }, 1793 | "engines": { 1794 | "node": ">=12" 1795 | } 1796 | }, 1797 | "node_modules/svelte2tsx": { 1798 | "version": "0.6.16", 1799 | "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.6.16.tgz", 1800 | "integrity": "sha512-AX2iYEvQdd4tq5BokRdOOA0N/nD37ZnhXAomrAG9EEGl2cjkvoQUwe1Aluo6FSzA684WJjhxW+1ZXmveCmvDrA==", 1801 | "dev": true, 1802 | "dependencies": { 1803 | "dedent-js": "^1.0.1", 1804 | "pascal-case": "^3.1.1" 1805 | }, 1806 | "peerDependencies": { 1807 | "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0", 1808 | "typescript": "^4.9.4 || ^5.0.0" 1809 | } 1810 | }, 1811 | "node_modules/to-regex-range": { 1812 | "version": "5.0.1", 1813 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1814 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1815 | "dev": true, 1816 | "dependencies": { 1817 | "is-number": "^7.0.0" 1818 | }, 1819 | "engines": { 1820 | "node": ">=8.0" 1821 | } 1822 | }, 1823 | "node_modules/totalist": { 1824 | "version": "3.0.1", 1825 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 1826 | "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 1827 | "dev": true, 1828 | "engines": { 1829 | "node": ">=6" 1830 | } 1831 | }, 1832 | "node_modules/tslib": { 1833 | "version": "2.6.0", 1834 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", 1835 | "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", 1836 | "dev": true 1837 | }, 1838 | "node_modules/typescript": { 1839 | "version": "5.1.6", 1840 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", 1841 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", 1842 | "dev": true, 1843 | "bin": { 1844 | "tsc": "bin/tsc", 1845 | "tsserver": "bin/tsserver" 1846 | }, 1847 | "engines": { 1848 | "node": ">=14.17" 1849 | } 1850 | }, 1851 | "node_modules/undici": { 1852 | "version": "5.22.1", 1853 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", 1854 | "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", 1855 | "dev": true, 1856 | "dependencies": { 1857 | "busboy": "^1.6.0" 1858 | }, 1859 | "engines": { 1860 | "node": ">=14.0" 1861 | } 1862 | }, 1863 | "node_modules/vite": { 1864 | "version": "4.3.9", 1865 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", 1866 | "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", 1867 | "dev": true, 1868 | "dependencies": { 1869 | "esbuild": "^0.17.5", 1870 | "postcss": "^8.4.23", 1871 | "rollup": "^3.21.0" 1872 | }, 1873 | "bin": { 1874 | "vite": "bin/vite.js" 1875 | }, 1876 | "engines": { 1877 | "node": "^14.18.0 || >=16.0.0" 1878 | }, 1879 | "optionalDependencies": { 1880 | "fsevents": "~2.3.2" 1881 | }, 1882 | "peerDependencies": { 1883 | "@types/node": ">= 14", 1884 | "less": "*", 1885 | "sass": "*", 1886 | "stylus": "*", 1887 | "sugarss": "*", 1888 | "terser": "^5.4.0" 1889 | }, 1890 | "peerDependenciesMeta": { 1891 | "@types/node": { 1892 | "optional": true 1893 | }, 1894 | "less": { 1895 | "optional": true 1896 | }, 1897 | "sass": { 1898 | "optional": true 1899 | }, 1900 | "stylus": { 1901 | "optional": true 1902 | }, 1903 | "sugarss": { 1904 | "optional": true 1905 | }, 1906 | "terser": { 1907 | "optional": true 1908 | } 1909 | } 1910 | }, 1911 | "node_modules/vitefu": { 1912 | "version": "0.2.4", 1913 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 1914 | "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 1915 | "dev": true, 1916 | "peerDependencies": { 1917 | "vite": "^3.0.0 || ^4.0.0" 1918 | }, 1919 | "peerDependenciesMeta": { 1920 | "vite": { 1921 | "optional": true 1922 | } 1923 | } 1924 | }, 1925 | "node_modules/wrappy": { 1926 | "version": "1.0.2", 1927 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1928 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1929 | "dev": true 1930 | } 1931 | } 1932 | } 1933 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@okrad/svelte-progressbar", 3 | "version": "2.2.0", 4 | "description": "A multi-series SVG progress bar component made with Svelte. It can be rendered both as a linear, radial (circular), semicircular or even custom-shaped progressbar.", 5 | "author": "Enrico Triolo ", 6 | "license": "MIT", 7 | "repository": "https://github.com/okrad/svelte-progressbar.git", 8 | "keywords": [ 9 | "progress bar", 10 | "progressbar", 11 | "svelte", 12 | "svg" 13 | ], 14 | "scripts": { 15 | "dev": "vite dev", 16 | "build": "vite build && npm run package", 17 | "preview": "vite preview", 18 | "package": "svelte-kit sync && svelte-package && publint", 19 | "bundle": "vite build -c vite.bundle.config.js --outDir bundle", 20 | "prepublishOnly": "npm run package", 21 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 22 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" 23 | }, 24 | "exports": { 25 | ".": { 26 | "types": "./dist/types.d.ts", 27 | "svelte": "./dist/index.js" 28 | } 29 | }, 30 | "files": [ 31 | "dist" 32 | ], 33 | "peerDependencies": { 34 | "svelte": "^4.0.4" 35 | }, 36 | "devDependencies": { 37 | "@sveltejs/adapter-auto": "^2.1.0", 38 | "@sveltejs/kit": "^1.22.0", 39 | "@sveltejs/package": "^2.1.0", 40 | "publint": "^0.1.16", 41 | "svelte": "^4.0.4", 42 | "svelte-check": "^3.4.4", 43 | "tslib": "^2.6.0", 44 | "typescript": "^5.1.6", 45 | "vite": "^4.3.9" 46 | }, 47 | "svelte": "./dist/index.js", 48 | "types": "./dist/types.d.ts", 49 | "type": "module" 50 | } 51 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | } 11 | 12 | export {}; 13 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/lib/Arc.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /src/lib/CustomShapeProgressBar.svelte: -------------------------------------------------------------------------------- 1 | 111 | 112 | 117 | 118 | 119 | 120 | 121 | {#each $store.series as serie, seriesIdx} 122 | {#if serie.perc > 0} 123 | 124 | 125 | {/if} 126 | {/each} 127 | 128 | {#if showProgressValue} 129 | 130 | 131 | 132 | {/if} 133 | 134 | 135 | {#if addBackground} 136 | 137 | {/if} 138 | 139 | 140 | 141 | {#if showProgressValue} 142 | 154 | 155 | {/if} 156 | -------------------------------------------------------------------------------- /src/lib/LinearProgressBar.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 | 39 | -------------------------------------------------------------------------------- /src/lib/ProgressBar.svelte: -------------------------------------------------------------------------------- 1 | 2 | 56 | 57 |
58 | {#if style == 'radial' || style == 'semicircle'} 59 | 65 | 66 | 67 | {:else if style == 'custom'} 68 | 73 | {:else} 74 | 79 | {/if} 80 |
-------------------------------------------------------------------------------- /src/lib/ProgressLabel.svelte: -------------------------------------------------------------------------------- 1 | 50 | 51 | 118 | 119 | {#if showInvertedLabel} 120 | 121 |
{@html $store.label}
122 |
123 | {/if} 124 | 125 | 126 | 127 |
{@html $store.label}
128 |
129 |
130 | -------------------------------------------------------------------------------- /src/lib/RadialProgressBar.svelte: -------------------------------------------------------------------------------- 1 | 79 | 80 | 81 | 82 | {#if showProgressValue} 83 | 84 | 85 | 86 | 87 | 88 | 89 | {/if} 90 | 91 | 92 | {#if addBackground && stackSeries} 93 | 94 | {/if} 95 | 96 | {#each $store.series as serie, idx} 97 | 98 | {#if !stackSeries && addBackground} 99 | 100 | {/if} 101 | 102 | {/each} 103 | 104 | {#if showProgressValue} 105 | 116 | 117 | {/if} 118 | 119 | -------------------------------------------------------------------------------- /src/lib/SeriesArc.svelte: -------------------------------------------------------------------------------- 1 | 28 | {#if !bg} 29 | {#if stackSeries} 30 | {#if $store.series[serieIdx].prevOffset < 100} 31 | 32 | {/if} 33 | {:else} 34 | 35 | {/if} 36 | {:else} 37 | 38 | {/if} -------------------------------------------------------------------------------- /src/lib/index.js: -------------------------------------------------------------------------------- 1 | import ProgressBar from './ProgressBar.svelte'; 2 | export default ProgressBar; -------------------------------------------------------------------------------- /src/lib/stores.ts: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { tweened } from 'svelte/motion'; 3 | import { cubicOut } from 'svelte/easing'; 4 | import {interpolateColor} from './utils'; 5 | import type {Series, SeriesStore} from './types'; 6 | 7 | const twOpts = { 8 | duration: 1000, 9 | easing: cubicOut 10 | }; 11 | 12 | function getProgressLabel(series, labelTemplate: string = null): string { 13 | 14 | let lbl = ''; 15 | 16 | if(labelTemplate) { 17 | lbl = labelTemplate; 18 | series.forEach((s, idx) => { 19 | const re = new RegExp('%v' + (idx + 1)); 20 | lbl = lbl.replace(re, s.perc + '%'); 21 | }); 22 | } 23 | else { 24 | lbl = series.reduce((acc, val) => { 25 | acc.push(val.perc + '%'); 26 | return acc; 27 | }, []).join(' + '); 28 | 29 | } 30 | 31 | return lbl; 32 | 33 | } 34 | 35 | export function seriesStore(series: Array, props): SeriesStore { 36 | 37 | if(props.thresholds && props.thresholds.length > 0) { 38 | //Sort thresholds to ensure proper comparison 39 | props.thresholds.sort((t1, t2) => t1.till - t2.till); 40 | } 41 | 42 | var forcedLabel = props.valueLabel ? props.valueLabel : ''; 43 | 44 | function getColorForSeries(s: Series, seriesIdx: number) { 45 | 46 | let color = null; 47 | 48 | if(props.thresholds && props.thresholds.length > 0) { 49 | const thres = props.thresholds.find((colInfo, idx) => (s.perc <= colInfo.till || idx == props.thresholds.length - 1)); 50 | 51 | if(thres) 52 | color = thres.color; 53 | } 54 | 55 | if(!color) { 56 | 57 | if(series[seriesIdx] && series[seriesIdx].hasOwnProperty('color') && series[seriesIdx].color) { 58 | color = series[seriesIdx].color; 59 | } 60 | else { 61 | const colorTableMaxIndex = props.colors.length; 62 | color = props.colors[seriesIdx % colorTableMaxIndex]; 63 | } 64 | } 65 | 66 | return color; 67 | }; 68 | 69 | function series2storeData(s: Series|number, idx: number): Series { 70 | 71 | let data: any = {}; 72 | 73 | if(typeof s != 'object') { 74 | data = {perc: s}; 75 | } 76 | else { 77 | data = s; 78 | } 79 | 80 | if(!data.hasOwnProperty('color') || !data.color) 81 | data.color = getColorForSeries(data, idx); 82 | 83 | if(forcedLabel) 84 | data.label = forcedLabel; 85 | 86 | data.prevOffset = 0; 87 | 88 | if(props.stackSeries) { 89 | data.radius = 50 - ((props.thickness / 2) * series.length); 90 | } 91 | else { 92 | data.radius = 50 - (idx + 1) * (props.thickness / 2) - (idx > 0 ? props.margin : 0); 93 | } 94 | /* 95 | if(props.stackSeries) { 96 | data.radius = 50 - (props.thickness * series.length); 97 | } 98 | else { 99 | data.radius = 50 - (idx + 1) * props.thickness - (idx > 0 ? props.margin : 0); 100 | } 101 | */ 102 | return data; 103 | }; 104 | 105 | if(!Array.isArray(series)) 106 | series = [series]; 107 | 108 | const { subscribe, set, update } = tweened({ 109 | series: series.map((s, idx) => series2storeData({perc: 0}, idx)), 110 | overallPerc: 0, 111 | label: forcedLabel ? forcedLabel : '' 112 | }, { 113 | ...twOpts, 114 | interpolate: (from, to) => t => { 115 | 116 | const newSeries = []; 117 | 118 | let overallPerc = 0; 119 | const numFromSeries = from.series.length; 120 | const numToSeries = to.series.length; 121 | 122 | if(numFromSeries < numToSeries) { 123 | for(let i = numFromSeries; i < numToSeries; i++) { 124 | from.series.push(series2storeData(0, 0)); 125 | } 126 | } 127 | else if(numFromSeries > numToSeries) { 128 | for(let i = numToSeries; i < numFromSeries; i++) { 129 | to.series.push(series2storeData(0, 0)); 130 | } 131 | } 132 | 133 | from.series.forEach((sv, idx) => { 134 | const tv = to.series[idx]; 135 | 136 | if(tv.perc > sv.perc) { 137 | newSeries[idx] = { 138 | perc: Math.round(sv.perc + (tv.perc - sv.perc) * t), 139 | prevOffset: sv.prevOffset + (tv.prevOffset - sv.prevOffset) * t, 140 | }; 141 | } 142 | else { 143 | newSeries[idx] = { 144 | perc: Math.round(sv.perc - (sv.perc - tv.perc) * t), 145 | prevOffset: sv.prevOffset - (sv.prevOffset - tv.prevOffset) * t, 146 | }; 147 | 148 | } 149 | 150 | const toColor = to.series[idx].hasOwnProperty('color') && to.series[idx].color ? to.series[idx].color : getColorForSeries(newSeries[idx], idx); 151 | 152 | if(sv.hasOwnProperty('color')) { 153 | newSeries[idx].color = interpolateColor(sv.color, toColor, 1); 154 | } 155 | else { 156 | newSeries[idx].color = toColor; 157 | } 158 | 159 | overallPerc += newSeries[idx].perc; 160 | 161 | if(props.stackSeries) 162 | newSeries[idx].radius = 50 - ((props.thickness / 2) * series.length); 163 | else 164 | newSeries[idx].radius = 50 - (idx + 1) * (props.thickness / 2) - (idx > 0 ? props.margin : 0); 165 | }); 166 | 167 | if(overallPerc > 100) 168 | overallPerc = 100; 169 | 170 | return { 171 | series: newSeries, 172 | label: getProgressLabel(newSeries, forcedLabel), 173 | overallPerc 174 | }; 175 | } 176 | }); 177 | 178 | return { 179 | subscribe, 180 | set, 181 | updateSeries: newSeries => { 182 | if(!Array.isArray(newSeries)) 183 | newSeries = [newSeries]; 184 | 185 | newSeries = newSeries.map(s => { 186 | if(typeof s != 'object') 187 | s = {perc: s}; 188 | return s; 189 | }); 190 | 191 | update(state => { 192 | 193 | const newState = { 194 | series: state.series.map(s => s), 195 | overallPerc: state.overallPerc, 196 | label: '' 197 | }; 198 | 199 | newSeries.forEach((ns, idx) => { 200 | newState.series[idx] = series2storeData(ns, idx); 201 | }); 202 | 203 | if(newSeries.length < state.series.length) { 204 | for(let i = newSeries.length; i < state.series.length; i++) { 205 | newState.series[i] = series2storeData(0, 0); 206 | } 207 | } 208 | 209 | let overallOffset = 0; 210 | newState.series.forEach(s => { 211 | s.prevOffset = overallOffset; 212 | overallOffset += s.perc; 213 | }); 214 | 215 | newState.overallPerc = overallOffset; 216 | 217 | if(newState.overallPerc > 100) 218 | newState.overallPerc = 100; 219 | 220 | newState.label = getProgressLabel(newState.series, forcedLabel); 221 | 222 | return newState; 223 | }); 224 | 225 | }, 226 | 227 | updatePerc: (perc, seriesIdx = 0) => { 228 | return update(state => { 229 | state.series[seriesIdx].perc = perc; 230 | state.series[seriesIdx].color = getColorForSeries(state.series[seriesIdx], seriesIdx); 231 | state.overallPerc = state.series.reduce((p, s) => p += s.perc, 0); 232 | state.label = getProgressLabel(state.series, forcedLabel); 233 | 234 | return state; 235 | }); 236 | }, 237 | 238 | updateLabel: newLabel => { 239 | 240 | if(newLabel) { 241 | forcedLabel = newLabel; 242 | update(state => { 243 | return { 244 | series: state.series.map(s => s), 245 | overallPerc: state.overallPerc, 246 | label: getProgressLabel(state.series, forcedLabel) 247 | }; 248 | }); 249 | } 250 | 251 | } 252 | }; 253 | 254 | } -------------------------------------------------------------------------------- /src/lib/types.d.ts: -------------------------------------------------------------------------------- 1 | import {SvelteComponent} from "svelte"; 2 | 3 | interface ProgressBarProps { 4 | series: any, 5 | style ?: string, 6 | showProgressValue ?: boolean, 7 | width ?: number | string, 8 | thickness ?: number, 9 | height ?: number, 10 | textSize ?: number, 11 | stackSeries ?: boolean, 12 | margin ?: number, 13 | addBackground ?: boolean, 14 | bgFillColor ?: string, 15 | bgColor ?: string, 16 | labelColor ?: string, 17 | valueLabel ?: string, 18 | cls ?: string, 19 | rx ?: number, 20 | ry ?: number, 21 | path ?: string, 22 | colors ?: Array, 23 | thresholds ?: Array 24 | } 25 | 26 | export default class ProgressBar extends SvelteComponent {} 27 | 28 | export interface SeriesStore { 29 | subscribe, 30 | set, 31 | series ?: Array, 32 | updateSeries: (newSeries: Array) => void, 33 | updatePerc: (perc: number, seriesIdx: number) => void, 34 | updateLabel: (newLabel: string) => void 35 | } 36 | 37 | export interface Series { 38 | perc: number, 39 | color ?: string, 40 | prevOffset ?: number, 41 | radius ?: number 42 | } 43 | 44 | export interface Threshold { 45 | till: number, 46 | color: string 47 | } -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | interface CartesianCoords { 4 | x: number, 5 | y: number 6 | }; 7 | 8 | export function getArcPath(x: number, y: number, radius: number, startAngle: number, endAngle: number, closed: boolean): string { 9 | 10 | //Avoid overlapping of start and end positions... 11 | if(endAngle == 360) 12 | endAngle = 359.9999; 13 | 14 | const start = polarToCartesian(x, y, radius, endAngle); 15 | const end = polarToCartesian(x, y, radius, startAngle); 16 | 17 | const largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1"; 18 | 19 | return [ 20 | "M", start.x, start.y, 21 | "A", radius, radius, 0, largeArcFlag, 0, end.x, end.y, 22 | closed ? 'Z' : '' 23 | ].join(" "); 24 | 25 | } 26 | 27 | //Based on https://stackoverflow.com/q/5736398 28 | function polarToCartesian(centerX: number, centerY: number, radius: number, angleInDegrees: number): CartesianCoords { 29 | angleInDegrees = angleInDegrees % 360; 30 | const angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; 31 | 32 | return { 33 | x: centerX + (radius * Math.cos(angleInRadians)), 34 | y: centerY + (radius * Math.sin(angleInRadians)) 35 | }; 36 | } 37 | 38 | 39 | //Converts a #ffffff hex string into an [r,g,b] array 40 | //See https://stackoverflow.com/a/5624139 41 | function hex2rgb(hex: string): number[] { 42 | 43 | if(hex.length == 4) { 44 | // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") 45 | const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; 46 | hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b); 47 | } 48 | 49 | const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); 50 | 51 | return result ? [ 52 | parseInt(result[1], 16), 53 | parseInt(result[2], 16), 54 | parseInt(result[3], 16) 55 | ] : null; 56 | } 57 | 58 | function rgb2hex(rgb: number[]): string { 59 | return "#" + ((1 << 24) + (rgb[0] << 16) + (rgb[1] << 8) + rgb[2]).toString(16).slice(1); 60 | } 61 | 62 | /** 63 | * Interpolate two hex colors 64 | */ 65 | export function interpolateColor(hexColor1: string, hexColor2: string, factor: number): string { 66 | const rgbColor1 = hex2rgb(hexColor1); 67 | const rgbColor2 = hex2rgb(hexColor2); 68 | 69 | let result = rgbColor1.slice(); 70 | for(let i = 0; i < 3; i++) { 71 | result[i] = Math.round(result[i] + factor * (rgbColor2[i] - rgbColor1[i])); 72 | if(result[i] > 255) 73 | result[i] = 255; 74 | if(result[i] < 0) 75 | result[i] = 0; 76 | } 77 | 78 | return rgb2hex(result); 79 | } 80 | 81 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 |

Welcome to your library project

2 |

Create your package using @sveltejs/package and preview/showcase your work with SvelteKit

3 |

Visit kit.svelte.dev to read the documentation

4 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node" 6 | }, 7 | "include": ["vite.config.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /vite.bundle.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { svelte } from '@sveltejs/vite-plugin-svelte' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig(({ command, mode }) => { 6 | return { 7 | plugins: [ 8 | svelte({ 9 | emitCss: false 10 | }) 11 | ], 12 | build: { 13 | lib: { 14 | entry: 'src/lib/ProgressBar.svelte', 15 | name: 'ProgressBar', 16 | formats: ['es', 'umd'], 17 | fileName: (format) => { 18 | if(format == 'es') 19 | return 'index.mjs'; 20 | else 21 | return 'index.js'; 22 | } 23 | }, 24 | watch: mode == 'development' ? {} : null, 25 | minify: mode != 'development' 26 | } 27 | } 28 | }) 29 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vite'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()] 6 | }); 7 | --------------------------------------------------------------------------------