├── .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 | 
29 |
30 | Interaction on desktop view
31 |
32 | 
33 |
34 | #### Mobile View
35 |
36 |
37 |

38 |

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 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------