├── .eslintrc.json ├── .github └── FUNDING.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── LICENSE ├── README.md ├── next-env.d.ts ├── next.config.js ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── preview ├── desktop.png ├── desktop_fullsize.png ├── interaction_desktop.png ├── interaction_mobile.png └── mobile.png ├── public ├── favicon.ico └── vercel.svg ├── src ├── @types │ └── data.d.ts ├── components │ ├── FilterBar │ │ ├── FilterItems.tsx │ │ ├── Input.tsx │ │ ├── MenuItems.tsx │ │ ├── YearRange.tsx │ │ └── index.tsx │ ├── Sankey │ │ ├── compute.ts │ │ └── index.tsx │ ├── Timeline │ │ ├── DesktopView.tsx │ │ ├── MobileView.tsx │ │ ├── buttons.tsx │ │ ├── compute.ts │ │ └── index.tsx │ ├── Years │ │ └── index.tsx │ └── Zoom │ │ └── index.tsx ├── lib │ ├── consts.ts │ ├── dataGenerator.ts │ ├── hooks.tsx │ └── utils.ts ├── pages │ ├── _app.tsx │ └── index.tsx ├── stores │ └── useTimeline.ts └── styles │ └── globals.css ├── tailwind.config.js └── tsconfig.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [geekplux] 2 | patreon: geekplux 3 | ko_fi: geekplux 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build/** 2 | out/** 3 | public/** 4 | build/** 5 | node_modules/** 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "none", 4 | "overrides": [ 5 | { 6 | "files": ["*.css"], 7 | "options": { 8 | "singleQuote": false 9 | } 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2022, GeekPlux 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Timeline-Sankey 2 | 3 | A project to visualize time range series data using the [Sankey diagram](https://en.wikipedia.org/wiki/Sankey_diagram). 4 | 5 | ## Features 6 | 7 | - Visualization layout: 8 | - **Responsive View**, with automatic resizing, and adaptive layout for mobile or desktop devices. 9 | - **Grid layout** for multiple node series 10 | - Direct link and cross(series) link 11 | - Node title 12 | - Series(column) title in mobile view 13 | - Interactions: 14 | - Hovering over a node highlights the connected nodes and links 15 | - **Zoom** on vertical orientation 16 | - **Filter** by node tags, categories or date range 17 | - Node clicking redirect 18 | - **Swipe** and **Touch** on mobile device view 19 | 20 | ## Preview 21 | 22 | [Online Demo](https://timeline-sankey.vercel.app) 23 | 24 | You can play with the demo by tweaking any parameters on right side of the page. 25 | 26 | #### Desktop View 27 | 28 | ![](./preview/desktop.png) 29 | 30 | Interaction on desktop view 31 | 32 | ![](./preview/interaction_desktop.png) 33 | 34 | #### Mobile View 35 | 36 |
37 | mobile view 38 | mobile interaction view 39 |
40 | 41 | More preview images can be found in the [preview folder](./preview). 42 | 43 | ### Docs 44 | 45 | This is not a library, but all parameters are exposed as public properties and which can be changed on the demo page. You can also go through the [index.tsx](./src/pages/index.tsx) to see all properties. 46 | 47 | ### Visualization Algorithm 48 | 49 | - Simple calculation of node position witnin each series(grid, column) to make them side by side as much as possible. So it's not a classical Sankey diagram algorithm like [which d3 is using](https://github.com/d3/d3-sankey) 50 | - Connect nodes with links then 51 | - Calculate node properties when interacting or filtering 52 | 53 | ## LICENSE 54 | 55 | [BSD-3-Clause](./LICENSE) © [GeekPlux](https://github.com/geekplux). 56 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | } 5 | 6 | module.exports = nextConfig 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "timeline-sankey", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "license": "bsd-3-clause", 12 | "dependencies": { 13 | "d3": "^7.4.4", 14 | "leva": "^0.9.30", 15 | "lodash": "^4.17.21", 16 | "next": "12.1.6", 17 | "react": "18.1.0", 18 | "react-dom": "18.1.0", 19 | "react-resize-detector": "^7.1.1", 20 | "react-responsive": "^9.0.0-beta.8", 21 | "react-swipeable": "^7.0.0", 22 | "react-use": "^17.4.0", 23 | "zustand": "^4.0.0-rc.1" 24 | }, 25 | "devDependencies": { 26 | "@types/d3": "^7.4.0", 27 | "@types/lodash": "^4.14.182", 28 | "@types/node": "17.0.35", 29 | "@types/react": "18.0.9", 30 | "@types/react-dom": "18.0.5", 31 | "autoprefixer": "^10.4.7", 32 | "eslint": "8.16.0", 33 | "eslint-config-next": "12.1.6", 34 | "postcss": "^8.4.14", 35 | "prettier": "^2.6.2", 36 | "tailwindcss": "^3.0.24", 37 | "typescript": "4.7.2" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@types/d3': ^7.4.0 5 | '@types/lodash': ^4.14.182 6 | '@types/node': 17.0.35 7 | '@types/react': 18.0.9 8 | '@types/react-dom': 18.0.5 9 | autoprefixer: ^10.4.7 10 | d3: ^7.4.4 11 | eslint: 8.16.0 12 | eslint-config-next: 12.1.6 13 | leva: ^0.9.30 14 | lodash: ^4.17.21 15 | next: 12.1.6 16 | postcss: ^8.4.14 17 | prettier: ^2.6.2 18 | react: 18.1.0 19 | react-dom: 18.1.0 20 | react-resize-detector: ^7.1.1 21 | react-responsive: ^9.0.0-beta.8 22 | react-swipeable: ^7.0.0 23 | react-use: ^17.4.0 24 | tailwindcss: ^3.0.24 25 | typescript: 4.7.2 26 | zustand: ^4.0.0-rc.1 27 | 28 | dependencies: 29 | d3: 7.4.4 30 | leva: 0.9.30_ef5jwxihqo6n7gxfmzogljlgcm 31 | lodash: 4.17.21 32 | next: 12.1.6_ef5jwxihqo6n7gxfmzogljlgcm 33 | react: 18.1.0 34 | react-dom: 18.1.0_react@18.1.0 35 | react-resize-detector: 7.1.1_ef5jwxihqo6n7gxfmzogljlgcm 36 | react-responsive: 9.0.0-beta.8_react@18.1.0 37 | react-swipeable: 7.0.0_react@18.1.0 38 | react-use: 17.4.0_ef5jwxihqo6n7gxfmzogljlgcm 39 | zustand: 4.0.0-rc.1_react@18.1.0 40 | 41 | devDependencies: 42 | '@types/d3': 7.4.0 43 | '@types/lodash': 4.14.182 44 | '@types/node': 17.0.35 45 | '@types/react': 18.0.9 46 | '@types/react-dom': 18.0.5 47 | autoprefixer: 10.4.7_postcss@8.4.14 48 | eslint: 8.16.0 49 | eslint-config-next: 12.1.6_k6khgwrcmlpd2kpaxkviqw2zii 50 | postcss: 8.4.14 51 | prettier: 2.6.2 52 | tailwindcss: 3.0.24 53 | typescript: 4.7.2 54 | 55 | packages: 56 | 57 | /@babel/runtime-corejs3/7.18.3: 58 | resolution: {integrity: sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==} 59 | engines: {node: '>=6.9.0'} 60 | dependencies: 61 | core-js-pure: 3.22.7 62 | regenerator-runtime: 0.13.9 63 | dev: true 64 | 65 | /@babel/runtime/7.18.3: 66 | resolution: {integrity: sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==} 67 | engines: {node: '>=6.9.0'} 68 | dependencies: 69 | regenerator-runtime: 0.13.9 70 | 71 | /@eslint/eslintrc/1.3.0: 72 | resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} 73 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 74 | dependencies: 75 | ajv: 6.12.6 76 | debug: 4.3.4 77 | espree: 9.3.2 78 | globals: 13.15.0 79 | ignore: 5.2.0 80 | import-fresh: 3.3.0 81 | js-yaml: 4.1.0 82 | minimatch: 3.1.2 83 | strip-json-comments: 3.1.1 84 | transitivePeerDependencies: 85 | - supports-color 86 | dev: true 87 | 88 | /@humanwhocodes/config-array/0.9.5: 89 | resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} 90 | engines: {node: '>=10.10.0'} 91 | dependencies: 92 | '@humanwhocodes/object-schema': 1.2.1 93 | debug: 4.3.4 94 | minimatch: 3.1.2 95 | transitivePeerDependencies: 96 | - supports-color 97 | dev: true 98 | 99 | /@humanwhocodes/object-schema/1.2.1: 100 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 101 | dev: true 102 | 103 | /@next/env/12.1.6: 104 | resolution: {integrity: sha512-Te/OBDXFSodPU6jlXYPAXpmZr/AkG6DCATAxttQxqOWaq6eDFX25Db3dK0120GZrSZmv4QCe9KsZmJKDbWs4OA==} 105 | 106 | /@next/eslint-plugin-next/12.1.6: 107 | resolution: {integrity: sha512-yNUtJ90NEiYFT6TJnNyofKMPYqirKDwpahcbxBgSIuABwYOdkGwzos1ZkYD51Qf0diYwpQZBeVqElTk7Q2WNqw==} 108 | dependencies: 109 | glob: 7.1.7 110 | dev: true 111 | 112 | /@next/swc-android-arm-eabi/12.1.6: 113 | resolution: {integrity: sha512-BxBr3QAAAXWgk/K7EedvzxJr2dE014mghBSA9iOEAv0bMgF+MRq4PoASjuHi15M2zfowpcRG8XQhMFtxftCleQ==} 114 | engines: {node: '>= 10'} 115 | cpu: [arm] 116 | os: [android] 117 | requiresBuild: true 118 | optional: true 119 | 120 | /@next/swc-android-arm64/12.1.6: 121 | resolution: {integrity: sha512-EboEk3ROYY7U6WA2RrMt/cXXMokUTXXfnxe2+CU+DOahvbrO8QSWhlBl9I9ZbFzJx28AGB9Yo3oQHCvph/4Lew==} 122 | engines: {node: '>= 10'} 123 | cpu: [arm64] 124 | os: [android] 125 | requiresBuild: true 126 | optional: true 127 | 128 | /@next/swc-darwin-arm64/12.1.6: 129 | resolution: {integrity: sha512-P0EXU12BMSdNj1F7vdkP/VrYDuCNwBExtRPDYawgSUakzi6qP0iKJpya2BuLvNzXx+XPU49GFuDC5X+SvY0mOw==} 130 | engines: {node: '>= 10'} 131 | cpu: [arm64] 132 | os: [darwin] 133 | requiresBuild: true 134 | optional: true 135 | 136 | /@next/swc-darwin-x64/12.1.6: 137 | resolution: {integrity: sha512-9FptMnbgHJK3dRDzfTpexs9S2hGpzOQxSQbe8omz6Pcl7rnEp9x4uSEKY51ho85JCjL4d0tDLBcXEJZKKLzxNg==} 138 | engines: {node: '>= 10'} 139 | cpu: [x64] 140 | os: [darwin] 141 | requiresBuild: true 142 | optional: true 143 | 144 | /@next/swc-linux-arm-gnueabihf/12.1.6: 145 | resolution: {integrity: sha512-PvfEa1RR55dsik/IDkCKSFkk6ODNGJqPY3ysVUZqmnWMDSuqFtf7BPWHFa/53znpvVB5XaJ5Z1/6aR5CTIqxPw==} 146 | engines: {node: '>= 10'} 147 | cpu: [arm] 148 | os: [linux] 149 | requiresBuild: true 150 | optional: true 151 | 152 | /@next/swc-linux-arm64-gnu/12.1.6: 153 | resolution: {integrity: sha512-53QOvX1jBbC2ctnmWHyRhMajGq7QZfl974WYlwclXarVV418X7ed7o/EzGY+YVAEKzIVaAB9JFFWGXn8WWo0gQ==} 154 | engines: {node: '>= 10'} 155 | cpu: [arm64] 156 | os: [linux] 157 | requiresBuild: true 158 | optional: true 159 | 160 | /@next/swc-linux-arm64-musl/12.1.6: 161 | resolution: {integrity: sha512-CMWAkYqfGdQCS+uuMA1A2UhOfcUYeoqnTW7msLr2RyYAys15pD960hlDfq7QAi8BCAKk0sQ2rjsl0iqMyziohQ==} 162 | engines: {node: '>= 10'} 163 | cpu: [arm64] 164 | os: [linux] 165 | requiresBuild: true 166 | optional: true 167 | 168 | /@next/swc-linux-x64-gnu/12.1.6: 169 | resolution: {integrity: sha512-AC7jE4Fxpn0s3ujngClIDTiEM/CQiB2N2vkcyWWn6734AmGT03Duq6RYtPMymFobDdAtZGFZd5nR95WjPzbZAQ==} 170 | engines: {node: '>= 10'} 171 | cpu: [x64] 172 | os: [linux] 173 | requiresBuild: true 174 | optional: true 175 | 176 | /@next/swc-linux-x64-musl/12.1.6: 177 | resolution: {integrity: sha512-c9Vjmi0EVk0Kou2qbrynskVarnFwfYIi+wKufR9Ad7/IKKuP6aEhOdZiIIdKsYWRtK2IWRF3h3YmdnEa2WLUag==} 178 | engines: {node: '>= 10'} 179 | cpu: [x64] 180 | os: [linux] 181 | requiresBuild: true 182 | optional: true 183 | 184 | /@next/swc-win32-arm64-msvc/12.1.6: 185 | resolution: {integrity: sha512-3UTOL/5XZSKFelM7qN0it35o3Cegm6LsyuERR3/OoqEExyj3aCk7F025b54/707HTMAnjlvQK3DzLhPu/xxO4g==} 186 | engines: {node: '>= 10'} 187 | cpu: [arm64] 188 | os: [win32] 189 | requiresBuild: true 190 | optional: true 191 | 192 | /@next/swc-win32-ia32-msvc/12.1.6: 193 | resolution: {integrity: sha512-8ZWoj6nCq6fI1yCzKq6oK0jE6Mxlz4MrEsRyu0TwDztWQWe7rh4XXGLAa2YVPatYcHhMcUL+fQQbqd1MsgaSDA==} 194 | engines: {node: '>= 10'} 195 | cpu: [ia32] 196 | os: [win32] 197 | requiresBuild: true 198 | optional: true 199 | 200 | /@next/swc-win32-x64-msvc/12.1.6: 201 | resolution: {integrity: sha512-4ZEwiRuZEicXhXqmhw3+de8Z4EpOLQj/gp+D9fFWo6ii6W1kBkNNvvEx4A90ugppu+74pT1lIJnOuz3A9oQeJA==} 202 | engines: {node: '>= 10'} 203 | cpu: [x64] 204 | os: [win32] 205 | requiresBuild: true 206 | optional: true 207 | 208 | /@nodelib/fs.scandir/2.1.5: 209 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 210 | engines: {node: '>= 8'} 211 | dependencies: 212 | '@nodelib/fs.stat': 2.0.5 213 | run-parallel: 1.2.0 214 | dev: true 215 | 216 | /@nodelib/fs.stat/2.0.5: 217 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 218 | engines: {node: '>= 8'} 219 | dev: true 220 | 221 | /@nodelib/fs.walk/1.2.8: 222 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 223 | engines: {node: '>= 8'} 224 | dependencies: 225 | '@nodelib/fs.scandir': 2.1.5 226 | fastq: 1.13.0 227 | dev: true 228 | 229 | /@radix-ui/popper/0.1.0: 230 | resolution: {integrity: sha512-uzYeElL3w7SeNMuQpXiFlBhTT+JyaNMCwDfjKkrzugEcYrf5n52PHqncNdQPUtR42hJh8V9FsqyEDbDxkeNjJQ==} 231 | dependencies: 232 | '@babel/runtime': 7.18.3 233 | csstype: 3.1.0 234 | dev: false 235 | 236 | /@radix-ui/primitive/0.1.0: 237 | resolution: {integrity: sha512-tqxZKybwN5Fa3VzZry4G6mXAAb9aAqKmPtnVbZpL0vsBwvOHTBwsjHVPXylocYLwEtBY9SCe665bYnNB515uoA==} 238 | dependencies: 239 | '@babel/runtime': 7.18.3 240 | dev: false 241 | 242 | /@radix-ui/react-arrow/0.1.3_react@18.1.0: 243 | resolution: {integrity: sha512-9x1gRYdlUD5OUwY7L+M+4FY/YltDSsrNSj8QXGPbxZxL5ghWXB/4lhyIGccCwk/e8ggfmQYv9SRNmn3LavPo3A==} 244 | peerDependencies: 245 | react: ^16.8 || ^17.0 246 | dependencies: 247 | '@babel/runtime': 7.18.3 248 | '@radix-ui/react-primitive': 0.1.3_react@18.1.0 249 | react: 18.1.0 250 | dev: false 251 | 252 | /@radix-ui/react-compose-refs/0.1.0_react@18.1.0: 253 | resolution: {integrity: sha512-eyclbh+b77k+69Dk72q3694OHrn9B3QsoIRx7ywX341U9RK1ThgQjMFZoPtmZNQTksXHLNEiefR8hGVeFyInGg==} 254 | peerDependencies: 255 | react: ^16.8 || ^17.0 256 | dependencies: 257 | '@babel/runtime': 7.18.3 258 | react: 18.1.0 259 | dev: false 260 | 261 | /@radix-ui/react-context/0.1.1_react@18.1.0: 262 | resolution: {integrity: sha512-PkyVX1JsLBioeu0jB9WvRpDBBLtLZohVDT3BB5CTSJqActma8S8030P57mWZb4baZifMvN7KKWPAA40UmWKkQg==} 263 | peerDependencies: 264 | react: ^16.8 || ^17.0 265 | dependencies: 266 | '@babel/runtime': 7.18.3 267 | react: 18.1.0 268 | dev: false 269 | 270 | /@radix-ui/react-id/0.1.4_react@18.1.0: 271 | resolution: {integrity: sha512-/hq5m/D0ZfJWOS7TLF+G0l08KDRs87LBE46JkAvgKkg1fW4jkucx9At9D9vauIPSbdNmww5kXEp566hMlA8eXA==} 272 | peerDependencies: 273 | react: ^16.8 || ^17.0 274 | dependencies: 275 | '@babel/runtime': 7.18.3 276 | '@radix-ui/react-use-layout-effect': 0.1.0_react@18.1.0 277 | react: 18.1.0 278 | dev: false 279 | 280 | /@radix-ui/react-popper/0.1.3_react@18.1.0: 281 | resolution: {integrity: sha512-2OV2YaJv7iTZexJY3HJ7B6Fs1A/3JXd3fRGU4JY0guACfGMD1C/jSgds505MKQOTiHE/quI6j3/q8yfzFjJR9g==} 282 | peerDependencies: 283 | react: ^16.8 || ^17.0 284 | dependencies: 285 | '@babel/runtime': 7.18.3 286 | '@radix-ui/popper': 0.1.0 287 | '@radix-ui/react-arrow': 0.1.3_react@18.1.0 288 | '@radix-ui/react-compose-refs': 0.1.0_react@18.1.0 289 | '@radix-ui/react-context': 0.1.1_react@18.1.0 290 | '@radix-ui/react-primitive': 0.1.3_react@18.1.0 291 | '@radix-ui/react-use-rect': 0.1.1_react@18.1.0 292 | '@radix-ui/react-use-size': 0.1.0_react@18.1.0 293 | '@radix-ui/rect': 0.1.1 294 | react: 18.1.0 295 | dev: false 296 | 297 | /@radix-ui/react-portal/0.1.3_ef5jwxihqo6n7gxfmzogljlgcm: 298 | resolution: {integrity: sha512-DrV+sPYLs0HhmX5/b7yRT6nLM9Nl6FtQe2KUG+46kiCOKQ+0XzNMO5hmeQtyq0mRf/qlC02rFu6OMsWpIqVsJg==} 299 | peerDependencies: 300 | react: ^16.8 || ^17.0 301 | react-dom: ^16.8 || ^17.0 302 | dependencies: 303 | '@babel/runtime': 7.18.3 304 | '@radix-ui/react-primitive': 0.1.3_react@18.1.0 305 | '@radix-ui/react-use-layout-effect': 0.1.0_react@18.1.0 306 | react: 18.1.0 307 | react-dom: 18.1.0_react@18.1.0 308 | dev: false 309 | 310 | /@radix-ui/react-portal/0.1.4_ef5jwxihqo6n7gxfmzogljlgcm: 311 | resolution: {integrity: sha512-MO0wRy2eYRTZ/CyOri9NANCAtAtq89DEtg90gicaTlkCfdqCLEBsLb+/q66BZQTr3xX/Vq01nnVfc/TkCqoqvw==} 312 | peerDependencies: 313 | react: ^16.8 || ^17.0 314 | react-dom: ^16.8 || ^17.0 315 | dependencies: 316 | '@babel/runtime': 7.18.3 317 | '@radix-ui/react-primitive': 0.1.4_react@18.1.0 318 | '@radix-ui/react-use-layout-effect': 0.1.0_react@18.1.0 319 | react: 18.1.0 320 | react-dom: 18.1.0_react@18.1.0 321 | dev: false 322 | 323 | /@radix-ui/react-presence/0.1.1_react@18.1.0: 324 | resolution: {integrity: sha512-LsL+NcWDpFUAYCmXeH02o4pgqcSLpwxP84UIjCtpIKrsPe2vLuhcp79KC/jZJeXz+of2lUpMAxpM+eCpxFZtlg==} 325 | peerDependencies: 326 | react: '>=16.8' 327 | dependencies: 328 | '@babel/runtime': 7.18.3 329 | '@radix-ui/react-compose-refs': 0.1.0_react@18.1.0 330 | '@radix-ui/react-use-layout-effect': 0.1.0_react@18.1.0 331 | react: 18.1.0 332 | dev: false 333 | 334 | /@radix-ui/react-primitive/0.1.3_react@18.1.0: 335 | resolution: {integrity: sha512-fcyADaaAx2jdqEDLsTs6aX50S3L1c9K9CC6XMpJpuXFJCU4n9PGTFDZRtY2gAoXXoRCPIBsklCopSmGb6SsDjQ==} 336 | peerDependencies: 337 | react: ^16.8 || ^17.0 338 | dependencies: 339 | '@babel/runtime': 7.18.3 340 | '@radix-ui/react-slot': 0.1.2_react@18.1.0 341 | react: 18.1.0 342 | dev: false 343 | 344 | /@radix-ui/react-primitive/0.1.4_react@18.1.0: 345 | resolution: {integrity: sha512-6gSl2IidySupIMJFjYnDIkIWRyQdbu/AHK7rbICPani+LW4b0XdxBXc46og/iZvuwW8pjCS8I2SadIerv84xYA==} 346 | peerDependencies: 347 | react: ^16.8 || ^17.0 348 | dependencies: 349 | '@babel/runtime': 7.18.3 350 | '@radix-ui/react-slot': 0.1.2_react@18.1.0 351 | react: 18.1.0 352 | dev: false 353 | 354 | /@radix-ui/react-slot/0.1.2_react@18.1.0: 355 | resolution: {integrity: sha512-ADkqfL+agEzEguU3yS26jfB50hRrwf7U4VTwAOZEmi/g+ITcBWe12yM46ueS/UCIMI9Py+gFUaAdxgxafFvY2Q==} 356 | peerDependencies: 357 | react: ^16.8 || ^17.0 358 | dependencies: 359 | '@babel/runtime': 7.18.3 360 | '@radix-ui/react-compose-refs': 0.1.0_react@18.1.0 361 | react: 18.1.0 362 | dev: false 363 | 364 | /@radix-ui/react-tooltip/0.1.6_ef5jwxihqo6n7gxfmzogljlgcm: 365 | resolution: {integrity: sha512-0uaRpRmTCQo5yMUkDpv4LEDnaQDoeLXcNNhZonCZdbZBQ7ntvjURIWIigq1/pXZp0UX7oPpFzsXD9jUp8JT0WA==} 366 | peerDependencies: 367 | react: ^16.8 || ^17.0 368 | react-dom: ^16.8 || ^17.0 369 | dependencies: 370 | '@babel/runtime': 7.18.3 371 | '@radix-ui/primitive': 0.1.0 372 | '@radix-ui/react-compose-refs': 0.1.0_react@18.1.0 373 | '@radix-ui/react-context': 0.1.1_react@18.1.0 374 | '@radix-ui/react-id': 0.1.4_react@18.1.0 375 | '@radix-ui/react-popper': 0.1.3_react@18.1.0 376 | '@radix-ui/react-portal': 0.1.3_ef5jwxihqo6n7gxfmzogljlgcm 377 | '@radix-ui/react-presence': 0.1.1_react@18.1.0 378 | '@radix-ui/react-primitive': 0.1.3_react@18.1.0 379 | '@radix-ui/react-slot': 0.1.2_react@18.1.0 380 | '@radix-ui/react-use-controllable-state': 0.1.0_react@18.1.0 381 | '@radix-ui/react-use-escape-keydown': 0.1.0_react@18.1.0 382 | '@radix-ui/react-use-previous': 0.1.0_react@18.1.0 383 | '@radix-ui/react-use-rect': 0.1.1_react@18.1.0 384 | '@radix-ui/react-visually-hidden': 0.1.3_react@18.1.0 385 | react: 18.1.0 386 | react-dom: 18.1.0_react@18.1.0 387 | dev: false 388 | 389 | /@radix-ui/react-use-callback-ref/0.1.0_react@18.1.0: 390 | resolution: {integrity: sha512-Va041McOFFl+aV+sejvl0BS2aeHx86ND9X/rVFmEFQKTXCp6xgUK0NGUAGcgBlIjnJSbMYPGEk1xKSSlVcN2Aw==} 391 | peerDependencies: 392 | react: ^16.8 || ^17.0 393 | dependencies: 394 | '@babel/runtime': 7.18.3 395 | react: 18.1.0 396 | dev: false 397 | 398 | /@radix-ui/react-use-controllable-state/0.1.0_react@18.1.0: 399 | resolution: {integrity: sha512-zv7CX/PgsRl46a52Tl45TwqwVJdmqnlQEQhaYMz/yBOD2sx2gCkCFSoF/z9mpnYWmS6DTLNTg5lIps3fV6EnXg==} 400 | peerDependencies: 401 | react: ^16.8 || ^17.0 402 | dependencies: 403 | '@babel/runtime': 7.18.3 404 | '@radix-ui/react-use-callback-ref': 0.1.0_react@18.1.0 405 | react: 18.1.0 406 | dev: false 407 | 408 | /@radix-ui/react-use-escape-keydown/0.1.0_react@18.1.0: 409 | resolution: {integrity: sha512-tDLZbTGFmvXaazUXXv8kYbiCcbAE8yKgng9s95d8fCO+Eundv0Jngbn/hKPhDDs4jj9ChwRX5cDDnlaN+ugYYQ==} 410 | peerDependencies: 411 | react: ^16.8 || ^17.0 412 | dependencies: 413 | '@babel/runtime': 7.18.3 414 | '@radix-ui/react-use-callback-ref': 0.1.0_react@18.1.0 415 | react: 18.1.0 416 | dev: false 417 | 418 | /@radix-ui/react-use-layout-effect/0.1.0_react@18.1.0: 419 | resolution: {integrity: sha512-+wdeS51Y+E1q1Wmd+1xSSbesZkpVj4jsg0BojCbopWvgq5iBvixw5vgemscdh58ep98BwUbsFYnrywFhV9yrVg==} 420 | peerDependencies: 421 | react: ^16.8 || ^17.0 422 | dependencies: 423 | '@babel/runtime': 7.18.3 424 | react: 18.1.0 425 | dev: false 426 | 427 | /@radix-ui/react-use-previous/0.1.0_react@18.1.0: 428 | resolution: {integrity: sha512-0fxNc33rYnCzDMPSiSnfS8YklnxQo8WqbAQXPAgIaaA1jRu2qFB916PL4qCIW+avcAAqFD38vWhqDqcVmBharA==} 429 | peerDependencies: 430 | react: ^16.8 || ^17.0 431 | dependencies: 432 | '@babel/runtime': 7.18.3 433 | react: 18.1.0 434 | dev: false 435 | 436 | /@radix-ui/react-use-rect/0.1.1_react@18.1.0: 437 | resolution: {integrity: sha512-kHNNXAsP3/PeszEmM/nxBBS9Jbo93sO+xuMTcRfwzXsmxT5gDXQzAiKbZQ0EecCPtJIzqvr7dlaQi/aP1PKYqQ==} 438 | peerDependencies: 439 | react: ^16.8 || ^17.0 440 | dependencies: 441 | '@babel/runtime': 7.18.3 442 | '@radix-ui/rect': 0.1.1 443 | react: 18.1.0 444 | dev: false 445 | 446 | /@radix-ui/react-use-size/0.1.0_react@18.1.0: 447 | resolution: {integrity: sha512-TcZAsR+BYI46w/RbaSFCRACl+Jh6mDqhu6GS2r0iuJpIVrj8atff7qtTjmMmfGtEDNEjhl7DxN3pr1nTS/oruQ==} 448 | peerDependencies: 449 | react: ^16.8 || ^17.0 450 | dependencies: 451 | '@babel/runtime': 7.18.3 452 | react: 18.1.0 453 | dev: false 454 | 455 | /@radix-ui/react-visually-hidden/0.1.3_react@18.1.0: 456 | resolution: {integrity: sha512-dPU6ZR2WQ/W9qv7E1Y8/I8ymqG+8sViU6dQQ6sfr2/8yGr0I4mmI7ywTnqXaE+YS9gHLEZHdQcEqTNESg6YfdQ==} 457 | peerDependencies: 458 | react: ^16.8 || ^17.0 459 | dependencies: 460 | '@babel/runtime': 7.18.3 461 | '@radix-ui/react-primitive': 0.1.3_react@18.1.0 462 | react: 18.1.0 463 | dev: false 464 | 465 | /@radix-ui/rect/0.1.1: 466 | resolution: {integrity: sha512-g3hnE/UcOg7REdewduRPAK88EPuLZtaq7sA9ouu8S+YEtnyFRI16jgv6GZYe3VMoQLL1T171ebmEPtDjyxWLzw==} 467 | dependencies: 468 | '@babel/runtime': 7.18.3 469 | dev: false 470 | 471 | /@rushstack/eslint-patch/1.1.3: 472 | resolution: {integrity: sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==} 473 | dev: true 474 | 475 | /@stitches/react/1.2.8_react@18.1.0: 476 | resolution: {integrity: sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==} 477 | peerDependencies: 478 | react: '>= 16.3.0' 479 | dependencies: 480 | react: 18.1.0 481 | dev: false 482 | 483 | /@types/d3-array/3.0.3: 484 | resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==} 485 | dev: true 486 | 487 | /@types/d3-axis/3.0.1: 488 | resolution: {integrity: sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw==} 489 | dependencies: 490 | '@types/d3-selection': 3.0.2 491 | dev: true 492 | 493 | /@types/d3-brush/3.0.1: 494 | resolution: {integrity: sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw==} 495 | dependencies: 496 | '@types/d3-selection': 3.0.2 497 | dev: true 498 | 499 | /@types/d3-chord/3.0.1: 500 | resolution: {integrity: sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw==} 501 | dev: true 502 | 503 | /@types/d3-color/3.1.0: 504 | resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} 505 | dev: true 506 | 507 | /@types/d3-contour/3.0.1: 508 | resolution: {integrity: sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ==} 509 | dependencies: 510 | '@types/d3-array': 3.0.3 511 | '@types/geojson': 7946.0.8 512 | dev: true 513 | 514 | /@types/d3-delaunay/6.0.1: 515 | resolution: {integrity: sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==} 516 | dev: true 517 | 518 | /@types/d3-dispatch/3.0.1: 519 | resolution: {integrity: sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==} 520 | dev: true 521 | 522 | /@types/d3-drag/3.0.1: 523 | resolution: {integrity: sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==} 524 | dependencies: 525 | '@types/d3-selection': 3.0.2 526 | dev: true 527 | 528 | /@types/d3-dsv/3.0.0: 529 | resolution: {integrity: sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==} 530 | dev: true 531 | 532 | /@types/d3-ease/3.0.0: 533 | resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} 534 | dev: true 535 | 536 | /@types/d3-fetch/3.0.1: 537 | resolution: {integrity: sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw==} 538 | dependencies: 539 | '@types/d3-dsv': 3.0.0 540 | dev: true 541 | 542 | /@types/d3-force/3.0.3: 543 | resolution: {integrity: sha512-z8GteGVfkWJMKsx6hwC3SiTSLspL98VNpmvLpEFJQpZPq6xpA1I8HNBDNSpukfK0Vb0l64zGFhzunLgEAcBWSA==} 544 | dev: true 545 | 546 | /@types/d3-format/3.0.1: 547 | resolution: {integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==} 548 | dev: true 549 | 550 | /@types/d3-geo/3.0.2: 551 | resolution: {integrity: sha512-DbqK7MLYA8LpyHQfv6Klz0426bQEf7bRTvhMy44sNGVyZoWn//B0c+Qbeg8Osi2Obdc9BLLXYAKpyWege2/7LQ==} 552 | dependencies: 553 | '@types/geojson': 7946.0.8 554 | dev: true 555 | 556 | /@types/d3-hierarchy/3.1.0: 557 | resolution: {integrity: sha512-g+sey7qrCa3UbsQlMZZBOHROkFqx7KZKvUpRzI/tAp/8erZWpYq7FgNKvYwebi2LaEiVs1klhUfd3WCThxmmWQ==} 558 | dev: true 559 | 560 | /@types/d3-interpolate/3.0.1: 561 | resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} 562 | dependencies: 563 | '@types/d3-color': 3.1.0 564 | dev: true 565 | 566 | /@types/d3-path/3.0.0: 567 | resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} 568 | dev: true 569 | 570 | /@types/d3-polygon/3.0.0: 571 | resolution: {integrity: sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==} 572 | dev: true 573 | 574 | /@types/d3-quadtree/3.0.2: 575 | resolution: {integrity: sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==} 576 | dev: true 577 | 578 | /@types/d3-random/3.0.1: 579 | resolution: {integrity: sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==} 580 | dev: true 581 | 582 | /@types/d3-scale-chromatic/3.0.0: 583 | resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} 584 | dev: true 585 | 586 | /@types/d3-scale/4.0.2: 587 | resolution: {integrity: sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==} 588 | dependencies: 589 | '@types/d3-time': 3.0.0 590 | dev: true 591 | 592 | /@types/d3-selection/3.0.2: 593 | resolution: {integrity: sha512-d29EDd0iUBrRoKhPndhDY6U/PYxOWqgIZwKTooy2UkBfU7TNZNpRho0yLWPxlatQrFWk2mnTu71IZQ4+LRgKlQ==} 594 | dev: true 595 | 596 | /@types/d3-shape/3.1.0: 597 | resolution: {integrity: sha512-jYIYxFFA9vrJ8Hd4Se83YI6XF+gzDL1aC5DCsldai4XYYiVNdhtpGbA/GM6iyQ8ayhSp3a148LY34hy7A4TxZA==} 598 | dependencies: 599 | '@types/d3-path': 3.0.0 600 | dev: true 601 | 602 | /@types/d3-time-format/4.0.0: 603 | resolution: {integrity: sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==} 604 | dev: true 605 | 606 | /@types/d3-time/3.0.0: 607 | resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} 608 | dev: true 609 | 610 | /@types/d3-timer/3.0.0: 611 | resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} 612 | dev: true 613 | 614 | /@types/d3-transition/3.0.1: 615 | resolution: {integrity: sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g==} 616 | dependencies: 617 | '@types/d3-selection': 3.0.2 618 | dev: true 619 | 620 | /@types/d3-zoom/3.0.1: 621 | resolution: {integrity: sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ==} 622 | dependencies: 623 | '@types/d3-interpolate': 3.0.1 624 | '@types/d3-selection': 3.0.2 625 | dev: true 626 | 627 | /@types/d3/7.4.0: 628 | resolution: {integrity: sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==} 629 | dependencies: 630 | '@types/d3-array': 3.0.3 631 | '@types/d3-axis': 3.0.1 632 | '@types/d3-brush': 3.0.1 633 | '@types/d3-chord': 3.0.1 634 | '@types/d3-color': 3.1.0 635 | '@types/d3-contour': 3.0.1 636 | '@types/d3-delaunay': 6.0.1 637 | '@types/d3-dispatch': 3.0.1 638 | '@types/d3-drag': 3.0.1 639 | '@types/d3-dsv': 3.0.0 640 | '@types/d3-ease': 3.0.0 641 | '@types/d3-fetch': 3.0.1 642 | '@types/d3-force': 3.0.3 643 | '@types/d3-format': 3.0.1 644 | '@types/d3-geo': 3.0.2 645 | '@types/d3-hierarchy': 3.1.0 646 | '@types/d3-interpolate': 3.0.1 647 | '@types/d3-path': 3.0.0 648 | '@types/d3-polygon': 3.0.0 649 | '@types/d3-quadtree': 3.0.2 650 | '@types/d3-random': 3.0.1 651 | '@types/d3-scale': 4.0.2 652 | '@types/d3-scale-chromatic': 3.0.0 653 | '@types/d3-selection': 3.0.2 654 | '@types/d3-shape': 3.1.0 655 | '@types/d3-time': 3.0.0 656 | '@types/d3-time-format': 4.0.0 657 | '@types/d3-timer': 3.0.0 658 | '@types/d3-transition': 3.0.1 659 | '@types/d3-zoom': 3.0.1 660 | dev: true 661 | 662 | /@types/geojson/7946.0.8: 663 | resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==} 664 | dev: true 665 | 666 | /@types/js-cookie/2.2.7: 667 | resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} 668 | dev: false 669 | 670 | /@types/json5/0.0.29: 671 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 672 | dev: true 673 | 674 | /@types/lodash/4.14.182: 675 | resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==} 676 | dev: true 677 | 678 | /@types/node/17.0.35: 679 | resolution: {integrity: sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==} 680 | dev: true 681 | 682 | /@types/prop-types/15.7.5: 683 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 684 | dev: true 685 | 686 | /@types/react-dom/18.0.5: 687 | resolution: {integrity: sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==} 688 | dependencies: 689 | '@types/react': 18.0.9 690 | dev: true 691 | 692 | /@types/react/18.0.9: 693 | resolution: {integrity: sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==} 694 | dependencies: 695 | '@types/prop-types': 15.7.5 696 | '@types/scheduler': 0.16.2 697 | csstype: 3.1.0 698 | dev: true 699 | 700 | /@types/scheduler/0.16.2: 701 | resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} 702 | dev: true 703 | 704 | /@typescript-eslint/parser/5.26.0_xztl6dhthcahlo6akmb2bmjmle: 705 | resolution: {integrity: sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==} 706 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 707 | peerDependencies: 708 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 709 | typescript: '*' 710 | peerDependenciesMeta: 711 | typescript: 712 | optional: true 713 | dependencies: 714 | '@typescript-eslint/scope-manager': 5.26.0 715 | '@typescript-eslint/types': 5.26.0 716 | '@typescript-eslint/typescript-estree': 5.26.0_typescript@4.7.2 717 | debug: 4.3.4 718 | eslint: 8.16.0 719 | typescript: 4.7.2 720 | transitivePeerDependencies: 721 | - supports-color 722 | dev: true 723 | 724 | /@typescript-eslint/scope-manager/5.26.0: 725 | resolution: {integrity: sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==} 726 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 727 | dependencies: 728 | '@typescript-eslint/types': 5.26.0 729 | '@typescript-eslint/visitor-keys': 5.26.0 730 | dev: true 731 | 732 | /@typescript-eslint/types/5.26.0: 733 | resolution: {integrity: sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==} 734 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 735 | dev: true 736 | 737 | /@typescript-eslint/typescript-estree/5.26.0_typescript@4.7.2: 738 | resolution: {integrity: sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==} 739 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 740 | peerDependencies: 741 | typescript: '*' 742 | peerDependenciesMeta: 743 | typescript: 744 | optional: true 745 | dependencies: 746 | '@typescript-eslint/types': 5.26.0 747 | '@typescript-eslint/visitor-keys': 5.26.0 748 | debug: 4.3.4 749 | globby: 11.1.0 750 | is-glob: 4.0.3 751 | semver: 7.3.7 752 | tsutils: 3.21.0_typescript@4.7.2 753 | typescript: 4.7.2 754 | transitivePeerDependencies: 755 | - supports-color 756 | dev: true 757 | 758 | /@typescript-eslint/visitor-keys/5.26.0: 759 | resolution: {integrity: sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==} 760 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 761 | dependencies: 762 | '@typescript-eslint/types': 5.26.0 763 | eslint-visitor-keys: 3.3.0 764 | dev: true 765 | 766 | /@use-gesture/core/10.2.18: 767 | resolution: {integrity: sha512-O+qxBlKxPtYM/LyRnK/U5MhVA9kKHj4C2yHsUurDxNO0a8D1PHLz9YmMPh2UXGQE4wtSke03GsLqRsHbUvN9nw==} 768 | dev: false 769 | 770 | /@use-gesture/react/10.2.18_react@18.1.0: 771 | resolution: {integrity: sha512-MJQ5q/huXIER3st3bsmuWA7lxcdwZd28KJoBPFPNxKFenjF47smaiCCf+dLjUBiTV0DiIYAN4pXK19KxwfnUgg==} 772 | peerDependencies: 773 | react: '>= 16.8.0' 774 | dependencies: 775 | '@use-gesture/core': 10.2.18 776 | react: 18.1.0 777 | dev: false 778 | 779 | /@welldone-software/why-did-you-render/6.2.3_react@18.1.0: 780 | resolution: {integrity: sha512-FQgi90jvC9uw2aALlonJfqaWOvU5UUBBVvdAnS2iryXwCc4YJkKsPJY5Y/LzaND3OIyk8XGUn1vTRn6hcem28Q==} 781 | peerDependencies: 782 | react: ^16 || ^17 783 | dependencies: 784 | lodash: 4.17.21 785 | react: 18.1.0 786 | dev: false 787 | 788 | /@xobotyi/scrollbar-width/1.9.5: 789 | resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} 790 | dev: false 791 | 792 | /acorn-jsx/5.3.2_acorn@8.7.1: 793 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 794 | peerDependencies: 795 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 796 | dependencies: 797 | acorn: 8.7.1 798 | dev: true 799 | 800 | /acorn-node/1.8.2: 801 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 802 | dependencies: 803 | acorn: 7.4.1 804 | acorn-walk: 7.2.0 805 | xtend: 4.0.2 806 | dev: true 807 | 808 | /acorn-walk/7.2.0: 809 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 810 | engines: {node: '>=0.4.0'} 811 | dev: true 812 | 813 | /acorn/7.4.1: 814 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 815 | engines: {node: '>=0.4.0'} 816 | hasBin: true 817 | dev: true 818 | 819 | /acorn/8.7.1: 820 | resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} 821 | engines: {node: '>=0.4.0'} 822 | hasBin: true 823 | dev: true 824 | 825 | /ajv/6.12.6: 826 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 827 | dependencies: 828 | fast-deep-equal: 3.1.3 829 | fast-json-stable-stringify: 2.1.0 830 | json-schema-traverse: 0.4.1 831 | uri-js: 4.4.1 832 | dev: true 833 | 834 | /ansi-regex/5.0.1: 835 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 836 | engines: {node: '>=8'} 837 | dev: true 838 | 839 | /ansi-styles/4.3.0: 840 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 841 | engines: {node: '>=8'} 842 | dependencies: 843 | color-convert: 2.0.1 844 | dev: true 845 | 846 | /anymatch/3.1.2: 847 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 848 | engines: {node: '>= 8'} 849 | dependencies: 850 | normalize-path: 3.0.0 851 | picomatch: 2.3.1 852 | dev: true 853 | 854 | /arg/5.0.1: 855 | resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==} 856 | dev: true 857 | 858 | /argparse/2.0.1: 859 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 860 | dev: true 861 | 862 | /aria-query/4.2.2: 863 | resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} 864 | engines: {node: '>=6.0'} 865 | dependencies: 866 | '@babel/runtime': 7.18.3 867 | '@babel/runtime-corejs3': 7.18.3 868 | dev: true 869 | 870 | /array-includes/3.1.5: 871 | resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} 872 | engines: {node: '>= 0.4'} 873 | dependencies: 874 | call-bind: 1.0.2 875 | define-properties: 1.1.4 876 | es-abstract: 1.20.1 877 | get-intrinsic: 1.1.1 878 | is-string: 1.0.7 879 | dev: true 880 | 881 | /array-union/2.1.0: 882 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 883 | engines: {node: '>=8'} 884 | dev: true 885 | 886 | /array.prototype.flat/1.3.0: 887 | resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} 888 | engines: {node: '>= 0.4'} 889 | dependencies: 890 | call-bind: 1.0.2 891 | define-properties: 1.1.4 892 | es-abstract: 1.20.1 893 | es-shim-unscopables: 1.0.0 894 | dev: true 895 | 896 | /array.prototype.flatmap/1.3.0: 897 | resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==} 898 | engines: {node: '>= 0.4'} 899 | dependencies: 900 | call-bind: 1.0.2 901 | define-properties: 1.1.4 902 | es-abstract: 1.20.1 903 | es-shim-unscopables: 1.0.0 904 | dev: true 905 | 906 | /assign-symbols/1.0.0: 907 | resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} 908 | engines: {node: '>=0.10.0'} 909 | dev: false 910 | 911 | /ast-types-flow/0.0.7: 912 | resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} 913 | dev: true 914 | 915 | /attr-accept/2.2.2: 916 | resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} 917 | engines: {node: '>=4'} 918 | dev: false 919 | 920 | /autoprefixer/10.4.7_postcss@8.4.14: 921 | resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} 922 | engines: {node: ^10 || ^12 || >=14} 923 | hasBin: true 924 | peerDependencies: 925 | postcss: ^8.1.0 926 | dependencies: 927 | browserslist: 4.20.3 928 | caniuse-lite: 1.0.30001343 929 | fraction.js: 4.2.0 930 | normalize-range: 0.1.2 931 | picocolors: 1.0.0 932 | postcss: 8.4.14 933 | postcss-value-parser: 4.2.0 934 | dev: true 935 | 936 | /axe-core/4.4.2: 937 | resolution: {integrity: sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==} 938 | engines: {node: '>=12'} 939 | dev: true 940 | 941 | /axobject-query/2.2.0: 942 | resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} 943 | dev: true 944 | 945 | /balanced-match/1.0.2: 946 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 947 | dev: true 948 | 949 | /binary-extensions/2.2.0: 950 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 951 | engines: {node: '>=8'} 952 | dev: true 953 | 954 | /brace-expansion/1.1.11: 955 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 956 | dependencies: 957 | balanced-match: 1.0.2 958 | concat-map: 0.0.1 959 | dev: true 960 | 961 | /braces/3.0.2: 962 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 963 | engines: {node: '>=8'} 964 | dependencies: 965 | fill-range: 7.0.1 966 | dev: true 967 | 968 | /browserslist/4.20.3: 969 | resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==} 970 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 971 | hasBin: true 972 | dependencies: 973 | caniuse-lite: 1.0.30001343 974 | electron-to-chromium: 1.4.139 975 | escalade: 3.1.1 976 | node-releases: 2.0.5 977 | picocolors: 1.0.0 978 | dev: true 979 | 980 | /call-bind/1.0.2: 981 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 982 | dependencies: 983 | function-bind: 1.1.1 984 | get-intrinsic: 1.1.1 985 | dev: true 986 | 987 | /callsites/3.1.0: 988 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 989 | engines: {node: '>=6'} 990 | dev: true 991 | 992 | /camelcase-css/2.0.1: 993 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 994 | engines: {node: '>= 6'} 995 | dev: true 996 | 997 | /caniuse-lite/1.0.30001343: 998 | resolution: {integrity: sha512-8KeCrAtPMabo/XW14B+R9sZYoClx1n0b+WYgwDKZPtWR3TcdvWzdSy7mPyFEmR5WU1St9v1PW6sdO5dkFOEzfA==} 999 | 1000 | /chalk/4.1.2: 1001 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1002 | engines: {node: '>=10'} 1003 | dependencies: 1004 | ansi-styles: 4.3.0 1005 | supports-color: 7.2.0 1006 | dev: true 1007 | 1008 | /chokidar/3.5.3: 1009 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1010 | engines: {node: '>= 8.10.0'} 1011 | dependencies: 1012 | anymatch: 3.1.2 1013 | braces: 3.0.2 1014 | glob-parent: 5.1.2 1015 | is-binary-path: 2.1.0 1016 | is-glob: 4.0.3 1017 | normalize-path: 3.0.0 1018 | readdirp: 3.6.0 1019 | optionalDependencies: 1020 | fsevents: 2.3.2 1021 | dev: true 1022 | 1023 | /color-convert/2.0.1: 1024 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1025 | engines: {node: '>=7.0.0'} 1026 | dependencies: 1027 | color-name: 1.1.4 1028 | dev: true 1029 | 1030 | /color-name/1.1.4: 1031 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1032 | dev: true 1033 | 1034 | /colord/2.9.3: 1035 | resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} 1036 | dev: false 1037 | 1038 | /commander/7.2.0: 1039 | resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} 1040 | engines: {node: '>= 10'} 1041 | dev: false 1042 | 1043 | /concat-map/0.0.1: 1044 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 1045 | dev: true 1046 | 1047 | /copy-to-clipboard/3.3.1: 1048 | resolution: {integrity: sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==} 1049 | dependencies: 1050 | toggle-selection: 1.0.6 1051 | dev: false 1052 | 1053 | /core-js-pure/3.22.7: 1054 | resolution: {integrity: sha512-wTriFxiZI+C8msGeh7fJcbC/a0V8fdInN1oS2eK79DMBGs8iIJiXhtFJCiT3rBa8w6zroHWW3p8ArlujZ/Mz+w==} 1055 | requiresBuild: true 1056 | dev: true 1057 | 1058 | /cross-spawn/7.0.3: 1059 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1060 | engines: {node: '>= 8'} 1061 | dependencies: 1062 | path-key: 3.1.1 1063 | shebang-command: 2.0.0 1064 | which: 2.0.2 1065 | dev: true 1066 | 1067 | /css-in-js-utils/2.0.1: 1068 | resolution: {integrity: sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==} 1069 | dependencies: 1070 | hyphenate-style-name: 1.0.4 1071 | isobject: 3.0.1 1072 | dev: false 1073 | 1074 | /css-mediaquery/0.1.2: 1075 | resolution: {integrity: sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=} 1076 | dev: false 1077 | 1078 | /css-tree/1.1.3: 1079 | resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} 1080 | engines: {node: '>=8.0.0'} 1081 | dependencies: 1082 | mdn-data: 2.0.14 1083 | source-map: 0.6.1 1084 | dev: false 1085 | 1086 | /cssesc/3.0.0: 1087 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1088 | engines: {node: '>=4'} 1089 | hasBin: true 1090 | dev: true 1091 | 1092 | /csstype/3.1.0: 1093 | resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} 1094 | 1095 | /d3-array/3.1.6: 1096 | resolution: {integrity: sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==} 1097 | engines: {node: '>=12'} 1098 | dependencies: 1099 | internmap: 2.0.3 1100 | dev: false 1101 | 1102 | /d3-axis/3.0.0: 1103 | resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} 1104 | engines: {node: '>=12'} 1105 | dev: false 1106 | 1107 | /d3-brush/3.0.0: 1108 | resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} 1109 | engines: {node: '>=12'} 1110 | dependencies: 1111 | d3-dispatch: 3.0.1 1112 | d3-drag: 3.0.0 1113 | d3-interpolate: 3.0.1 1114 | d3-selection: 3.0.0 1115 | d3-transition: 3.0.1_d3-selection@3.0.0 1116 | dev: false 1117 | 1118 | /d3-chord/3.0.1: 1119 | resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} 1120 | engines: {node: '>=12'} 1121 | dependencies: 1122 | d3-path: 3.0.1 1123 | dev: false 1124 | 1125 | /d3-color/3.1.0: 1126 | resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} 1127 | engines: {node: '>=12'} 1128 | dev: false 1129 | 1130 | /d3-contour/3.0.1: 1131 | resolution: {integrity: sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==} 1132 | engines: {node: '>=12'} 1133 | dependencies: 1134 | d3-array: 3.1.6 1135 | dev: false 1136 | 1137 | /d3-delaunay/6.0.2: 1138 | resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==} 1139 | engines: {node: '>=12'} 1140 | dependencies: 1141 | delaunator: 5.0.0 1142 | dev: false 1143 | 1144 | /d3-dispatch/3.0.1: 1145 | resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} 1146 | engines: {node: '>=12'} 1147 | dev: false 1148 | 1149 | /d3-drag/3.0.0: 1150 | resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} 1151 | engines: {node: '>=12'} 1152 | dependencies: 1153 | d3-dispatch: 3.0.1 1154 | d3-selection: 3.0.0 1155 | dev: false 1156 | 1157 | /d3-dsv/3.0.1: 1158 | resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} 1159 | engines: {node: '>=12'} 1160 | hasBin: true 1161 | dependencies: 1162 | commander: 7.2.0 1163 | iconv-lite: 0.6.3 1164 | rw: 1.3.3 1165 | dev: false 1166 | 1167 | /d3-ease/3.0.1: 1168 | resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} 1169 | engines: {node: '>=12'} 1170 | dev: false 1171 | 1172 | /d3-fetch/3.0.1: 1173 | resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} 1174 | engines: {node: '>=12'} 1175 | dependencies: 1176 | d3-dsv: 3.0.1 1177 | dev: false 1178 | 1179 | /d3-force/3.0.0: 1180 | resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} 1181 | engines: {node: '>=12'} 1182 | dependencies: 1183 | d3-dispatch: 3.0.1 1184 | d3-quadtree: 3.0.1 1185 | d3-timer: 3.0.1 1186 | dev: false 1187 | 1188 | /d3-format/3.1.0: 1189 | resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} 1190 | engines: {node: '>=12'} 1191 | dev: false 1192 | 1193 | /d3-geo/3.0.1: 1194 | resolution: {integrity: sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==} 1195 | engines: {node: '>=12'} 1196 | dependencies: 1197 | d3-array: 3.1.6 1198 | dev: false 1199 | 1200 | /d3-hierarchy/3.1.2: 1201 | resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} 1202 | engines: {node: '>=12'} 1203 | dev: false 1204 | 1205 | /d3-interpolate/3.0.1: 1206 | resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} 1207 | engines: {node: '>=12'} 1208 | dependencies: 1209 | d3-color: 3.1.0 1210 | dev: false 1211 | 1212 | /d3-path/3.0.1: 1213 | resolution: {integrity: sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==} 1214 | engines: {node: '>=12'} 1215 | dev: false 1216 | 1217 | /d3-polygon/3.0.1: 1218 | resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} 1219 | engines: {node: '>=12'} 1220 | dev: false 1221 | 1222 | /d3-quadtree/3.0.1: 1223 | resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} 1224 | engines: {node: '>=12'} 1225 | dev: false 1226 | 1227 | /d3-random/3.0.1: 1228 | resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} 1229 | engines: {node: '>=12'} 1230 | dev: false 1231 | 1232 | /d3-scale-chromatic/3.0.0: 1233 | resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} 1234 | engines: {node: '>=12'} 1235 | dependencies: 1236 | d3-color: 3.1.0 1237 | d3-interpolate: 3.0.1 1238 | dev: false 1239 | 1240 | /d3-scale/4.0.2: 1241 | resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} 1242 | engines: {node: '>=12'} 1243 | dependencies: 1244 | d3-array: 3.1.6 1245 | d3-format: 3.1.0 1246 | d3-interpolate: 3.0.1 1247 | d3-time: 3.0.0 1248 | d3-time-format: 4.1.0 1249 | dev: false 1250 | 1251 | /d3-selection/3.0.0: 1252 | resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} 1253 | engines: {node: '>=12'} 1254 | dev: false 1255 | 1256 | /d3-shape/3.1.0: 1257 | resolution: {integrity: sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==} 1258 | engines: {node: '>=12'} 1259 | dependencies: 1260 | d3-path: 3.0.1 1261 | dev: false 1262 | 1263 | /d3-time-format/4.1.0: 1264 | resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} 1265 | engines: {node: '>=12'} 1266 | dependencies: 1267 | d3-time: 3.0.0 1268 | dev: false 1269 | 1270 | /d3-time/3.0.0: 1271 | resolution: {integrity: sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==} 1272 | engines: {node: '>=12'} 1273 | dependencies: 1274 | d3-array: 3.1.6 1275 | dev: false 1276 | 1277 | /d3-timer/3.0.1: 1278 | resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} 1279 | engines: {node: '>=12'} 1280 | dev: false 1281 | 1282 | /d3-transition/3.0.1_d3-selection@3.0.0: 1283 | resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} 1284 | engines: {node: '>=12'} 1285 | peerDependencies: 1286 | d3-selection: 2 - 3 1287 | dependencies: 1288 | d3-color: 3.1.0 1289 | d3-dispatch: 3.0.1 1290 | d3-ease: 3.0.1 1291 | d3-interpolate: 3.0.1 1292 | d3-selection: 3.0.0 1293 | d3-timer: 3.0.1 1294 | dev: false 1295 | 1296 | /d3-zoom/3.0.0: 1297 | resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} 1298 | engines: {node: '>=12'} 1299 | dependencies: 1300 | d3-dispatch: 3.0.1 1301 | d3-drag: 3.0.0 1302 | d3-interpolate: 3.0.1 1303 | d3-selection: 3.0.0 1304 | d3-transition: 3.0.1_d3-selection@3.0.0 1305 | dev: false 1306 | 1307 | /d3/7.4.4: 1308 | resolution: {integrity: sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==} 1309 | engines: {node: '>=12'} 1310 | dependencies: 1311 | d3-array: 3.1.6 1312 | d3-axis: 3.0.0 1313 | d3-brush: 3.0.0 1314 | d3-chord: 3.0.1 1315 | d3-color: 3.1.0 1316 | d3-contour: 3.0.1 1317 | d3-delaunay: 6.0.2 1318 | d3-dispatch: 3.0.1 1319 | d3-drag: 3.0.0 1320 | d3-dsv: 3.0.1 1321 | d3-ease: 3.0.1 1322 | d3-fetch: 3.0.1 1323 | d3-force: 3.0.0 1324 | d3-format: 3.1.0 1325 | d3-geo: 3.0.1 1326 | d3-hierarchy: 3.1.2 1327 | d3-interpolate: 3.0.1 1328 | d3-path: 3.0.1 1329 | d3-polygon: 3.0.1 1330 | d3-quadtree: 3.0.1 1331 | d3-random: 3.0.1 1332 | d3-scale: 4.0.2 1333 | d3-scale-chromatic: 3.0.0 1334 | d3-selection: 3.0.0 1335 | d3-shape: 3.1.0 1336 | d3-time: 3.0.0 1337 | d3-time-format: 4.1.0 1338 | d3-timer: 3.0.1 1339 | d3-transition: 3.0.1_d3-selection@3.0.0 1340 | d3-zoom: 3.0.0 1341 | dev: false 1342 | 1343 | /damerau-levenshtein/1.0.8: 1344 | resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} 1345 | dev: true 1346 | 1347 | /debug/2.6.9: 1348 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 1349 | peerDependencies: 1350 | supports-color: '*' 1351 | peerDependenciesMeta: 1352 | supports-color: 1353 | optional: true 1354 | dependencies: 1355 | ms: 2.0.0 1356 | dev: true 1357 | 1358 | /debug/3.2.7: 1359 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 1360 | peerDependencies: 1361 | supports-color: '*' 1362 | peerDependenciesMeta: 1363 | supports-color: 1364 | optional: true 1365 | dependencies: 1366 | ms: 2.1.3 1367 | dev: true 1368 | 1369 | /debug/4.3.4: 1370 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1371 | engines: {node: '>=6.0'} 1372 | peerDependencies: 1373 | supports-color: '*' 1374 | peerDependenciesMeta: 1375 | supports-color: 1376 | optional: true 1377 | dependencies: 1378 | ms: 2.1.2 1379 | dev: true 1380 | 1381 | /deep-is/0.1.4: 1382 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1383 | dev: true 1384 | 1385 | /define-properties/1.1.4: 1386 | resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} 1387 | engines: {node: '>= 0.4'} 1388 | dependencies: 1389 | has-property-descriptors: 1.0.0 1390 | object-keys: 1.1.1 1391 | dev: true 1392 | 1393 | /defined/1.0.0: 1394 | resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=} 1395 | dev: true 1396 | 1397 | /delaunator/5.0.0: 1398 | resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} 1399 | dependencies: 1400 | robust-predicates: 3.0.1 1401 | dev: false 1402 | 1403 | /dequal/2.0.3: 1404 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 1405 | engines: {node: '>=6'} 1406 | dev: false 1407 | 1408 | /detective/5.2.0: 1409 | resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} 1410 | engines: {node: '>=0.8.0'} 1411 | hasBin: true 1412 | dependencies: 1413 | acorn-node: 1.8.2 1414 | defined: 1.0.0 1415 | minimist: 1.2.6 1416 | dev: true 1417 | 1418 | /didyoumean/1.2.2: 1419 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1420 | dev: true 1421 | 1422 | /dir-glob/3.0.1: 1423 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1424 | engines: {node: '>=8'} 1425 | dependencies: 1426 | path-type: 4.0.0 1427 | dev: true 1428 | 1429 | /dlv/1.1.3: 1430 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1431 | dev: true 1432 | 1433 | /doctrine/2.1.0: 1434 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 1435 | engines: {node: '>=0.10.0'} 1436 | dependencies: 1437 | esutils: 2.0.3 1438 | dev: true 1439 | 1440 | /doctrine/3.0.0: 1441 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1442 | engines: {node: '>=6.0.0'} 1443 | dependencies: 1444 | esutils: 2.0.3 1445 | dev: true 1446 | 1447 | /electron-to-chromium/1.4.139: 1448 | resolution: {integrity: sha512-lYxzcUCjWxxVug+A7UxBCUiVr13TCjfZFYJS9Lq1VpU/ErwV4a6zUQo9dfojuGpw/L/x9REGuBl6ICQPGgbs3g==} 1449 | dev: true 1450 | 1451 | /emoji-regex/9.2.2: 1452 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1453 | dev: true 1454 | 1455 | /error-stack-parser/2.0.7: 1456 | resolution: {integrity: sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==} 1457 | dependencies: 1458 | stackframe: 1.2.1 1459 | dev: false 1460 | 1461 | /es-abstract/1.20.1: 1462 | resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} 1463 | engines: {node: '>= 0.4'} 1464 | dependencies: 1465 | call-bind: 1.0.2 1466 | es-to-primitive: 1.2.1 1467 | function-bind: 1.1.1 1468 | function.prototype.name: 1.1.5 1469 | get-intrinsic: 1.1.1 1470 | get-symbol-description: 1.0.0 1471 | has: 1.0.3 1472 | has-property-descriptors: 1.0.0 1473 | has-symbols: 1.0.3 1474 | internal-slot: 1.0.3 1475 | is-callable: 1.2.4 1476 | is-negative-zero: 2.0.2 1477 | is-regex: 1.1.4 1478 | is-shared-array-buffer: 1.0.2 1479 | is-string: 1.0.7 1480 | is-weakref: 1.0.2 1481 | object-inspect: 1.12.1 1482 | object-keys: 1.1.1 1483 | object.assign: 4.1.2 1484 | regexp.prototype.flags: 1.4.3 1485 | string.prototype.trimend: 1.0.5 1486 | string.prototype.trimstart: 1.0.5 1487 | unbox-primitive: 1.0.2 1488 | dev: true 1489 | 1490 | /es-shim-unscopables/1.0.0: 1491 | resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} 1492 | dependencies: 1493 | has: 1.0.3 1494 | dev: true 1495 | 1496 | /es-to-primitive/1.2.1: 1497 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 1498 | engines: {node: '>= 0.4'} 1499 | dependencies: 1500 | is-callable: 1.2.4 1501 | is-date-object: 1.0.5 1502 | is-symbol: 1.0.4 1503 | dev: true 1504 | 1505 | /escalade/3.1.1: 1506 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1507 | engines: {node: '>=6'} 1508 | dev: true 1509 | 1510 | /escape-string-regexp/4.0.0: 1511 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1512 | engines: {node: '>=10'} 1513 | dev: true 1514 | 1515 | /eslint-config-next/12.1.6_k6khgwrcmlpd2kpaxkviqw2zii: 1516 | resolution: {integrity: sha512-qoiS3g/EPzfCTkGkaPBSX9W0NGE/B1wNO3oWrd76QszVGrdpLggNqcO8+LR6MB0CNqtp9Q8NoeVrxNVbzM9hqA==} 1517 | peerDependencies: 1518 | eslint: ^7.23.0 || ^8.0.0 1519 | next: '>=10.2.0' 1520 | typescript: '>=3.3.1' 1521 | peerDependenciesMeta: 1522 | typescript: 1523 | optional: true 1524 | dependencies: 1525 | '@next/eslint-plugin-next': 12.1.6 1526 | '@rushstack/eslint-patch': 1.1.3 1527 | '@typescript-eslint/parser': 5.26.0_xztl6dhthcahlo6akmb2bmjmle 1528 | eslint: 8.16.0 1529 | eslint-import-resolver-node: 0.3.6 1530 | eslint-import-resolver-typescript: 2.7.1_btspkuwbqkl4adpiufzbathtpi 1531 | eslint-plugin-import: 2.26.0_ztbftnvu57zhg5cuougx2imeci 1532 | eslint-plugin-jsx-a11y: 6.5.1_eslint@8.16.0 1533 | eslint-plugin-react: 7.30.0_eslint@8.16.0 1534 | eslint-plugin-react-hooks: 4.5.0_eslint@8.16.0 1535 | next: 12.1.6_ef5jwxihqo6n7gxfmzogljlgcm 1536 | typescript: 4.7.2 1537 | transitivePeerDependencies: 1538 | - eslint-import-resolver-webpack 1539 | - supports-color 1540 | dev: true 1541 | 1542 | /eslint-import-resolver-node/0.3.6: 1543 | resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} 1544 | dependencies: 1545 | debug: 3.2.7 1546 | resolve: 1.22.0 1547 | transitivePeerDependencies: 1548 | - supports-color 1549 | dev: true 1550 | 1551 | /eslint-import-resolver-typescript/2.7.1_btspkuwbqkl4adpiufzbathtpi: 1552 | resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==} 1553 | engines: {node: '>=4'} 1554 | peerDependencies: 1555 | eslint: '*' 1556 | eslint-plugin-import: '*' 1557 | dependencies: 1558 | debug: 4.3.4 1559 | eslint: 8.16.0 1560 | eslint-plugin-import: 2.26.0_ztbftnvu57zhg5cuougx2imeci 1561 | glob: 7.2.3 1562 | is-glob: 4.0.3 1563 | resolve: 1.22.0 1564 | tsconfig-paths: 3.14.1 1565 | transitivePeerDependencies: 1566 | - supports-color 1567 | dev: true 1568 | 1569 | /eslint-module-utils/2.7.3_yxrttxwxgn5axzfjkhhzgts2eq: 1570 | resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} 1571 | engines: {node: '>=4'} 1572 | peerDependencies: 1573 | '@typescript-eslint/parser': '*' 1574 | eslint-import-resolver-node: '*' 1575 | eslint-import-resolver-typescript: '*' 1576 | eslint-import-resolver-webpack: '*' 1577 | peerDependenciesMeta: 1578 | '@typescript-eslint/parser': 1579 | optional: true 1580 | eslint-import-resolver-node: 1581 | optional: true 1582 | eslint-import-resolver-typescript: 1583 | optional: true 1584 | eslint-import-resolver-webpack: 1585 | optional: true 1586 | dependencies: 1587 | '@typescript-eslint/parser': 5.26.0_xztl6dhthcahlo6akmb2bmjmle 1588 | debug: 3.2.7 1589 | eslint-import-resolver-node: 0.3.6 1590 | eslint-import-resolver-typescript: 2.7.1_btspkuwbqkl4adpiufzbathtpi 1591 | find-up: 2.1.0 1592 | transitivePeerDependencies: 1593 | - supports-color 1594 | dev: true 1595 | 1596 | /eslint-plugin-import/2.26.0_ztbftnvu57zhg5cuougx2imeci: 1597 | resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} 1598 | engines: {node: '>=4'} 1599 | peerDependencies: 1600 | '@typescript-eslint/parser': '*' 1601 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 1602 | peerDependenciesMeta: 1603 | '@typescript-eslint/parser': 1604 | optional: true 1605 | dependencies: 1606 | '@typescript-eslint/parser': 5.26.0_xztl6dhthcahlo6akmb2bmjmle 1607 | array-includes: 3.1.5 1608 | array.prototype.flat: 1.3.0 1609 | debug: 2.6.9 1610 | doctrine: 2.1.0 1611 | eslint: 8.16.0 1612 | eslint-import-resolver-node: 0.3.6 1613 | eslint-module-utils: 2.7.3_yxrttxwxgn5axzfjkhhzgts2eq 1614 | has: 1.0.3 1615 | is-core-module: 2.9.0 1616 | is-glob: 4.0.3 1617 | minimatch: 3.1.2 1618 | object.values: 1.1.5 1619 | resolve: 1.22.0 1620 | tsconfig-paths: 3.14.1 1621 | transitivePeerDependencies: 1622 | - eslint-import-resolver-typescript 1623 | - eslint-import-resolver-webpack 1624 | - supports-color 1625 | dev: true 1626 | 1627 | /eslint-plugin-jsx-a11y/6.5.1_eslint@8.16.0: 1628 | resolution: {integrity: sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==} 1629 | engines: {node: '>=4.0'} 1630 | peerDependencies: 1631 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 1632 | dependencies: 1633 | '@babel/runtime': 7.18.3 1634 | aria-query: 4.2.2 1635 | array-includes: 3.1.5 1636 | ast-types-flow: 0.0.7 1637 | axe-core: 4.4.2 1638 | axobject-query: 2.2.0 1639 | damerau-levenshtein: 1.0.8 1640 | emoji-regex: 9.2.2 1641 | eslint: 8.16.0 1642 | has: 1.0.3 1643 | jsx-ast-utils: 3.3.0 1644 | language-tags: 1.0.5 1645 | minimatch: 3.1.2 1646 | dev: true 1647 | 1648 | /eslint-plugin-react-hooks/4.5.0_eslint@8.16.0: 1649 | resolution: {integrity: sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==} 1650 | engines: {node: '>=10'} 1651 | peerDependencies: 1652 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 1653 | dependencies: 1654 | eslint: 8.16.0 1655 | dev: true 1656 | 1657 | /eslint-plugin-react/7.30.0_eslint@8.16.0: 1658 | resolution: {integrity: sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==} 1659 | engines: {node: '>=4'} 1660 | peerDependencies: 1661 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 1662 | dependencies: 1663 | array-includes: 3.1.5 1664 | array.prototype.flatmap: 1.3.0 1665 | doctrine: 2.1.0 1666 | eslint: 8.16.0 1667 | estraverse: 5.3.0 1668 | jsx-ast-utils: 3.3.0 1669 | minimatch: 3.1.2 1670 | object.entries: 1.1.5 1671 | object.fromentries: 2.0.5 1672 | object.hasown: 1.1.1 1673 | object.values: 1.1.5 1674 | prop-types: 15.8.1 1675 | resolve: 2.0.0-next.3 1676 | semver: 6.3.0 1677 | string.prototype.matchall: 4.0.7 1678 | dev: true 1679 | 1680 | /eslint-scope/7.1.1: 1681 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 1682 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1683 | dependencies: 1684 | esrecurse: 4.3.0 1685 | estraverse: 5.3.0 1686 | dev: true 1687 | 1688 | /eslint-utils/3.0.0_eslint@8.16.0: 1689 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1690 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1691 | peerDependencies: 1692 | eslint: '>=5' 1693 | dependencies: 1694 | eslint: 8.16.0 1695 | eslint-visitor-keys: 2.1.0 1696 | dev: true 1697 | 1698 | /eslint-visitor-keys/2.1.0: 1699 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1700 | engines: {node: '>=10'} 1701 | dev: true 1702 | 1703 | /eslint-visitor-keys/3.3.0: 1704 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 1705 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1706 | dev: true 1707 | 1708 | /eslint/8.16.0: 1709 | resolution: {integrity: sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==} 1710 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1711 | hasBin: true 1712 | dependencies: 1713 | '@eslint/eslintrc': 1.3.0 1714 | '@humanwhocodes/config-array': 0.9.5 1715 | ajv: 6.12.6 1716 | chalk: 4.1.2 1717 | cross-spawn: 7.0.3 1718 | debug: 4.3.4 1719 | doctrine: 3.0.0 1720 | escape-string-regexp: 4.0.0 1721 | eslint-scope: 7.1.1 1722 | eslint-utils: 3.0.0_eslint@8.16.0 1723 | eslint-visitor-keys: 3.3.0 1724 | espree: 9.3.2 1725 | esquery: 1.4.0 1726 | esutils: 2.0.3 1727 | fast-deep-equal: 3.1.3 1728 | file-entry-cache: 6.0.1 1729 | functional-red-black-tree: 1.0.1 1730 | glob-parent: 6.0.2 1731 | globals: 13.15.0 1732 | ignore: 5.2.0 1733 | import-fresh: 3.3.0 1734 | imurmurhash: 0.1.4 1735 | is-glob: 4.0.3 1736 | js-yaml: 4.1.0 1737 | json-stable-stringify-without-jsonify: 1.0.1 1738 | levn: 0.4.1 1739 | lodash.merge: 4.6.2 1740 | minimatch: 3.1.2 1741 | natural-compare: 1.4.0 1742 | optionator: 0.9.1 1743 | regexpp: 3.2.0 1744 | strip-ansi: 6.0.1 1745 | strip-json-comments: 3.1.1 1746 | text-table: 0.2.0 1747 | v8-compile-cache: 2.3.0 1748 | transitivePeerDependencies: 1749 | - supports-color 1750 | dev: true 1751 | 1752 | /espree/9.3.2: 1753 | resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} 1754 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1755 | dependencies: 1756 | acorn: 8.7.1 1757 | acorn-jsx: 5.3.2_acorn@8.7.1 1758 | eslint-visitor-keys: 3.3.0 1759 | dev: true 1760 | 1761 | /esquery/1.4.0: 1762 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 1763 | engines: {node: '>=0.10'} 1764 | dependencies: 1765 | estraverse: 5.3.0 1766 | dev: true 1767 | 1768 | /esrecurse/4.3.0: 1769 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1770 | engines: {node: '>=4.0'} 1771 | dependencies: 1772 | estraverse: 5.3.0 1773 | dev: true 1774 | 1775 | /estraverse/5.3.0: 1776 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1777 | engines: {node: '>=4.0'} 1778 | dev: true 1779 | 1780 | /esutils/2.0.3: 1781 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1782 | engines: {node: '>=0.10.0'} 1783 | dev: true 1784 | 1785 | /extend-shallow/2.0.1: 1786 | resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} 1787 | engines: {node: '>=0.10.0'} 1788 | dependencies: 1789 | is-extendable: 0.1.1 1790 | dev: false 1791 | 1792 | /extend-shallow/3.0.2: 1793 | resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} 1794 | engines: {node: '>=0.10.0'} 1795 | dependencies: 1796 | assign-symbols: 1.0.0 1797 | is-extendable: 1.0.1 1798 | dev: false 1799 | 1800 | /fast-deep-equal/3.1.3: 1801 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1802 | 1803 | /fast-glob/3.2.11: 1804 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 1805 | engines: {node: '>=8.6.0'} 1806 | dependencies: 1807 | '@nodelib/fs.stat': 2.0.5 1808 | '@nodelib/fs.walk': 1.2.8 1809 | glob-parent: 5.1.2 1810 | merge2: 1.4.1 1811 | micromatch: 4.0.5 1812 | dev: true 1813 | 1814 | /fast-json-stable-stringify/2.1.0: 1815 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1816 | dev: true 1817 | 1818 | /fast-levenshtein/2.0.6: 1819 | resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} 1820 | dev: true 1821 | 1822 | /fast-shallow-equal/1.0.0: 1823 | resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} 1824 | dev: false 1825 | 1826 | /fastest-stable-stringify/2.0.2: 1827 | resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} 1828 | dev: false 1829 | 1830 | /fastq/1.13.0: 1831 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 1832 | dependencies: 1833 | reusify: 1.0.4 1834 | dev: true 1835 | 1836 | /file-entry-cache/6.0.1: 1837 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1838 | engines: {node: ^10.12.0 || >=12.0.0} 1839 | dependencies: 1840 | flat-cache: 3.0.4 1841 | dev: true 1842 | 1843 | /file-selector/0.5.0: 1844 | resolution: {integrity: sha512-s8KNnmIDTBoD0p9uJ9uD0XY38SCeBOtj0UMXyQSLg1Ypfrfj8+dAvwsLjYQkQ2GjhVtp2HrnF5cJzMhBjfD8HA==} 1845 | engines: {node: '>= 10'} 1846 | dependencies: 1847 | tslib: 2.4.0 1848 | dev: false 1849 | 1850 | /fill-range/7.0.1: 1851 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1852 | engines: {node: '>=8'} 1853 | dependencies: 1854 | to-regex-range: 5.0.1 1855 | dev: true 1856 | 1857 | /find-up/2.1.0: 1858 | resolution: {integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=} 1859 | engines: {node: '>=4'} 1860 | dependencies: 1861 | locate-path: 2.0.0 1862 | dev: true 1863 | 1864 | /flat-cache/3.0.4: 1865 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1866 | engines: {node: ^10.12.0 || >=12.0.0} 1867 | dependencies: 1868 | flatted: 3.2.5 1869 | rimraf: 3.0.2 1870 | dev: true 1871 | 1872 | /flatted/3.2.5: 1873 | resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} 1874 | dev: true 1875 | 1876 | /for-in/1.0.2: 1877 | resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} 1878 | engines: {node: '>=0.10.0'} 1879 | dev: false 1880 | 1881 | /fraction.js/4.2.0: 1882 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 1883 | dev: true 1884 | 1885 | /fs.realpath/1.0.0: 1886 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 1887 | dev: true 1888 | 1889 | /fsevents/2.3.2: 1890 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1891 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1892 | os: [darwin] 1893 | requiresBuild: true 1894 | dev: true 1895 | optional: true 1896 | 1897 | /function-bind/1.1.1: 1898 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1899 | dev: true 1900 | 1901 | /function.prototype.name/1.1.5: 1902 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 1903 | engines: {node: '>= 0.4'} 1904 | dependencies: 1905 | call-bind: 1.0.2 1906 | define-properties: 1.1.4 1907 | es-abstract: 1.20.1 1908 | functions-have-names: 1.2.3 1909 | dev: true 1910 | 1911 | /functional-red-black-tree/1.0.1: 1912 | resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} 1913 | dev: true 1914 | 1915 | /functions-have-names/1.2.3: 1916 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1917 | dev: true 1918 | 1919 | /get-intrinsic/1.1.1: 1920 | resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} 1921 | dependencies: 1922 | function-bind: 1.1.1 1923 | has: 1.0.3 1924 | has-symbols: 1.0.3 1925 | dev: true 1926 | 1927 | /get-symbol-description/1.0.0: 1928 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 1929 | engines: {node: '>= 0.4'} 1930 | dependencies: 1931 | call-bind: 1.0.2 1932 | get-intrinsic: 1.1.1 1933 | dev: true 1934 | 1935 | /get-value/2.0.6: 1936 | resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} 1937 | engines: {node: '>=0.10.0'} 1938 | dev: false 1939 | 1940 | /glob-parent/5.1.2: 1941 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1942 | engines: {node: '>= 6'} 1943 | dependencies: 1944 | is-glob: 4.0.3 1945 | dev: true 1946 | 1947 | /glob-parent/6.0.2: 1948 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1949 | engines: {node: '>=10.13.0'} 1950 | dependencies: 1951 | is-glob: 4.0.3 1952 | dev: true 1953 | 1954 | /glob/7.1.7: 1955 | resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} 1956 | dependencies: 1957 | fs.realpath: 1.0.0 1958 | inflight: 1.0.6 1959 | inherits: 2.0.4 1960 | minimatch: 3.1.2 1961 | once: 1.4.0 1962 | path-is-absolute: 1.0.1 1963 | dev: true 1964 | 1965 | /glob/7.2.3: 1966 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1967 | dependencies: 1968 | fs.realpath: 1.0.0 1969 | inflight: 1.0.6 1970 | inherits: 2.0.4 1971 | minimatch: 3.1.2 1972 | once: 1.4.0 1973 | path-is-absolute: 1.0.1 1974 | dev: true 1975 | 1976 | /globals/13.15.0: 1977 | resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} 1978 | engines: {node: '>=8'} 1979 | dependencies: 1980 | type-fest: 0.20.2 1981 | dev: true 1982 | 1983 | /globby/11.1.0: 1984 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1985 | engines: {node: '>=10'} 1986 | dependencies: 1987 | array-union: 2.1.0 1988 | dir-glob: 3.0.1 1989 | fast-glob: 3.2.11 1990 | ignore: 5.2.0 1991 | merge2: 1.4.1 1992 | slash: 3.0.0 1993 | dev: true 1994 | 1995 | /has-bigints/1.0.2: 1996 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1997 | dev: true 1998 | 1999 | /has-flag/4.0.0: 2000 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 2001 | engines: {node: '>=8'} 2002 | dev: true 2003 | 2004 | /has-property-descriptors/1.0.0: 2005 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 2006 | dependencies: 2007 | get-intrinsic: 1.1.1 2008 | dev: true 2009 | 2010 | /has-symbols/1.0.3: 2011 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 2012 | engines: {node: '>= 0.4'} 2013 | dev: true 2014 | 2015 | /has-tostringtag/1.0.0: 2016 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 2017 | engines: {node: '>= 0.4'} 2018 | dependencies: 2019 | has-symbols: 1.0.3 2020 | dev: true 2021 | 2022 | /has/1.0.3: 2023 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 2024 | engines: {node: '>= 0.4.0'} 2025 | dependencies: 2026 | function-bind: 1.1.1 2027 | dev: true 2028 | 2029 | /hyphenate-style-name/1.0.4: 2030 | resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} 2031 | dev: false 2032 | 2033 | /iconv-lite/0.6.3: 2034 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 2035 | engines: {node: '>=0.10.0'} 2036 | dependencies: 2037 | safer-buffer: 2.1.2 2038 | dev: false 2039 | 2040 | /ignore/5.2.0: 2041 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 2042 | engines: {node: '>= 4'} 2043 | dev: true 2044 | 2045 | /import-fresh/3.3.0: 2046 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 2047 | engines: {node: '>=6'} 2048 | dependencies: 2049 | parent-module: 1.0.1 2050 | resolve-from: 4.0.0 2051 | dev: true 2052 | 2053 | /imurmurhash/0.1.4: 2054 | resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} 2055 | engines: {node: '>=0.8.19'} 2056 | dev: true 2057 | 2058 | /inflight/1.0.6: 2059 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 2060 | dependencies: 2061 | once: 1.4.0 2062 | wrappy: 1.0.2 2063 | dev: true 2064 | 2065 | /inherits/2.0.4: 2066 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 2067 | dev: true 2068 | 2069 | /inline-style-prefixer/6.0.1: 2070 | resolution: {integrity: sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ==} 2071 | dependencies: 2072 | css-in-js-utils: 2.0.1 2073 | dev: false 2074 | 2075 | /internal-slot/1.0.3: 2076 | resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} 2077 | engines: {node: '>= 0.4'} 2078 | dependencies: 2079 | get-intrinsic: 1.1.1 2080 | has: 1.0.3 2081 | side-channel: 1.0.4 2082 | dev: true 2083 | 2084 | /internmap/2.0.3: 2085 | resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} 2086 | engines: {node: '>=12'} 2087 | dev: false 2088 | 2089 | /is-bigint/1.0.4: 2090 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 2091 | dependencies: 2092 | has-bigints: 1.0.2 2093 | dev: true 2094 | 2095 | /is-binary-path/2.1.0: 2096 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 2097 | engines: {node: '>=8'} 2098 | dependencies: 2099 | binary-extensions: 2.2.0 2100 | dev: true 2101 | 2102 | /is-boolean-object/1.1.2: 2103 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 2104 | engines: {node: '>= 0.4'} 2105 | dependencies: 2106 | call-bind: 1.0.2 2107 | has-tostringtag: 1.0.0 2108 | dev: true 2109 | 2110 | /is-callable/1.2.4: 2111 | resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} 2112 | engines: {node: '>= 0.4'} 2113 | dev: true 2114 | 2115 | /is-core-module/2.9.0: 2116 | resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} 2117 | dependencies: 2118 | has: 1.0.3 2119 | dev: true 2120 | 2121 | /is-date-object/1.0.5: 2122 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 2123 | engines: {node: '>= 0.4'} 2124 | dependencies: 2125 | has-tostringtag: 1.0.0 2126 | dev: true 2127 | 2128 | /is-extendable/0.1.1: 2129 | resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} 2130 | engines: {node: '>=0.10.0'} 2131 | dev: false 2132 | 2133 | /is-extendable/1.0.1: 2134 | resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} 2135 | engines: {node: '>=0.10.0'} 2136 | dependencies: 2137 | is-plain-object: 2.0.4 2138 | dev: false 2139 | 2140 | /is-extglob/2.1.1: 2141 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 2142 | engines: {node: '>=0.10.0'} 2143 | dev: true 2144 | 2145 | /is-glob/4.0.3: 2146 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 2147 | engines: {node: '>=0.10.0'} 2148 | dependencies: 2149 | is-extglob: 2.1.1 2150 | dev: true 2151 | 2152 | /is-negative-zero/2.0.2: 2153 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 2154 | engines: {node: '>= 0.4'} 2155 | dev: true 2156 | 2157 | /is-number-object/1.0.7: 2158 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 2159 | engines: {node: '>= 0.4'} 2160 | dependencies: 2161 | has-tostringtag: 1.0.0 2162 | dev: true 2163 | 2164 | /is-number/7.0.0: 2165 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 2166 | engines: {node: '>=0.12.0'} 2167 | dev: true 2168 | 2169 | /is-plain-object/2.0.4: 2170 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 2171 | engines: {node: '>=0.10.0'} 2172 | dependencies: 2173 | isobject: 3.0.1 2174 | dev: false 2175 | 2176 | /is-regex/1.1.4: 2177 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 2178 | engines: {node: '>= 0.4'} 2179 | dependencies: 2180 | call-bind: 1.0.2 2181 | has-tostringtag: 1.0.0 2182 | dev: true 2183 | 2184 | /is-shared-array-buffer/1.0.2: 2185 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 2186 | dependencies: 2187 | call-bind: 1.0.2 2188 | dev: true 2189 | 2190 | /is-string/1.0.7: 2191 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 2192 | engines: {node: '>= 0.4'} 2193 | dependencies: 2194 | has-tostringtag: 1.0.0 2195 | dev: true 2196 | 2197 | /is-symbol/1.0.4: 2198 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 2199 | engines: {node: '>= 0.4'} 2200 | dependencies: 2201 | has-symbols: 1.0.3 2202 | dev: true 2203 | 2204 | /is-weakref/1.0.2: 2205 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 2206 | dependencies: 2207 | call-bind: 1.0.2 2208 | dev: true 2209 | 2210 | /isexe/2.0.0: 2211 | resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} 2212 | dev: true 2213 | 2214 | /isobject/3.0.1: 2215 | resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} 2216 | engines: {node: '>=0.10.0'} 2217 | dev: false 2218 | 2219 | /js-cookie/2.2.1: 2220 | resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} 2221 | dev: false 2222 | 2223 | /js-tokens/4.0.0: 2224 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2225 | 2226 | /js-yaml/4.1.0: 2227 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2228 | hasBin: true 2229 | dependencies: 2230 | argparse: 2.0.1 2231 | dev: true 2232 | 2233 | /json-schema-traverse/0.4.1: 2234 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 2235 | dev: true 2236 | 2237 | /json-stable-stringify-without-jsonify/1.0.1: 2238 | resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} 2239 | dev: true 2240 | 2241 | /json5/1.0.1: 2242 | resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} 2243 | hasBin: true 2244 | dependencies: 2245 | minimist: 1.2.6 2246 | dev: true 2247 | 2248 | /jsx-ast-utils/3.3.0: 2249 | resolution: {integrity: sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==} 2250 | engines: {node: '>=4.0'} 2251 | dependencies: 2252 | array-includes: 3.1.5 2253 | object.assign: 4.1.2 2254 | dev: true 2255 | 2256 | /language-subtag-registry/0.3.21: 2257 | resolution: {integrity: sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==} 2258 | dev: true 2259 | 2260 | /language-tags/1.0.5: 2261 | resolution: {integrity: sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=} 2262 | dependencies: 2263 | language-subtag-registry: 0.3.21 2264 | dev: true 2265 | 2266 | /leva/0.9.30_ef5jwxihqo6n7gxfmzogljlgcm: 2267 | resolution: {integrity: sha512-sAf+kYaiyLIYyNyxVwq7V9A+xFuzbHc34uN7wLz7UTxGh5zxiEKVJ2K8k1zC42N3PEt2cOg0NgwlYa+NITdDHw==} 2268 | peerDependencies: 2269 | react: '>=16.8.0' 2270 | react-dom: '>=16.8.0' 2271 | dependencies: 2272 | '@radix-ui/react-portal': 0.1.4_ef5jwxihqo6n7gxfmzogljlgcm 2273 | '@radix-ui/react-tooltip': 0.1.6_ef5jwxihqo6n7gxfmzogljlgcm 2274 | '@stitches/react': 1.2.8_react@18.1.0 2275 | '@use-gesture/react': 10.2.18_react@18.1.0 2276 | '@welldone-software/why-did-you-render': 6.2.3_react@18.1.0 2277 | colord: 2.9.3 2278 | dequal: 2.0.3 2279 | merge-value: 1.0.0 2280 | react: 18.1.0 2281 | react-colorful: 5.6.0_ef5jwxihqo6n7gxfmzogljlgcm 2282 | react-dom: 18.1.0_react@18.1.0 2283 | react-dropzone: 12.1.0_react@18.1.0 2284 | v8n: 1.5.1 2285 | zustand: 3.7.2_react@18.1.0 2286 | dev: false 2287 | 2288 | /levn/0.4.1: 2289 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 2290 | engines: {node: '>= 0.8.0'} 2291 | dependencies: 2292 | prelude-ls: 1.2.1 2293 | type-check: 0.4.0 2294 | dev: true 2295 | 2296 | /lilconfig/2.0.5: 2297 | resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} 2298 | engines: {node: '>=10'} 2299 | dev: true 2300 | 2301 | /locate-path/2.0.0: 2302 | resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} 2303 | engines: {node: '>=4'} 2304 | dependencies: 2305 | p-locate: 2.0.0 2306 | path-exists: 3.0.0 2307 | dev: true 2308 | 2309 | /lodash.merge/4.6.2: 2310 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 2311 | dev: true 2312 | 2313 | /lodash/4.17.21: 2314 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2315 | dev: false 2316 | 2317 | /loose-envify/1.4.0: 2318 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 2319 | hasBin: true 2320 | dependencies: 2321 | js-tokens: 4.0.0 2322 | 2323 | /lru-cache/6.0.0: 2324 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2325 | engines: {node: '>=10'} 2326 | dependencies: 2327 | yallist: 4.0.0 2328 | dev: true 2329 | 2330 | /matchmediaquery/0.3.1: 2331 | resolution: {integrity: sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==} 2332 | dependencies: 2333 | css-mediaquery: 0.1.2 2334 | dev: false 2335 | 2336 | /mdn-data/2.0.14: 2337 | resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} 2338 | dev: false 2339 | 2340 | /merge-value/1.0.0: 2341 | resolution: {integrity: sha512-fJMmvat4NeKz63Uv9iHWcPDjCWcCkoiRoajRTEO8hlhUC6rwaHg0QCF9hBOTjZmm4JuglPckPSTtcuJL5kp0TQ==} 2342 | engines: {node: '>=0.10.0'} 2343 | dependencies: 2344 | get-value: 2.0.6 2345 | is-extendable: 1.0.1 2346 | mixin-deep: 1.3.2 2347 | set-value: 2.0.1 2348 | dev: false 2349 | 2350 | /merge2/1.4.1: 2351 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2352 | engines: {node: '>= 8'} 2353 | dev: true 2354 | 2355 | /micromatch/4.0.5: 2356 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2357 | engines: {node: '>=8.6'} 2358 | dependencies: 2359 | braces: 3.0.2 2360 | picomatch: 2.3.1 2361 | dev: true 2362 | 2363 | /minimatch/3.1.2: 2364 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2365 | dependencies: 2366 | brace-expansion: 1.1.11 2367 | dev: true 2368 | 2369 | /minimist/1.2.6: 2370 | resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} 2371 | dev: true 2372 | 2373 | /mixin-deep/1.3.2: 2374 | resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} 2375 | engines: {node: '>=0.10.0'} 2376 | dependencies: 2377 | for-in: 1.0.2 2378 | is-extendable: 1.0.1 2379 | dev: false 2380 | 2381 | /ms/2.0.0: 2382 | resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} 2383 | dev: true 2384 | 2385 | /ms/2.1.2: 2386 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2387 | dev: true 2388 | 2389 | /ms/2.1.3: 2390 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2391 | dev: true 2392 | 2393 | /nano-css/5.3.5_ef5jwxihqo6n7gxfmzogljlgcm: 2394 | resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} 2395 | peerDependencies: 2396 | react: '*' 2397 | react-dom: '*' 2398 | dependencies: 2399 | css-tree: 1.1.3 2400 | csstype: 3.1.0 2401 | fastest-stable-stringify: 2.0.2 2402 | inline-style-prefixer: 6.0.1 2403 | react: 18.1.0 2404 | react-dom: 18.1.0_react@18.1.0 2405 | rtl-css-js: 1.15.0 2406 | sourcemap-codec: 1.4.8 2407 | stacktrace-js: 2.0.2 2408 | stylis: 4.1.1 2409 | dev: false 2410 | 2411 | /nanoid/3.3.4: 2412 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 2413 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2414 | hasBin: true 2415 | 2416 | /natural-compare/1.4.0: 2417 | resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} 2418 | dev: true 2419 | 2420 | /next/12.1.6_ef5jwxihqo6n7gxfmzogljlgcm: 2421 | resolution: {integrity: sha512-cebwKxL3/DhNKfg9tPZDQmbRKjueqykHHbgaoG4VBRH3AHQJ2HO0dbKFiS1hPhe1/qgc2d/hFeadsbPicmLD+A==} 2422 | engines: {node: '>=12.22.0'} 2423 | hasBin: true 2424 | peerDependencies: 2425 | fibers: '>= 3.1.0' 2426 | node-sass: ^6.0.0 || ^7.0.0 2427 | react: ^17.0.2 || ^18.0.0-0 2428 | react-dom: ^17.0.2 || ^18.0.0-0 2429 | sass: ^1.3.0 2430 | peerDependenciesMeta: 2431 | fibers: 2432 | optional: true 2433 | node-sass: 2434 | optional: true 2435 | sass: 2436 | optional: true 2437 | dependencies: 2438 | '@next/env': 12.1.6 2439 | caniuse-lite: 1.0.30001343 2440 | postcss: 8.4.5 2441 | react: 18.1.0 2442 | react-dom: 18.1.0_react@18.1.0 2443 | styled-jsx: 5.0.2_react@18.1.0 2444 | optionalDependencies: 2445 | '@next/swc-android-arm-eabi': 12.1.6 2446 | '@next/swc-android-arm64': 12.1.6 2447 | '@next/swc-darwin-arm64': 12.1.6 2448 | '@next/swc-darwin-x64': 12.1.6 2449 | '@next/swc-linux-arm-gnueabihf': 12.1.6 2450 | '@next/swc-linux-arm64-gnu': 12.1.6 2451 | '@next/swc-linux-arm64-musl': 12.1.6 2452 | '@next/swc-linux-x64-gnu': 12.1.6 2453 | '@next/swc-linux-x64-musl': 12.1.6 2454 | '@next/swc-win32-arm64-msvc': 12.1.6 2455 | '@next/swc-win32-ia32-msvc': 12.1.6 2456 | '@next/swc-win32-x64-msvc': 12.1.6 2457 | transitivePeerDependencies: 2458 | - '@babel/core' 2459 | - babel-plugin-macros 2460 | 2461 | /node-releases/2.0.5: 2462 | resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==} 2463 | dev: true 2464 | 2465 | /normalize-path/3.0.0: 2466 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2467 | engines: {node: '>=0.10.0'} 2468 | dev: true 2469 | 2470 | /normalize-range/0.1.2: 2471 | resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} 2472 | engines: {node: '>=0.10.0'} 2473 | dev: true 2474 | 2475 | /object-assign/4.1.1: 2476 | resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} 2477 | engines: {node: '>=0.10.0'} 2478 | 2479 | /object-hash/3.0.0: 2480 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 2481 | engines: {node: '>= 6'} 2482 | dev: true 2483 | 2484 | /object-inspect/1.12.1: 2485 | resolution: {integrity: sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==} 2486 | dev: true 2487 | 2488 | /object-keys/1.1.1: 2489 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 2490 | engines: {node: '>= 0.4'} 2491 | dev: true 2492 | 2493 | /object.assign/4.1.2: 2494 | resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} 2495 | engines: {node: '>= 0.4'} 2496 | dependencies: 2497 | call-bind: 1.0.2 2498 | define-properties: 1.1.4 2499 | has-symbols: 1.0.3 2500 | object-keys: 1.1.1 2501 | dev: true 2502 | 2503 | /object.entries/1.1.5: 2504 | resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} 2505 | engines: {node: '>= 0.4'} 2506 | dependencies: 2507 | call-bind: 1.0.2 2508 | define-properties: 1.1.4 2509 | es-abstract: 1.20.1 2510 | dev: true 2511 | 2512 | /object.fromentries/2.0.5: 2513 | resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} 2514 | engines: {node: '>= 0.4'} 2515 | dependencies: 2516 | call-bind: 1.0.2 2517 | define-properties: 1.1.4 2518 | es-abstract: 1.20.1 2519 | dev: true 2520 | 2521 | /object.hasown/1.1.1: 2522 | resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} 2523 | dependencies: 2524 | define-properties: 1.1.4 2525 | es-abstract: 1.20.1 2526 | dev: true 2527 | 2528 | /object.values/1.1.5: 2529 | resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} 2530 | engines: {node: '>= 0.4'} 2531 | dependencies: 2532 | call-bind: 1.0.2 2533 | define-properties: 1.1.4 2534 | es-abstract: 1.20.1 2535 | dev: true 2536 | 2537 | /once/1.4.0: 2538 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 2539 | dependencies: 2540 | wrappy: 1.0.2 2541 | dev: true 2542 | 2543 | /optionator/0.9.1: 2544 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 2545 | engines: {node: '>= 0.8.0'} 2546 | dependencies: 2547 | deep-is: 0.1.4 2548 | fast-levenshtein: 2.0.6 2549 | levn: 0.4.1 2550 | prelude-ls: 1.2.1 2551 | type-check: 0.4.0 2552 | word-wrap: 1.2.3 2553 | dev: true 2554 | 2555 | /p-limit/1.3.0: 2556 | resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} 2557 | engines: {node: '>=4'} 2558 | dependencies: 2559 | p-try: 1.0.0 2560 | dev: true 2561 | 2562 | /p-locate/2.0.0: 2563 | resolution: {integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=} 2564 | engines: {node: '>=4'} 2565 | dependencies: 2566 | p-limit: 1.3.0 2567 | dev: true 2568 | 2569 | /p-try/1.0.0: 2570 | resolution: {integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=} 2571 | engines: {node: '>=4'} 2572 | dev: true 2573 | 2574 | /parent-module/1.0.1: 2575 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2576 | engines: {node: '>=6'} 2577 | dependencies: 2578 | callsites: 3.1.0 2579 | dev: true 2580 | 2581 | /path-exists/3.0.0: 2582 | resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} 2583 | engines: {node: '>=4'} 2584 | dev: true 2585 | 2586 | /path-is-absolute/1.0.1: 2587 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 2588 | engines: {node: '>=0.10.0'} 2589 | dev: true 2590 | 2591 | /path-key/3.1.1: 2592 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2593 | engines: {node: '>=8'} 2594 | dev: true 2595 | 2596 | /path-parse/1.0.7: 2597 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2598 | dev: true 2599 | 2600 | /path-type/4.0.0: 2601 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2602 | engines: {node: '>=8'} 2603 | dev: true 2604 | 2605 | /picocolors/1.0.0: 2606 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2607 | 2608 | /picomatch/2.3.1: 2609 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2610 | engines: {node: '>=8.6'} 2611 | dev: true 2612 | 2613 | /postcss-js/4.0.0_postcss@8.4.14: 2614 | resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} 2615 | engines: {node: ^12 || ^14 || >= 16} 2616 | peerDependencies: 2617 | postcss: ^8.3.3 2618 | dependencies: 2619 | camelcase-css: 2.0.1 2620 | postcss: 8.4.14 2621 | dev: true 2622 | 2623 | /postcss-load-config/3.1.4_postcss@8.4.14: 2624 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 2625 | engines: {node: '>= 10'} 2626 | peerDependencies: 2627 | postcss: '>=8.0.9' 2628 | ts-node: '>=9.0.0' 2629 | peerDependenciesMeta: 2630 | postcss: 2631 | optional: true 2632 | ts-node: 2633 | optional: true 2634 | dependencies: 2635 | lilconfig: 2.0.5 2636 | postcss: 8.4.14 2637 | yaml: 1.10.2 2638 | dev: true 2639 | 2640 | /postcss-nested/5.0.6_postcss@8.4.14: 2641 | resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} 2642 | engines: {node: '>=12.0'} 2643 | peerDependencies: 2644 | postcss: ^8.2.14 2645 | dependencies: 2646 | postcss: 8.4.14 2647 | postcss-selector-parser: 6.0.10 2648 | dev: true 2649 | 2650 | /postcss-selector-parser/6.0.10: 2651 | resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} 2652 | engines: {node: '>=4'} 2653 | dependencies: 2654 | cssesc: 3.0.0 2655 | util-deprecate: 1.0.2 2656 | dev: true 2657 | 2658 | /postcss-value-parser/4.2.0: 2659 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2660 | dev: true 2661 | 2662 | /postcss/8.4.14: 2663 | resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} 2664 | engines: {node: ^10 || ^12 || >=14} 2665 | dependencies: 2666 | nanoid: 3.3.4 2667 | picocolors: 1.0.0 2668 | source-map-js: 1.0.2 2669 | dev: true 2670 | 2671 | /postcss/8.4.5: 2672 | resolution: {integrity: sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==} 2673 | engines: {node: ^10 || ^12 || >=14} 2674 | dependencies: 2675 | nanoid: 3.3.4 2676 | picocolors: 1.0.0 2677 | source-map-js: 1.0.2 2678 | 2679 | /prelude-ls/1.2.1: 2680 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2681 | engines: {node: '>= 0.8.0'} 2682 | dev: true 2683 | 2684 | /prettier/2.6.2: 2685 | resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} 2686 | engines: {node: '>=10.13.0'} 2687 | hasBin: true 2688 | dev: true 2689 | 2690 | /prop-types/15.8.1: 2691 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 2692 | dependencies: 2693 | loose-envify: 1.4.0 2694 | object-assign: 4.1.1 2695 | react-is: 16.13.1 2696 | 2697 | /punycode/2.1.1: 2698 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 2699 | engines: {node: '>=6'} 2700 | dev: true 2701 | 2702 | /queue-microtask/1.2.3: 2703 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2704 | dev: true 2705 | 2706 | /quick-lru/5.1.1: 2707 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 2708 | engines: {node: '>=10'} 2709 | dev: true 2710 | 2711 | /react-colorful/5.6.0_ef5jwxihqo6n7gxfmzogljlgcm: 2712 | resolution: {integrity: sha512-2/sW7msvdPWYc6uKFteTOztlX8ujoKImv6k2TVSlqbGNbR3bsQMfTyHcca+kk8dDUe/bsfVkI3M2WOl1bKL+Lg==} 2713 | peerDependencies: 2714 | react: '>=16.8.0' 2715 | react-dom: '>=16.8.0' 2716 | dependencies: 2717 | react: 18.1.0 2718 | react-dom: 18.1.0_react@18.1.0 2719 | dev: false 2720 | 2721 | /react-dom/18.1.0_react@18.1.0: 2722 | resolution: {integrity: sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==} 2723 | peerDependencies: 2724 | react: ^18.1.0 2725 | dependencies: 2726 | loose-envify: 1.4.0 2727 | react: 18.1.0 2728 | scheduler: 0.22.0 2729 | 2730 | /react-dropzone/12.1.0_react@18.1.0: 2731 | resolution: {integrity: sha512-iBYHA1rbopIvtzokEX4QubO6qk5IF/x3BtKGu74rF2JkQDXnwC4uO/lHKpaw4PJIV6iIAYOlwLv2FpiGyqHNog==} 2732 | engines: {node: '>= 10.13'} 2733 | peerDependencies: 2734 | react: '>= 16.8' 2735 | dependencies: 2736 | attr-accept: 2.2.2 2737 | file-selector: 0.5.0 2738 | prop-types: 15.8.1 2739 | react: 18.1.0 2740 | dev: false 2741 | 2742 | /react-is/16.13.1: 2743 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 2744 | 2745 | /react-resize-detector/7.1.1_ef5jwxihqo6n7gxfmzogljlgcm: 2746 | resolution: {integrity: sha512-rU54VTstNzFLZAmMNHqt8xINjDWP7SQR05A2HUW0OGvl4vcrXzgaxrrqAY5tZMfkLkoYm5u0i0qGqCjdc2jyAA==} 2747 | peerDependencies: 2748 | react: ^16.0.0 || ^17.0.0 || ^18.0.0 2749 | react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 2750 | dependencies: 2751 | lodash: 4.17.21 2752 | react: 18.1.0 2753 | react-dom: 18.1.0_react@18.1.0 2754 | dev: false 2755 | 2756 | /react-responsive/9.0.0-beta.8_react@18.1.0: 2757 | resolution: {integrity: sha512-3DH8YMbYCaZZ6GnsabO7/fWUFDxY5/UMdYQn4kYRBvammJvbvTTfDODo7sb4XsnOoglu0U7S6pVupH5VN+oAoQ==} 2758 | engines: {node: '>=0.10'} 2759 | peerDependencies: 2760 | react: '>=16.8.0' 2761 | dependencies: 2762 | hyphenate-style-name: 1.0.4 2763 | matchmediaquery: 0.3.1 2764 | prop-types: 15.8.1 2765 | react: 18.1.0 2766 | shallow-equal: 1.2.1 2767 | dev: false 2768 | 2769 | /react-swipeable/7.0.0_react@18.1.0: 2770 | resolution: {integrity: sha512-NI7KGfQ6gwNFN0Hor3vytYW3iRfMMaivGEuxcADOOfBCx/kqwXE8IfHFxEcxSUkxCYf38COLKYd9EMYZghqaUA==} 2771 | peerDependencies: 2772 | react: ^16.8.3 || ^17 || ^18 2773 | dependencies: 2774 | react: 18.1.0 2775 | dev: false 2776 | 2777 | /react-universal-interface/0.6.2_react@18.1.0+tslib@2.4.0: 2778 | resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} 2779 | peerDependencies: 2780 | react: '*' 2781 | tslib: '*' 2782 | dependencies: 2783 | react: 18.1.0 2784 | tslib: 2.4.0 2785 | dev: false 2786 | 2787 | /react-use/17.4.0_ef5jwxihqo6n7gxfmzogljlgcm: 2788 | resolution: {integrity: sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==} 2789 | peerDependencies: 2790 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2791 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 2792 | dependencies: 2793 | '@types/js-cookie': 2.2.7 2794 | '@xobotyi/scrollbar-width': 1.9.5 2795 | copy-to-clipboard: 3.3.1 2796 | fast-deep-equal: 3.1.3 2797 | fast-shallow-equal: 1.0.0 2798 | js-cookie: 2.2.1 2799 | nano-css: 5.3.5_ef5jwxihqo6n7gxfmzogljlgcm 2800 | react: 18.1.0 2801 | react-dom: 18.1.0_react@18.1.0 2802 | react-universal-interface: 0.6.2_react@18.1.0+tslib@2.4.0 2803 | resize-observer-polyfill: 1.5.1 2804 | screenfull: 5.2.0 2805 | set-harmonic-interval: 1.0.1 2806 | throttle-debounce: 3.0.1 2807 | ts-easing: 0.2.0 2808 | tslib: 2.4.0 2809 | dev: false 2810 | 2811 | /react/18.1.0: 2812 | resolution: {integrity: sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==} 2813 | engines: {node: '>=0.10.0'} 2814 | dependencies: 2815 | loose-envify: 1.4.0 2816 | 2817 | /readdirp/3.6.0: 2818 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2819 | engines: {node: '>=8.10.0'} 2820 | dependencies: 2821 | picomatch: 2.3.1 2822 | dev: true 2823 | 2824 | /regenerator-runtime/0.13.9: 2825 | resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} 2826 | 2827 | /regexp.prototype.flags/1.4.3: 2828 | resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} 2829 | engines: {node: '>= 0.4'} 2830 | dependencies: 2831 | call-bind: 1.0.2 2832 | define-properties: 1.1.4 2833 | functions-have-names: 1.2.3 2834 | dev: true 2835 | 2836 | /regexpp/3.2.0: 2837 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2838 | engines: {node: '>=8'} 2839 | dev: true 2840 | 2841 | /resize-observer-polyfill/1.5.1: 2842 | resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} 2843 | dev: false 2844 | 2845 | /resolve-from/4.0.0: 2846 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2847 | engines: {node: '>=4'} 2848 | dev: true 2849 | 2850 | /resolve/1.22.0: 2851 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 2852 | hasBin: true 2853 | dependencies: 2854 | is-core-module: 2.9.0 2855 | path-parse: 1.0.7 2856 | supports-preserve-symlinks-flag: 1.0.0 2857 | dev: true 2858 | 2859 | /resolve/2.0.0-next.3: 2860 | resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} 2861 | dependencies: 2862 | is-core-module: 2.9.0 2863 | path-parse: 1.0.7 2864 | dev: true 2865 | 2866 | /reusify/1.0.4: 2867 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2868 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2869 | dev: true 2870 | 2871 | /rimraf/3.0.2: 2872 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2873 | hasBin: true 2874 | dependencies: 2875 | glob: 7.2.3 2876 | dev: true 2877 | 2878 | /robust-predicates/3.0.1: 2879 | resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==} 2880 | dev: false 2881 | 2882 | /rtl-css-js/1.15.0: 2883 | resolution: {integrity: sha512-99Cu4wNNIhrI10xxUaABHsdDqzalrSRTie4GeCmbGVuehm4oj+fIy8fTzB+16pmKe8Bv9rl+hxIBez6KxExTew==} 2884 | dependencies: 2885 | '@babel/runtime': 7.18.3 2886 | dev: false 2887 | 2888 | /run-parallel/1.2.0: 2889 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2890 | dependencies: 2891 | queue-microtask: 1.2.3 2892 | dev: true 2893 | 2894 | /rw/1.3.3: 2895 | resolution: {integrity: sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=} 2896 | dev: false 2897 | 2898 | /safer-buffer/2.1.2: 2899 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2900 | dev: false 2901 | 2902 | /scheduler/0.22.0: 2903 | resolution: {integrity: sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==} 2904 | dependencies: 2905 | loose-envify: 1.4.0 2906 | 2907 | /screenfull/5.2.0: 2908 | resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} 2909 | engines: {node: '>=0.10.0'} 2910 | dev: false 2911 | 2912 | /semver/6.3.0: 2913 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 2914 | hasBin: true 2915 | dev: true 2916 | 2917 | /semver/7.3.7: 2918 | resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} 2919 | engines: {node: '>=10'} 2920 | hasBin: true 2921 | dependencies: 2922 | lru-cache: 6.0.0 2923 | dev: true 2924 | 2925 | /set-harmonic-interval/1.0.1: 2926 | resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} 2927 | engines: {node: '>=6.9'} 2928 | dev: false 2929 | 2930 | /set-value/2.0.1: 2931 | resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} 2932 | engines: {node: '>=0.10.0'} 2933 | dependencies: 2934 | extend-shallow: 2.0.1 2935 | is-extendable: 0.1.1 2936 | is-plain-object: 2.0.4 2937 | split-string: 3.1.0 2938 | dev: false 2939 | 2940 | /shallow-equal/1.2.1: 2941 | resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} 2942 | dev: false 2943 | 2944 | /shebang-command/2.0.0: 2945 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2946 | engines: {node: '>=8'} 2947 | dependencies: 2948 | shebang-regex: 3.0.0 2949 | dev: true 2950 | 2951 | /shebang-regex/3.0.0: 2952 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2953 | engines: {node: '>=8'} 2954 | dev: true 2955 | 2956 | /side-channel/1.0.4: 2957 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2958 | dependencies: 2959 | call-bind: 1.0.2 2960 | get-intrinsic: 1.1.1 2961 | object-inspect: 1.12.1 2962 | dev: true 2963 | 2964 | /slash/3.0.0: 2965 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2966 | engines: {node: '>=8'} 2967 | dev: true 2968 | 2969 | /source-map-js/1.0.2: 2970 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2971 | engines: {node: '>=0.10.0'} 2972 | 2973 | /source-map/0.5.6: 2974 | resolution: {integrity: sha1-dc449SvwczxafwwRjYEzSiu19BI=} 2975 | engines: {node: '>=0.10.0'} 2976 | dev: false 2977 | 2978 | /source-map/0.6.1: 2979 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2980 | engines: {node: '>=0.10.0'} 2981 | dev: false 2982 | 2983 | /sourcemap-codec/1.4.8: 2984 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 2985 | dev: false 2986 | 2987 | /split-string/3.1.0: 2988 | resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} 2989 | engines: {node: '>=0.10.0'} 2990 | dependencies: 2991 | extend-shallow: 3.0.2 2992 | dev: false 2993 | 2994 | /stack-generator/2.0.5: 2995 | resolution: {integrity: sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==} 2996 | dependencies: 2997 | stackframe: 1.2.1 2998 | dev: false 2999 | 3000 | /stackframe/1.2.1: 3001 | resolution: {integrity: sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==} 3002 | dev: false 3003 | 3004 | /stacktrace-gps/3.0.4: 3005 | resolution: {integrity: sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==} 3006 | dependencies: 3007 | source-map: 0.5.6 3008 | stackframe: 1.2.1 3009 | dev: false 3010 | 3011 | /stacktrace-js/2.0.2: 3012 | resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} 3013 | dependencies: 3014 | error-stack-parser: 2.0.7 3015 | stack-generator: 2.0.5 3016 | stacktrace-gps: 3.0.4 3017 | dev: false 3018 | 3019 | /string.prototype.matchall/4.0.7: 3020 | resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} 3021 | dependencies: 3022 | call-bind: 1.0.2 3023 | define-properties: 1.1.4 3024 | es-abstract: 1.20.1 3025 | get-intrinsic: 1.1.1 3026 | has-symbols: 1.0.3 3027 | internal-slot: 1.0.3 3028 | regexp.prototype.flags: 1.4.3 3029 | side-channel: 1.0.4 3030 | dev: true 3031 | 3032 | /string.prototype.trimend/1.0.5: 3033 | resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} 3034 | dependencies: 3035 | call-bind: 1.0.2 3036 | define-properties: 1.1.4 3037 | es-abstract: 1.20.1 3038 | dev: true 3039 | 3040 | /string.prototype.trimstart/1.0.5: 3041 | resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} 3042 | dependencies: 3043 | call-bind: 1.0.2 3044 | define-properties: 1.1.4 3045 | es-abstract: 1.20.1 3046 | dev: true 3047 | 3048 | /strip-ansi/6.0.1: 3049 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3050 | engines: {node: '>=8'} 3051 | dependencies: 3052 | ansi-regex: 5.0.1 3053 | dev: true 3054 | 3055 | /strip-bom/3.0.0: 3056 | resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=} 3057 | engines: {node: '>=4'} 3058 | dev: true 3059 | 3060 | /strip-json-comments/3.1.1: 3061 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 3062 | engines: {node: '>=8'} 3063 | dev: true 3064 | 3065 | /styled-jsx/5.0.2_react@18.1.0: 3066 | resolution: {integrity: sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==} 3067 | engines: {node: '>= 12.0.0'} 3068 | peerDependencies: 3069 | '@babel/core': '*' 3070 | babel-plugin-macros: '*' 3071 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 3072 | peerDependenciesMeta: 3073 | '@babel/core': 3074 | optional: true 3075 | babel-plugin-macros: 3076 | optional: true 3077 | dependencies: 3078 | react: 18.1.0 3079 | 3080 | /stylis/4.1.1: 3081 | resolution: {integrity: sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==} 3082 | dev: false 3083 | 3084 | /supports-color/7.2.0: 3085 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 3086 | engines: {node: '>=8'} 3087 | dependencies: 3088 | has-flag: 4.0.0 3089 | dev: true 3090 | 3091 | /supports-preserve-symlinks-flag/1.0.0: 3092 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 3093 | engines: {node: '>= 0.4'} 3094 | dev: true 3095 | 3096 | /tailwindcss/3.0.24: 3097 | resolution: {integrity: sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig==} 3098 | engines: {node: '>=12.13.0'} 3099 | hasBin: true 3100 | dependencies: 3101 | arg: 5.0.1 3102 | chokidar: 3.5.3 3103 | color-name: 1.1.4 3104 | detective: 5.2.0 3105 | didyoumean: 1.2.2 3106 | dlv: 1.1.3 3107 | fast-glob: 3.2.11 3108 | glob-parent: 6.0.2 3109 | is-glob: 4.0.3 3110 | lilconfig: 2.0.5 3111 | normalize-path: 3.0.0 3112 | object-hash: 3.0.0 3113 | picocolors: 1.0.0 3114 | postcss: 8.4.14 3115 | postcss-js: 4.0.0_postcss@8.4.14 3116 | postcss-load-config: 3.1.4_postcss@8.4.14 3117 | postcss-nested: 5.0.6_postcss@8.4.14 3118 | postcss-selector-parser: 6.0.10 3119 | postcss-value-parser: 4.2.0 3120 | quick-lru: 5.1.1 3121 | resolve: 1.22.0 3122 | transitivePeerDependencies: 3123 | - ts-node 3124 | dev: true 3125 | 3126 | /text-table/0.2.0: 3127 | resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} 3128 | dev: true 3129 | 3130 | /throttle-debounce/3.0.1: 3131 | resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} 3132 | engines: {node: '>=10'} 3133 | dev: false 3134 | 3135 | /to-regex-range/5.0.1: 3136 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3137 | engines: {node: '>=8.0'} 3138 | dependencies: 3139 | is-number: 7.0.0 3140 | dev: true 3141 | 3142 | /toggle-selection/1.0.6: 3143 | resolution: {integrity: sha1-bkWxJj8gF/oKzH2J14sVuL932jI=} 3144 | dev: false 3145 | 3146 | /ts-easing/0.2.0: 3147 | resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} 3148 | dev: false 3149 | 3150 | /tsconfig-paths/3.14.1: 3151 | resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} 3152 | dependencies: 3153 | '@types/json5': 0.0.29 3154 | json5: 1.0.1 3155 | minimist: 1.2.6 3156 | strip-bom: 3.0.0 3157 | dev: true 3158 | 3159 | /tslib/1.14.1: 3160 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 3161 | dev: true 3162 | 3163 | /tslib/2.4.0: 3164 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 3165 | dev: false 3166 | 3167 | /tsutils/3.21.0_typescript@4.7.2: 3168 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 3169 | engines: {node: '>= 6'} 3170 | peerDependencies: 3171 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 3172 | dependencies: 3173 | tslib: 1.14.1 3174 | typescript: 4.7.2 3175 | dev: true 3176 | 3177 | /type-check/0.4.0: 3178 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 3179 | engines: {node: '>= 0.8.0'} 3180 | dependencies: 3181 | prelude-ls: 1.2.1 3182 | dev: true 3183 | 3184 | /type-fest/0.20.2: 3185 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 3186 | engines: {node: '>=10'} 3187 | dev: true 3188 | 3189 | /typescript/4.7.2: 3190 | resolution: {integrity: sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==} 3191 | engines: {node: '>=4.2.0'} 3192 | hasBin: true 3193 | dev: true 3194 | 3195 | /unbox-primitive/1.0.2: 3196 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 3197 | dependencies: 3198 | call-bind: 1.0.2 3199 | has-bigints: 1.0.2 3200 | has-symbols: 1.0.3 3201 | which-boxed-primitive: 1.0.2 3202 | dev: true 3203 | 3204 | /uri-js/4.4.1: 3205 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 3206 | dependencies: 3207 | punycode: 2.1.1 3208 | dev: true 3209 | 3210 | /use-sync-external-store/1.1.0_react@18.1.0: 3211 | resolution: {integrity: sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==} 3212 | peerDependencies: 3213 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 3214 | dependencies: 3215 | react: 18.1.0 3216 | dev: false 3217 | 3218 | /util-deprecate/1.0.2: 3219 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 3220 | dev: true 3221 | 3222 | /v8-compile-cache/2.3.0: 3223 | resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} 3224 | dev: true 3225 | 3226 | /v8n/1.5.1: 3227 | resolution: {integrity: sha512-LdabyT4OffkyXFCe9UT+uMkxNBs5rcTVuZClvxQr08D5TUgo1OFKkoT65qYRCsiKBl/usHjpXvP4hHMzzDRj3A==} 3228 | dev: false 3229 | 3230 | /which-boxed-primitive/1.0.2: 3231 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 3232 | dependencies: 3233 | is-bigint: 1.0.4 3234 | is-boolean-object: 1.1.2 3235 | is-number-object: 1.0.7 3236 | is-string: 1.0.7 3237 | is-symbol: 1.0.4 3238 | dev: true 3239 | 3240 | /which/2.0.2: 3241 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3242 | engines: {node: '>= 8'} 3243 | hasBin: true 3244 | dependencies: 3245 | isexe: 2.0.0 3246 | dev: true 3247 | 3248 | /word-wrap/1.2.3: 3249 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 3250 | engines: {node: '>=0.10.0'} 3251 | dev: true 3252 | 3253 | /wrappy/1.0.2: 3254 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 3255 | dev: true 3256 | 3257 | /xtend/4.0.2: 3258 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 3259 | engines: {node: '>=0.4'} 3260 | dev: true 3261 | 3262 | /yallist/4.0.0: 3263 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 3264 | dev: true 3265 | 3266 | /yaml/1.10.2: 3267 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 3268 | engines: {node: '>= 6'} 3269 | dev: true 3270 | 3271 | /zustand/3.7.2_react@18.1.0: 3272 | resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} 3273 | engines: {node: '>=12.7.0'} 3274 | peerDependencies: 3275 | react: '>=16.8' 3276 | peerDependenciesMeta: 3277 | react: 3278 | optional: true 3279 | dependencies: 3280 | react: 18.1.0 3281 | dev: false 3282 | 3283 | /zustand/4.0.0-rc.1_react@18.1.0: 3284 | resolution: {integrity: sha512-qgcs7zLqBdHu0PuT3GW4WCIY5SgXdsv30GQMu9Qpp1BA2aS+sNS8l4x0hWuyEhjXkN+701aGWawhKDv6oWJAcw==} 3285 | engines: {node: '>=12.7.0'} 3286 | peerDependencies: 3287 | immer: '>=9.0' 3288 | react: '>=16.8' 3289 | peerDependenciesMeta: 3290 | immer: 3291 | optional: true 3292 | react: 3293 | optional: true 3294 | dependencies: 3295 | react: 18.1.0 3296 | use-sync-external-store: 1.1.0_react@18.1.0 3297 | dev: false 3298 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } -------------------------------------------------------------------------------- /preview/desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geekplux/timeline-sankey/67b44978aeeb2850f0a7b7d8fcdc6efc941ea3fd/preview/desktop.png -------------------------------------------------------------------------------- /preview/desktop_fullsize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geekplux/timeline-sankey/67b44978aeeb2850f0a7b7d8fcdc6efc941ea3fd/preview/desktop_fullsize.png -------------------------------------------------------------------------------- /preview/interaction_desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geekplux/timeline-sankey/67b44978aeeb2850f0a7b7d8fcdc6efc941ea3fd/preview/interaction_desktop.png -------------------------------------------------------------------------------- /preview/interaction_mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geekplux/timeline-sankey/67b44978aeeb2850f0a7b7d8fcdc6efc941ea3fd/preview/interaction_mobile.png -------------------------------------------------------------------------------- /preview/mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geekplux/timeline-sankey/67b44978aeeb2850f0a7b7d8fcdc6efc941ea3fd/preview/mobile.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geekplux/timeline-sankey/67b44978aeeb2850f0a7b7d8fcdc6efc941ea3fd/public/favicon.ico -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /src/@types/data.d.ts: -------------------------------------------------------------------------------- 1 | export type Item = { 2 | [id: string]; 3 | id?: number; 4 | key?: string; 5 | title: string; 6 | color?: string; 7 | }; 8 | 9 | export type Filters = { 10 | [key: string]: Set; 11 | }; 12 | 13 | export type Data = { 14 | [id: string]; 15 | id: number; 16 | year_start: number; 17 | year_finish: number; 18 | influenced: Data[]; 19 | influenced_by: Data[]; 20 | cross_influenced: Data[]; 21 | cross_influenced_by: Data[]; 22 | tags: Item[]; 23 | categories: Item[]; 24 | column: Item; 25 | }; 26 | 27 | export type VisParams = { 28 | yearStep: number; 29 | yearHeight: number; 30 | mobileYearHeight: number; 31 | nodeGap: number; 32 | nodeTitleGap: number; 33 | nodeWidth: number; 34 | mobileNodeWidth: number; 35 | linkDefaultColor: string; 36 | crossLinkStrokeDashArray: number; 37 | crossLinkTriangleSize: number; 38 | gridGap: number; 39 | } 40 | 41 | export type TimelineProps = { 42 | data: Data[]; 43 | visParams: VisParams; 44 | }; 45 | 46 | export type Node = Data & { 47 | // _sideBySideCount?: number; 48 | // _column?: number; 49 | _x0: number; 50 | _x1: number; 51 | _y0: number; 52 | _y1: number; 53 | _width: number; 54 | _height: number; 55 | _color: string; 56 | _xMidPoint: number; 57 | _yMidPoint: number; 58 | _halfWidth: number; 59 | }; 60 | 61 | export type Link = { 62 | source: number; 63 | target: number; 64 | sourceNode: Node; 65 | targetNode: Node; 66 | type: string; 67 | d?: string; 68 | triangle?: string; 69 | strokeWidth?: number; 70 | rotate?: number; 71 | }; 72 | -------------------------------------------------------------------------------- /src/components/FilterBar/FilterItems.tsx: -------------------------------------------------------------------------------- 1 | import { useTimeline } from 'src/stores/useTimeline'; 2 | import { useCallback } from 'react'; 3 | import shallow from 'zustand/shallow'; 4 | 5 | const FilterItems = () => { 6 | const [filters, setFilters] = useTimeline( 7 | useCallback((s) => [s.filters, s.setFilters], []), 8 | shallow 9 | ); 10 | 11 | if (!filters) return null; 12 | const { yearRange, ...otherItems } = filters; 13 | 14 | // clear filter when clicking them 15 | const clearFilter = (filter: string) => () => { 16 | const newFilters = Object.assign({}, filters); 17 | if (filter == 'yearRange') { 18 | delete newFilters.yearRange; 19 | } 20 | 21 | Object.keys(newFilters).map((k) => { 22 | if (k === 'yearRange') return; 23 | (newFilters as any)[k].delete(filter); 24 | }); 25 | 26 | setFilters(newFilters); 27 | }; 28 | 29 | const Close = () => ( 30 |
X
31 | ); 32 | const FilterButton = ({ children, ...props }: any) => ( 33 | 39 | ); 40 | 41 | return ( 42 | <> 43 | {Object.keys(otherItems).map((k) => 44 | [...(filters as any)[k]].map((f) => ( 45 | 46 | {f} 47 | 48 | 49 | )) 50 | )} 51 | {yearRange && ( 52 | 53 | {`${yearRange[0]} - ${yearRange[1]}`} 54 | 55 | 56 | )} 57 | 58 | ); 59 | }; 60 | 61 | export default FilterItems; 62 | -------------------------------------------------------------------------------- /src/components/FilterBar/Input.tsx: -------------------------------------------------------------------------------- 1 | const Input = (props: any) => { 2 | const handleKeyUp = (event: KeyboardEvent) => { 3 | if (event.key === 'Enter') { 4 | const { onEnter } = props; 5 | onEnter(event); 6 | } 7 | }; 8 | 9 | return ; 10 | }; 11 | 12 | export default Input; 13 | -------------------------------------------------------------------------------- /src/components/FilterBar/MenuItems.tsx: -------------------------------------------------------------------------------- 1 | import { YEAR_RANGE_KEY } from 'src/lib/consts'; 2 | import { useTimeline } from 'src/stores/useTimeline'; 3 | import shallow from 'zustand/shallow'; 4 | import { useCallback } from 'react'; 5 | 6 | const menuMap: any = { 7 | Tags: 'tags', 8 | 'Categories': 'categories', 9 | Time: YEAR_RANGE_KEY 10 | }; 11 | 12 | const MenuItems = ({ mainMenu, setMainMenu, stats }: any) => { 13 | const [filters, setFilters] = useTimeline( 14 | useCallback((s) => [s.filters, s.setFilters], []), 15 | shallow 16 | ); 17 | // because there is no time property in stats, set stats.time is empty set 18 | stats[YEAR_RANGE_KEY] = new Set(); 19 | 20 | const menus = mainMenu 21 | ? [...stats[menuMap[mainMenu]]].sort() 22 | : Object.keys(menuMap); 23 | 24 | const select = (item: string) => () => { 25 | // toggle the main menu 26 | if (!mainMenu) { 27 | setMainMenu(item); 28 | return; 29 | } 30 | 31 | // toggle the submenu, e.g. filters 32 | const existFilter = (filters as any)[menuMap[mainMenu]]; 33 | if (existFilter) { 34 | setFilters({ 35 | ...filters, 36 | [menuMap[mainMenu]]: existFilter.add(item) 37 | }); 38 | } else { 39 | const newFilter = new Set(); 40 | newFilter.add(item); 41 | setFilters({ 42 | ...filters, 43 | [menuMap[mainMenu]]: newFilter 44 | }); 45 | } 46 | }; 47 | 48 | return ( 49 | <> 50 | {menus.map((item: string, i) => ( 51 | 62 | ))} 63 | 64 | ); 65 | }; 66 | 67 | export default MenuItems; 68 | -------------------------------------------------------------------------------- /src/components/FilterBar/YearRange.tsx: -------------------------------------------------------------------------------- 1 | import Input from './Input'; 2 | import { useCallback, useState } from 'react'; 3 | import { YEAR_RANGE_KEY } from 'src/lib/consts'; 4 | import { useTimeline } from 'src/stores/useTimeline'; 5 | import shallow from 'zustand/shallow'; 6 | 7 | const YearRange = ({ minYear, maxYear }: any) => { 8 | const [filters, setFilters] = useTimeline( 9 | useCallback((s) => [s.filters, s.setFilters], []), 10 | shallow 11 | ); 12 | const [fromYear, setFromYear] = useState(minYear); 13 | const [toYear, setToYear] = useState(maxYear); 14 | 15 | const handleFromYearChange = (event: any) => setFromYear(event.target.value); 16 | const handleToYearChange = (event: any) => setToYear(event.target.value); 17 | const handleEnter = (event: any) => { 18 | setFilters({ ...filters, [YEAR_RANGE_KEY]: [fromYear, toYear] }); 19 | }; 20 | 21 | return ( 22 |
23 |
24 | 25 | 34 |
35 |
36 | 37 | 46 |
47 |
48 | ); 49 | }; 50 | 51 | export default YearRange; 52 | -------------------------------------------------------------------------------- /src/components/FilterBar/index.tsx: -------------------------------------------------------------------------------- 1 | import { onKeyAction } from 'src/lib/utils'; 2 | import { useRef, useState } from 'react'; 3 | import { useClickAway } from 'react-use'; 4 | import FilterItems from './FilterItems'; 5 | import MenuItems from './MenuItems'; 6 | import YearRange from './YearRange'; 7 | 8 | export type FilterProps = { 9 | stats: any; 10 | minYear: number; 11 | maxYear: number; 12 | }; 13 | 14 | export default function Filter({ stats, minYear, maxYear }: FilterProps) { 15 | const [menuVisible, setMenuVisible] = useState(false); 16 | const [mainMenu, setMainMenu] = useState(''); 17 | const menuRef = useRef(null); 18 | 19 | // display or undisplay all menus 20 | const toggleMenus = () => { 21 | if (menuVisible) { 22 | setMainMenu(''); 23 | } 24 | setMenuVisible(!menuVisible); 25 | }; 26 | 27 | useClickAway(menuRef, () => { 28 | setMainMenu(''); 29 | setMenuVisible(false); 30 | }); 31 | 32 | return ( 33 |
37 | {menuVisible && ( 38 |
39 | {mainMenu && ( 40 | 48 | )} 49 |
55 | {mainMenu == 'Time' ? ( 56 | 57 | ) : ( 58 | 63 | )} 64 |
65 |
66 | )} 67 | 68 | 75 |
76 | ); 77 | } 78 | -------------------------------------------------------------------------------- /src/components/Sankey/compute.ts: -------------------------------------------------------------------------------- 1 | import { 2 | CROSS_LINK_KEYS, 3 | DIRECT_LINK_KEYS, 4 | YEAR_RANGE_KEY 5 | } from 'src/lib/consts'; 6 | import type { Filters, Link, Node } from 'src/@types/data'; 7 | import { scaleLinear } from 'd3'; 8 | import groupBy from 'lodash/groupBy'; 9 | import map from 'lodash/map'; 10 | import sortBy from 'lodash/sortBy'; 11 | 12 | export type Year = { 13 | value: number; 14 | type: string; 15 | idx: number; 16 | }; 17 | 18 | type Params = { 19 | data: any; 20 | minYear: number; 21 | maxYear: number; 22 | width: number; 23 | height: number; 24 | filters?: Filters; 25 | isMobile: boolean; 26 | yearStep: number; 27 | nodeGap: number; 28 | nodeWidth: number; 29 | gridGap: number; 30 | crossLinkTriangleSize: number; 31 | }; 32 | 33 | export const isDirectLink = (link: Link) => 34 | Object.values(DIRECT_LINK_KEYS).includes(link.type); 35 | export const isCrossLink = (link: Link) => 36 | Object.values(CROSS_LINK_KEYS).includes(link.type); 37 | 38 | function computeNodes(data: any, maxYear: number, filters?: Filters) { 39 | const rawNodes: Node[] = []; 40 | data.map((d: Node) => { 41 | d._filterOut = false; 42 | if (filters) { 43 | Object.keys(filters).map((k) => { 44 | if (k === YEAR_RANGE_KEY) { 45 | const [fromYear, toYear] = filters[k]; 46 | if (d.year_start < fromYear || d.year_finish > toYear) { 47 | d._filterOut = true; 48 | } 49 | } 50 | 51 | k in d && 52 | d[k].map((v: any) => { 53 | // filter out 54 | if (filters[k].has(v.title)) { 55 | d._filterOut = true; 56 | } 57 | }); 58 | }); 59 | } 60 | 61 | if (d.year_finish > maxYear) { 62 | d.year_finish = maxYear; // adjust max finish year to current year 63 | } 64 | d._color = d.column.color!; 65 | rawNodes.push(d); 66 | }); 67 | 68 | return groupBy(rawNodes, 'column.key'); 69 | } 70 | 71 | /** 72 | * Compute the count of nodes side by side. 73 | * @param nodes 74 | */ 75 | function computeNodesColumn(nodes: Node[], nodeGap: number) { 76 | // create a array to store the height of each column 77 | // the height = maximum value of `year_finish` of the node in current column, e.g. node._y0 78 | const columns: number[] = []; 79 | 80 | let p = 0; 81 | map(nodes, (node, i) => { 82 | if (i === 0) { 83 | columns.push(node._y0); 84 | node._column = 0; 85 | } else { 86 | let needNewColumn = true; 87 | for (let j = 0; j < columns.length; ++j) { 88 | // if current can join the exist column 89 | if (node._y1 < columns[j] - nodeGap) { 90 | p += 1; 91 | columns[j] = node._y0; 92 | node._column = j; 93 | needNewColumn = false; 94 | break; 95 | } 96 | } 97 | if (needNewColumn) { 98 | columns.push(node._y0); 99 | node._column = columns.length - 1; 100 | } 101 | } 102 | }); 103 | 104 | return columns.length; 105 | } 106 | 107 | /** 108 | * compute node's y0 y1 109 | * @param nodes 110 | * @param param 111 | * @returns 112 | */ 113 | function computeNodesYAxis( 114 | nodes: Node[], 115 | { minYear, maxYear, height, yearStep }: Params 116 | ) { 117 | const yScale = scaleLinear() 118 | .domain([minYear, maxYear + yearStep / 2]) 119 | .range([height, 0]); 120 | 121 | map(nodes, (node, i) => { 122 | node._y0 = yScale(node.year_finish); 123 | node._y1 = yScale(node.year_start); 124 | node._yMidPoint = (node._y0 + node._y1) / 2; 125 | node._height = Math.abs(node._y1 - node._y0); 126 | }); 127 | 128 | return nodes; 129 | } 130 | 131 | /** 132 | * Compute the nodes position in sankey layout. eg. xy axis position for nodes 133 | * like svg rect coordinates 134 | * (x0, y0) ---- (x1, y0) 135 | * | | 136 | * | | 137 | * | | 138 | * | | 139 | * (x0, y1) ---- (x1, y1) 140 | * @param rawNodes 141 | * @param columns 142 | * @param grids how many grids 143 | * @param grid which grid, one column one grid 144 | * @param width 145 | * @param height 146 | */ 147 | function computeNodesXAxis( 148 | nodes: Node[], 149 | columns: number, 150 | grids: number, 151 | grid: number, 152 | { width, nodeWidth, gridGap }: Params 153 | ) { 154 | const gridWidth = width / grids; 155 | const columnWidth = (gridWidth - gridGap) / columns; // width of each column 156 | 157 | map(nodes, (node, i) => { 158 | node._xMidPoint = 159 | columnWidth * node._column + 160 | columnWidth / 2 + 161 | grid * (gridWidth + gridGap / 2); 162 | node._x0 = node._xMidPoint - nodeWidth / 2; 163 | node._x1 = node._xMidPoint + nodeWidth / 2; 164 | node._width = nodeWidth; 165 | node._halfWidth = nodeWidth / 2; 166 | }); 167 | 168 | return nodes; 169 | } 170 | 171 | function computeLinks(nodes: Node[]) { 172 | const links: Link[] = []; 173 | const linksSet = new Set(); 174 | const nodesMap = new Map(nodes.map((node) => [node.id, node])); 175 | 176 | /** 177 | * push link to links 178 | * @param type link type 179 | * @param node 180 | * @param sourceBy 181 | * @param targetBy 182 | */ 183 | function pushLinks(type: string, node: Node, direction: string) { 184 | if (type in node) { 185 | map(node[type], (linkedNode) => { 186 | const source = direction == 'source' ? node.id : linkedNode.id; 187 | const target = direction == 'target' ? node.id : linkedNode.id; 188 | const targetNode = nodesMap.get(target); 189 | if (!linksSet.has(`${source}-${target}`)) { 190 | links.push({ 191 | source, 192 | target, 193 | type, 194 | sourceNode: direction == 'source' ? node : targetNode!, 195 | targetNode: direction == 'target' ? node : targetNode! 196 | }); 197 | linksSet.add(`${source}-${target}`); 198 | } 199 | }); 200 | } 201 | } 202 | 203 | map(nodes, (node) => { 204 | pushLinks(DIRECT_LINK_KEYS.source, node, 'source'); 205 | pushLinks(DIRECT_LINK_KEYS.target, node, 'target'); 206 | pushLinks(CROSS_LINK_KEYS.source, node, 'source'); 207 | pushLinks(CROSS_LINK_KEYS.target, node, 'target'); 208 | }); 209 | 210 | return links; 211 | } 212 | 213 | function computeLinksPosition(nodes: Node[], links: Link[], crossLinkTriangleSize: number) { 214 | const nodesMap = new Map(nodes.map((node) => [node.id, node])); 215 | 216 | map(links, (l) => { 217 | const { source: sourceNodeId, target: targetNodeId } = l; 218 | const s = nodesMap.get(sourceNodeId); // source node 219 | const t = nodesMap.get(targetNodeId); // target node 220 | // console.log(l, s, t) 221 | 222 | if (isDirectLink(l)) { 223 | // // solution 1 224 | // const controlNodeYAxis = (t!._y1 + s!._y0) / 2; 225 | 226 | // solution 2 227 | const controlNodeYAxis = (t!._y1 + s!._y1) / 2; 228 | 229 | /** 230 | * thickness not consistent 231 | */ 232 | // // solution 1 233 | // l.d = `M ${t?._x0} ${t?._y1} 234 | // C ${t?._x0} ${controlNodeYAxis}, ${s?._x0} ${controlNodeYAxis} 235 | // , ${s?._x0} ${s?._y0} 236 | // L ${s?._x1} ${s?._y0} 237 | // C ${s?._x1} ${controlNodeYAxis}, ${t?._x1} ${controlNodeYAxis} 238 | // , ${t?._x1} ${t?._y1} 239 | // Z`; 240 | 241 | // solution 2 242 | l.d = `M ${t?._x0} ${t?._y1} 243 | C ${t?._x0} ${controlNodeYAxis}, ${s?._x1} ${controlNodeYAxis} 244 | , ${s?._x0} ${s?._y1} 245 | L ${s?._x1} ${s?._y1} 246 | C ${s?._x1} ${controlNodeYAxis}, ${t?._x1} ${controlNodeYAxis} 247 | , ${t?._x1} ${t?._y1} 248 | Z`; 249 | 250 | /** thickness consistent */ 251 | // l.d = `M ${t?._xMidPoint} ${t?._y1} 252 | // C ${t?._xMidPoint} ${controlNodeYAxis}, ${s?._xMidPoint} ${controlNodeYAxis} 253 | // , ${s?._xMidPoint} ${s?._y0}`; 254 | // l.strokeWidth = s?._width; 255 | } 256 | 257 | if (isCrossLink(l)) { 258 | // solution 1 259 | const verticalPoint = '_yMidPoint'; 260 | 261 | // // solution 2 262 | // const verticalPoint = '_y1'; 263 | 264 | const controlNode = { 265 | x: (s!._xMidPoint + t!._xMidPoint) / 2, 266 | y: t![verticalPoint] 267 | }; 268 | 269 | l.d = `M ${s?._xMidPoint} ${s?._y1} 270 | Q ${controlNode.x} ${controlNode.y} 271 | , ${t?._xMidPoint} ${t![verticalPoint]}`; 272 | 273 | /** 274 | * all tangent == 0, because target's y axis == control node's y axis 275 | */ 276 | // const tan = Math.atan2( 277 | // Math.abs(t?._yMidPoint - controlNode.y), 278 | // Math.abs(t?._xMidPoint - controlNode.x) 279 | // ); 280 | 281 | const longSide = Math.cos(Math.PI / 3) * crossLinkTriangleSize; 282 | const shortSide = Math.sin(Math.PI / 6) * crossLinkTriangleSize; 283 | 284 | /** 285 | * just check the x axis 286 | */ 287 | const direction = controlNode.x > t!._xMidPoint ? 'left' : 'right'; 288 | if (direction === 'left') { 289 | l.triangle = `${t!._xMidPoint - longSide}, ${t![verticalPoint]} ${ 290 | t!._xMidPoint + shortSide 291 | }, ${t![verticalPoint] + longSide} ${t!._xMidPoint + shortSide}, ${ 292 | t![verticalPoint] - longSide 293 | }`; 294 | } else { 295 | l.triangle = `${t!._xMidPoint + longSide}, ${t![verticalPoint]} ${ 296 | t!._xMidPoint - shortSide 297 | }, ${t![verticalPoint] + longSide} ${t!._xMidPoint - shortSide}, ${ 298 | t![verticalPoint] - longSide 299 | }`; 300 | } 301 | 302 | // l.rotate = 303 | // (Math.atan2( 304 | // Math.abs(t!._yMidPoint - s!._yMidPoint), 305 | // Math.abs(s!._xMidPoint - t!._xMidPoint) 306 | // ) * 307 | // 180) / 308 | // Math.PI - 60; 309 | } 310 | }); 311 | 312 | return links; 313 | } 314 | 315 | export function transformToGraph(params: Params) { 316 | const { data, maxYear, filters, nodeGap, crossLinkTriangleSize } = params; 317 | 318 | // data quality check 319 | if (!data || !data.length) { 320 | console.error('no data'); 321 | return { nodes: [], links: [], crossLinks: [] }; 322 | } 323 | 324 | // compute nodes, clean nodes data 325 | const nodesGroupByColumn = computeNodes(data, maxYear, filters); 326 | const columns = Object.keys(nodesGroupByColumn); 327 | columns.sort(); 328 | 329 | let nodes: Node[] = []; 330 | columns.map((t, i) => { 331 | let tnodes = sortBy(nodesGroupByColumn[t], ['year_start']); // temp nodes of each column 332 | computeNodesYAxis(tnodes, params); 333 | const grids = computeNodesColumn(tnodes, nodeGap); 334 | computeNodesXAxis(tnodes, grids, columns.length, i, params); 335 | nodes = nodes.concat(tnodes); 336 | }); 337 | 338 | // compute links 339 | let links = computeLinks(nodes); 340 | links = computeLinksPosition(nodes, links, crossLinkTriangleSize); 341 | 342 | return { nodes, links }; 343 | } 344 | -------------------------------------------------------------------------------- /src/components/Sankey/index.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | CROSS_LINK_KEYS, 3 | DIRECT_LINK_KEYS, 4 | } from 'src/lib/consts'; 5 | import { useBreakpoint } from 'src/lib/hooks'; 6 | import { onKeyAction } from 'src/lib/utils'; 7 | import { useTimeline } from 'src/stores/useTimeline'; 8 | import type { Node } from 'src/@types/data'; 9 | import { useRouter } from 'next/router'; 10 | import { useState } from 'react'; 11 | import { isCrossLink, isDirectLink, transformToGraph } from './compute'; 12 | 13 | export type SankeyProps = { 14 | data: any; 15 | width?: number; 16 | height?: number; 17 | minYear: number; 18 | maxYear: number; 19 | yearStep: number; 20 | nodeGap: number; 21 | nodeTitleGap: number; 22 | nodeWidth: number; 23 | gridGap: number; 24 | linkDefaultColor: string; 25 | crossLinkStrokeDashArray: number; 26 | crossLinkTriangleSize: number; 27 | containerProps?: any; 28 | }; 29 | 30 | const isFilterOut = (node: Node) => (node._filterOut ? 0.2 : 1); 31 | 32 | const STORE_SLICES = { 33 | updateLayout: (s: any) => s.update, 34 | filters: (s: any) => s.filters 35 | }; 36 | 37 | /** 38 | * ### Sankey component 39 | */ 40 | export default function Sankey({ 41 | data, 42 | width, 43 | height, 44 | minYear, 45 | maxYear, 46 | yearStep, 47 | nodeGap, 48 | nodeTitleGap, 49 | nodeWidth, 50 | linkDefaultColor, 51 | crossLinkStrokeDashArray, 52 | crossLinkTriangleSize, 53 | gridGap, 54 | containerProps, 55 | }: SankeyProps) { 56 | const router = useRouter(); 57 | const isMobile = useBreakpoint('(max-width: 480px)'); 58 | const [hoveredNodes, setHoveredNodes] = useState(new Set()); 59 | const [highlightedNodes, setHighlightedNodes] = useState(new Set()); 60 | const filters = useTimeline(STORE_SLICES.filters); 61 | 62 | if (!width || !height) { 63 | return null; 64 | } 65 | 66 | const { nodes, links } = transformToGraph({ 67 | data, 68 | minYear, 69 | maxYear, 70 | width, 71 | height, 72 | filters, 73 | isMobile, 74 | yearStep, 75 | nodeGap, 76 | nodeWidth, 77 | gridGap, 78 | crossLinkTriangleSize 79 | }); 80 | 81 | const onNodeHover = (node: Node) => () => { 82 | const highlightedNodes = new Set(); 83 | highlightedNodes.add(node.id); 84 | const hoveredNodes = new Set(); 85 | hoveredNodes.add(node.id); 86 | setHoveredNodes(hoveredNodes); 87 | 88 | [...Object.values(CROSS_LINK_KEYS), ...Object.values(DIRECT_LINK_KEYS)].map( 89 | (k) => { 90 | node[k].map((n: Node) => highlightedNodes.add(n.id)); 91 | } 92 | ); 93 | setHighlightedNodes(highlightedNodes); 94 | }; 95 | 96 | const clearNodeHover = () => { 97 | setHoveredNodes(new Set()); 98 | setHighlightedNodes(new Set()); 99 | }; 100 | 101 | const nodeColor = (node: Node) => 102 | highlightedNodes.size 103 | ? highlightedNodes.has(node.id) 104 | ? isFilterOut(node) 105 | : 0.05 106 | : isFilterOut(node); 107 | 108 | const handleNodeClick = (node: Node) => (e: any) => { 109 | e.preventDefault(); 110 | router.push(node.slug); 111 | }; 112 | 113 | return ( 114 |
115 | 116 | 117 | {links 118 | .filter((l) => isDirectLink(l)) 119 | .map((l, i) => ( 120 | 134 | ))} 135 | 136 | 137 | {nodes.map((node, i) => ( 138 | 145 | 152 | 160 | router.push(node.slug) 161 | )} 162 | tabIndex={0} 163 | aria-label={node.name} 164 | > 165 |
166 |

175 | {node.name} 176 |

177 |
178 |
179 |
180 | ))} 181 |
182 | 183 | {links 184 | .filter((l) => isCrossLink(l)) 185 | .map((l, i) => ( 186 | 187 | 203 | 218 | 219 | ))} 220 | 221 |
222 |
223 | ); 224 | } 225 | -------------------------------------------------------------------------------- /src/components/Timeline/DesktopView.tsx: -------------------------------------------------------------------------------- 1 | import FilterBar from 'src/components/FilterBar'; 2 | import Sankey from 'src/components/Sankey'; 3 | import Years from 'src/components/Years'; 4 | import Zoom from 'src/components/Zoom'; 5 | import { useEffect, useMemo, useState } from 'react'; 6 | import { useResizeDetector } from 'react-resize-detector'; 7 | import { computeCanvasSize, computeStats } from './compute'; 8 | import { TimelineProps } from 'src/@types/data'; 9 | 10 | const DesktopView = ({ data, visParams }: TimelineProps) => { 11 | const { 12 | yearStep, 13 | yearHeight: desktopYearHeight, 14 | nodeGap, 15 | nodeTitleGap, 16 | nodeWidth, 17 | linkDefaultColor, 18 | crossLinkStrokeDashArray, 19 | crossLinkTriangleSize, 20 | gridGap 21 | } = visParams; 22 | const [yearHeight, setYearHeight] = useState(desktopYearHeight); 23 | useEffect(() => { 24 | setYearHeight(desktopYearHeight); 25 | }, [desktopYearHeight]); 26 | 27 | const { minYear, maxYear, canvasHeight } = computeCanvasSize( 28 | data, 29 | yearHeight, 30 | yearStep 31 | ); 32 | const stats = useMemo(() => computeStats(data), [data]); 33 | 34 | const { width, ref } = useResizeDetector({ 35 | handleHeight: false 36 | }); 37 | 38 | return ( 39 | <> 40 | 46 |
51 | 66 |
67 | 68 | 69 | 70 | ); 71 | }; 72 | 73 | export default DesktopView; 74 | -------------------------------------------------------------------------------- /src/components/Timeline/MobileView.tsx: -------------------------------------------------------------------------------- 1 | import Sankey from 'src/components/Sankey'; 2 | import Years from 'src/components/Years'; 3 | import { useMemo, useState } from 'react'; 4 | import { useResizeDetector } from 'react-resize-detector'; 5 | import { useSwipeable } from 'react-swipeable'; 6 | import { LeftButton, RightButton } from './buttons'; 7 | import { computeCanvasSize, computeStats } from './compute'; 8 | import { TimelineProps } from 'src/@types/data'; 9 | 10 | const MobileView = ({ data, visParams }: TimelineProps) => { 11 | const { 12 | yearStep, 13 | mobileYearHeight, 14 | nodeGap, 15 | nodeTitleGap, 16 | mobileNodeWidth, 17 | linkDefaultColor, 18 | crossLinkStrokeDashArray, 19 | crossLinkTriangleSize, 20 | gridGap 21 | } = visParams; 22 | const [viewCursor, setViewCursor] = useState(0); 23 | const { minYear, maxYear, canvasHeight } = computeCanvasSize( 24 | data, 25 | mobileYearHeight, 26 | yearStep 27 | ); 28 | const stats = useMemo(() => computeStats(data), [data]); 29 | const views = [...Array.from(stats.columns)].sort(); 30 | 31 | const { width, ref } = useResizeDetector({ 32 | handleHeight: false 33 | }); 34 | 35 | const slideLeft = () => { 36 | if (viewCursor >= views.length - 1) return; 37 | setViewCursor(viewCursor + 1); 38 | }; 39 | const slideRight = () => { 40 | if (viewCursor <= 0) return; 41 | setViewCursor(viewCursor - 1); 42 | }; 43 | 44 | const handlers = useSwipeable({ 45 | onSwipedLeft: (e) => slideLeft(), 46 | onSwipedRight: (e) => slideRight(), 47 | // preventDefaultTouchmoveEvent: true, 48 | trackMouse: true 49 | }); 50 | 51 | return ( 52 | <> 53 | 59 |
63 |
64 | 85 |
86 |
87 |
88 | slideRight()} /> 89 | {(views as any)[viewCursor]} 90 | slideLeft()} /> 91 |
92 | 93 | ); 94 | }; 95 | 96 | export default MobileView; 97 | -------------------------------------------------------------------------------- /src/components/Timeline/buttons.tsx: -------------------------------------------------------------------------------- 1 | export const LeftButton = (props: any) => ( 2 | 14 | ); 15 | 16 | export const RightButton = (props: any) => ( 17 | 30 | ); 31 | -------------------------------------------------------------------------------- /src/components/Timeline/compute.ts: -------------------------------------------------------------------------------- 1 | import type { Data } from 'src/@types/data'; 2 | 3 | /** 4 | * calculate year's range, return maxYear and minYear 5 | * @param data 6 | * @returns 7 | */ 8 | export function yearRange(data: Data[]) { 9 | let minYear = Infinity; 10 | let maxYear = -Infinity; 11 | data.map((d: Data) => { 12 | if (minYear > d.year_start) minYear = d.year_start; 13 | if (maxYear < d.year_finish) maxYear = d.year_finish; 14 | }); 15 | 16 | const currentYear = new Date().getFullYear(); 17 | if (maxYear > currentYear) { 18 | maxYear = currentYear; 19 | } 20 | 21 | return { minYear, maxYear }; 22 | } 23 | 24 | /** 25 | * compute the canvas height 26 | * @param { minYear, maxYear } 27 | * @returns 28 | */ 29 | export function computeCanvasHeight({ 30 | minYear, 31 | maxYear, 32 | yearHeight, 33 | yearStep 34 | }: { 35 | minYear: number; 36 | maxYear: number; 37 | yearHeight: number; 38 | yearStep: number; 39 | }): number { 40 | return ((maxYear - minYear) / yearStep + 1) * yearHeight; 41 | } 42 | 43 | export function computeCanvasSize( 44 | data: Data[], 45 | yearHeight: number, 46 | yearStep: number 47 | ) { 48 | if (!data || !data.length) { 49 | console.error('No data'); 50 | } 51 | 52 | const { minYear, maxYear } = yearRange(data); 53 | const canvasHeight = computeCanvasHeight({ 54 | minYear, 55 | maxYear, 56 | yearHeight, 57 | yearStep 58 | }); 59 | return { minYear, maxYear, canvasHeight }; 60 | } 61 | 62 | export function computeStats(data: Data[]) { 63 | const tags = new Set(); 64 | const categories = new Set(); 65 | const columns = new Set(); 66 | 67 | data.map((d) => { 68 | d.tags.map((t) => tags.add(t.title)); 69 | d.categories.map((t) => categories.add(t.title)); 70 | columns.add(d.column.title); 71 | }); 72 | 73 | return { tags, categories, columns }; 74 | } 75 | -------------------------------------------------------------------------------- /src/components/Timeline/index.tsx: -------------------------------------------------------------------------------- 1 | import { TimelineProps } from 'src/@types/data'; 2 | import DesktopView from './DesktopView'; 3 | import MobileView from './MobileView'; 4 | 5 | type Props = TimelineProps & { 6 | isMobile: boolean; 7 | }; 8 | 9 | /** 10 | * ### Timeline visualization component 11 | */ 12 | export function Timeline({ data, visParams, isMobile }: Props) { 13 | return ( 14 |
15 | {isMobile ? ( 16 | 17 | ) : ( 18 | 19 | )} 20 |
21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /src/components/Years/index.tsx: -------------------------------------------------------------------------------- 1 | import range from 'lodash/range'; 2 | import type { HTMLProps } from 'react'; 3 | 4 | export type YearsProps = { 5 | yearHeight: number; 6 | minYear: number; 7 | maxYear: number; 8 | yearStep: number; 9 | } & HTMLProps; 10 | 11 | export default function Years({ 12 | yearHeight, 13 | minYear, 14 | maxYear, 15 | yearStep, 16 | }: YearsProps) { 17 | const years = range(minYear, maxYear, yearStep).reverse(); 18 | 19 | return ( 20 |
21 | {years.map((y: any, i: number) => ( 22 |
30 | 31 | {`${y}s`} 32 | 33 |
34 | ))} 35 |
36 | ); 37 | } 38 | -------------------------------------------------------------------------------- /src/components/Zoom/index.tsx: -------------------------------------------------------------------------------- 1 | import { MAX_YEAR_HEIGHT, MIN_YEAR_HEIGHT } from 'src/lib/consts'; 2 | 3 | export default function Zoom({ yearHeight, setYearHeight }: { 4 | yearHeight: number; 5 | setYearHeight: (yearHeight: number) => void; 6 | }) { 7 | const zoomOut = () => { 8 | if (yearHeight / 1.5 > MIN_YEAR_HEIGHT) setYearHeight(yearHeight / 1.5); 9 | }; 10 | 11 | const zoomIn = () => { 12 | if (yearHeight * 1.5 < MAX_YEAR_HEIGHT) setYearHeight(yearHeight * 1.5); 13 | }; 14 | 15 | return ( 16 |
17 | 23 | 29 |
30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /src/lib/consts.ts: -------------------------------------------------------------------------------- 1 | export const BREAKPOINTS = { 2 | sm: '640px', 3 | md: '768px', 4 | lg: '1024px', 5 | xl: '1280px', 6 | '2xl': '1536px', 7 | '3xl': '2000px' 8 | }; 9 | 10 | export const MAX_YEAR_HEIGHT: number = 200; // max height of per year, for zoom function 11 | export const MIN_YEAR_HEIGHT: number = 40; // min height of per year, for zoom function 12 | export const YEAR_RANGE_KEY: string = 'yearRange'; 13 | 14 | export const DIRECT_LINK_KEYS = { 15 | source: 'influenced', 16 | target: 'influenced_by' 17 | }; 18 | export const CROSS_LINK_KEYS = { 19 | source: 'cross_influenced', 20 | target: 'cross_influenced_by' 21 | }; 22 | -------------------------------------------------------------------------------- /src/lib/dataGenerator.ts: -------------------------------------------------------------------------------- 1 | function getRandomInt(min: number, max: number): number { 2 | min = Math.ceil(min); 3 | max = Math.floor(max); 4 | return Math.floor(Math.random() * (max - min) + min); //The maximum is exclusive and the minimum is inclusive 5 | } 6 | 7 | function randomLink(linkMaxCount: number, nodes: number[]) { 8 | const count = getRandomInt(0, linkMaxCount); 9 | return new Array(count).fill(0).map(() => ({ 10 | id: nodes[getRandomInt(0, nodes.length)] 11 | })); 12 | } 13 | 14 | export default function dataGenerator( 15 | count: number, 16 | yearRange: number[], 17 | tagMaxCount: number, 18 | categoryMaxCount: number, 19 | columnCount: number, 20 | colors: string[], 21 | influencedMaxCount: number, 22 | influencedByMaxCount: number, 23 | crossInfluencedMaxCount: number, 24 | crossInfluencedByMaxCount: number 25 | ) { 26 | const data = []; 27 | const nodeIdsGroupByColumn = new Array(columnCount) 28 | .fill(0) 29 | .map((): number[] => []); 30 | 31 | for (let i = 0; i < count; i++) { 32 | const year1 = getRandomInt(yearRange[0], yearRange[1]); 33 | const year2 = getRandomInt(yearRange[0], yearRange[1]); 34 | const column = getRandomInt(0, columnCount); 35 | nodeIdsGroupByColumn[column].push(i); 36 | const tagCount = getRandomInt(0, tagMaxCount); 37 | const tags = new Array(tagCount).fill(0).map(() => ({ 38 | title: `Tag ${getRandomInt(0, tagMaxCount)}` 39 | })); 40 | const categoryCount = getRandomInt(0, categoryMaxCount); 41 | const categories = new Array(categoryCount).fill(0).map(() => ({ 42 | title: `Category ${getRandomInt(0, categoryMaxCount)}` 43 | })); 44 | 45 | data.push({ 46 | id: i, 47 | name: `Node Name ${i}`, 48 | slug: `https://github.com/geekplux/timeline-sankey`, 49 | description: `Node description ${i}`, 50 | year_start: year1 < year2 ? year1 : year2, 51 | year_finish: year1 < year2 ? year2 : year1, 52 | column: { 53 | key: column, 54 | title: `Column Title ${column}`, 55 | color: colors[column] 56 | }, 57 | tags, 58 | categories 59 | }); 60 | } 61 | 62 | return data.map((d: any) => { 63 | const column = d.column.key; 64 | const sameColumnNodes = nodeIdsGroupByColumn[column]; 65 | const otherColumnNodes = nodeIdsGroupByColumn 66 | .filter((_, index) => index !== column) 67 | .reduce((a, b) => a.concat(b), []); 68 | 69 | d.influenced = randomLink(influencedMaxCount, sameColumnNodes); 70 | d.influenced_by = randomLink(influencedByMaxCount, sameColumnNodes); 71 | d.cross_influenced = randomLink(crossInfluencedMaxCount, otherColumnNodes); 72 | d.cross_influenced_by = randomLink( 73 | crossInfluencedByMaxCount, 74 | otherColumnNodes 75 | ); 76 | return d; 77 | }); 78 | } 79 | -------------------------------------------------------------------------------- /src/lib/hooks.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { useMediaQuery } from 'react-responsive'; 3 | 4 | /** 5 | * Patched useMediaQuery for SSR 6 | * Until https://github.com/contra/react-responsive/issues/162 resolved 7 | */ 8 | export function useBreakpoint( 9 | query: string, 10 | fallback = true, 11 | callback?: () => any 12 | ) { 13 | const [browserFlushed, setBrowserFlushed] = useState(false); 14 | const matched = useMediaQuery({ query }, undefined, callback); 15 | useEffect(() => setBrowserFlushed(true), []); 16 | 17 | if (typeof window !== 'undefined' && browserFlushed) { 18 | return matched; 19 | } 20 | return fallback; 21 | } 22 | 23 | /** 24 | * Set styles on a page and remove on dismount 25 | */ 26 | export function usePageStyles(styles: object) { 27 | useEffect(() => { 28 | Object.keys(styles).forEach((style) => { 29 | document.body.style[style as any] = styles[style as keyof typeof styles]; 30 | }); 31 | 32 | return () => 33 | Object.keys(styles).forEach((style) => { 34 | document.body.style.removeProperty(style); 35 | }); 36 | }, [styles]); 37 | } 38 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import type { KeyboardEvent } from 'react'; 2 | 3 | /** 4 | * Simple fetch wrapper for JSON GETs 5 | */ 6 | export function fetchJSON(url: string) { 7 | return fetch(url).then((res) => res.json()); 8 | } 9 | 10 | /** 11 | * Call a funciton on enter/space 12 | */ 13 | export const onKeyAction = (cb: () => void) => (e: KeyboardEvent) => { 14 | if (e.key === 'Enter' || e.key === ' ') { 15 | cb(); 16 | } 17 | }; 18 | 19 | /** 20 | * Naive utility to strip HTML tags from a string 21 | * @param html HTML string 22 | */ 23 | export function plaintext(html: string) { 24 | return html?.replace(/<[^>]*>?/gm, ''); 25 | } 26 | 27 | /** 28 | * Resole relative URLs against a source 29 | * @param link URL to resolve 30 | * @param source Source URL to resolve against 31 | */ 32 | export function resolveUrl(link: string, source: string) { 33 | return !/^https?:\/\//i.test(link) ? new URL(link, source).href : link; 34 | } 35 | 36 | /** 37 | * Helper to update CSS variables 38 | * @param properties Object of CSS properties 39 | */ 40 | export function setProperties(properties: any) { 41 | Object.keys(properties).forEach((property: string) => 42 | document.documentElement.style.setProperty(property, properties[property]) 43 | ); 44 | } 45 | -------------------------------------------------------------------------------- /src/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import 'src/styles/globals.css' 2 | import type { AppProps } from 'next/app' 3 | 4 | function MyApp({ Component, pageProps }: AppProps) { 5 | return 6 | } 7 | 8 | export default MyApp 9 | -------------------------------------------------------------------------------- /src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { Timeline } from 'src/components/Timeline'; 3 | import { Data } from 'src/@types/data'; 4 | import { useControls } from 'leva'; 5 | import dataGenerator from 'src/lib/dataGenerator'; 6 | import { Leva } from 'leva'; 7 | import { MAX_YEAR_HEIGHT, MIN_YEAR_HEIGHT } from 'src/lib/consts'; 8 | import { BREAKPOINTS } from 'src/lib/consts'; 9 | import { useBreakpoint } from 'src/lib/hooks'; 10 | 11 | /** 12 | * Timeline page 13 | */ 14 | export default function TimelinePage() { 15 | const [data, setData] = useState([]); 16 | const isMobile = useBreakpoint(`(max-width: ${BREAKPOINTS.lg})`); 17 | const visParams = useControls('Visualization Parameters', { 18 | yearStep: { 19 | value: 10, 20 | min: 5, 21 | max: 50, 22 | step: 5 23 | }, 24 | yearHeight: { 25 | value: 60, // height of per year 26 | min: MIN_YEAR_HEIGHT, 27 | max: MAX_YEAR_HEIGHT, 28 | step: 10 29 | }, 30 | nodeWidth: { 31 | value: 12, 32 | min: 5, 33 | max: 30, 34 | step: 1 35 | }, 36 | linkDefaultColor: 'rgba(220, 220, 220, 1)', 37 | gridGap: { 38 | value: 80, 39 | min: 20, 40 | max: 200, 41 | step: 5 42 | }, 43 | nodeGap: { 44 | value: 30, // the minimum gap height between nodes in each column. which is for the space of node title, unit: pixel 45 | min: 10, 46 | max: 60, 47 | step: 5 48 | }, 49 | nodeTitleGap: { 50 | value: 30, // the vertical gap height between node and its title, unit: pixel 51 | min: 10, 52 | max: 50, 53 | step: 5 54 | }, 55 | crossLinkStrokeDashArray: { 56 | value: 1, 57 | min: 1, 58 | max: 20, 59 | step: 1 60 | }, 61 | crossLinkTriangleSize: { 62 | value: 7, 63 | min: 5, 64 | max: 20, 65 | step: 1 66 | }, 67 | mobileYearHeight: { 68 | value: 50, // height of per year 69 | min: 20, 70 | max: 100, 71 | step: 5 72 | }, 73 | mobileNodeWidth: { 74 | value: 8, 75 | min: 3, 76 | max: 30, 77 | step: 1 78 | } 79 | }); 80 | 81 | const { 82 | nodeCount, 83 | yearRange, 84 | tagMaxCount, 85 | categoryMaxCount, 86 | columnCount, 87 | color1, 88 | color2, 89 | color3, 90 | color4, 91 | color5, 92 | influencedMaxCount, 93 | influencedByMaxCount, 94 | crossInfluencedMaxCount, 95 | crossInfluencedByMaxCount 96 | } = useControls( 97 | 'Random Data Generation Parameters', 98 | { 99 | nodeCount: { 100 | value: 40, 101 | min: 10, 102 | max: 100, 103 | step: 10 104 | }, 105 | yearRange: { 106 | min: 1600, 107 | max: 2022, 108 | value: [1800, 2022] 109 | }, 110 | columnCount: { 111 | value: 3, 112 | min: 2, 113 | max: 5, 114 | step: 1 115 | }, 116 | tagMaxCount: 10, 117 | categoryMaxCount: 10, 118 | color1: { value: 'peru', render: (get) => get('columnCount') >= 1 }, 119 | color2: { value: 'lightpink', render: (get) => get('columnCount') >= 2 }, 120 | color3: { value: 'steelblue', render: (get) => get('columnCount') >= 3 }, 121 | color4: { value: 'red', render: (get) => get('columnCount') >= 4 }, 122 | color5: { value: 'limegreen', render: (get) => get('columnCount') >= 5 }, 123 | influencedMaxCount: 3, 124 | influencedByMaxCount: 3, 125 | crossInfluencedMaxCount: 6, 126 | crossInfluencedByMaxCount: 6 127 | }, 128 | { 129 | collapsed: true 130 | } 131 | ); 132 | 133 | useEffect(() => { 134 | setData( 135 | dataGenerator( 136 | nodeCount, 137 | yearRange, 138 | tagMaxCount, 139 | categoryMaxCount, 140 | columnCount, 141 | [color1, color2, color3, color4, color5], 142 | influencedMaxCount, 143 | influencedByMaxCount, 144 | crossInfluencedMaxCount, 145 | crossInfluencedByMaxCount 146 | ) 147 | ); 148 | }, [ 149 | nodeCount, 150 | yearRange, 151 | tagMaxCount, 152 | categoryMaxCount, 153 | columnCount, 154 | color1, 155 | color2, 156 | color3, 157 | color4, 158 | color5, 159 | influencedMaxCount, 160 | influencedByMaxCount, 161 | crossInfluencedMaxCount, 162 | crossInfluencedByMaxCount 163 | ]); 164 | 165 | return ( 166 | <> 167 | 168 | 175 | 176 | ); 177 | } 178 | -------------------------------------------------------------------------------- /src/stores/useTimeline.ts: -------------------------------------------------------------------------------- 1 | import create from 'zustand'; 2 | 3 | type Filters = { 4 | tags?: Set; 5 | categories?: Set; 6 | yearRange?: string[]; 7 | }; 8 | type UseTimeline = { 9 | filters: Filters; 10 | setFilters(filters: Filters): void; 11 | }; 12 | 13 | export const useTimeline = create((set) => { 14 | return { 15 | filters: {}, 16 | setFilters: (filters) => set({ filters }) 17 | }; 18 | }); 19 | -------------------------------------------------------------------------------- /src/styles/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | html, 6 | body { 7 | padding: 0; 8 | margin: 0; 9 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, 10 | Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; 11 | } 12 | 13 | a { 14 | color: inherit; 15 | text-decoration: none; 16 | } 17 | 18 | * { 19 | box-sizing: border-box; 20 | } 21 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: [ 3 | './src/pages/**/*.{js,ts,jsx,tsx}', 4 | './src/components/**/*.{js,ts,jsx,tsx}', 5 | ], 6 | theme: { 7 | extend: {}, 8 | }, 9 | plugins: [], 10 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "baseUrl": "." 18 | }, 19 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "src", "src/@types"], 20 | "exclude": ["node_modules"] 21 | } 22 | --------------------------------------------------------------------------------