├── .gitignore ├── README.md ├── env.d.ts ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── favicon.ico ├── icons │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon-114x114.png │ ├── apple-touch-icon-120x120.png │ ├── apple-touch-icon-144x144.png │ ├── apple-touch-icon-152x152.png │ ├── apple-touch-icon-180x180.png │ ├── apple-touch-icon-57x57.png │ ├── apple-touch-icon-60x60.png │ ├── apple-touch-icon-72x72.png │ ├── apple-touch-icon-76x76.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── mstile-150x150.png │ └── safari-pinned-tab.svg ├── screenshot-visible.png └── screenshot.png ├── src ├── Index.vue ├── Logo.vue ├── WordleWars.vue ├── components │ ├── Example.ts │ ├── ExampleInfo.vue │ ├── ExampleWrapper.vue │ ├── Game.vue │ ├── Header.vue │ ├── Keyboard.vue │ ├── MiniBoard.vue │ ├── MiniBoardPlaying.vue │ ├── MiniBoardScore.vue │ ├── MiniScore.vue │ ├── MiniScores.vue │ └── ScoreCard.vue ├── lib-liveblocks │ ├── LiveblocksProvider.vue │ ├── RoomProvider.vue │ ├── index.ts │ ├── symbols.ts │ ├── useList.ts │ ├── useMyPresence.ts │ ├── useOthers.ts │ └── useStorage.ts ├── lib │ ├── copyText.ts │ ├── createRoomId.ts │ ├── getWordOfTheDay.ts │ ├── messages.ts │ └── sortUsers.ts ├── liveblocks.config.ts ├── main.ts ├── styles │ └── global.css ├── types.ts └── words.ts ├── tailwind.config.js ├── tsconfig.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | .idea 7 | .vscode 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Wordle Wars](https://wordlewars.ctnicholas.dev) 2 | 3 | This repo shows how to build a multiplayer Wordle clone with [Liveblocks](https://liveblocks.io), [Vue](https://vuejs.org/), and [Vite](https://vitejs.dev/). 4 | 5 | ![Wordle wars screenshot](https://wordlewars.ctnicholas.dev/screenshot.png) 6 | 7 | ## [Try it out](https://wordlewars.ctnicholas.dev) 8 | 9 | 10 | It's forked from [Vue Wordle](https://github.com/yyx990803/vue-wordle) created by Evan You (@yyx990803), with some multiplayer and extra styling added. 11 | You can only see your opponent's letters after you've got the word of the day. Scores are saved at the end of the war, 12 | and a new Wordle becomes available at UTC±00:00 every day. It features a dark mode and a colourblind mode. 13 | 14 | ![Wordle wars screenshot](https://wordlewars.ctnicholas.dev/screenshot-visible.png) 15 | 16 | This repository is open sourced for learning purposes only - the original creator(s) of Wordle own all applicable rights to the game itself. 17 | 18 | ## Getting started 19 | 20 | ### Run examples locally 21 | 22 | - Install all dependencies with `npm install` 23 | 24 | - Create an account on [liveblocks.io](https://liveblocks.io/dashboard) 25 | 26 | - Copy your public key from the [administration](https://liveblocks.io/dashboard/apikeys) 27 | 28 | - Create a file named `.env.local` and add your Liveblocks secret as environment variable `VITE_LIVEBLOCKS_PUBLIC_KEY=sk_test_yourkey` 29 | 30 | ### Run examples on CodeSandbox 31 | 32 | - Open this repository on CodeSandbox with this [link](https://codesandbox.io/s/wordle-wars-with-liveblocks-and-vite-0hhdi) 33 | 34 | - Create an account on [liveblocks.io](https://liveblocks.io/dashboard) 35 | 36 | - Copy your public key from the [administration](https://liveblocks.io/dashboard/apikeys) 37 | 38 | - Create [secret](https://codesandbox.io/docs/secrets) named `VITE_LIVEBLOCKS_PUBLIC_KEY` with the secret key you just copied. You need to create an account on CodeSandbox to add an environment variable. 39 | 40 | - Refresh your browser and you should be good to go! 41 | 42 | 43 | ## More with Liveblocks 44 | [![Adding live cursors to Next.js](https://www.ctnicholas.dev/images/custom-thumbnails/live-cursors-with-liveblocks.png)](https://www.ctnicholas.dev/articles/live-cursors-with-liveblocks) 45 | [![Build a live piano](https://livepiano.ctnicholas.dev/screenshot.png)](https://livepiano.ctnicholas.dev) 46 | [![Build a live basket](https://livebasket.ctnicholas.dev/screenshot.png)](https://livebasket.ctnicholas.dev) 47 | -------------------------------------------------------------------------------- /env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Wordle Wars — A multiplayer Wordle clone • ctnicholas.dev 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wordle-wars", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "wordle-wars", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@liveblocks/client": "^1.8.1", 12 | "vue": "^3.2.25", 13 | "vue-confetti-explosion": "^1.0.1" 14 | }, 15 | "devDependencies": { 16 | "@vitejs/plugin-vue": "^2.0.0", 17 | "autoprefixer": "^10.4.2", 18 | "postcss": "^8.4.6", 19 | "tailwindcss": "^3.0.19", 20 | "vite": "^2.7.2" 21 | } 22 | }, 23 | "node_modules/@babel/code-frame": { 24 | "version": "7.16.7", 25 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 26 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 27 | "dev": true, 28 | "dependencies": { 29 | "@babel/highlight": "^7.16.7" 30 | }, 31 | "engines": { 32 | "node": ">=6.9.0" 33 | } 34 | }, 35 | "node_modules/@babel/helper-validator-identifier": { 36 | "version": "7.16.7", 37 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 38 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 39 | "dev": true, 40 | "engines": { 41 | "node": ">=6.9.0" 42 | } 43 | }, 44 | "node_modules/@babel/highlight": { 45 | "version": "7.16.10", 46 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", 47 | "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", 48 | "dev": true, 49 | "dependencies": { 50 | "@babel/helper-validator-identifier": "^7.16.7", 51 | "chalk": "^2.0.0", 52 | "js-tokens": "^4.0.0" 53 | }, 54 | "engines": { 55 | "node": ">=6.9.0" 56 | } 57 | }, 58 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 59 | "version": "3.2.1", 60 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 61 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 62 | "dev": true, 63 | "dependencies": { 64 | "color-convert": "^1.9.0" 65 | }, 66 | "engines": { 67 | "node": ">=4" 68 | } 69 | }, 70 | "node_modules/@babel/highlight/node_modules/chalk": { 71 | "version": "2.4.2", 72 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 73 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 74 | "dev": true, 75 | "dependencies": { 76 | "ansi-styles": "^3.2.1", 77 | "escape-string-regexp": "^1.0.5", 78 | "supports-color": "^5.3.0" 79 | }, 80 | "engines": { 81 | "node": ">=4" 82 | } 83 | }, 84 | "node_modules/@babel/highlight/node_modules/color-convert": { 85 | "version": "1.9.3", 86 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 87 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 88 | "dev": true, 89 | "dependencies": { 90 | "color-name": "1.1.3" 91 | } 92 | }, 93 | "node_modules/@babel/highlight/node_modules/color-name": { 94 | "version": "1.1.3", 95 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 96 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 97 | "dev": true 98 | }, 99 | "node_modules/@babel/highlight/node_modules/has-flag": { 100 | "version": "3.0.0", 101 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 102 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 103 | "dev": true, 104 | "engines": { 105 | "node": ">=4" 106 | } 107 | }, 108 | "node_modules/@babel/highlight/node_modules/supports-color": { 109 | "version": "5.5.0", 110 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 111 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 112 | "dev": true, 113 | "dependencies": { 114 | "has-flag": "^3.0.0" 115 | }, 116 | "engines": { 117 | "node": ">=4" 118 | } 119 | }, 120 | "node_modules/@babel/parser": { 121 | "version": "7.16.12", 122 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", 123 | "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", 124 | "bin": { 125 | "parser": "bin/babel-parser.js" 126 | }, 127 | "engines": { 128 | "node": ">=6.0.0" 129 | } 130 | }, 131 | "node_modules/@liveblocks/client": { 132 | "version": "1.8.1", 133 | "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-1.8.1.tgz", 134 | "integrity": "sha512-2em/JBTH12sFvX2EsLpOJJu9o8tv5ABsF4ITwO+Zt7Zn8Ptdfs2jdlptZDepLCvijtIT5rLz9lZ+NaCF1gceHQ==", 135 | "dependencies": { 136 | "@liveblocks/core": "1.8.1" 137 | } 138 | }, 139 | "node_modules/@liveblocks/core": { 140 | "version": "1.8.1", 141 | "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-1.8.1.tgz", 142 | "integrity": "sha512-gDSlKzVJt6sApvJpXn/EXGZr83P5dwc1K4voRdcQUSD/1a4IZp81o3g00g2rqAbkXAVvk+3KWzubyTj5gRlpQg==" 143 | }, 144 | "node_modules/@nodelib/fs.scandir": { 145 | "version": "2.1.5", 146 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 147 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 148 | "dev": true, 149 | "dependencies": { 150 | "@nodelib/fs.stat": "2.0.5", 151 | "run-parallel": "^1.1.9" 152 | }, 153 | "engines": { 154 | "node": ">= 8" 155 | } 156 | }, 157 | "node_modules/@nodelib/fs.stat": { 158 | "version": "2.0.5", 159 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 160 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 161 | "dev": true, 162 | "engines": { 163 | "node": ">= 8" 164 | } 165 | }, 166 | "node_modules/@nodelib/fs.walk": { 167 | "version": "1.2.8", 168 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 169 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 170 | "dev": true, 171 | "dependencies": { 172 | "@nodelib/fs.scandir": "2.1.5", 173 | "fastq": "^1.6.0" 174 | }, 175 | "engines": { 176 | "node": ">= 8" 177 | } 178 | }, 179 | "node_modules/@types/parse-json": { 180 | "version": "4.0.0", 181 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 182 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", 183 | "dev": true 184 | }, 185 | "node_modules/@vitejs/plugin-vue": { 186 | "version": "2.1.0", 187 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.1.0.tgz", 188 | "integrity": "sha512-AZ78WxvFMYd8JmM/GBV6a6SGGTU0GgN/0/4T+FnMMsLzFEzTeAUwuraapy50ifHZsC+G5SvWs86bvaCPTneFlA==", 189 | "dev": true, 190 | "engines": { 191 | "node": ">=12.0.0" 192 | }, 193 | "peerDependencies": { 194 | "vite": "^2.5.10", 195 | "vue": "^3.2.25" 196 | } 197 | }, 198 | "node_modules/@vue/compiler-core": { 199 | "version": "3.2.28", 200 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.28.tgz", 201 | "integrity": "sha512-mQpfEjmHVxmWKaup0HL6tLMv2HqjjJu7XT4/q0IoUXYXC4xKG8lIVn5YChJqxBTLPuQjzas7u7i9L4PAWJZRtA==", 202 | "dependencies": { 203 | "@babel/parser": "^7.16.4", 204 | "@vue/shared": "3.2.28", 205 | "estree-walker": "^2.0.2", 206 | "source-map": "^0.6.1" 207 | } 208 | }, 209 | "node_modules/@vue/compiler-dom": { 210 | "version": "3.2.28", 211 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.28.tgz", 212 | "integrity": "sha512-KA4yXceLteKC7VykvPnViUixemQw3A+oii+deSbZJOQKQKVh1HLosI10qxa8ImPCyun41+wG3uGR+tW7eu1W6Q==", 213 | "dependencies": { 214 | "@vue/compiler-core": "3.2.28", 215 | "@vue/shared": "3.2.28" 216 | } 217 | }, 218 | "node_modules/@vue/compiler-sfc": { 219 | "version": "3.2.28", 220 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.28.tgz", 221 | "integrity": "sha512-zB0WznfEBb4CbGBHzhboHDKVO5nxbkbxxFo9iVlxObP7a9/qvA5kkZEuT7nXP52f3b3qEfmVTjIT23Lo1ndZdQ==", 222 | "dependencies": { 223 | "@babel/parser": "^7.16.4", 224 | "@vue/compiler-core": "3.2.28", 225 | "@vue/compiler-dom": "3.2.28", 226 | "@vue/compiler-ssr": "3.2.28", 227 | "@vue/reactivity-transform": "3.2.28", 228 | "@vue/shared": "3.2.28", 229 | "estree-walker": "^2.0.2", 230 | "magic-string": "^0.25.7", 231 | "postcss": "^8.1.10", 232 | "source-map": "^0.6.1" 233 | } 234 | }, 235 | "node_modules/@vue/compiler-ssr": { 236 | "version": "3.2.28", 237 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.28.tgz", 238 | "integrity": "sha512-z8rck1PDTu20iLyip9lAvIhaO40DUJrw3Zv0mS4Apfh3PlfWpF5dhsO5g0dgt213wgYsQIYVIlU9cfrYapqRgg==", 239 | "dependencies": { 240 | "@vue/compiler-dom": "3.2.28", 241 | "@vue/shared": "3.2.28" 242 | } 243 | }, 244 | "node_modules/@vue/reactivity": { 245 | "version": "3.2.28", 246 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.28.tgz", 247 | "integrity": "sha512-WamM5LGv7JIarW+EYAzYFqYonZXjTnOjNW0sBO93jRE9I1ReAwfH8NvQXkPA3JZ3fuF6SGDdG8Y9/+dKjd/1Gw==", 248 | "dependencies": { 249 | "@vue/shared": "3.2.28" 250 | } 251 | }, 252 | "node_modules/@vue/reactivity-transform": { 253 | "version": "3.2.28", 254 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.28.tgz", 255 | "integrity": "sha512-zE8idNkOPnBDd2tKSIk84hOQZ+jXKvSy5FoIIVlcNEJHnCFnQ3maqeSJ9KoB2Rf6EXUhFTiTDNRlYlXmT2uHbQ==", 256 | "dependencies": { 257 | "@babel/parser": "^7.16.4", 258 | "@vue/compiler-core": "3.2.28", 259 | "@vue/shared": "3.2.28", 260 | "estree-walker": "^2.0.2", 261 | "magic-string": "^0.25.7" 262 | } 263 | }, 264 | "node_modules/@vue/runtime-core": { 265 | "version": "3.2.28", 266 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.28.tgz", 267 | "integrity": "sha512-sVbBMFUt42JatTlXbdH6tVcLPw1eEOrrVQWI+j6/nJVzR852RURaT6DhdR0azdYscxq4xmmBctE0VQmlibBOFw==", 268 | "dependencies": { 269 | "@vue/reactivity": "3.2.28", 270 | "@vue/shared": "3.2.28" 271 | } 272 | }, 273 | "node_modules/@vue/runtime-dom": { 274 | "version": "3.2.28", 275 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.28.tgz", 276 | "integrity": "sha512-Jg7cxZanEXXGu1QnZILFLnDrM+MIFN8VAullmMZiJEZziHvhygRMpi0ahNy/8OqGwtTze1JNhLdHRBO+q2hbmg==", 277 | "dependencies": { 278 | "@vue/runtime-core": "3.2.28", 279 | "@vue/shared": "3.2.28", 280 | "csstype": "^2.6.8" 281 | } 282 | }, 283 | "node_modules/@vue/server-renderer": { 284 | "version": "3.2.28", 285 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.28.tgz", 286 | "integrity": "sha512-S+MhurgkPabRvhdDl8R6efKBmniJqBbbWIYTXADaJIKFLFLQCW4gcYUTbxuebzk6j3z485vpekhrHHymTF52Pg==", 287 | "dependencies": { 288 | "@vue/compiler-ssr": "3.2.28", 289 | "@vue/shared": "3.2.28" 290 | }, 291 | "peerDependencies": { 292 | "vue": "3.2.28" 293 | } 294 | }, 295 | "node_modules/@vue/shared": { 296 | "version": "3.2.28", 297 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.28.tgz", 298 | "integrity": "sha512-eMQ8s9j8FpbGHlgUAaj/coaG3Q8YtMsoWL/RIHTsE3Ex7PUTyr7V91vB5HqWB5Sn8m4RXTHGO22/skoTUYvp0A==" 299 | }, 300 | "node_modules/acorn": { 301 | "version": "7.4.1", 302 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 303 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 304 | "dev": true, 305 | "bin": { 306 | "acorn": "bin/acorn" 307 | }, 308 | "engines": { 309 | "node": ">=0.4.0" 310 | } 311 | }, 312 | "node_modules/acorn-node": { 313 | "version": "1.8.2", 314 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 315 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 316 | "dev": true, 317 | "dependencies": { 318 | "acorn": "^7.0.0", 319 | "acorn-walk": "^7.0.0", 320 | "xtend": "^4.0.2" 321 | } 322 | }, 323 | "node_modules/acorn-walk": { 324 | "version": "7.2.0", 325 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 326 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 327 | "dev": true, 328 | "engines": { 329 | "node": ">=0.4.0" 330 | } 331 | }, 332 | "node_modules/ansi-styles": { 333 | "version": "4.3.0", 334 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 335 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 336 | "dev": true, 337 | "dependencies": { 338 | "color-convert": "^2.0.1" 339 | }, 340 | "engines": { 341 | "node": ">=8" 342 | }, 343 | "funding": { 344 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 345 | } 346 | }, 347 | "node_modules/anymatch": { 348 | "version": "3.1.2", 349 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 350 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 351 | "dev": true, 352 | "dependencies": { 353 | "normalize-path": "^3.0.0", 354 | "picomatch": "^2.0.4" 355 | }, 356 | "engines": { 357 | "node": ">= 8" 358 | } 359 | }, 360 | "node_modules/arg": { 361 | "version": "5.0.1", 362 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", 363 | "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", 364 | "dev": true 365 | }, 366 | "node_modules/autoprefixer": { 367 | "version": "10.4.2", 368 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", 369 | "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", 370 | "dev": true, 371 | "dependencies": { 372 | "browserslist": "^4.19.1", 373 | "caniuse-lite": "^1.0.30001297", 374 | "fraction.js": "^4.1.2", 375 | "normalize-range": "^0.1.2", 376 | "picocolors": "^1.0.0", 377 | "postcss-value-parser": "^4.2.0" 378 | }, 379 | "bin": { 380 | "autoprefixer": "bin/autoprefixer" 381 | }, 382 | "engines": { 383 | "node": "^10 || ^12 || >=14" 384 | }, 385 | "funding": { 386 | "type": "opencollective", 387 | "url": "https://opencollective.com/postcss/" 388 | }, 389 | "peerDependencies": { 390 | "postcss": "^8.1.0" 391 | } 392 | }, 393 | "node_modules/binary-extensions": { 394 | "version": "2.2.0", 395 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 396 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 397 | "dev": true, 398 | "engines": { 399 | "node": ">=8" 400 | } 401 | }, 402 | "node_modules/braces": { 403 | "version": "3.0.2", 404 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 405 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 406 | "dev": true, 407 | "dependencies": { 408 | "fill-range": "^7.0.1" 409 | }, 410 | "engines": { 411 | "node": ">=8" 412 | } 413 | }, 414 | "node_modules/browserslist": { 415 | "version": "4.19.1", 416 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", 417 | "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", 418 | "dev": true, 419 | "dependencies": { 420 | "caniuse-lite": "^1.0.30001286", 421 | "electron-to-chromium": "^1.4.17", 422 | "escalade": "^3.1.1", 423 | "node-releases": "^2.0.1", 424 | "picocolors": "^1.0.0" 425 | }, 426 | "bin": { 427 | "browserslist": "cli.js" 428 | }, 429 | "engines": { 430 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 431 | }, 432 | "funding": { 433 | "type": "opencollective", 434 | "url": "https://opencollective.com/browserslist" 435 | } 436 | }, 437 | "node_modules/callsites": { 438 | "version": "3.1.0", 439 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 440 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 441 | "dev": true, 442 | "engines": { 443 | "node": ">=6" 444 | } 445 | }, 446 | "node_modules/camelcase-css": { 447 | "version": "2.0.1", 448 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 449 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 450 | "dev": true, 451 | "engines": { 452 | "node": ">= 6" 453 | } 454 | }, 455 | "node_modules/caniuse-lite": { 456 | "version": "1.0.30001309", 457 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001309.tgz", 458 | "integrity": "sha512-Pl8vfigmBXXq+/yUz1jUwULeq9xhMJznzdc/xwl4WclDAuebcTHVefpz8lE/bMI+UN7TOkSSe7B7RnZd6+dzjA==", 459 | "dev": true, 460 | "funding": { 461 | "type": "opencollective", 462 | "url": "https://opencollective.com/browserslist" 463 | } 464 | }, 465 | "node_modules/chalk": { 466 | "version": "4.1.2", 467 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 468 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 469 | "dev": true, 470 | "dependencies": { 471 | "ansi-styles": "^4.1.0", 472 | "supports-color": "^7.1.0" 473 | }, 474 | "engines": { 475 | "node": ">=10" 476 | }, 477 | "funding": { 478 | "url": "https://github.com/chalk/chalk?sponsor=1" 479 | } 480 | }, 481 | "node_modules/chokidar": { 482 | "version": "3.5.3", 483 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 484 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 485 | "dev": true, 486 | "funding": [ 487 | { 488 | "type": "individual", 489 | "url": "https://paulmillr.com/funding/" 490 | } 491 | ], 492 | "dependencies": { 493 | "anymatch": "~3.1.2", 494 | "braces": "~3.0.2", 495 | "glob-parent": "~5.1.2", 496 | "is-binary-path": "~2.1.0", 497 | "is-glob": "~4.0.1", 498 | "normalize-path": "~3.0.0", 499 | "readdirp": "~3.6.0" 500 | }, 501 | "engines": { 502 | "node": ">= 8.10.0" 503 | }, 504 | "optionalDependencies": { 505 | "fsevents": "~2.3.2" 506 | } 507 | }, 508 | "node_modules/chokidar/node_modules/glob-parent": { 509 | "version": "5.1.2", 510 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 511 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 512 | "dev": true, 513 | "dependencies": { 514 | "is-glob": "^4.0.1" 515 | }, 516 | "engines": { 517 | "node": ">= 6" 518 | } 519 | }, 520 | "node_modules/color-convert": { 521 | "version": "2.0.1", 522 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 523 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 524 | "dev": true, 525 | "dependencies": { 526 | "color-name": "~1.1.4" 527 | }, 528 | "engines": { 529 | "node": ">=7.0.0" 530 | } 531 | }, 532 | "node_modules/color-name": { 533 | "version": "1.1.4", 534 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 535 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 536 | "dev": true 537 | }, 538 | "node_modules/cosmiconfig": { 539 | "version": "7.0.1", 540 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", 541 | "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", 542 | "dev": true, 543 | "dependencies": { 544 | "@types/parse-json": "^4.0.0", 545 | "import-fresh": "^3.2.1", 546 | "parse-json": "^5.0.0", 547 | "path-type": "^4.0.0", 548 | "yaml": "^1.10.0" 549 | }, 550 | "engines": { 551 | "node": ">=10" 552 | } 553 | }, 554 | "node_modules/cssesc": { 555 | "version": "3.0.0", 556 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 557 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 558 | "dev": true, 559 | "bin": { 560 | "cssesc": "bin/cssesc" 561 | }, 562 | "engines": { 563 | "node": ">=4" 564 | } 565 | }, 566 | "node_modules/csstype": { 567 | "version": "2.6.19", 568 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", 569 | "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" 570 | }, 571 | "node_modules/defined": { 572 | "version": "1.0.0", 573 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 574 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 575 | "dev": true 576 | }, 577 | "node_modules/detective": { 578 | "version": "5.2.0", 579 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", 580 | "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", 581 | "dev": true, 582 | "dependencies": { 583 | "acorn-node": "^1.6.1", 584 | "defined": "^1.0.0", 585 | "minimist": "^1.1.1" 586 | }, 587 | "bin": { 588 | "detective": "bin/detective.js" 589 | }, 590 | "engines": { 591 | "node": ">=0.8.0" 592 | } 593 | }, 594 | "node_modules/didyoumean": { 595 | "version": "1.2.2", 596 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 597 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 598 | "dev": true 599 | }, 600 | "node_modules/dlv": { 601 | "version": "1.1.3", 602 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 603 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 604 | "dev": true 605 | }, 606 | "node_modules/electron-to-chromium": { 607 | "version": "1.4.67", 608 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.67.tgz", 609 | "integrity": "sha512-A6a2jEPLueEDfb7kvh7/E94RKKnIb01qL+4I7RFxtajmo+G9F5Ei7HgY5PRbQ4RDrh6DGDW66P0hD5XI2nRAcg==", 610 | "dev": true 611 | }, 612 | "node_modules/error-ex": { 613 | "version": "1.3.2", 614 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 615 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 616 | "dev": true, 617 | "dependencies": { 618 | "is-arrayish": "^0.2.1" 619 | } 620 | }, 621 | "node_modules/esbuild": { 622 | "version": "0.13.15", 623 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz", 624 | "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==", 625 | "dev": true, 626 | "hasInstallScript": true, 627 | "bin": { 628 | "esbuild": "bin/esbuild" 629 | }, 630 | "optionalDependencies": { 631 | "esbuild-android-arm64": "0.13.15", 632 | "esbuild-darwin-64": "0.13.15", 633 | "esbuild-darwin-arm64": "0.13.15", 634 | "esbuild-freebsd-64": "0.13.15", 635 | "esbuild-freebsd-arm64": "0.13.15", 636 | "esbuild-linux-32": "0.13.15", 637 | "esbuild-linux-64": "0.13.15", 638 | "esbuild-linux-arm": "0.13.15", 639 | "esbuild-linux-arm64": "0.13.15", 640 | "esbuild-linux-mips64le": "0.13.15", 641 | "esbuild-linux-ppc64le": "0.13.15", 642 | "esbuild-netbsd-64": "0.13.15", 643 | "esbuild-openbsd-64": "0.13.15", 644 | "esbuild-sunos-64": "0.13.15", 645 | "esbuild-windows-32": "0.13.15", 646 | "esbuild-windows-64": "0.13.15", 647 | "esbuild-windows-arm64": "0.13.15" 648 | } 649 | }, 650 | "node_modules/esbuild-android-arm64": { 651 | "version": "0.13.15", 652 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz", 653 | "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==", 654 | "cpu": [ 655 | "arm64" 656 | ], 657 | "dev": true, 658 | "optional": true, 659 | "os": [ 660 | "android" 661 | ] 662 | }, 663 | "node_modules/esbuild-darwin-64": { 664 | "version": "0.13.15", 665 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz", 666 | "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==", 667 | "cpu": [ 668 | "x64" 669 | ], 670 | "dev": true, 671 | "optional": true, 672 | "os": [ 673 | "darwin" 674 | ] 675 | }, 676 | "node_modules/esbuild-darwin-arm64": { 677 | "version": "0.13.15", 678 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz", 679 | "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==", 680 | "cpu": [ 681 | "arm64" 682 | ], 683 | "dev": true, 684 | "optional": true, 685 | "os": [ 686 | "darwin" 687 | ] 688 | }, 689 | "node_modules/esbuild-freebsd-64": { 690 | "version": "0.13.15", 691 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz", 692 | "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==", 693 | "cpu": [ 694 | "x64" 695 | ], 696 | "dev": true, 697 | "optional": true, 698 | "os": [ 699 | "freebsd" 700 | ] 701 | }, 702 | "node_modules/esbuild-freebsd-arm64": { 703 | "version": "0.13.15", 704 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz", 705 | "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==", 706 | "cpu": [ 707 | "arm64" 708 | ], 709 | "dev": true, 710 | "optional": true, 711 | "os": [ 712 | "freebsd" 713 | ] 714 | }, 715 | "node_modules/esbuild-linux-32": { 716 | "version": "0.13.15", 717 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz", 718 | "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==", 719 | "cpu": [ 720 | "ia32" 721 | ], 722 | "dev": true, 723 | "optional": true, 724 | "os": [ 725 | "linux" 726 | ] 727 | }, 728 | "node_modules/esbuild-linux-64": { 729 | "version": "0.13.15", 730 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz", 731 | "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==", 732 | "cpu": [ 733 | "x64" 734 | ], 735 | "dev": true, 736 | "optional": true, 737 | "os": [ 738 | "linux" 739 | ] 740 | }, 741 | "node_modules/esbuild-linux-arm": { 742 | "version": "0.13.15", 743 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz", 744 | "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==", 745 | "cpu": [ 746 | "arm" 747 | ], 748 | "dev": true, 749 | "optional": true, 750 | "os": [ 751 | "linux" 752 | ] 753 | }, 754 | "node_modules/esbuild-linux-arm64": { 755 | "version": "0.13.15", 756 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz", 757 | "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==", 758 | "cpu": [ 759 | "arm64" 760 | ], 761 | "dev": true, 762 | "optional": true, 763 | "os": [ 764 | "linux" 765 | ] 766 | }, 767 | "node_modules/esbuild-linux-mips64le": { 768 | "version": "0.13.15", 769 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz", 770 | "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==", 771 | "cpu": [ 772 | "mips64el" 773 | ], 774 | "dev": true, 775 | "optional": true, 776 | "os": [ 777 | "linux" 778 | ] 779 | }, 780 | "node_modules/esbuild-linux-ppc64le": { 781 | "version": "0.13.15", 782 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz", 783 | "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==", 784 | "cpu": [ 785 | "ppc64" 786 | ], 787 | "dev": true, 788 | "optional": true, 789 | "os": [ 790 | "linux" 791 | ] 792 | }, 793 | "node_modules/esbuild-netbsd-64": { 794 | "version": "0.13.15", 795 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz", 796 | "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==", 797 | "cpu": [ 798 | "x64" 799 | ], 800 | "dev": true, 801 | "optional": true, 802 | "os": [ 803 | "netbsd" 804 | ] 805 | }, 806 | "node_modules/esbuild-openbsd-64": { 807 | "version": "0.13.15", 808 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz", 809 | "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==", 810 | "cpu": [ 811 | "x64" 812 | ], 813 | "dev": true, 814 | "optional": true, 815 | "os": [ 816 | "openbsd" 817 | ] 818 | }, 819 | "node_modules/esbuild-sunos-64": { 820 | "version": "0.13.15", 821 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz", 822 | "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==", 823 | "cpu": [ 824 | "x64" 825 | ], 826 | "dev": true, 827 | "optional": true, 828 | "os": [ 829 | "sunos" 830 | ] 831 | }, 832 | "node_modules/esbuild-windows-32": { 833 | "version": "0.13.15", 834 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz", 835 | "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==", 836 | "cpu": [ 837 | "ia32" 838 | ], 839 | "dev": true, 840 | "optional": true, 841 | "os": [ 842 | "win32" 843 | ] 844 | }, 845 | "node_modules/esbuild-windows-64": { 846 | "version": "0.13.15", 847 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz", 848 | "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==", 849 | "cpu": [ 850 | "x64" 851 | ], 852 | "dev": true, 853 | "optional": true, 854 | "os": [ 855 | "win32" 856 | ] 857 | }, 858 | "node_modules/esbuild-windows-arm64": { 859 | "version": "0.13.15", 860 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz", 861 | "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==", 862 | "cpu": [ 863 | "arm64" 864 | ], 865 | "dev": true, 866 | "optional": true, 867 | "os": [ 868 | "win32" 869 | ] 870 | }, 871 | "node_modules/escalade": { 872 | "version": "3.1.1", 873 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 874 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 875 | "dev": true, 876 | "engines": { 877 | "node": ">=6" 878 | } 879 | }, 880 | "node_modules/escape-string-regexp": { 881 | "version": "1.0.5", 882 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 883 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 884 | "dev": true, 885 | "engines": { 886 | "node": ">=0.8.0" 887 | } 888 | }, 889 | "node_modules/estree-walker": { 890 | "version": "2.0.2", 891 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 892 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 893 | }, 894 | "node_modules/fast-glob": { 895 | "version": "3.2.11", 896 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 897 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 898 | "dev": true, 899 | "dependencies": { 900 | "@nodelib/fs.stat": "^2.0.2", 901 | "@nodelib/fs.walk": "^1.2.3", 902 | "glob-parent": "^5.1.2", 903 | "merge2": "^1.3.0", 904 | "micromatch": "^4.0.4" 905 | }, 906 | "engines": { 907 | "node": ">=8.6.0" 908 | } 909 | }, 910 | "node_modules/fast-glob/node_modules/glob-parent": { 911 | "version": "5.1.2", 912 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 913 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 914 | "dev": true, 915 | "dependencies": { 916 | "is-glob": "^4.0.1" 917 | }, 918 | "engines": { 919 | "node": ">= 6" 920 | } 921 | }, 922 | "node_modules/fastq": { 923 | "version": "1.13.0", 924 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 925 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 926 | "dev": true, 927 | "dependencies": { 928 | "reusify": "^1.0.4" 929 | } 930 | }, 931 | "node_modules/fill-range": { 932 | "version": "7.0.1", 933 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 934 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 935 | "dev": true, 936 | "dependencies": { 937 | "to-regex-range": "^5.0.1" 938 | }, 939 | "engines": { 940 | "node": ">=8" 941 | } 942 | }, 943 | "node_modules/fraction.js": { 944 | "version": "4.1.3", 945 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", 946 | "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", 947 | "dev": true, 948 | "engines": { 949 | "node": "*" 950 | }, 951 | "funding": { 952 | "type": "patreon", 953 | "url": "https://www.patreon.com/infusion" 954 | } 955 | }, 956 | "node_modules/fsevents": { 957 | "version": "2.3.2", 958 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 959 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 960 | "dev": true, 961 | "hasInstallScript": true, 962 | "optional": true, 963 | "os": [ 964 | "darwin" 965 | ], 966 | "engines": { 967 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 968 | } 969 | }, 970 | "node_modules/function-bind": { 971 | "version": "1.1.1", 972 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 973 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 974 | "dev": true 975 | }, 976 | "node_modules/glob-parent": { 977 | "version": "6.0.2", 978 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 979 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 980 | "dev": true, 981 | "dependencies": { 982 | "is-glob": "^4.0.3" 983 | }, 984 | "engines": { 985 | "node": ">=10.13.0" 986 | } 987 | }, 988 | "node_modules/has": { 989 | "version": "1.0.3", 990 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 991 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 992 | "dev": true, 993 | "dependencies": { 994 | "function-bind": "^1.1.1" 995 | }, 996 | "engines": { 997 | "node": ">= 0.4.0" 998 | } 999 | }, 1000 | "node_modules/has-flag": { 1001 | "version": "4.0.0", 1002 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1003 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1004 | "dev": true, 1005 | "engines": { 1006 | "node": ">=8" 1007 | } 1008 | }, 1009 | "node_modules/import-fresh": { 1010 | "version": "3.3.0", 1011 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1012 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1013 | "dev": true, 1014 | "dependencies": { 1015 | "parent-module": "^1.0.0", 1016 | "resolve-from": "^4.0.0" 1017 | }, 1018 | "engines": { 1019 | "node": ">=6" 1020 | }, 1021 | "funding": { 1022 | "url": "https://github.com/sponsors/sindresorhus" 1023 | } 1024 | }, 1025 | "node_modules/is-arrayish": { 1026 | "version": "0.2.1", 1027 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1028 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1029 | "dev": true 1030 | }, 1031 | "node_modules/is-binary-path": { 1032 | "version": "2.1.0", 1033 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1034 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1035 | "dev": true, 1036 | "dependencies": { 1037 | "binary-extensions": "^2.0.0" 1038 | }, 1039 | "engines": { 1040 | "node": ">=8" 1041 | } 1042 | }, 1043 | "node_modules/is-core-module": { 1044 | "version": "2.8.1", 1045 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 1046 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 1047 | "dev": true, 1048 | "dependencies": { 1049 | "has": "^1.0.3" 1050 | }, 1051 | "funding": { 1052 | "url": "https://github.com/sponsors/ljharb" 1053 | } 1054 | }, 1055 | "node_modules/is-extglob": { 1056 | "version": "2.1.1", 1057 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1058 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1059 | "dev": true, 1060 | "engines": { 1061 | "node": ">=0.10.0" 1062 | } 1063 | }, 1064 | "node_modules/is-glob": { 1065 | "version": "4.0.3", 1066 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1067 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1068 | "dev": true, 1069 | "dependencies": { 1070 | "is-extglob": "^2.1.1" 1071 | }, 1072 | "engines": { 1073 | "node": ">=0.10.0" 1074 | } 1075 | }, 1076 | "node_modules/is-number": { 1077 | "version": "7.0.0", 1078 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1079 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1080 | "dev": true, 1081 | "engines": { 1082 | "node": ">=0.12.0" 1083 | } 1084 | }, 1085 | "node_modules/js-tokens": { 1086 | "version": "4.0.0", 1087 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1088 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1089 | "dev": true 1090 | }, 1091 | "node_modules/json-parse-even-better-errors": { 1092 | "version": "2.3.1", 1093 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1094 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 1095 | "dev": true 1096 | }, 1097 | "node_modules/lilconfig": { 1098 | "version": "2.0.4", 1099 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", 1100 | "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", 1101 | "dev": true, 1102 | "engines": { 1103 | "node": ">=10" 1104 | } 1105 | }, 1106 | "node_modules/lines-and-columns": { 1107 | "version": "1.2.4", 1108 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1109 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1110 | "dev": true 1111 | }, 1112 | "node_modules/magic-string": { 1113 | "version": "0.25.7", 1114 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 1115 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 1116 | "dependencies": { 1117 | "sourcemap-codec": "^1.4.4" 1118 | } 1119 | }, 1120 | "node_modules/merge2": { 1121 | "version": "1.4.1", 1122 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1123 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1124 | "dev": true, 1125 | "engines": { 1126 | "node": ">= 8" 1127 | } 1128 | }, 1129 | "node_modules/micromatch": { 1130 | "version": "4.0.4", 1131 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 1132 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 1133 | "dev": true, 1134 | "dependencies": { 1135 | "braces": "^3.0.1", 1136 | "picomatch": "^2.2.3" 1137 | }, 1138 | "engines": { 1139 | "node": ">=8.6" 1140 | } 1141 | }, 1142 | "node_modules/minimist": { 1143 | "version": "1.2.5", 1144 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1145 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1146 | "dev": true 1147 | }, 1148 | "node_modules/nanoid": { 1149 | "version": "3.2.0", 1150 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 1151 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", 1152 | "bin": { 1153 | "nanoid": "bin/nanoid.cjs" 1154 | }, 1155 | "engines": { 1156 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1157 | } 1158 | }, 1159 | "node_modules/node-releases": { 1160 | "version": "2.0.2", 1161 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", 1162 | "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", 1163 | "dev": true 1164 | }, 1165 | "node_modules/normalize-path": { 1166 | "version": "3.0.0", 1167 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1168 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1169 | "dev": true, 1170 | "engines": { 1171 | "node": ">=0.10.0" 1172 | } 1173 | }, 1174 | "node_modules/normalize-range": { 1175 | "version": "0.1.2", 1176 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1177 | "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", 1178 | "dev": true, 1179 | "engines": { 1180 | "node": ">=0.10.0" 1181 | } 1182 | }, 1183 | "node_modules/object-hash": { 1184 | "version": "2.2.0", 1185 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", 1186 | "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", 1187 | "dev": true, 1188 | "engines": { 1189 | "node": ">= 6" 1190 | } 1191 | }, 1192 | "node_modules/parent-module": { 1193 | "version": "1.0.1", 1194 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1195 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "callsites": "^3.0.0" 1199 | }, 1200 | "engines": { 1201 | "node": ">=6" 1202 | } 1203 | }, 1204 | "node_modules/parse-json": { 1205 | "version": "5.2.0", 1206 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1207 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1208 | "dev": true, 1209 | "dependencies": { 1210 | "@babel/code-frame": "^7.0.0", 1211 | "error-ex": "^1.3.1", 1212 | "json-parse-even-better-errors": "^2.3.0", 1213 | "lines-and-columns": "^1.1.6" 1214 | }, 1215 | "engines": { 1216 | "node": ">=8" 1217 | }, 1218 | "funding": { 1219 | "url": "https://github.com/sponsors/sindresorhus" 1220 | } 1221 | }, 1222 | "node_modules/path-parse": { 1223 | "version": "1.0.7", 1224 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1225 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1226 | "dev": true 1227 | }, 1228 | "node_modules/path-type": { 1229 | "version": "4.0.0", 1230 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1231 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1232 | "dev": true, 1233 | "engines": { 1234 | "node": ">=8" 1235 | } 1236 | }, 1237 | "node_modules/picocolors": { 1238 | "version": "1.0.0", 1239 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1240 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1241 | }, 1242 | "node_modules/picomatch": { 1243 | "version": "2.3.1", 1244 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1245 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1246 | "dev": true, 1247 | "engines": { 1248 | "node": ">=8.6" 1249 | }, 1250 | "funding": { 1251 | "url": "https://github.com/sponsors/jonschlinkert" 1252 | } 1253 | }, 1254 | "node_modules/postcss": { 1255 | "version": "8.4.6", 1256 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", 1257 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", 1258 | "dependencies": { 1259 | "nanoid": "^3.2.0", 1260 | "picocolors": "^1.0.0", 1261 | "source-map-js": "^1.0.2" 1262 | }, 1263 | "engines": { 1264 | "node": "^10 || ^12 || >=14" 1265 | }, 1266 | "funding": { 1267 | "type": "opencollective", 1268 | "url": "https://opencollective.com/postcss/" 1269 | } 1270 | }, 1271 | "node_modules/postcss-js": { 1272 | "version": "4.0.0", 1273 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 1274 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 1275 | "dev": true, 1276 | "dependencies": { 1277 | "camelcase-css": "^2.0.1" 1278 | }, 1279 | "engines": { 1280 | "node": "^12 || ^14 || >= 16" 1281 | }, 1282 | "funding": { 1283 | "type": "opencollective", 1284 | "url": "https://opencollective.com/postcss/" 1285 | }, 1286 | "peerDependencies": { 1287 | "postcss": "^8.3.3" 1288 | } 1289 | }, 1290 | "node_modules/postcss-load-config": { 1291 | "version": "3.1.1", 1292 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", 1293 | "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", 1294 | "dev": true, 1295 | "dependencies": { 1296 | "lilconfig": "^2.0.4", 1297 | "yaml": "^1.10.2" 1298 | }, 1299 | "engines": { 1300 | "node": ">= 10" 1301 | }, 1302 | "funding": { 1303 | "type": "opencollective", 1304 | "url": "https://opencollective.com/postcss/" 1305 | }, 1306 | "peerDependencies": { 1307 | "ts-node": ">=9.0.0" 1308 | }, 1309 | "peerDependenciesMeta": { 1310 | "ts-node": { 1311 | "optional": true 1312 | } 1313 | } 1314 | }, 1315 | "node_modules/postcss-nested": { 1316 | "version": "5.0.6", 1317 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", 1318 | "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", 1319 | "dev": true, 1320 | "dependencies": { 1321 | "postcss-selector-parser": "^6.0.6" 1322 | }, 1323 | "engines": { 1324 | "node": ">=12.0" 1325 | }, 1326 | "funding": { 1327 | "type": "opencollective", 1328 | "url": "https://opencollective.com/postcss/" 1329 | }, 1330 | "peerDependencies": { 1331 | "postcss": "^8.2.14" 1332 | } 1333 | }, 1334 | "node_modules/postcss-selector-parser": { 1335 | "version": "6.0.9", 1336 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", 1337 | "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", 1338 | "dev": true, 1339 | "dependencies": { 1340 | "cssesc": "^3.0.0", 1341 | "util-deprecate": "^1.0.2" 1342 | }, 1343 | "engines": { 1344 | "node": ">=4" 1345 | } 1346 | }, 1347 | "node_modules/postcss-value-parser": { 1348 | "version": "4.2.0", 1349 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1350 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1351 | "dev": true 1352 | }, 1353 | "node_modules/queue-microtask": { 1354 | "version": "1.2.3", 1355 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1356 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1357 | "dev": true, 1358 | "funding": [ 1359 | { 1360 | "type": "github", 1361 | "url": "https://github.com/sponsors/feross" 1362 | }, 1363 | { 1364 | "type": "patreon", 1365 | "url": "https://www.patreon.com/feross" 1366 | }, 1367 | { 1368 | "type": "consulting", 1369 | "url": "https://feross.org/support" 1370 | } 1371 | ] 1372 | }, 1373 | "node_modules/quick-lru": { 1374 | "version": "5.1.1", 1375 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1376 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 1377 | "dev": true, 1378 | "engines": { 1379 | "node": ">=10" 1380 | }, 1381 | "funding": { 1382 | "url": "https://github.com/sponsors/sindresorhus" 1383 | } 1384 | }, 1385 | "node_modules/readdirp": { 1386 | "version": "3.6.0", 1387 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1388 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1389 | "dev": true, 1390 | "dependencies": { 1391 | "picomatch": "^2.2.1" 1392 | }, 1393 | "engines": { 1394 | "node": ">=8.10.0" 1395 | } 1396 | }, 1397 | "node_modules/resolve": { 1398 | "version": "1.22.0", 1399 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 1400 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 1401 | "dev": true, 1402 | "dependencies": { 1403 | "is-core-module": "^2.8.1", 1404 | "path-parse": "^1.0.7", 1405 | "supports-preserve-symlinks-flag": "^1.0.0" 1406 | }, 1407 | "bin": { 1408 | "resolve": "bin/resolve" 1409 | }, 1410 | "funding": { 1411 | "url": "https://github.com/sponsors/ljharb" 1412 | } 1413 | }, 1414 | "node_modules/resolve-from": { 1415 | "version": "4.0.0", 1416 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1417 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1418 | "dev": true, 1419 | "engines": { 1420 | "node": ">=4" 1421 | } 1422 | }, 1423 | "node_modules/reusify": { 1424 | "version": "1.0.4", 1425 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1426 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1427 | "dev": true, 1428 | "engines": { 1429 | "iojs": ">=1.0.0", 1430 | "node": ">=0.10.0" 1431 | } 1432 | }, 1433 | "node_modules/rollup": { 1434 | "version": "2.66.0", 1435 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", 1436 | "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", 1437 | "dev": true, 1438 | "bin": { 1439 | "rollup": "dist/bin/rollup" 1440 | }, 1441 | "engines": { 1442 | "node": ">=10.0.0" 1443 | }, 1444 | "optionalDependencies": { 1445 | "fsevents": "~2.3.2" 1446 | } 1447 | }, 1448 | "node_modules/run-parallel": { 1449 | "version": "1.2.0", 1450 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1451 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1452 | "dev": true, 1453 | "funding": [ 1454 | { 1455 | "type": "github", 1456 | "url": "https://github.com/sponsors/feross" 1457 | }, 1458 | { 1459 | "type": "patreon", 1460 | "url": "https://www.patreon.com/feross" 1461 | }, 1462 | { 1463 | "type": "consulting", 1464 | "url": "https://feross.org/support" 1465 | } 1466 | ], 1467 | "dependencies": { 1468 | "queue-microtask": "^1.2.2" 1469 | } 1470 | }, 1471 | "node_modules/source-map": { 1472 | "version": "0.6.1", 1473 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1474 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1475 | "engines": { 1476 | "node": ">=0.10.0" 1477 | } 1478 | }, 1479 | "node_modules/source-map-js": { 1480 | "version": "1.0.2", 1481 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1482 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1483 | "engines": { 1484 | "node": ">=0.10.0" 1485 | } 1486 | }, 1487 | "node_modules/sourcemap-codec": { 1488 | "version": "1.4.8", 1489 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1490 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 1491 | }, 1492 | "node_modules/supports-color": { 1493 | "version": "7.2.0", 1494 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1495 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1496 | "dev": true, 1497 | "dependencies": { 1498 | "has-flag": "^4.0.0" 1499 | }, 1500 | "engines": { 1501 | "node": ">=8" 1502 | } 1503 | }, 1504 | "node_modules/supports-preserve-symlinks-flag": { 1505 | "version": "1.0.0", 1506 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1507 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1508 | "dev": true, 1509 | "engines": { 1510 | "node": ">= 0.4" 1511 | }, 1512 | "funding": { 1513 | "url": "https://github.com/sponsors/ljharb" 1514 | } 1515 | }, 1516 | "node_modules/tailwindcss": { 1517 | "version": "3.0.19", 1518 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.19.tgz", 1519 | "integrity": "sha512-rjsdfz/qZya5xQ0OVynEMETgWq1CacmftgMYeXXh6bRM5vxsNwRSbMJsCCIjq/w67om9VP/AFMolOwiE+5VKig==", 1520 | "dev": true, 1521 | "dependencies": { 1522 | "arg": "^5.0.1", 1523 | "chalk": "^4.1.2", 1524 | "chokidar": "^3.5.3", 1525 | "color-name": "^1.1.4", 1526 | "cosmiconfig": "^7.0.1", 1527 | "detective": "^5.2.0", 1528 | "didyoumean": "^1.2.2", 1529 | "dlv": "^1.1.3", 1530 | "fast-glob": "^3.2.11", 1531 | "glob-parent": "^6.0.2", 1532 | "is-glob": "^4.0.3", 1533 | "normalize-path": "^3.0.0", 1534 | "object-hash": "^2.2.0", 1535 | "postcss-js": "^4.0.0", 1536 | "postcss-load-config": "^3.1.0", 1537 | "postcss-nested": "5.0.6", 1538 | "postcss-selector-parser": "^6.0.9", 1539 | "postcss-value-parser": "^4.2.0", 1540 | "quick-lru": "^5.1.1", 1541 | "resolve": "^1.22.0" 1542 | }, 1543 | "bin": { 1544 | "tailwind": "lib/cli.js", 1545 | "tailwindcss": "lib/cli.js" 1546 | }, 1547 | "engines": { 1548 | "node": ">=12.13.0" 1549 | }, 1550 | "peerDependencies": { 1551 | "autoprefixer": "^10.0.2", 1552 | "postcss": "^8.0.9" 1553 | } 1554 | }, 1555 | "node_modules/to-regex-range": { 1556 | "version": "5.0.1", 1557 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1558 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1559 | "dev": true, 1560 | "dependencies": { 1561 | "is-number": "^7.0.0" 1562 | }, 1563 | "engines": { 1564 | "node": ">=8.0" 1565 | } 1566 | }, 1567 | "node_modules/util-deprecate": { 1568 | "version": "1.0.2", 1569 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1570 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1571 | "dev": true 1572 | }, 1573 | "node_modules/vite": { 1574 | "version": "2.7.13", 1575 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.7.13.tgz", 1576 | "integrity": "sha512-Mq8et7f3aK0SgSxjDNfOAimZGW9XryfHRa/uV0jseQSilg+KhYDSoNb9h1rknOy6SuMkvNDLKCYAYYUMCE+IgQ==", 1577 | "dev": true, 1578 | "dependencies": { 1579 | "esbuild": "^0.13.12", 1580 | "postcss": "^8.4.5", 1581 | "resolve": "^1.20.0", 1582 | "rollup": "^2.59.0" 1583 | }, 1584 | "bin": { 1585 | "vite": "bin/vite.js" 1586 | }, 1587 | "engines": { 1588 | "node": ">=12.2.0" 1589 | }, 1590 | "optionalDependencies": { 1591 | "fsevents": "~2.3.2" 1592 | }, 1593 | "peerDependencies": { 1594 | "less": "*", 1595 | "sass": "*", 1596 | "stylus": "*" 1597 | }, 1598 | "peerDependenciesMeta": { 1599 | "less": { 1600 | "optional": true 1601 | }, 1602 | "sass": { 1603 | "optional": true 1604 | }, 1605 | "stylus": { 1606 | "optional": true 1607 | } 1608 | } 1609 | }, 1610 | "node_modules/vue": { 1611 | "version": "3.2.28", 1612 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.28.tgz", 1613 | "integrity": "sha512-U+jBwVh3RQ9AgceLFdT7i2FFujoC+kYuGrKo5y8aLluWKZWPS40WgA2pyYHaiSX9ydCbEGr3rc/JzdqskzD95g==", 1614 | "dependencies": { 1615 | "@vue/compiler-dom": "3.2.28", 1616 | "@vue/compiler-sfc": "3.2.28", 1617 | "@vue/runtime-dom": "3.2.28", 1618 | "@vue/server-renderer": "3.2.28", 1619 | "@vue/shared": "3.2.28" 1620 | } 1621 | }, 1622 | "node_modules/vue-confetti-explosion": { 1623 | "version": "1.0.1", 1624 | "resolved": "https://registry.npmjs.org/vue-confetti-explosion/-/vue-confetti-explosion-1.0.1.tgz", 1625 | "integrity": "sha512-xQ42/XJtFElKBgZQ01XzPHO8dtrrAWlccdnC3YmE/rewiXObNmlLE2YZXo2wrdj0pU+SD8Q+VZ33hygcvZu9dg==", 1626 | "engines": { 1627 | "node": ">=12" 1628 | }, 1629 | "peerDependencies": { 1630 | "vue": "^3.0.5" 1631 | } 1632 | }, 1633 | "node_modules/xtend": { 1634 | "version": "4.0.2", 1635 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1636 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1637 | "dev": true, 1638 | "engines": { 1639 | "node": ">=0.4" 1640 | } 1641 | }, 1642 | "node_modules/yaml": { 1643 | "version": "1.10.2", 1644 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 1645 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 1646 | "dev": true, 1647 | "engines": { 1648 | "node": ">= 6" 1649 | } 1650 | } 1651 | }, 1652 | "dependencies": { 1653 | "@babel/code-frame": { 1654 | "version": "7.16.7", 1655 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 1656 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 1657 | "dev": true, 1658 | "requires": { 1659 | "@babel/highlight": "^7.16.7" 1660 | } 1661 | }, 1662 | "@babel/helper-validator-identifier": { 1663 | "version": "7.16.7", 1664 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 1665 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 1666 | "dev": true 1667 | }, 1668 | "@babel/highlight": { 1669 | "version": "7.16.10", 1670 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", 1671 | "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", 1672 | "dev": true, 1673 | "requires": { 1674 | "@babel/helper-validator-identifier": "^7.16.7", 1675 | "chalk": "^2.0.0", 1676 | "js-tokens": "^4.0.0" 1677 | }, 1678 | "dependencies": { 1679 | "ansi-styles": { 1680 | "version": "3.2.1", 1681 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1682 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1683 | "dev": true, 1684 | "requires": { 1685 | "color-convert": "^1.9.0" 1686 | } 1687 | }, 1688 | "chalk": { 1689 | "version": "2.4.2", 1690 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1691 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1692 | "dev": true, 1693 | "requires": { 1694 | "ansi-styles": "^3.2.1", 1695 | "escape-string-regexp": "^1.0.5", 1696 | "supports-color": "^5.3.0" 1697 | } 1698 | }, 1699 | "color-convert": { 1700 | "version": "1.9.3", 1701 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1702 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1703 | "dev": true, 1704 | "requires": { 1705 | "color-name": "1.1.3" 1706 | } 1707 | }, 1708 | "color-name": { 1709 | "version": "1.1.3", 1710 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1711 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1712 | "dev": true 1713 | }, 1714 | "has-flag": { 1715 | "version": "3.0.0", 1716 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1717 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1718 | "dev": true 1719 | }, 1720 | "supports-color": { 1721 | "version": "5.5.0", 1722 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1723 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1724 | "dev": true, 1725 | "requires": { 1726 | "has-flag": "^3.0.0" 1727 | } 1728 | } 1729 | } 1730 | }, 1731 | "@babel/parser": { 1732 | "version": "7.16.12", 1733 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", 1734 | "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" 1735 | }, 1736 | "@liveblocks/client": { 1737 | "version": "1.8.1", 1738 | "resolved": "https://registry.npmjs.org/@liveblocks/client/-/client-1.8.1.tgz", 1739 | "integrity": "sha512-2em/JBTH12sFvX2EsLpOJJu9o8tv5ABsF4ITwO+Zt7Zn8Ptdfs2jdlptZDepLCvijtIT5rLz9lZ+NaCF1gceHQ==", 1740 | "requires": { 1741 | "@liveblocks/core": "1.8.1" 1742 | } 1743 | }, 1744 | "@liveblocks/core": { 1745 | "version": "1.8.1", 1746 | "resolved": "https://registry.npmjs.org/@liveblocks/core/-/core-1.8.1.tgz", 1747 | "integrity": "sha512-gDSlKzVJt6sApvJpXn/EXGZr83P5dwc1K4voRdcQUSD/1a4IZp81o3g00g2rqAbkXAVvk+3KWzubyTj5gRlpQg==" 1748 | }, 1749 | "@nodelib/fs.scandir": { 1750 | "version": "2.1.5", 1751 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1752 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1753 | "dev": true, 1754 | "requires": { 1755 | "@nodelib/fs.stat": "2.0.5", 1756 | "run-parallel": "^1.1.9" 1757 | } 1758 | }, 1759 | "@nodelib/fs.stat": { 1760 | "version": "2.0.5", 1761 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1762 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1763 | "dev": true 1764 | }, 1765 | "@nodelib/fs.walk": { 1766 | "version": "1.2.8", 1767 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1768 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1769 | "dev": true, 1770 | "requires": { 1771 | "@nodelib/fs.scandir": "2.1.5", 1772 | "fastq": "^1.6.0" 1773 | } 1774 | }, 1775 | "@types/parse-json": { 1776 | "version": "4.0.0", 1777 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", 1778 | "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", 1779 | "dev": true 1780 | }, 1781 | "@vitejs/plugin-vue": { 1782 | "version": "2.1.0", 1783 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.1.0.tgz", 1784 | "integrity": "sha512-AZ78WxvFMYd8JmM/GBV6a6SGGTU0GgN/0/4T+FnMMsLzFEzTeAUwuraapy50ifHZsC+G5SvWs86bvaCPTneFlA==", 1785 | "dev": true, 1786 | "requires": {} 1787 | }, 1788 | "@vue/compiler-core": { 1789 | "version": "3.2.28", 1790 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.28.tgz", 1791 | "integrity": "sha512-mQpfEjmHVxmWKaup0HL6tLMv2HqjjJu7XT4/q0IoUXYXC4xKG8lIVn5YChJqxBTLPuQjzas7u7i9L4PAWJZRtA==", 1792 | "requires": { 1793 | "@babel/parser": "^7.16.4", 1794 | "@vue/shared": "3.2.28", 1795 | "estree-walker": "^2.0.2", 1796 | "source-map": "^0.6.1" 1797 | } 1798 | }, 1799 | "@vue/compiler-dom": { 1800 | "version": "3.2.28", 1801 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.28.tgz", 1802 | "integrity": "sha512-KA4yXceLteKC7VykvPnViUixemQw3A+oii+deSbZJOQKQKVh1HLosI10qxa8ImPCyun41+wG3uGR+tW7eu1W6Q==", 1803 | "requires": { 1804 | "@vue/compiler-core": "3.2.28", 1805 | "@vue/shared": "3.2.28" 1806 | } 1807 | }, 1808 | "@vue/compiler-sfc": { 1809 | "version": "3.2.28", 1810 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.28.tgz", 1811 | "integrity": "sha512-zB0WznfEBb4CbGBHzhboHDKVO5nxbkbxxFo9iVlxObP7a9/qvA5kkZEuT7nXP52f3b3qEfmVTjIT23Lo1ndZdQ==", 1812 | "requires": { 1813 | "@babel/parser": "^7.16.4", 1814 | "@vue/compiler-core": "3.2.28", 1815 | "@vue/compiler-dom": "3.2.28", 1816 | "@vue/compiler-ssr": "3.2.28", 1817 | "@vue/reactivity-transform": "3.2.28", 1818 | "@vue/shared": "3.2.28", 1819 | "estree-walker": "^2.0.2", 1820 | "magic-string": "^0.25.7", 1821 | "postcss": "^8.1.10", 1822 | "source-map": "^0.6.1" 1823 | } 1824 | }, 1825 | "@vue/compiler-ssr": { 1826 | "version": "3.2.28", 1827 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.28.tgz", 1828 | "integrity": "sha512-z8rck1PDTu20iLyip9lAvIhaO40DUJrw3Zv0mS4Apfh3PlfWpF5dhsO5g0dgt213wgYsQIYVIlU9cfrYapqRgg==", 1829 | "requires": { 1830 | "@vue/compiler-dom": "3.2.28", 1831 | "@vue/shared": "3.2.28" 1832 | } 1833 | }, 1834 | "@vue/reactivity": { 1835 | "version": "3.2.28", 1836 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.28.tgz", 1837 | "integrity": "sha512-WamM5LGv7JIarW+EYAzYFqYonZXjTnOjNW0sBO93jRE9I1ReAwfH8NvQXkPA3JZ3fuF6SGDdG8Y9/+dKjd/1Gw==", 1838 | "requires": { 1839 | "@vue/shared": "3.2.28" 1840 | } 1841 | }, 1842 | "@vue/reactivity-transform": { 1843 | "version": "3.2.28", 1844 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.28.tgz", 1845 | "integrity": "sha512-zE8idNkOPnBDd2tKSIk84hOQZ+jXKvSy5FoIIVlcNEJHnCFnQ3maqeSJ9KoB2Rf6EXUhFTiTDNRlYlXmT2uHbQ==", 1846 | "requires": { 1847 | "@babel/parser": "^7.16.4", 1848 | "@vue/compiler-core": "3.2.28", 1849 | "@vue/shared": "3.2.28", 1850 | "estree-walker": "^2.0.2", 1851 | "magic-string": "^0.25.7" 1852 | } 1853 | }, 1854 | "@vue/runtime-core": { 1855 | "version": "3.2.28", 1856 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.28.tgz", 1857 | "integrity": "sha512-sVbBMFUt42JatTlXbdH6tVcLPw1eEOrrVQWI+j6/nJVzR852RURaT6DhdR0azdYscxq4xmmBctE0VQmlibBOFw==", 1858 | "requires": { 1859 | "@vue/reactivity": "3.2.28", 1860 | "@vue/shared": "3.2.28" 1861 | } 1862 | }, 1863 | "@vue/runtime-dom": { 1864 | "version": "3.2.28", 1865 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.28.tgz", 1866 | "integrity": "sha512-Jg7cxZanEXXGu1QnZILFLnDrM+MIFN8VAullmMZiJEZziHvhygRMpi0ahNy/8OqGwtTze1JNhLdHRBO+q2hbmg==", 1867 | "requires": { 1868 | "@vue/runtime-core": "3.2.28", 1869 | "@vue/shared": "3.2.28", 1870 | "csstype": "^2.6.8" 1871 | } 1872 | }, 1873 | "@vue/server-renderer": { 1874 | "version": "3.2.28", 1875 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.28.tgz", 1876 | "integrity": "sha512-S+MhurgkPabRvhdDl8R6efKBmniJqBbbWIYTXADaJIKFLFLQCW4gcYUTbxuebzk6j3z485vpekhrHHymTF52Pg==", 1877 | "requires": { 1878 | "@vue/compiler-ssr": "3.2.28", 1879 | "@vue/shared": "3.2.28" 1880 | } 1881 | }, 1882 | "@vue/shared": { 1883 | "version": "3.2.28", 1884 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.28.tgz", 1885 | "integrity": "sha512-eMQ8s9j8FpbGHlgUAaj/coaG3Q8YtMsoWL/RIHTsE3Ex7PUTyr7V91vB5HqWB5Sn8m4RXTHGO22/skoTUYvp0A==" 1886 | }, 1887 | "acorn": { 1888 | "version": "7.4.1", 1889 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 1890 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 1891 | "dev": true 1892 | }, 1893 | "acorn-node": { 1894 | "version": "1.8.2", 1895 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 1896 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 1897 | "dev": true, 1898 | "requires": { 1899 | "acorn": "^7.0.0", 1900 | "acorn-walk": "^7.0.0", 1901 | "xtend": "^4.0.2" 1902 | } 1903 | }, 1904 | "acorn-walk": { 1905 | "version": "7.2.0", 1906 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 1907 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 1908 | "dev": true 1909 | }, 1910 | "ansi-styles": { 1911 | "version": "4.3.0", 1912 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1913 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1914 | "dev": true, 1915 | "requires": { 1916 | "color-convert": "^2.0.1" 1917 | } 1918 | }, 1919 | "anymatch": { 1920 | "version": "3.1.2", 1921 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1922 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1923 | "dev": true, 1924 | "requires": { 1925 | "normalize-path": "^3.0.0", 1926 | "picomatch": "^2.0.4" 1927 | } 1928 | }, 1929 | "arg": { 1930 | "version": "5.0.1", 1931 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", 1932 | "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", 1933 | "dev": true 1934 | }, 1935 | "autoprefixer": { 1936 | "version": "10.4.2", 1937 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", 1938 | "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", 1939 | "dev": true, 1940 | "requires": { 1941 | "browserslist": "^4.19.1", 1942 | "caniuse-lite": "^1.0.30001297", 1943 | "fraction.js": "^4.1.2", 1944 | "normalize-range": "^0.1.2", 1945 | "picocolors": "^1.0.0", 1946 | "postcss-value-parser": "^4.2.0" 1947 | } 1948 | }, 1949 | "binary-extensions": { 1950 | "version": "2.2.0", 1951 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1952 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1953 | "dev": true 1954 | }, 1955 | "braces": { 1956 | "version": "3.0.2", 1957 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1958 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1959 | "dev": true, 1960 | "requires": { 1961 | "fill-range": "^7.0.1" 1962 | } 1963 | }, 1964 | "browserslist": { 1965 | "version": "4.19.1", 1966 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", 1967 | "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", 1968 | "dev": true, 1969 | "requires": { 1970 | "caniuse-lite": "^1.0.30001286", 1971 | "electron-to-chromium": "^1.4.17", 1972 | "escalade": "^3.1.1", 1973 | "node-releases": "^2.0.1", 1974 | "picocolors": "^1.0.0" 1975 | } 1976 | }, 1977 | "callsites": { 1978 | "version": "3.1.0", 1979 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1980 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1981 | "dev": true 1982 | }, 1983 | "camelcase-css": { 1984 | "version": "2.0.1", 1985 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1986 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1987 | "dev": true 1988 | }, 1989 | "caniuse-lite": { 1990 | "version": "1.0.30001309", 1991 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001309.tgz", 1992 | "integrity": "sha512-Pl8vfigmBXXq+/yUz1jUwULeq9xhMJznzdc/xwl4WclDAuebcTHVefpz8lE/bMI+UN7TOkSSe7B7RnZd6+dzjA==", 1993 | "dev": true 1994 | }, 1995 | "chalk": { 1996 | "version": "4.1.2", 1997 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1998 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1999 | "dev": true, 2000 | "requires": { 2001 | "ansi-styles": "^4.1.0", 2002 | "supports-color": "^7.1.0" 2003 | } 2004 | }, 2005 | "chokidar": { 2006 | "version": "3.5.3", 2007 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2008 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2009 | "dev": true, 2010 | "requires": { 2011 | "anymatch": "~3.1.2", 2012 | "braces": "~3.0.2", 2013 | "fsevents": "~2.3.2", 2014 | "glob-parent": "~5.1.2", 2015 | "is-binary-path": "~2.1.0", 2016 | "is-glob": "~4.0.1", 2017 | "normalize-path": "~3.0.0", 2018 | "readdirp": "~3.6.0" 2019 | }, 2020 | "dependencies": { 2021 | "glob-parent": { 2022 | "version": "5.1.2", 2023 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2024 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2025 | "dev": true, 2026 | "requires": { 2027 | "is-glob": "^4.0.1" 2028 | } 2029 | } 2030 | } 2031 | }, 2032 | "color-convert": { 2033 | "version": "2.0.1", 2034 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2035 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2036 | "dev": true, 2037 | "requires": { 2038 | "color-name": "~1.1.4" 2039 | } 2040 | }, 2041 | "color-name": { 2042 | "version": "1.1.4", 2043 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2044 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2045 | "dev": true 2046 | }, 2047 | "cosmiconfig": { 2048 | "version": "7.0.1", 2049 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", 2050 | "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", 2051 | "dev": true, 2052 | "requires": { 2053 | "@types/parse-json": "^4.0.0", 2054 | "import-fresh": "^3.2.1", 2055 | "parse-json": "^5.0.0", 2056 | "path-type": "^4.0.0", 2057 | "yaml": "^1.10.0" 2058 | } 2059 | }, 2060 | "cssesc": { 2061 | "version": "3.0.0", 2062 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 2063 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 2064 | "dev": true 2065 | }, 2066 | "csstype": { 2067 | "version": "2.6.19", 2068 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", 2069 | "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" 2070 | }, 2071 | "defined": { 2072 | "version": "1.0.0", 2073 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 2074 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 2075 | "dev": true 2076 | }, 2077 | "detective": { 2078 | "version": "5.2.0", 2079 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", 2080 | "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", 2081 | "dev": true, 2082 | "requires": { 2083 | "acorn-node": "^1.6.1", 2084 | "defined": "^1.0.0", 2085 | "minimist": "^1.1.1" 2086 | } 2087 | }, 2088 | "didyoumean": { 2089 | "version": "1.2.2", 2090 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 2091 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 2092 | "dev": true 2093 | }, 2094 | "dlv": { 2095 | "version": "1.1.3", 2096 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 2097 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 2098 | "dev": true 2099 | }, 2100 | "electron-to-chromium": { 2101 | "version": "1.4.67", 2102 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.67.tgz", 2103 | "integrity": "sha512-A6a2jEPLueEDfb7kvh7/E94RKKnIb01qL+4I7RFxtajmo+G9F5Ei7HgY5PRbQ4RDrh6DGDW66P0hD5XI2nRAcg==", 2104 | "dev": true 2105 | }, 2106 | "error-ex": { 2107 | "version": "1.3.2", 2108 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 2109 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 2110 | "dev": true, 2111 | "requires": { 2112 | "is-arrayish": "^0.2.1" 2113 | } 2114 | }, 2115 | "esbuild": { 2116 | "version": "0.13.15", 2117 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz", 2118 | "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==", 2119 | "dev": true, 2120 | "requires": { 2121 | "esbuild-android-arm64": "0.13.15", 2122 | "esbuild-darwin-64": "0.13.15", 2123 | "esbuild-darwin-arm64": "0.13.15", 2124 | "esbuild-freebsd-64": "0.13.15", 2125 | "esbuild-freebsd-arm64": "0.13.15", 2126 | "esbuild-linux-32": "0.13.15", 2127 | "esbuild-linux-64": "0.13.15", 2128 | "esbuild-linux-arm": "0.13.15", 2129 | "esbuild-linux-arm64": "0.13.15", 2130 | "esbuild-linux-mips64le": "0.13.15", 2131 | "esbuild-linux-ppc64le": "0.13.15", 2132 | "esbuild-netbsd-64": "0.13.15", 2133 | "esbuild-openbsd-64": "0.13.15", 2134 | "esbuild-sunos-64": "0.13.15", 2135 | "esbuild-windows-32": "0.13.15", 2136 | "esbuild-windows-64": "0.13.15", 2137 | "esbuild-windows-arm64": "0.13.15" 2138 | } 2139 | }, 2140 | "esbuild-android-arm64": { 2141 | "version": "0.13.15", 2142 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz", 2143 | "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==", 2144 | "dev": true, 2145 | "optional": true 2146 | }, 2147 | "esbuild-darwin-64": { 2148 | "version": "0.13.15", 2149 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz", 2150 | "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==", 2151 | "dev": true, 2152 | "optional": true 2153 | }, 2154 | "esbuild-darwin-arm64": { 2155 | "version": "0.13.15", 2156 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz", 2157 | "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==", 2158 | "dev": true, 2159 | "optional": true 2160 | }, 2161 | "esbuild-freebsd-64": { 2162 | "version": "0.13.15", 2163 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz", 2164 | "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==", 2165 | "dev": true, 2166 | "optional": true 2167 | }, 2168 | "esbuild-freebsd-arm64": { 2169 | "version": "0.13.15", 2170 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz", 2171 | "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==", 2172 | "dev": true, 2173 | "optional": true 2174 | }, 2175 | "esbuild-linux-32": { 2176 | "version": "0.13.15", 2177 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz", 2178 | "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==", 2179 | "dev": true, 2180 | "optional": true 2181 | }, 2182 | "esbuild-linux-64": { 2183 | "version": "0.13.15", 2184 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz", 2185 | "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==", 2186 | "dev": true, 2187 | "optional": true 2188 | }, 2189 | "esbuild-linux-arm": { 2190 | "version": "0.13.15", 2191 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz", 2192 | "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==", 2193 | "dev": true, 2194 | "optional": true 2195 | }, 2196 | "esbuild-linux-arm64": { 2197 | "version": "0.13.15", 2198 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz", 2199 | "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==", 2200 | "dev": true, 2201 | "optional": true 2202 | }, 2203 | "esbuild-linux-mips64le": { 2204 | "version": "0.13.15", 2205 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz", 2206 | "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==", 2207 | "dev": true, 2208 | "optional": true 2209 | }, 2210 | "esbuild-linux-ppc64le": { 2211 | "version": "0.13.15", 2212 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz", 2213 | "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==", 2214 | "dev": true, 2215 | "optional": true 2216 | }, 2217 | "esbuild-netbsd-64": { 2218 | "version": "0.13.15", 2219 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz", 2220 | "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==", 2221 | "dev": true, 2222 | "optional": true 2223 | }, 2224 | "esbuild-openbsd-64": { 2225 | "version": "0.13.15", 2226 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz", 2227 | "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==", 2228 | "dev": true, 2229 | "optional": true 2230 | }, 2231 | "esbuild-sunos-64": { 2232 | "version": "0.13.15", 2233 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz", 2234 | "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==", 2235 | "dev": true, 2236 | "optional": true 2237 | }, 2238 | "esbuild-windows-32": { 2239 | "version": "0.13.15", 2240 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz", 2241 | "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==", 2242 | "dev": true, 2243 | "optional": true 2244 | }, 2245 | "esbuild-windows-64": { 2246 | "version": "0.13.15", 2247 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz", 2248 | "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==", 2249 | "dev": true, 2250 | "optional": true 2251 | }, 2252 | "esbuild-windows-arm64": { 2253 | "version": "0.13.15", 2254 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz", 2255 | "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==", 2256 | "dev": true, 2257 | "optional": true 2258 | }, 2259 | "escalade": { 2260 | "version": "3.1.1", 2261 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2262 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2263 | "dev": true 2264 | }, 2265 | "escape-string-regexp": { 2266 | "version": "1.0.5", 2267 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2268 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 2269 | "dev": true 2270 | }, 2271 | "estree-walker": { 2272 | "version": "2.0.2", 2273 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 2274 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 2275 | }, 2276 | "fast-glob": { 2277 | "version": "3.2.11", 2278 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", 2279 | "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", 2280 | "dev": true, 2281 | "requires": { 2282 | "@nodelib/fs.stat": "^2.0.2", 2283 | "@nodelib/fs.walk": "^1.2.3", 2284 | "glob-parent": "^5.1.2", 2285 | "merge2": "^1.3.0", 2286 | "micromatch": "^4.0.4" 2287 | }, 2288 | "dependencies": { 2289 | "glob-parent": { 2290 | "version": "5.1.2", 2291 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2292 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2293 | "dev": true, 2294 | "requires": { 2295 | "is-glob": "^4.0.1" 2296 | } 2297 | } 2298 | } 2299 | }, 2300 | "fastq": { 2301 | "version": "1.13.0", 2302 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 2303 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 2304 | "dev": true, 2305 | "requires": { 2306 | "reusify": "^1.0.4" 2307 | } 2308 | }, 2309 | "fill-range": { 2310 | "version": "7.0.1", 2311 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2312 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2313 | "dev": true, 2314 | "requires": { 2315 | "to-regex-range": "^5.0.1" 2316 | } 2317 | }, 2318 | "fraction.js": { 2319 | "version": "4.1.3", 2320 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz", 2321 | "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==", 2322 | "dev": true 2323 | }, 2324 | "fsevents": { 2325 | "version": "2.3.2", 2326 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2327 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2328 | "dev": true, 2329 | "optional": true 2330 | }, 2331 | "function-bind": { 2332 | "version": "1.1.1", 2333 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2334 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2335 | "dev": true 2336 | }, 2337 | "glob-parent": { 2338 | "version": "6.0.2", 2339 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 2340 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2341 | "dev": true, 2342 | "requires": { 2343 | "is-glob": "^4.0.3" 2344 | } 2345 | }, 2346 | "has": { 2347 | "version": "1.0.3", 2348 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2349 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2350 | "dev": true, 2351 | "requires": { 2352 | "function-bind": "^1.1.1" 2353 | } 2354 | }, 2355 | "has-flag": { 2356 | "version": "4.0.0", 2357 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2358 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2359 | "dev": true 2360 | }, 2361 | "import-fresh": { 2362 | "version": "3.3.0", 2363 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2364 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2365 | "dev": true, 2366 | "requires": { 2367 | "parent-module": "^1.0.0", 2368 | "resolve-from": "^4.0.0" 2369 | } 2370 | }, 2371 | "is-arrayish": { 2372 | "version": "0.2.1", 2373 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 2374 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 2375 | "dev": true 2376 | }, 2377 | "is-binary-path": { 2378 | "version": "2.1.0", 2379 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2380 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2381 | "dev": true, 2382 | "requires": { 2383 | "binary-extensions": "^2.0.0" 2384 | } 2385 | }, 2386 | "is-core-module": { 2387 | "version": "2.8.1", 2388 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", 2389 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", 2390 | "dev": true, 2391 | "requires": { 2392 | "has": "^1.0.3" 2393 | } 2394 | }, 2395 | "is-extglob": { 2396 | "version": "2.1.1", 2397 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2398 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 2399 | "dev": true 2400 | }, 2401 | "is-glob": { 2402 | "version": "4.0.3", 2403 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2404 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2405 | "dev": true, 2406 | "requires": { 2407 | "is-extglob": "^2.1.1" 2408 | } 2409 | }, 2410 | "is-number": { 2411 | "version": "7.0.0", 2412 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2413 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2414 | "dev": true 2415 | }, 2416 | "js-tokens": { 2417 | "version": "4.0.0", 2418 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2419 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2420 | "dev": true 2421 | }, 2422 | "json-parse-even-better-errors": { 2423 | "version": "2.3.1", 2424 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2425 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2426 | "dev": true 2427 | }, 2428 | "lilconfig": { 2429 | "version": "2.0.4", 2430 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", 2431 | "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", 2432 | "dev": true 2433 | }, 2434 | "lines-and-columns": { 2435 | "version": "1.2.4", 2436 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2437 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2438 | "dev": true 2439 | }, 2440 | "magic-string": { 2441 | "version": "0.25.7", 2442 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 2443 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 2444 | "requires": { 2445 | "sourcemap-codec": "^1.4.4" 2446 | } 2447 | }, 2448 | "merge2": { 2449 | "version": "1.4.1", 2450 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2451 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2452 | "dev": true 2453 | }, 2454 | "micromatch": { 2455 | "version": "4.0.4", 2456 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 2457 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 2458 | "dev": true, 2459 | "requires": { 2460 | "braces": "^3.0.1", 2461 | "picomatch": "^2.2.3" 2462 | } 2463 | }, 2464 | "minimist": { 2465 | "version": "1.2.5", 2466 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2467 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 2468 | "dev": true 2469 | }, 2470 | "nanoid": { 2471 | "version": "3.2.0", 2472 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 2473 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" 2474 | }, 2475 | "node-releases": { 2476 | "version": "2.0.2", 2477 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", 2478 | "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", 2479 | "dev": true 2480 | }, 2481 | "normalize-path": { 2482 | "version": "3.0.0", 2483 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2484 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2485 | "dev": true 2486 | }, 2487 | "normalize-range": { 2488 | "version": "0.1.2", 2489 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 2490 | "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", 2491 | "dev": true 2492 | }, 2493 | "object-hash": { 2494 | "version": "2.2.0", 2495 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", 2496 | "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", 2497 | "dev": true 2498 | }, 2499 | "parent-module": { 2500 | "version": "1.0.1", 2501 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2502 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2503 | "dev": true, 2504 | "requires": { 2505 | "callsites": "^3.0.0" 2506 | } 2507 | }, 2508 | "parse-json": { 2509 | "version": "5.2.0", 2510 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 2511 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 2512 | "dev": true, 2513 | "requires": { 2514 | "@babel/code-frame": "^7.0.0", 2515 | "error-ex": "^1.3.1", 2516 | "json-parse-even-better-errors": "^2.3.0", 2517 | "lines-and-columns": "^1.1.6" 2518 | } 2519 | }, 2520 | "path-parse": { 2521 | "version": "1.0.7", 2522 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2523 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2524 | "dev": true 2525 | }, 2526 | "path-type": { 2527 | "version": "4.0.0", 2528 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2529 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2530 | "dev": true 2531 | }, 2532 | "picocolors": { 2533 | "version": "1.0.0", 2534 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2535 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 2536 | }, 2537 | "picomatch": { 2538 | "version": "2.3.1", 2539 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2540 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2541 | "dev": true 2542 | }, 2543 | "postcss": { 2544 | "version": "8.4.6", 2545 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", 2546 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", 2547 | "requires": { 2548 | "nanoid": "^3.2.0", 2549 | "picocolors": "^1.0.0", 2550 | "source-map-js": "^1.0.2" 2551 | } 2552 | }, 2553 | "postcss-js": { 2554 | "version": "4.0.0", 2555 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 2556 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 2557 | "dev": true, 2558 | "requires": { 2559 | "camelcase-css": "^2.0.1" 2560 | } 2561 | }, 2562 | "postcss-load-config": { 2563 | "version": "3.1.1", 2564 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", 2565 | "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", 2566 | "dev": true, 2567 | "requires": { 2568 | "lilconfig": "^2.0.4", 2569 | "yaml": "^1.10.2" 2570 | } 2571 | }, 2572 | "postcss-nested": { 2573 | "version": "5.0.6", 2574 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", 2575 | "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", 2576 | "dev": true, 2577 | "requires": { 2578 | "postcss-selector-parser": "^6.0.6" 2579 | } 2580 | }, 2581 | "postcss-selector-parser": { 2582 | "version": "6.0.9", 2583 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", 2584 | "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", 2585 | "dev": true, 2586 | "requires": { 2587 | "cssesc": "^3.0.0", 2588 | "util-deprecate": "^1.0.2" 2589 | } 2590 | }, 2591 | "postcss-value-parser": { 2592 | "version": "4.2.0", 2593 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 2594 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 2595 | "dev": true 2596 | }, 2597 | "queue-microtask": { 2598 | "version": "1.2.3", 2599 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2600 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2601 | "dev": true 2602 | }, 2603 | "quick-lru": { 2604 | "version": "5.1.1", 2605 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 2606 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 2607 | "dev": true 2608 | }, 2609 | "readdirp": { 2610 | "version": "3.6.0", 2611 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2612 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2613 | "dev": true, 2614 | "requires": { 2615 | "picomatch": "^2.2.1" 2616 | } 2617 | }, 2618 | "resolve": { 2619 | "version": "1.22.0", 2620 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", 2621 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", 2622 | "dev": true, 2623 | "requires": { 2624 | "is-core-module": "^2.8.1", 2625 | "path-parse": "^1.0.7", 2626 | "supports-preserve-symlinks-flag": "^1.0.0" 2627 | } 2628 | }, 2629 | "resolve-from": { 2630 | "version": "4.0.0", 2631 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2632 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2633 | "dev": true 2634 | }, 2635 | "reusify": { 2636 | "version": "1.0.4", 2637 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2638 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2639 | "dev": true 2640 | }, 2641 | "rollup": { 2642 | "version": "2.66.0", 2643 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.66.0.tgz", 2644 | "integrity": "sha512-L6mKOkdyP8HK5kKJXaiWG7KZDumPJjuo1P+cfyHOJPNNTK3Moe7zCH5+fy7v8pVmHXtlxorzaBjvkBMB23s98g==", 2645 | "dev": true, 2646 | "requires": { 2647 | "fsevents": "~2.3.2" 2648 | } 2649 | }, 2650 | "run-parallel": { 2651 | "version": "1.2.0", 2652 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2653 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2654 | "dev": true, 2655 | "requires": { 2656 | "queue-microtask": "^1.2.2" 2657 | } 2658 | }, 2659 | "source-map": { 2660 | "version": "0.6.1", 2661 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2662 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 2663 | }, 2664 | "source-map-js": { 2665 | "version": "1.0.2", 2666 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2667 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 2668 | }, 2669 | "sourcemap-codec": { 2670 | "version": "1.4.8", 2671 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 2672 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" 2673 | }, 2674 | "supports-color": { 2675 | "version": "7.2.0", 2676 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2677 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2678 | "dev": true, 2679 | "requires": { 2680 | "has-flag": "^4.0.0" 2681 | } 2682 | }, 2683 | "supports-preserve-symlinks-flag": { 2684 | "version": "1.0.0", 2685 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2686 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2687 | "dev": true 2688 | }, 2689 | "tailwindcss": { 2690 | "version": "3.0.19", 2691 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.19.tgz", 2692 | "integrity": "sha512-rjsdfz/qZya5xQ0OVynEMETgWq1CacmftgMYeXXh6bRM5vxsNwRSbMJsCCIjq/w67om9VP/AFMolOwiE+5VKig==", 2693 | "dev": true, 2694 | "requires": { 2695 | "arg": "^5.0.1", 2696 | "chalk": "^4.1.2", 2697 | "chokidar": "^3.5.3", 2698 | "color-name": "^1.1.4", 2699 | "cosmiconfig": "^7.0.1", 2700 | "detective": "^5.2.0", 2701 | "didyoumean": "^1.2.2", 2702 | "dlv": "^1.1.3", 2703 | "fast-glob": "^3.2.11", 2704 | "glob-parent": "^6.0.2", 2705 | "is-glob": "^4.0.3", 2706 | "normalize-path": "^3.0.0", 2707 | "object-hash": "^2.2.0", 2708 | "postcss-js": "^4.0.0", 2709 | "postcss-load-config": "^3.1.0", 2710 | "postcss-nested": "5.0.6", 2711 | "postcss-selector-parser": "^6.0.9", 2712 | "postcss-value-parser": "^4.2.0", 2713 | "quick-lru": "^5.1.1", 2714 | "resolve": "^1.22.0" 2715 | } 2716 | }, 2717 | "to-regex-range": { 2718 | "version": "5.0.1", 2719 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2720 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2721 | "dev": true, 2722 | "requires": { 2723 | "is-number": "^7.0.0" 2724 | } 2725 | }, 2726 | "util-deprecate": { 2727 | "version": "1.0.2", 2728 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2729 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2730 | "dev": true 2731 | }, 2732 | "vite": { 2733 | "version": "2.7.13", 2734 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.7.13.tgz", 2735 | "integrity": "sha512-Mq8et7f3aK0SgSxjDNfOAimZGW9XryfHRa/uV0jseQSilg+KhYDSoNb9h1rknOy6SuMkvNDLKCYAYYUMCE+IgQ==", 2736 | "dev": true, 2737 | "requires": { 2738 | "esbuild": "^0.13.12", 2739 | "fsevents": "~2.3.2", 2740 | "postcss": "^8.4.5", 2741 | "resolve": "^1.20.0", 2742 | "rollup": "^2.59.0" 2743 | } 2744 | }, 2745 | "vue": { 2746 | "version": "3.2.28", 2747 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.28.tgz", 2748 | "integrity": "sha512-U+jBwVh3RQ9AgceLFdT7i2FFujoC+kYuGrKo5y8aLluWKZWPS40WgA2pyYHaiSX9ydCbEGr3rc/JzdqskzD95g==", 2749 | "requires": { 2750 | "@vue/compiler-dom": "3.2.28", 2751 | "@vue/compiler-sfc": "3.2.28", 2752 | "@vue/runtime-dom": "3.2.28", 2753 | "@vue/server-renderer": "3.2.28", 2754 | "@vue/shared": "3.2.28" 2755 | } 2756 | }, 2757 | "vue-confetti-explosion": { 2758 | "version": "1.0.1", 2759 | "resolved": "https://registry.npmjs.org/vue-confetti-explosion/-/vue-confetti-explosion-1.0.1.tgz", 2760 | "integrity": "sha512-xQ42/XJtFElKBgZQ01XzPHO8dtrrAWlccdnC3YmE/rewiXObNmlLE2YZXo2wrdj0pU+SD8Q+VZ33hygcvZu9dg==", 2761 | "requires": {} 2762 | }, 2763 | "xtend": { 2764 | "version": "4.0.2", 2765 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2766 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2767 | "dev": true 2768 | }, 2769 | "yaml": { 2770 | "version": "1.10.2", 2771 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2772 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 2773 | "dev": true 2774 | } 2775 | } 2776 | } 2777 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wordle-wars", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vite build", 7 | "preview": "vite preview" 8 | }, 9 | "dependencies": { 10 | "@liveblocks/client": "^1.8.1", 11 | "vue": "^3.2.25", 12 | "vue-confetti-explosion": "^1.0.1" 13 | }, 14 | "devDependencies": { 15 | "@vitejs/plugin-vue": "^2.0.0", 16 | "autoprefixer": "^10.4.2", 17 | "postcss": "^8.4.6", 18 | "tailwindcss": "^3.0.19", 19 | "vite": "^2.7.2" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/favicon.ico -------------------------------------------------------------------------------- /public/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /public/icons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #18181b 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/favicon-16x16.png -------------------------------------------------------------------------------- /public/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/favicon-32x32.png -------------------------------------------------------------------------------- /public/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/icons/mstile-150x150.png -------------------------------------------------------------------------------- /public/icons/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.14, written by Peter Selinger 2001-2017 9 | 10 | 12 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /public/screenshot-visible.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/screenshot-visible.png -------------------------------------------------------------------------------- /public/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTNicholas/wordle-wars/0e3745c499ac1a577b002a70d98faff0a21cdcb5/public/screenshot.png -------------------------------------------------------------------------------- /src/Index.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 24 | 31 | -------------------------------------------------------------------------------- /src/Logo.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 34 | -------------------------------------------------------------------------------- /src/WordleWars.vue: -------------------------------------------------------------------------------- 1 | 217 | 218 | 332 | 333 | 593 | -------------------------------------------------------------------------------- /src/components/Example.ts: -------------------------------------------------------------------------------- 1 | export const info = { 2 | hide: false, 3 | title: 'Wordle wars', 4 | description: 'Share the link to play this Wordle clone live with others. Open it in a new window to try it against yourself.', 5 | githubHref: 'https://github.com/CTNicholas/wordle-wars', 6 | codeSandboxHref: '', 7 | twitterHref: 'https://twitter.com/@ctnicholasdev', 8 | website: 'https://ctnicholas.dev' 9 | } 10 | -------------------------------------------------------------------------------- /src/components/ExampleInfo.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 89 | -------------------------------------------------------------------------------- /src/components/ExampleWrapper.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 85 | -------------------------------------------------------------------------------- /src/components/Game.vue: -------------------------------------------------------------------------------- 1 | 184 | 185 | 243 | 244 | 504 | -------------------------------------------------------------------------------- /src/components/Header.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 53 | 54 | 154 | 155 | 235 | -------------------------------------------------------------------------------- /src/components/Keyboard.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 46 | 47 | 97 | -------------------------------------------------------------------------------- /src/components/MiniBoard.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 55 | 56 | 131 | -------------------------------------------------------------------------------- /src/components/MiniBoardPlaying.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | 21 | 43 | -------------------------------------------------------------------------------- /src/components/MiniBoardScore.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | 48 | -------------------------------------------------------------------------------- /src/components/MiniScore.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 31 | 32 | 64 | -------------------------------------------------------------------------------- /src/components/MiniScores.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 33 | 34 | 105 | -------------------------------------------------------------------------------- /src/components/ScoreCard.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 31 | 32 | 54 | -------------------------------------------------------------------------------- /src/lib-liveblocks/LiveblocksProvider.vue: -------------------------------------------------------------------------------- 1 | 5 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /src/lib-liveblocks/RoomProvider.vue: -------------------------------------------------------------------------------- 1 | 5 | 26 | 27 | 30 | -------------------------------------------------------------------------------- /src/lib-liveblocks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './symbols' 2 | export * from './useMyPresence' 3 | export * from './useStorage' 4 | export * from './useOthers' 5 | export * from './useList' 6 | 7 | /** 8 | * These components were built to (mostly) match the 9 | * liveblocks-react library 10 | */ 11 | -------------------------------------------------------------------------------- /src/lib-liveblocks/symbols.ts: -------------------------------------------------------------------------------- 1 | import { InjectionKey } from 'vue' 2 | 3 | // Symbols are used for provide/inject to avoid polluting the global scope 4 | export const clientSymbol = Symbol() as InjectionKey 5 | export const roomSymbol = Symbol() as InjectionKey 6 | -------------------------------------------------------------------------------- /src/lib-liveblocks/useList.ts: -------------------------------------------------------------------------------- 1 | import { inject, onUnmounted, Ref, ref, watch } from 'vue' 2 | import { roomSymbol } from './symbols' 3 | import { LiveList, Room } from '@liveblocks/client' 4 | import { useStorage } from './useStorage' 5 | 6 | /** 7 | * Works similarly to `liveblocks-react` useList 8 | * https://liveblocks.io/docs/api-reference/liveblocks-react#useList 9 | * 10 | * Two differences: 11 | * 1. It's a vue ref, so use .value 12 | * 2. .value must be called as a function every time 13 | * 14 | * const list = useList("animals", ["🦁", "🦊", "🐵"]) 15 | * console.log([...list.value()]) 16 | * console.log(list.value().get(2)) 17 | */ 18 | export function useList (name: string, initial?: any[]): Ref<() => LiveList|void>|null { 19 | const room = inject(roomSymbol) 20 | 21 | if (!room) { 22 | console.error('Use RoomProvider as parent with id prop') 23 | return null 24 | } 25 | 26 | const root = useStorage() 27 | const list = ref(() => {}) 28 | 29 | watch(root, () => { 30 | if (!root.value().get(name)) { 31 | root.value().set(name, new LiveList(initial)) 32 | } 33 | 34 | list.value = () => root.value().get(name) 35 | 36 | const unsubscribe = room.subscribe(root.value().get(name), (newList) => { 37 | list.value = () => newList 38 | }) 39 | 40 | onUnmounted(() => { 41 | unsubscribe() 42 | }) 43 | }) 44 | 45 | return list 46 | } 47 | -------------------------------------------------------------------------------- /src/lib-liveblocks/useMyPresence.ts: -------------------------------------------------------------------------------- 1 | import { inject, onUnmounted, ref, watchEffect } from 'vue' 2 | import { Presence, Room } from '@liveblocks/client' 3 | import { roomSymbol } from './symbols' 4 | 5 | /** 6 | * Works similarly to `liveblocks-react` useMyPresence 7 | * https://liveblocks.io/docs/api-reference/liveblocks-react#useMyPresence 8 | * 9 | * The first array index uses a vue ref so make sure to use .value 10 | * const [presence, updateMyPresence] = useMyPresence() 11 | * console.log(presence.value) 12 | * 13 | * But not for updateMyPresence: 14 | * updateMyPresence({ ... }) 15 | */ 16 | export function useMyPresence (): [Presence|null, ((updatedPresence: any) => void)] { 17 | const room = inject(roomSymbol) 18 | 19 | if (!room) { 20 | console.error('Use RoomProvider as parent with id prop') 21 | return [null, updatePresence] 22 | } 23 | 24 | const presence = ref({}) 25 | 26 | watchEffect(() => { 27 | room.updatePresence(presence.value) 28 | }) 29 | 30 | const unsubscribe = room.subscribe('my-presence', newPresence => { 31 | presence.value = newPresence 32 | }) 33 | 34 | onUnmounted(() => { 35 | unsubscribe() 36 | }) 37 | 38 | function updatePresence (updatedPresence: any) { 39 | if (room && presence?.value) { 40 | room.updatePresence(updatedPresence) 41 | } else { 42 | } 43 | } 44 | 45 | return [presence, updatePresence] 46 | } 47 | -------------------------------------------------------------------------------- /src/lib-liveblocks/useOthers.ts: -------------------------------------------------------------------------------- 1 | import { inject, onUnmounted, ref, watchEffect } from 'vue' 2 | import { Others, Room } from '@liveblocks/client' 3 | import { roomSymbol } from './symbols' 4 | 5 | /** 6 | * Works similarly to `liveblocks-react` useOthers 7 | * https://liveblocks.io/docs/api-reference/liveblocks-react#useOthers 8 | * 9 | * This uses a vue ref so make sure to use .value 10 | * const others = useOthers() 11 | * console.log(others.value) 12 | */ 13 | export function useOthers () { 14 | const room = inject(roomSymbol) 15 | 16 | if (!room) { 17 | console.error('Use RoomProvider as parent with id prop') 18 | return null 19 | } 20 | 21 | const others = ref() 22 | 23 | watchEffect(() => { 24 | others.value = room.getOthers() 25 | }) 26 | 27 | const unsubscribe = room.subscribe('others', newOthers => { 28 | others.value = newOthers 29 | }) 30 | 31 | onUnmounted(() => { 32 | unsubscribe() 33 | }) 34 | 35 | return others 36 | } 37 | -------------------------------------------------------------------------------- /src/lib-liveblocks/useStorage.ts: -------------------------------------------------------------------------------- 1 | import { inject, Ref, ref, watchEffect } from 'vue' 2 | import { LiveObject, Room } from '@liveblocks/client' 3 | import { roomSymbol } from './symbols' 4 | 5 | /** 6 | * No `liveblocks-react` public API equivalent, but useStorage is used internally 7 | */ 8 | export function useStorage (): Ref<() => LiveObject> { 9 | const room = inject(roomSymbol) 10 | // @ts-ignore 11 | const rootRef = ref<() => LiveObject>(() => {}) 12 | 13 | watchEffect(() => { 14 | if (!room) { 15 | console.error('Use RoomProvider as parent with id prop') 16 | return null 17 | } 18 | 19 | async function fetchStorage() { 20 | const { root }: { root: LiveObject } = await room!.getStorage() 21 | rootRef.value = () => root 22 | } 23 | 24 | fetchStorage() 25 | }) 26 | 27 | return rootRef 28 | } 29 | -------------------------------------------------------------------------------- /src/lib/copyText.ts: -------------------------------------------------------------------------------- 1 | export function copyUrlToClipboard () { 2 | copyTextToClipboard(window.location.href) 3 | } 4 | 5 | export function copyTextToClipboard (text: string) { 6 | if (!navigator.clipboard) { 7 | fallbackCopyTextToClipboard(text) 8 | return 9 | } 10 | navigator.clipboard.writeText(text).then(function () {}, function (err) { 11 | console.error('Unable to copy', err) 12 | }) 13 | } 14 | 15 | function fallbackCopyTextToClipboard (text: string) { 16 | var textArea = document.createElement('textarea') 17 | textArea.value = text 18 | 19 | // Avoid scrolling to bottom 20 | textArea.style.top = '0' 21 | textArea.style.left = '0' 22 | textArea.style.position = 'fixed' 23 | 24 | document.body.appendChild(textArea) 25 | textArea.focus() 26 | textArea.select() 27 | 28 | try { 29 | document.execCommand('copy') 30 | } catch (err) { 31 | console.error('Unable to copy', err) 32 | } 33 | 34 | document.body.removeChild(textArea) 35 | } 36 | -------------------------------------------------------------------------------- /src/lib/createRoomId.ts: -------------------------------------------------------------------------------- 1 | export function createRoomId () { 2 | let id = new URLSearchParams(window.location.search).get('room') 3 | if (!id) { 4 | id = randomId() 5 | window.location.search = `?room=${id}` 6 | } 7 | return id 8 | } 9 | 10 | function randomId () { 11 | return 'xxxxxxxxxxxxxxxxxxxxx'.replace(/[x]/g, () => { 12 | return (Math.random() * 16 | 0).toString(16) 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /src/lib/getWordOfTheDay.ts: -------------------------------------------------------------------------------- 1 | import { answers } from '../words' 2 | 3 | export function getWordOfTheDay () { 4 | if (import.meta.env.DEV) { 5 | console.log('DEV: Answer is PRIDE') 6 | return { answer: 'pride', answerDay: 1 } 7 | } 8 | 9 | const now = dateToUtc(new Date()) 10 | const start = new Date(Date.UTC(2022, 1, 15)) 11 | const diff = Number(now) - Number(start) 12 | let day = Math.floor(diff / (1000 * 60 * 60 * 24)) 13 | while (day > answers.length) { 14 | day -= answers.length 15 | } 16 | return { answer: answers[day], answerDay: day + 1 } 17 | } 18 | 19 | function dateToUtc (d: Date) { 20 | return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate())) 21 | } 22 | -------------------------------------------------------------------------------- /src/lib/messages.ts: -------------------------------------------------------------------------------- 1 | function wordToBoard (word: string, state: string = 'correct') { 2 | return [[...word].map(letter => ({ letter, state }))] 3 | } 4 | 5 | const enterYourName = [ 6 | [ 7 | { letter: 'e', state: 'correct' }, 8 | { letter: 'n', state: 'correct' }, 9 | { letter: 't', state: 'correct' }, 10 | { letter: 'e', state: 'correct' }, 11 | { letter: 'r', state: 'correct' } 12 | ], 13 | [ 14 | { letter: 'y', state: 'present' }, 15 | { letter: 'o', state: 'present' }, 16 | { letter: 'u', state: 'present' }, 17 | { letter: 'r', state: 'present' }, 18 | { letter: '', state: 'absent' }, 19 | ], 20 | [ 21 | { letter: '', state: 'absent' }, 22 | { letter: 'n', state: 'correct' }, 23 | { letter: 'a', state: 'correct' }, 24 | { letter: 'm', state: 'correct' }, 25 | { letter: 'e', state: 'correct' }, 26 | ] 27 | ] 28 | 29 | const relay = [ 30 | [ 31 | { letter: 'r', state: 'correct' }, 32 | { letter: 'e', state: 'absent' }, 33 | { letter: 'l', state: 'absent' }, 34 | { letter: 'a', state: 'absent' }, 35 | { letter: 'y', state: 'absent' } 36 | ], 37 | ] 38 | 39 | const happy = [ 40 | [ 41 | { letter: 'h', state: 'absent' }, 42 | { letter: 'a', state: 'present' }, 43 | { letter: 'p', state: 'absent' }, 44 | { letter: 'p', state: 'absent' }, 45 | { letter: 'y', state: 'absent' } 46 | ], 47 | ] 48 | 49 | const minds = [ 50 | [ 51 | { letter: 'm', state: 'absent' }, 52 | { letter: 'i', state: 'absent' }, 53 | { letter: 'n', state: 'absent' }, 54 | { letter: 'd', state: 'absent' }, 55 | { letter: 's', state: 'absent' } 56 | ], 57 | ] 58 | 59 | 60 | const fight = [ 61 | [ 62 | { letter: 'f', state: 'correct' }, 63 | { letter: 'i', state: 'correct' }, 64 | { letter: 'g', state: 'correct' }, 65 | { letter: 'h', state: 'correct' }, 66 | { letter: 't', state: 'correct' } 67 | ], 68 | ] 69 | 70 | const connecting = [ 71 | [ 72 | { letter: 'f', state: 'correct' }, 73 | { letter: 'i', state: 'correct' }, 74 | { letter: 'n', state: 'correct' }, 75 | { letter: 'd', state: 'correct' }, 76 | { letter: '', state: 'absent' } 77 | ], 78 | [ 79 | { letter: 't', state: 'present' }, 80 | { letter: 'h', state: 'present' }, 81 | { letter: 'o', state: 'present' }, 82 | { letter: 's', state: 'present' }, 83 | { letter: 'e', state: 'present' }, 84 | ], 85 | [ 86 | { letter: 'w', state: 'correct' }, 87 | { letter: 'o', state: 'correct' }, 88 | { letter: 'r', state: 'correct' }, 89 | { letter: 'd', state: 'correct' }, 90 | { letter: 's', state: 'correct' }, 91 | ] 92 | ] 93 | 94 | export default { wordToBoard, relay, happy, minds, connecting, fight, enterYourName } 95 | -------------------------------------------------------------------------------- /src/lib/sortUsers.ts: -------------------------------------------------------------------------------- 1 | // All users sorted by score 2 | import { LetterState, OtherUser } from '../types' 3 | 4 | export function sortUsers (arr: OtherUser[]) { 5 | return arr.sort((a: OtherUser, b: OtherUser) => { 6 | if (!b.score) { 7 | return -1 8 | } 9 | if (!a.score) { 10 | return 1 11 | } 12 | const correctSort = b.score[LetterState.CORRECT] - a.score[LetterState.CORRECT] 13 | if (correctSort !== 0) { 14 | return correctSort 15 | } 16 | const presentSort = b.score[LetterState.PRESENT] = a.score[LetterState.PRESENT] 17 | if (presentSort !== 0) { 18 | return presentSort 19 | } 20 | const rowsComplete = a.rowsComplete - b.rowsComplete 21 | if (rowsComplete !== 0) { 22 | return rowsComplete 23 | } 24 | if (a.timeFinished && b.timeFinished) { 25 | return a.timeFinished - b.timeFinished 26 | } 27 | return 0 28 | }) 29 | } 30 | -------------------------------------------------------------------------------- /src/liveblocks.config.ts: -------------------------------------------------------------------------------- 1 | import { createClient, type Room } from "@liveblocks/client"; 2 | 3 | export const client = createClient({ 4 | publicApiKey: import.meta.env.VITE_LIVEBLOCKS_PUBLIC_KEY as string, 5 | }) 6 | 7 | // Presence represents the properties that exist on every user in the Room 8 | // and that will automatically be kept in sync. Accessible through the 9 | // `user.presence` property. Must be JSON-serializable. 10 | type Presence = { 11 | // cursor: { x: number, y: number } | null, 12 | // ... 13 | }; 14 | 15 | // Optionally, Storage represents the shared document that persists in the 16 | // Room, even after all users leave. Fields under Storage typically are 17 | // LiveList, LiveMap, LiveObject instances, for which updates are 18 | // automatically persisted and synced to all connected clients. 19 | type Storage = { 20 | // author: LiveObject<{ firstName: string, lastName: string }>, 21 | // ... 22 | }; 23 | 24 | // Optionally, UserMeta represents static/readonly metadata on each user, as 25 | // provided by your own custom auth back end (if used). Useful for data that 26 | // will not change during a session, like a user's name or avatar. 27 | type UserMeta = { 28 | // id?: string, // Accessible through `user.id` 29 | // info?: Json, // Accessible through `user.info` 30 | }; 31 | 32 | // Optionally, the type of custom events broadcast and listened to in this 33 | // room. Use a union for multiple events. Must be JSON-serializable. 34 | type RoomEvent = { 35 | // type: "NOTIFICATION", 36 | // ... 37 | }; 38 | 39 | // Optionally, when using Comments, ThreadMetadata represents metadata on 40 | // each thread. Can only contain booleans, strings, and numbers. 41 | export type ThreadMetadata = { 42 | // resolved: boolean; 43 | // quote: string; 44 | // time: number; 45 | }; 46 | 47 | export type TypedRoom = Room; 48 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import Index from './Index.vue' 3 | import './styles/global.css' 4 | 5 | // resize for scaling the board size 6 | window.addEventListener('resize', onResize) 7 | // set size on startup 8 | onResize() 9 | 10 | function onResize () { 11 | // get actual vh on mobile 12 | document.body.style.setProperty('--vh', window.innerHeight + 'px') 13 | } 14 | 15 | createApp(Index).mount('#app') 16 | -------------------------------------------------------------------------------- /src/styles/global.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | html, body, #app { 6 | position: absolute; 7 | top: 0; 8 | left: 0; 9 | right: 0; 10 | height: var(--vh); 11 | height: -webkit-fill-available; 12 | } 13 | 14 | *, *:before, *:after { 15 | box-sizing: border-box; 16 | } 17 | 18 | #app { 19 | display: flex; 20 | flex-direction: column; 21 | align-items: stretch; 22 | justify-content: space-between; 23 | padding-bottom: 2px; 24 | } 25 | 26 | .dark #app { 27 | background: #18181B; 28 | color: #D4D4D8; 29 | } 30 | 31 | body { 32 | font-family: Inter, 'Clear Sans', 'Helvetica Neue', Arial, sans-serif; 33 | margin: 0 auto; 34 | } 35 | 36 | input, button { 37 | font: inherit; 38 | } 39 | 40 | .divider { 41 | background: lightgrey; 42 | height: 1px; 43 | display: block; 44 | width: 100%; 45 | margin: 24px 0 0; 46 | } 47 | 48 | .dark .divider { 49 | background: #52525B; 50 | } 51 | 52 | #source-link { 53 | position: absolute; 54 | right: 1em; 55 | top: 0.5em; 56 | } 57 | 58 | .correct, 59 | .present, 60 | .absent { 61 | color: #fff !important; 62 | } 63 | 64 | .keyboard-button { 65 | background-color: #d3d6da; 66 | color: #1a1a1b; 67 | } 68 | 69 | .dark .keyboard-button { 70 | background: #71717A; 71 | color: #fff; 72 | } 73 | 74 | /* LIGHT MODE */ 75 | .correct, 76 | .ready-button, 77 | .ready-button:disabled, 78 | .ready-button:active { 79 | background-color: #1bb238; 80 | } 81 | .waiting-player-ready { 82 | color: #1bb238; 83 | } 84 | .ready-button:hover { 85 | background-color: #26d34a; 86 | } 87 | 88 | .present, 89 | .unready-button, 90 | .unready-button:disabled, 91 | .unready-button:active { 92 | background-color: #d2a207; 93 | } 94 | .waiting-player-waiting { 95 | color: #d2a207; 96 | } 97 | 98 | 99 | /* DARK MODE */ 100 | .dark .correct, 101 | .dark .ready-button, 102 | .dark .ready-button:disabled, 103 | .dark .ready-button:active { 104 | background-color: #15a62f; 105 | } 106 | .dark .waiting-player-ready { 107 | color: #15a62f; 108 | } 109 | .dark .ready-button:hover { 110 | background-color: #1eb73b; 111 | } 112 | 113 | .dark .present, 114 | .dark .unready-button, 115 | .dark .unready-button:disabled, 116 | .dark .unready-button:active { 117 | background-color: #be9403; 118 | } 119 | .dark .waiting-player-waiting { 120 | color: #be9403; 121 | } 122 | .dark .unready-button:hover { 123 | background-color: #be9403; 124 | } 125 | 126 | /* LIGHT COLOURBLIND MODE */ 127 | .colourblind .correct, 128 | .colourblind .ready-button, 129 | .colourblind .ready-button:disabled, 130 | .colourblind .ready-button:active { 131 | background-color: #8529fa; 132 | } 133 | .colourblind .waiting-player-ready { 134 | color: #8529fa; 135 | } 136 | .colourblind .ready-button:hover { 137 | background-color: #9243fd; 138 | } 139 | 140 | .colourblind .present, 141 | .colourblind .unready-button, 142 | .colourblind .unready-button:disabled, 143 | .colourblind .unready-button:active { 144 | background-color: #04c408; 145 | } 146 | .colourblind .waiting-player-waiting { 147 | color: #04c408; 148 | } 149 | .colourblind .unready-button:hover { 150 | background-color: #13ee18; 151 | } 152 | 153 | /* DARK COLOURBLIND MODE */ 154 | .dark.colourblind .correct, 155 | .dark.colourblind .ready-button, 156 | .dark.colourblind .ready-button:disabled, 157 | .dark.colourblind .ready-button:active { 158 | background-color: #984bff; 159 | } 160 | .dark.colourblind .waiting-player-ready { 161 | color: #984bff; 162 | } 163 | .dark.colourblind .ready-button:hover { 164 | background-color: #9c5afa; 165 | } 166 | 167 | .dark.colourblind .present, 168 | .dark.colourblind .unready-button, 169 | .dark.colourblind .unready-button:disabled, 170 | .dark.colourblind .unready-button:active { 171 | background-color: #04c408; 172 | } 173 | .dark.colourblind .waiting-player-waiting { 174 | color: #04c408; 175 | } 176 | .dark.colourblind .unready-button:hover { 177 | background-color: #13ee18; 178 | } 179 | 180 | /* ALL MODES */ 181 | .absent { 182 | background-color: #82918b !important; 183 | } 184 | 185 | .dark .absent { 186 | background-color: #3F3F46 !important; 187 | } 188 | 189 | .copy-button { 190 | background-color: #898989; 191 | } 192 | 193 | .link { 194 | @apply text-green-600 dark:text-green-500 font-semibold; 195 | } 196 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export const enum GameState { 2 | CONNECTING = 'connecting', 3 | INTRO = 'intro', 4 | WAITING = 'waiting', 5 | READY = 'ready', 6 | PLAYING = 'playing', 7 | COMPLETE = 'complete', 8 | SCORES = 'scores' 9 | } 10 | 11 | export type OtherScore = { 12 | correct: number 13 | present: number 14 | absent: number 15 | } 16 | 17 | export type OtherUser = { 18 | name: string 19 | board: string 20 | score: OtherScore 21 | stage: GameState 22 | rowsComplete: number 23 | timeFinished: number 24 | } 25 | 26 | export const enum LetterState { 27 | INITIAL = 0, 28 | CORRECT = 'correct', 29 | PRESENT = 'present', 30 | ABSENT = 'absent' 31 | } 32 | 33 | export type LettersGuessed = Record 34 | 35 | export type LetterBoard = { 36 | letter: string, 37 | state: LetterState 38 | } 39 | 40 | export type LettersGuessedProps = { 41 | letterBoard: LetterBoard[][] 42 | letterStates: LettersGuessed 43 | } 44 | 45 | export type GameCompleteProps = { 46 | success: boolean, 47 | successGrid?: string 48 | } 49 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const colors = require('tailwindcss/colors') 2 | 3 | module.exports = { 4 | darkMode: 'class', 5 | content: [ 6 | "./index.html", 7 | "./src/**/*.{vue,js,ts,jsx,tsx}", 8 | ], 9 | theme: { 10 | extend: { 11 | fontFamily: { 12 | karla: 'Karla, Inter, sans-serif' 13 | }, 14 | colors: { 15 | gray: { 16 | ...colors.zinc, 17 | 50: colors.gray[50], 18 | 100: colors.gray[100], 19 | 200: colors.gray[200], 20 | 850: '#202022' 21 | } 22 | } 23 | }, 24 | }, 25 | plugins: [], 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "useDefineForClassFields": true, 5 | "module": "esnext", 6 | "moduleResolution": "node", 7 | "strict": true, 8 | "jsx": "preserve", 9 | "sourceMap": true, 10 | "resolveJsonModule": true, 11 | "esModuleInterop": true, 12 | "lib": ["esnext", "dom"], 13 | "types": ["vite/client"] 14 | }, 15 | "include": ["env.d.ts", "src/**/*"] 16 | } 17 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [vue({ 7 | reactivityTransform: true 8 | })] 9 | }) 10 | --------------------------------------------------------------------------------