├── .eslintrc.cjs ├── .gitignore ├── .prettierignore ├── README.md ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── prettier.config.cjs ├── public ├── favicon.svg └── logo.svg ├── screenshot.png ├── src ├── App.tsx ├── components │ ├── code-mind.tsx │ ├── color-picker.tsx │ ├── editable-node.tsx │ ├── mind-container.tsx │ ├── mind-control.tsx │ ├── mind-edge.tsx │ ├── mind-node.tsx │ └── monacoWorker.ts ├── consts.ts ├── global.d.ts ├── hooks │ ├── useFocusState.ts │ └── useSelectState.ts ├── lib │ ├── save.ts │ └── storage.ts ├── main.tsx ├── share.ts ├── styles │ ├── index.scss │ ├── mind-node.scss │ └── monaco.scss ├── svgs │ ├── bold.svg │ ├── brush.svg │ ├── center.svg │ ├── italic.svg │ ├── strike-through.svg │ ├── zoom-in.svg │ └── zoom-out.svg ├── themes │ └── sunset │ │ ├── goose-1.svg │ │ ├── goose-2.svg │ │ ├── islet.svg │ │ ├── scene.tsx │ │ ├── sun.svg │ │ ├── wave-deep.svg │ │ └── wave-shallow.svg ├── utils.ts └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-undef 2 | module.exports = { 3 | env: { browser: true, es2020: true }, 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended'], 5 | parser: '@typescript-eslint/parser', 6 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, 7 | plugins: ['react-refresh'], 8 | rules: { 9 | 'react-refresh/only-export-components': 'warn', 10 | '@typescript-eslint/no-non-null-assertion': 'off', 11 | '@typescript-eslint/no-unsafe-call': 'off', 12 | '@typescript-eslint/no-unsafe-assignment': 'off', 13 | 'no-unused-vars': 'off', 14 | '@typescript-eslint/no-unused-vars': 'off', 15 | '@typescript-eslint/no-unsafe-member-access': 'off', 16 | '@typescript-eslint/ban-ts-comment': 'off', 17 | '@typescript-eslint/no-unsafe-argument': 'off', 18 | 'react-hooks/exhaustive-deps': 'off', 19 | '@typescript-eslint/no-empty-function': 'off', 20 | '@typescript-eslint/no-extra-semi': 'off' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | package-lock.json 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Code Mind](./screenshot.png) 2 | 3 |
4 | Online mind mapping that supports code writing, single and native. 5 |
6 | 7 | ## Start 8 | 9 | - Windows/Mouse: Hold the middle mouse button to move the view. 10 | - MacBook/Trackpad: Slide two fingers on the touchpad as usual to move the view. 11 | - Press `Tab` to generate a child node. 12 | - Press `Enter` to generate a sibling node. 13 | - Double click node to edit. 14 | - Type `/code` to switch to a code node (ts). 15 | - Use Ctrl/Command + s to save to local storage. 16 | 17 | ## To Do 18 | 19 | - [x] Background 20 | - [x] Scalable and movable 21 | - [x] Generate child nodes and sibling nodes 22 | - [x] Connection lines 23 | - [x] Styles are managed through context 24 | - [x] Fixed connection line 01 25 | - [x] Focus on newly generated node 26 | - [x] More connection line styles 27 | - bezier 28 | - right-angle 29 | - straight-with-handle 30 | - straight 31 | - [x] Optimise writing node 32 | - [x] Editable content 33 | - [x] Deletion 34 | - [x] Code(Monaco) 35 | - [x] Mouse/Touchpad, Window/Macbook (Figma-like control) 36 | - [ ] Point Zoom 37 | - Transition 38 | - [x] Scale 39 | - [x] Save feature 40 | - [ ] Resize node 41 | - [x] Controls 42 | - [ ] Customize node 43 | - [ ] Themes 44 | - [ ] Export/Import 45 | - [ ] Undo/Redo 46 | - [ ] Box selection 47 | - [ ] Draggable 48 | - [ ] Restyle 49 | - [ ] EN/ZH 50 | - [ ] AI? 51 | - [ ] Markdown 52 | - [ ] Mobile frendly 53 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Code Mind 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "code-mind", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview", 11 | "format": "prettier --write ." 12 | }, 13 | "dependencies": { 14 | "@react-spring/web": "^9.7.3", 15 | "@use-gesture/react": "^10.2.27", 16 | "clsx": "^2.0.0", 17 | "monaco-editor": "0.40.0", 18 | "react": "^18.2.0", 19 | "react-dom": "^18.2.0", 20 | "react-textarea-autosize": "^8.5.2", 21 | "sonner": "^0.6.2", 22 | "vite-plugin-svgr": "^3.2.0", 23 | "vite-tsconfig-paths": "^4.2.0", 24 | "zustand": "^4.4.1" 25 | }, 26 | "devDependencies": { 27 | "@types/react": "^18.0.37", 28 | "@types/react-dom": "^18.0.11", 29 | "@typescript-eslint/eslint-plugin": "^5.59.0", 30 | "@typescript-eslint/parser": "^5.59.0", 31 | "@vitejs/plugin-react-swc": "^3.0.0", 32 | "autoprefixer": "^10.4.14", 33 | "eslint": "^8.38.0", 34 | "eslint-plugin-react-hooks": "^4.6.0", 35 | "eslint-plugin-react-refresh": "^0.3.4", 36 | "postcss": "^8.4.24", 37 | "prettier-plugin-tailwindcss": "^0.2.8", 38 | "sass": "^1.63.4", 39 | "tailwindcss": "^3.3.2", 40 | "typescript": "^5.0.2", 41 | "vite": "^4.3.9" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@react-spring/web': 9 | specifier: ^9.7.3 10 | version: 9.7.3(react-dom@18.2.0)(react@18.2.0) 11 | '@use-gesture/react': 12 | specifier: ^10.2.27 13 | version: 10.2.27(react@18.2.0) 14 | clsx: 15 | specifier: ^2.0.0 16 | version: 2.0.0 17 | monaco-editor: 18 | specifier: 0.40.0 19 | version: 0.40.0 20 | react: 21 | specifier: ^18.2.0 22 | version: 18.2.0 23 | react-dom: 24 | specifier: ^18.2.0 25 | version: 18.2.0(react@18.2.0) 26 | react-textarea-autosize: 27 | specifier: ^8.5.2 28 | version: 8.5.2(@types/react@18.2.12)(react@18.2.0) 29 | sonner: 30 | specifier: ^0.6.2 31 | version: 0.6.2(react-dom@18.2.0)(react@18.2.0) 32 | vite-plugin-svgr: 33 | specifier: ^3.2.0 34 | version: 3.2.0(vite@4.3.9) 35 | vite-tsconfig-paths: 36 | specifier: ^4.2.0 37 | version: 4.2.0(typescript@5.1.3)(vite@4.3.9) 38 | zustand: 39 | specifier: ^4.4.1 40 | version: 4.4.1(@types/react@18.2.12)(react@18.2.0) 41 | 42 | devDependencies: 43 | '@types/react': 44 | specifier: ^18.0.37 45 | version: 18.2.12 46 | '@types/react-dom': 47 | specifier: ^18.0.11 48 | version: 18.2.5 49 | '@typescript-eslint/eslint-plugin': 50 | specifier: ^5.59.0 51 | version: 5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3) 52 | '@typescript-eslint/parser': 53 | specifier: ^5.59.0 54 | version: 5.59.11(eslint@8.42.0)(typescript@5.1.3) 55 | '@vitejs/plugin-react-swc': 56 | specifier: ^3.0.0 57 | version: 3.3.2(vite@4.3.9) 58 | autoprefixer: 59 | specifier: ^10.4.14 60 | version: 10.4.14(postcss@8.4.24) 61 | eslint: 62 | specifier: ^8.38.0 63 | version: 8.42.0 64 | eslint-plugin-react-hooks: 65 | specifier: ^4.6.0 66 | version: 4.6.0(eslint@8.42.0) 67 | eslint-plugin-react-refresh: 68 | specifier: ^0.3.4 69 | version: 0.3.5(eslint@8.42.0) 70 | postcss: 71 | specifier: ^8.4.24 72 | version: 8.4.24 73 | prettier-plugin-tailwindcss: 74 | specifier: ^0.2.8 75 | version: 0.2.8(prettier@2.8.8) 76 | sass: 77 | specifier: ^1.63.4 78 | version: 1.63.4 79 | tailwindcss: 80 | specifier: ^3.3.2 81 | version: 3.3.2 82 | typescript: 83 | specifier: ^5.0.2 84 | version: 5.1.3 85 | vite: 86 | specifier: ^4.3.9 87 | version: 4.3.9(sass@1.63.4) 88 | 89 | packages: 90 | 91 | /@alloc/quick-lru@5.2.0: 92 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 93 | engines: {node: '>=10'} 94 | dev: true 95 | 96 | /@ampproject/remapping@2.2.1: 97 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 98 | engines: {node: '>=6.0.0'} 99 | dependencies: 100 | '@jridgewell/gen-mapping': 0.3.3 101 | '@jridgewell/trace-mapping': 0.3.18 102 | dev: false 103 | 104 | /@babel/code-frame@7.22.10: 105 | resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} 106 | engines: {node: '>=6.9.0'} 107 | dependencies: 108 | '@babel/highlight': 7.22.10 109 | chalk: 2.4.2 110 | dev: false 111 | 112 | /@babel/compat-data@7.22.9: 113 | resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} 114 | engines: {node: '>=6.9.0'} 115 | dev: false 116 | 117 | /@babel/core@7.22.10: 118 | resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} 119 | engines: {node: '>=6.9.0'} 120 | dependencies: 121 | '@ampproject/remapping': 2.2.1 122 | '@babel/code-frame': 7.22.10 123 | '@babel/generator': 7.22.10 124 | '@babel/helper-compilation-targets': 7.22.10 125 | '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) 126 | '@babel/helpers': 7.22.10 127 | '@babel/parser': 7.22.10 128 | '@babel/template': 7.22.5 129 | '@babel/traverse': 7.22.10 130 | '@babel/types': 7.22.10 131 | convert-source-map: 1.9.0 132 | debug: 4.3.4 133 | gensync: 1.0.0-beta.2 134 | json5: 2.2.3 135 | semver: 6.3.1 136 | transitivePeerDependencies: 137 | - supports-color 138 | dev: false 139 | 140 | /@babel/generator@7.22.10: 141 | resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} 142 | engines: {node: '>=6.9.0'} 143 | dependencies: 144 | '@babel/types': 7.22.10 145 | '@jridgewell/gen-mapping': 0.3.3 146 | '@jridgewell/trace-mapping': 0.3.18 147 | jsesc: 2.5.2 148 | dev: false 149 | 150 | /@babel/helper-compilation-targets@7.22.10: 151 | resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} 152 | engines: {node: '>=6.9.0'} 153 | dependencies: 154 | '@babel/compat-data': 7.22.9 155 | '@babel/helper-validator-option': 7.22.5 156 | browserslist: 4.21.10 157 | lru-cache: 5.1.1 158 | semver: 6.3.1 159 | dev: false 160 | 161 | /@babel/helper-environment-visitor@7.22.5: 162 | resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} 163 | engines: {node: '>=6.9.0'} 164 | dev: false 165 | 166 | /@babel/helper-function-name@7.22.5: 167 | resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} 168 | engines: {node: '>=6.9.0'} 169 | dependencies: 170 | '@babel/template': 7.22.5 171 | '@babel/types': 7.22.10 172 | dev: false 173 | 174 | /@babel/helper-hoist-variables@7.22.5: 175 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 176 | engines: {node: '>=6.9.0'} 177 | dependencies: 178 | '@babel/types': 7.22.10 179 | dev: false 180 | 181 | /@babel/helper-module-imports@7.22.5: 182 | resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} 183 | engines: {node: '>=6.9.0'} 184 | dependencies: 185 | '@babel/types': 7.22.10 186 | dev: false 187 | 188 | /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): 189 | resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} 190 | engines: {node: '>=6.9.0'} 191 | peerDependencies: 192 | '@babel/core': ^7.0.0 193 | dependencies: 194 | '@babel/core': 7.22.10 195 | '@babel/helper-environment-visitor': 7.22.5 196 | '@babel/helper-module-imports': 7.22.5 197 | '@babel/helper-simple-access': 7.22.5 198 | '@babel/helper-split-export-declaration': 7.22.6 199 | '@babel/helper-validator-identifier': 7.22.5 200 | dev: false 201 | 202 | /@babel/helper-simple-access@7.22.5: 203 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 204 | engines: {node: '>=6.9.0'} 205 | dependencies: 206 | '@babel/types': 7.22.10 207 | dev: false 208 | 209 | /@babel/helper-split-export-declaration@7.22.6: 210 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 211 | engines: {node: '>=6.9.0'} 212 | dependencies: 213 | '@babel/types': 7.22.10 214 | dev: false 215 | 216 | /@babel/helper-string-parser@7.22.5: 217 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} 218 | engines: {node: '>=6.9.0'} 219 | dev: false 220 | 221 | /@babel/helper-validator-identifier@7.22.5: 222 | resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} 223 | engines: {node: '>=6.9.0'} 224 | dev: false 225 | 226 | /@babel/helper-validator-option@7.22.5: 227 | resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} 228 | engines: {node: '>=6.9.0'} 229 | dev: false 230 | 231 | /@babel/helpers@7.22.10: 232 | resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} 233 | engines: {node: '>=6.9.0'} 234 | dependencies: 235 | '@babel/template': 7.22.5 236 | '@babel/traverse': 7.22.10 237 | '@babel/types': 7.22.10 238 | transitivePeerDependencies: 239 | - supports-color 240 | dev: false 241 | 242 | /@babel/highlight@7.22.10: 243 | resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} 244 | engines: {node: '>=6.9.0'} 245 | dependencies: 246 | '@babel/helper-validator-identifier': 7.22.5 247 | chalk: 2.4.2 248 | js-tokens: 4.0.0 249 | dev: false 250 | 251 | /@babel/parser@7.22.10: 252 | resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} 253 | engines: {node: '>=6.0.0'} 254 | hasBin: true 255 | dependencies: 256 | '@babel/types': 7.22.10 257 | dev: false 258 | 259 | /@babel/runtime@7.22.6: 260 | resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} 261 | engines: {node: '>=6.9.0'} 262 | dependencies: 263 | regenerator-runtime: 0.13.11 264 | dev: false 265 | 266 | /@babel/template@7.22.5: 267 | resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} 268 | engines: {node: '>=6.9.0'} 269 | dependencies: 270 | '@babel/code-frame': 7.22.10 271 | '@babel/parser': 7.22.10 272 | '@babel/types': 7.22.10 273 | dev: false 274 | 275 | /@babel/traverse@7.22.10: 276 | resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} 277 | engines: {node: '>=6.9.0'} 278 | dependencies: 279 | '@babel/code-frame': 7.22.10 280 | '@babel/generator': 7.22.10 281 | '@babel/helper-environment-visitor': 7.22.5 282 | '@babel/helper-function-name': 7.22.5 283 | '@babel/helper-hoist-variables': 7.22.5 284 | '@babel/helper-split-export-declaration': 7.22.6 285 | '@babel/parser': 7.22.10 286 | '@babel/types': 7.22.10 287 | debug: 4.3.4 288 | globals: 11.12.0 289 | transitivePeerDependencies: 290 | - supports-color 291 | dev: false 292 | 293 | /@babel/types@7.22.10: 294 | resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} 295 | engines: {node: '>=6.9.0'} 296 | dependencies: 297 | '@babel/helper-string-parser': 7.22.5 298 | '@babel/helper-validator-identifier': 7.22.5 299 | to-fast-properties: 2.0.0 300 | dev: false 301 | 302 | /@esbuild/android-arm64@0.17.19: 303 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 304 | engines: {node: '>=12'} 305 | cpu: [arm64] 306 | os: [android] 307 | requiresBuild: true 308 | optional: true 309 | 310 | /@esbuild/android-arm@0.17.19: 311 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 312 | engines: {node: '>=12'} 313 | cpu: [arm] 314 | os: [android] 315 | requiresBuild: true 316 | optional: true 317 | 318 | /@esbuild/android-x64@0.17.19: 319 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 320 | engines: {node: '>=12'} 321 | cpu: [x64] 322 | os: [android] 323 | requiresBuild: true 324 | optional: true 325 | 326 | /@esbuild/darwin-arm64@0.17.19: 327 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 328 | engines: {node: '>=12'} 329 | cpu: [arm64] 330 | os: [darwin] 331 | requiresBuild: true 332 | optional: true 333 | 334 | /@esbuild/darwin-x64@0.17.19: 335 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 336 | engines: {node: '>=12'} 337 | cpu: [x64] 338 | os: [darwin] 339 | requiresBuild: true 340 | optional: true 341 | 342 | /@esbuild/freebsd-arm64@0.17.19: 343 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 344 | engines: {node: '>=12'} 345 | cpu: [arm64] 346 | os: [freebsd] 347 | requiresBuild: true 348 | optional: true 349 | 350 | /@esbuild/freebsd-x64@0.17.19: 351 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 352 | engines: {node: '>=12'} 353 | cpu: [x64] 354 | os: [freebsd] 355 | requiresBuild: true 356 | optional: true 357 | 358 | /@esbuild/linux-arm64@0.17.19: 359 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 360 | engines: {node: '>=12'} 361 | cpu: [arm64] 362 | os: [linux] 363 | requiresBuild: true 364 | optional: true 365 | 366 | /@esbuild/linux-arm@0.17.19: 367 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 368 | engines: {node: '>=12'} 369 | cpu: [arm] 370 | os: [linux] 371 | requiresBuild: true 372 | optional: true 373 | 374 | /@esbuild/linux-ia32@0.17.19: 375 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 376 | engines: {node: '>=12'} 377 | cpu: [ia32] 378 | os: [linux] 379 | requiresBuild: true 380 | optional: true 381 | 382 | /@esbuild/linux-loong64@0.17.19: 383 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 384 | engines: {node: '>=12'} 385 | cpu: [loong64] 386 | os: [linux] 387 | requiresBuild: true 388 | optional: true 389 | 390 | /@esbuild/linux-mips64el@0.17.19: 391 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 392 | engines: {node: '>=12'} 393 | cpu: [mips64el] 394 | os: [linux] 395 | requiresBuild: true 396 | optional: true 397 | 398 | /@esbuild/linux-ppc64@0.17.19: 399 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 400 | engines: {node: '>=12'} 401 | cpu: [ppc64] 402 | os: [linux] 403 | requiresBuild: true 404 | optional: true 405 | 406 | /@esbuild/linux-riscv64@0.17.19: 407 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 408 | engines: {node: '>=12'} 409 | cpu: [riscv64] 410 | os: [linux] 411 | requiresBuild: true 412 | optional: true 413 | 414 | /@esbuild/linux-s390x@0.17.19: 415 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 416 | engines: {node: '>=12'} 417 | cpu: [s390x] 418 | os: [linux] 419 | requiresBuild: true 420 | optional: true 421 | 422 | /@esbuild/linux-x64@0.17.19: 423 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 424 | engines: {node: '>=12'} 425 | cpu: [x64] 426 | os: [linux] 427 | requiresBuild: true 428 | optional: true 429 | 430 | /@esbuild/netbsd-x64@0.17.19: 431 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 432 | engines: {node: '>=12'} 433 | cpu: [x64] 434 | os: [netbsd] 435 | requiresBuild: true 436 | optional: true 437 | 438 | /@esbuild/openbsd-x64@0.17.19: 439 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 440 | engines: {node: '>=12'} 441 | cpu: [x64] 442 | os: [openbsd] 443 | requiresBuild: true 444 | optional: true 445 | 446 | /@esbuild/sunos-x64@0.17.19: 447 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 448 | engines: {node: '>=12'} 449 | cpu: [x64] 450 | os: [sunos] 451 | requiresBuild: true 452 | optional: true 453 | 454 | /@esbuild/win32-arm64@0.17.19: 455 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 456 | engines: {node: '>=12'} 457 | cpu: [arm64] 458 | os: [win32] 459 | requiresBuild: true 460 | optional: true 461 | 462 | /@esbuild/win32-ia32@0.17.19: 463 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 464 | engines: {node: '>=12'} 465 | cpu: [ia32] 466 | os: [win32] 467 | requiresBuild: true 468 | optional: true 469 | 470 | /@esbuild/win32-x64@0.17.19: 471 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 472 | engines: {node: '>=12'} 473 | cpu: [x64] 474 | os: [win32] 475 | requiresBuild: true 476 | optional: true 477 | 478 | /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): 479 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 480 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 481 | peerDependencies: 482 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 483 | dependencies: 484 | eslint: 8.42.0 485 | eslint-visitor-keys: 3.4.1 486 | dev: true 487 | 488 | /@eslint-community/regexpp@4.5.1: 489 | resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} 490 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 491 | dev: true 492 | 493 | /@eslint/eslintrc@2.0.3: 494 | resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} 495 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 496 | dependencies: 497 | ajv: 6.12.6 498 | debug: 4.3.4 499 | espree: 9.5.2 500 | globals: 13.20.0 501 | ignore: 5.2.4 502 | import-fresh: 3.3.0 503 | js-yaml: 4.1.0 504 | minimatch: 3.1.2 505 | strip-json-comments: 3.1.1 506 | transitivePeerDependencies: 507 | - supports-color 508 | dev: true 509 | 510 | /@eslint/js@8.42.0: 511 | resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} 512 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 513 | dev: true 514 | 515 | /@humanwhocodes/config-array@0.11.10: 516 | resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} 517 | engines: {node: '>=10.10.0'} 518 | dependencies: 519 | '@humanwhocodes/object-schema': 1.2.1 520 | debug: 4.3.4 521 | minimatch: 3.1.2 522 | transitivePeerDependencies: 523 | - supports-color 524 | dev: true 525 | 526 | /@humanwhocodes/module-importer@1.0.1: 527 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 528 | engines: {node: '>=12.22'} 529 | dev: true 530 | 531 | /@humanwhocodes/object-schema@1.2.1: 532 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 533 | dev: true 534 | 535 | /@jridgewell/gen-mapping@0.3.3: 536 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 537 | engines: {node: '>=6.0.0'} 538 | dependencies: 539 | '@jridgewell/set-array': 1.1.2 540 | '@jridgewell/sourcemap-codec': 1.4.15 541 | '@jridgewell/trace-mapping': 0.3.18 542 | 543 | /@jridgewell/resolve-uri@3.1.0: 544 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 545 | engines: {node: '>=6.0.0'} 546 | 547 | /@jridgewell/set-array@1.1.2: 548 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 549 | engines: {node: '>=6.0.0'} 550 | 551 | /@jridgewell/sourcemap-codec@1.4.14: 552 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 553 | 554 | /@jridgewell/sourcemap-codec@1.4.15: 555 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 556 | 557 | /@jridgewell/trace-mapping@0.3.18: 558 | resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} 559 | dependencies: 560 | '@jridgewell/resolve-uri': 3.1.0 561 | '@jridgewell/sourcemap-codec': 1.4.14 562 | 563 | /@nodelib/fs.scandir@2.1.5: 564 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 565 | engines: {node: '>= 8'} 566 | dependencies: 567 | '@nodelib/fs.stat': 2.0.5 568 | run-parallel: 1.2.0 569 | dev: true 570 | 571 | /@nodelib/fs.stat@2.0.5: 572 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 573 | engines: {node: '>= 8'} 574 | dev: true 575 | 576 | /@nodelib/fs.walk@1.2.8: 577 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 578 | engines: {node: '>= 8'} 579 | dependencies: 580 | '@nodelib/fs.scandir': 2.1.5 581 | fastq: 1.15.0 582 | dev: true 583 | 584 | /@react-spring/animated@9.7.3(react@18.2.0): 585 | resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} 586 | peerDependencies: 587 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 588 | dependencies: 589 | '@react-spring/shared': 9.7.3(react@18.2.0) 590 | '@react-spring/types': 9.7.3 591 | react: 18.2.0 592 | dev: false 593 | 594 | /@react-spring/core@9.7.3(react@18.2.0): 595 | resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} 596 | peerDependencies: 597 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 598 | dependencies: 599 | '@react-spring/animated': 9.7.3(react@18.2.0) 600 | '@react-spring/shared': 9.7.3(react@18.2.0) 601 | '@react-spring/types': 9.7.3 602 | react: 18.2.0 603 | dev: false 604 | 605 | /@react-spring/shared@9.7.3(react@18.2.0): 606 | resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} 607 | peerDependencies: 608 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 609 | dependencies: 610 | '@react-spring/types': 9.7.3 611 | react: 18.2.0 612 | dev: false 613 | 614 | /@react-spring/types@9.7.3: 615 | resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} 616 | dev: false 617 | 618 | /@react-spring/web@9.7.3(react-dom@18.2.0)(react@18.2.0): 619 | resolution: {integrity: sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==} 620 | peerDependencies: 621 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 622 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 623 | dependencies: 624 | '@react-spring/animated': 9.7.3(react@18.2.0) 625 | '@react-spring/core': 9.7.3(react@18.2.0) 626 | '@react-spring/shared': 9.7.3(react@18.2.0) 627 | '@react-spring/types': 9.7.3 628 | react: 18.2.0 629 | react-dom: 18.2.0(react@18.2.0) 630 | dev: false 631 | 632 | /@rollup/pluginutils@5.0.2: 633 | resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} 634 | engines: {node: '>=14.0.0'} 635 | peerDependencies: 636 | rollup: ^1.20.0||^2.0.0||^3.0.0 637 | peerDependenciesMeta: 638 | rollup: 639 | optional: true 640 | dependencies: 641 | '@types/estree': 1.0.1 642 | estree-walker: 2.0.2 643 | picomatch: 2.3.1 644 | dev: false 645 | 646 | /@svgr/babel-plugin-add-jsx-attribute@7.0.0(@babel/core@7.22.10): 647 | resolution: {integrity: sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==} 648 | engines: {node: '>=14'} 649 | peerDependencies: 650 | '@babel/core': ^7.0.0-0 651 | dependencies: 652 | '@babel/core': 7.22.10 653 | dev: false 654 | 655 | /@svgr/babel-plugin-remove-jsx-attribute@7.0.0(@babel/core@7.22.10): 656 | resolution: {integrity: sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==} 657 | engines: {node: '>=14'} 658 | peerDependencies: 659 | '@babel/core': ^7.0.0-0 660 | dependencies: 661 | '@babel/core': 7.22.10 662 | dev: false 663 | 664 | /@svgr/babel-plugin-remove-jsx-empty-expression@7.0.0(@babel/core@7.22.10): 665 | resolution: {integrity: sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==} 666 | engines: {node: '>=14'} 667 | peerDependencies: 668 | '@babel/core': ^7.0.0-0 669 | dependencies: 670 | '@babel/core': 7.22.10 671 | dev: false 672 | 673 | /@svgr/babel-plugin-replace-jsx-attribute-value@7.0.0(@babel/core@7.22.10): 674 | resolution: {integrity: sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA==} 675 | engines: {node: '>=14'} 676 | peerDependencies: 677 | '@babel/core': ^7.0.0-0 678 | dependencies: 679 | '@babel/core': 7.22.10 680 | dev: false 681 | 682 | /@svgr/babel-plugin-svg-dynamic-title@7.0.0(@babel/core@7.22.10): 683 | resolution: {integrity: sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w==} 684 | engines: {node: '>=14'} 685 | peerDependencies: 686 | '@babel/core': ^7.0.0-0 687 | dependencies: 688 | '@babel/core': 7.22.10 689 | dev: false 690 | 691 | /@svgr/babel-plugin-svg-em-dimensions@7.0.0(@babel/core@7.22.10): 692 | resolution: {integrity: sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA==} 693 | engines: {node: '>=14'} 694 | peerDependencies: 695 | '@babel/core': ^7.0.0-0 696 | dependencies: 697 | '@babel/core': 7.22.10 698 | dev: false 699 | 700 | /@svgr/babel-plugin-transform-react-native-svg@7.0.0(@babel/core@7.22.10): 701 | resolution: {integrity: sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ==} 702 | engines: {node: '>=14'} 703 | peerDependencies: 704 | '@babel/core': ^7.0.0-0 705 | dependencies: 706 | '@babel/core': 7.22.10 707 | dev: false 708 | 709 | /@svgr/babel-plugin-transform-svg-component@7.0.0(@babel/core@7.22.10): 710 | resolution: {integrity: sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A==} 711 | engines: {node: '>=12'} 712 | peerDependencies: 713 | '@babel/core': ^7.0.0-0 714 | dependencies: 715 | '@babel/core': 7.22.10 716 | dev: false 717 | 718 | /@svgr/babel-preset@7.0.0(@babel/core@7.22.10): 719 | resolution: {integrity: sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ==} 720 | engines: {node: '>=14'} 721 | peerDependencies: 722 | '@babel/core': ^7.0.0-0 723 | dependencies: 724 | '@babel/core': 7.22.10 725 | '@svgr/babel-plugin-add-jsx-attribute': 7.0.0(@babel/core@7.22.10) 726 | '@svgr/babel-plugin-remove-jsx-attribute': 7.0.0(@babel/core@7.22.10) 727 | '@svgr/babel-plugin-remove-jsx-empty-expression': 7.0.0(@babel/core@7.22.10) 728 | '@svgr/babel-plugin-replace-jsx-attribute-value': 7.0.0(@babel/core@7.22.10) 729 | '@svgr/babel-plugin-svg-dynamic-title': 7.0.0(@babel/core@7.22.10) 730 | '@svgr/babel-plugin-svg-em-dimensions': 7.0.0(@babel/core@7.22.10) 731 | '@svgr/babel-plugin-transform-react-native-svg': 7.0.0(@babel/core@7.22.10) 732 | '@svgr/babel-plugin-transform-svg-component': 7.0.0(@babel/core@7.22.10) 733 | dev: false 734 | 735 | /@svgr/core@7.0.0: 736 | resolution: {integrity: sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==} 737 | engines: {node: '>=14'} 738 | dependencies: 739 | '@babel/core': 7.22.10 740 | '@svgr/babel-preset': 7.0.0(@babel/core@7.22.10) 741 | camelcase: 6.3.0 742 | cosmiconfig: 8.2.0 743 | transitivePeerDependencies: 744 | - supports-color 745 | dev: false 746 | 747 | /@svgr/hast-util-to-babel-ast@7.0.0: 748 | resolution: {integrity: sha512-42Ej9sDDEmsJKjrfQ1PHmiDiHagh/u9AHO9QWbeNx4KmD9yS5d1XHmXUNINfUcykAU+4431Cn+k6Vn5mWBYimQ==} 749 | engines: {node: '>=14'} 750 | dependencies: 751 | '@babel/types': 7.22.10 752 | entities: 4.5.0 753 | dev: false 754 | 755 | /@svgr/plugin-jsx@7.0.0: 756 | resolution: {integrity: sha512-SWlTpPQmBUtLKxXWgpv8syzqIU8XgFRvyhfkam2So8b3BE0OS0HPe5UfmlJ2KIC+a7dpuuYovPR2WAQuSyMoPw==} 757 | engines: {node: '>=14'} 758 | dependencies: 759 | '@babel/core': 7.22.10 760 | '@svgr/babel-preset': 7.0.0(@babel/core@7.22.10) 761 | '@svgr/hast-util-to-babel-ast': 7.0.0 762 | svg-parser: 2.0.4 763 | transitivePeerDependencies: 764 | - supports-color 765 | dev: false 766 | 767 | /@swc/core-darwin-arm64@1.3.64: 768 | resolution: {integrity: sha512-gSPld6wxZBZoEvZXWmNfd+eJGlGvrEXmhMBCUwSccpuMa0KqK7F6AAZVu7kFkmlXPq2kS8owjk6/VXnVBmm5Vw==} 769 | engines: {node: '>=10'} 770 | cpu: [arm64] 771 | os: [darwin] 772 | requiresBuild: true 773 | dev: true 774 | optional: true 775 | 776 | /@swc/core-darwin-x64@1.3.64: 777 | resolution: {integrity: sha512-SJd1pr+U2pz5ZVv5BL36CN879Pn1V0014uVNlB+6yNh3e8T0fjUbtRJcbFiBB+OeYuJ1UNUeslaRJtKJNtMH7A==} 778 | engines: {node: '>=10'} 779 | cpu: [x64] 780 | os: [darwin] 781 | requiresBuild: true 782 | dev: true 783 | optional: true 784 | 785 | /@swc/core-linux-arm-gnueabihf@1.3.64: 786 | resolution: {integrity: sha512-XE60bZS+qO+d8IQYAayhn3TRqyzVmQeOsX2B1yUHuKZU3Zb/mt/cmD/HLzZZW7J3z19kYf2na7Hvmnt3amUGoA==} 787 | engines: {node: '>=10'} 788 | cpu: [arm] 789 | os: [linux] 790 | requiresBuild: true 791 | dev: true 792 | optional: true 793 | 794 | /@swc/core-linux-arm64-gnu@1.3.64: 795 | resolution: {integrity: sha512-+jcUua4cYLRMqDicv+4AaTZUGgYWXkXVI9AzaAgfkMNLU2TMXwuYXopxk1giAMop88+ovzYIqrxErRdu70CgtQ==} 796 | engines: {node: '>=10'} 797 | cpu: [arm64] 798 | os: [linux] 799 | libc: [glibc] 800 | requiresBuild: true 801 | dev: true 802 | optional: true 803 | 804 | /@swc/core-linux-arm64-musl@1.3.64: 805 | resolution: {integrity: sha512-50MI8NFYUKhLncqY2piM/XOnNqZT6zY2ZoNOFsy63/T2gAYy1ts4mF4YUEkg4XOA2zhue1JSLZBUrHQXbgMYUQ==} 806 | engines: {node: '>=10'} 807 | cpu: [arm64] 808 | os: [linux] 809 | libc: [musl] 810 | requiresBuild: true 811 | dev: true 812 | optional: true 813 | 814 | /@swc/core-linux-x64-gnu@1.3.64: 815 | resolution: {integrity: sha512-bT8seQ41Q4J2JDgn2JpFCGNehGAIilAkZ476gEaKKroEWepBhkD0K1MspSSVYSJhLSGbBVSaadUEiBPxWgu1Rw==} 816 | engines: {node: '>=10'} 817 | cpu: [x64] 818 | os: [linux] 819 | libc: [glibc] 820 | requiresBuild: true 821 | dev: true 822 | optional: true 823 | 824 | /@swc/core-linux-x64-musl@1.3.64: 825 | resolution: {integrity: sha512-sJgh3TXCDOEq/Au4XLAgNqy4rVcLeywQBoftnV3rcvX1/u9OCSRzgKLgYc5d1pEN5AMJV1l4u26kbGlQuZ+yRw==} 826 | engines: {node: '>=10'} 827 | cpu: [x64] 828 | os: [linux] 829 | libc: [musl] 830 | requiresBuild: true 831 | dev: true 832 | optional: true 833 | 834 | /@swc/core-win32-arm64-msvc@1.3.64: 835 | resolution: {integrity: sha512-zWIy+mAWDjtJjl4e4mmhQL7g9KbkOwcWbeoIk4C6NT4VpjnjdX1pMml/Ez2sF5J5cGBwu7B1ePfTe/kAE6G36Q==} 836 | engines: {node: '>=10'} 837 | cpu: [arm64] 838 | os: [win32] 839 | requiresBuild: true 840 | dev: true 841 | optional: true 842 | 843 | /@swc/core-win32-ia32-msvc@1.3.64: 844 | resolution: {integrity: sha512-6HMiuUeSMpTUAimb1E+gUNjy8m211oAzw+wjU8oOdA6iihWaLBz4TOhU9IaKZPPjqEcYGwqaT3tj5b5+mxde6Q==} 845 | engines: {node: '>=10'} 846 | cpu: [ia32] 847 | os: [win32] 848 | requiresBuild: true 849 | dev: true 850 | optional: true 851 | 852 | /@swc/core-win32-x64-msvc@1.3.64: 853 | resolution: {integrity: sha512-c8Al0JJfmgnO9sg6w34PICibqI4p7iXywo+wOxjY88oFwMcfV5rGaif1Fe3RqxJP/1WtUV7lYuKKZrneMXtyLA==} 854 | engines: {node: '>=10'} 855 | cpu: [x64] 856 | os: [win32] 857 | requiresBuild: true 858 | dev: true 859 | optional: true 860 | 861 | /@swc/core@1.3.64: 862 | resolution: {integrity: sha512-be1dk2pfjzBjFp/+p47/wvOAm7KpEtsi7hqI3ofox6pK3hBJChHgVTLVV9xqZm7CnYdyYYw3Z78hH6lrwutxXQ==} 863 | engines: {node: '>=10'} 864 | requiresBuild: true 865 | peerDependencies: 866 | '@swc/helpers': ^0.5.0 867 | peerDependenciesMeta: 868 | '@swc/helpers': 869 | optional: true 870 | optionalDependencies: 871 | '@swc/core-darwin-arm64': 1.3.64 872 | '@swc/core-darwin-x64': 1.3.64 873 | '@swc/core-linux-arm-gnueabihf': 1.3.64 874 | '@swc/core-linux-arm64-gnu': 1.3.64 875 | '@swc/core-linux-arm64-musl': 1.3.64 876 | '@swc/core-linux-x64-gnu': 1.3.64 877 | '@swc/core-linux-x64-musl': 1.3.64 878 | '@swc/core-win32-arm64-msvc': 1.3.64 879 | '@swc/core-win32-ia32-msvc': 1.3.64 880 | '@swc/core-win32-x64-msvc': 1.3.64 881 | dev: true 882 | 883 | /@types/estree@1.0.1: 884 | resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} 885 | dev: false 886 | 887 | /@types/json-schema@7.0.12: 888 | resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} 889 | dev: true 890 | 891 | /@types/prop-types@15.7.5: 892 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 893 | 894 | /@types/react-dom@18.2.5: 895 | resolution: {integrity: sha512-sRQsOS/sCLnpQhR4DSKGTtWFE3FZjpQa86KPVbhUqdYMRZ9FEFcfAytKhR/vUG2rH1oFbOOej6cuD7MFSobDRQ==} 896 | dependencies: 897 | '@types/react': 18.2.12 898 | dev: true 899 | 900 | /@types/react@18.2.12: 901 | resolution: {integrity: sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw==} 902 | dependencies: 903 | '@types/prop-types': 15.7.5 904 | '@types/scheduler': 0.16.3 905 | csstype: 3.1.2 906 | 907 | /@types/scheduler@0.16.3: 908 | resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} 909 | 910 | /@types/semver@7.5.0: 911 | resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} 912 | dev: true 913 | 914 | /@typescript-eslint/eslint-plugin@5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3): 915 | resolution: {integrity: sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==} 916 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 917 | peerDependencies: 918 | '@typescript-eslint/parser': ^5.0.0 919 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 920 | typescript: '*' 921 | peerDependenciesMeta: 922 | typescript: 923 | optional: true 924 | dependencies: 925 | '@eslint-community/regexpp': 4.5.1 926 | '@typescript-eslint/parser': 5.59.11(eslint@8.42.0)(typescript@5.1.3) 927 | '@typescript-eslint/scope-manager': 5.59.11 928 | '@typescript-eslint/type-utils': 5.59.11(eslint@8.42.0)(typescript@5.1.3) 929 | '@typescript-eslint/utils': 5.59.11(eslint@8.42.0)(typescript@5.1.3) 930 | debug: 4.3.4 931 | eslint: 8.42.0 932 | grapheme-splitter: 1.0.4 933 | ignore: 5.2.4 934 | natural-compare-lite: 1.4.0 935 | semver: 7.5.1 936 | tsutils: 3.21.0(typescript@5.1.3) 937 | typescript: 5.1.3 938 | transitivePeerDependencies: 939 | - supports-color 940 | dev: true 941 | 942 | /@typescript-eslint/parser@5.59.11(eslint@8.42.0)(typescript@5.1.3): 943 | resolution: {integrity: sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==} 944 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 945 | peerDependencies: 946 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 947 | typescript: '*' 948 | peerDependenciesMeta: 949 | typescript: 950 | optional: true 951 | dependencies: 952 | '@typescript-eslint/scope-manager': 5.59.11 953 | '@typescript-eslint/types': 5.59.11 954 | '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) 955 | debug: 4.3.4 956 | eslint: 8.42.0 957 | typescript: 5.1.3 958 | transitivePeerDependencies: 959 | - supports-color 960 | dev: true 961 | 962 | /@typescript-eslint/scope-manager@5.59.11: 963 | resolution: {integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==} 964 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 965 | dependencies: 966 | '@typescript-eslint/types': 5.59.11 967 | '@typescript-eslint/visitor-keys': 5.59.11 968 | dev: true 969 | 970 | /@typescript-eslint/type-utils@5.59.11(eslint@8.42.0)(typescript@5.1.3): 971 | resolution: {integrity: sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==} 972 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 973 | peerDependencies: 974 | eslint: '*' 975 | typescript: '*' 976 | peerDependenciesMeta: 977 | typescript: 978 | optional: true 979 | dependencies: 980 | '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) 981 | '@typescript-eslint/utils': 5.59.11(eslint@8.42.0)(typescript@5.1.3) 982 | debug: 4.3.4 983 | eslint: 8.42.0 984 | tsutils: 3.21.0(typescript@5.1.3) 985 | typescript: 5.1.3 986 | transitivePeerDependencies: 987 | - supports-color 988 | dev: true 989 | 990 | /@typescript-eslint/types@5.59.11: 991 | resolution: {integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==} 992 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 993 | dev: true 994 | 995 | /@typescript-eslint/typescript-estree@5.59.11(typescript@5.1.3): 996 | resolution: {integrity: sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==} 997 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 998 | peerDependencies: 999 | typescript: '*' 1000 | peerDependenciesMeta: 1001 | typescript: 1002 | optional: true 1003 | dependencies: 1004 | '@typescript-eslint/types': 5.59.11 1005 | '@typescript-eslint/visitor-keys': 5.59.11 1006 | debug: 4.3.4 1007 | globby: 11.1.0 1008 | is-glob: 4.0.3 1009 | semver: 7.5.1 1010 | tsutils: 3.21.0(typescript@5.1.3) 1011 | typescript: 5.1.3 1012 | transitivePeerDependencies: 1013 | - supports-color 1014 | dev: true 1015 | 1016 | /@typescript-eslint/utils@5.59.11(eslint@8.42.0)(typescript@5.1.3): 1017 | resolution: {integrity: sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==} 1018 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1019 | peerDependencies: 1020 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 1021 | dependencies: 1022 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) 1023 | '@types/json-schema': 7.0.12 1024 | '@types/semver': 7.5.0 1025 | '@typescript-eslint/scope-manager': 5.59.11 1026 | '@typescript-eslint/types': 5.59.11 1027 | '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) 1028 | eslint: 8.42.0 1029 | eslint-scope: 5.1.1 1030 | semver: 7.5.1 1031 | transitivePeerDependencies: 1032 | - supports-color 1033 | - typescript 1034 | dev: true 1035 | 1036 | /@typescript-eslint/visitor-keys@5.59.11: 1037 | resolution: {integrity: sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==} 1038 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1039 | dependencies: 1040 | '@typescript-eslint/types': 5.59.11 1041 | eslint-visitor-keys: 3.4.1 1042 | dev: true 1043 | 1044 | /@use-gesture/core@10.2.27: 1045 | resolution: {integrity: sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA==} 1046 | dev: false 1047 | 1048 | /@use-gesture/react@10.2.27(react@18.2.0): 1049 | resolution: {integrity: sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w==} 1050 | peerDependencies: 1051 | react: '>= 16.8.0' 1052 | dependencies: 1053 | '@use-gesture/core': 10.2.27 1054 | react: 18.2.0 1055 | dev: false 1056 | 1057 | /@vitejs/plugin-react-swc@3.3.2(vite@4.3.9): 1058 | resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==} 1059 | peerDependencies: 1060 | vite: ^4 1061 | dependencies: 1062 | '@swc/core': 1.3.64 1063 | vite: 4.3.9(sass@1.63.4) 1064 | transitivePeerDependencies: 1065 | - '@swc/helpers' 1066 | dev: true 1067 | 1068 | /acorn-jsx@5.3.2(acorn@8.8.2): 1069 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 1070 | peerDependencies: 1071 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 1072 | dependencies: 1073 | acorn: 8.8.2 1074 | dev: true 1075 | 1076 | /acorn@8.8.2: 1077 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 1078 | engines: {node: '>=0.4.0'} 1079 | hasBin: true 1080 | dev: true 1081 | 1082 | /ajv@6.12.6: 1083 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 1084 | dependencies: 1085 | fast-deep-equal: 3.1.3 1086 | fast-json-stable-stringify: 2.1.0 1087 | json-schema-traverse: 0.4.1 1088 | uri-js: 4.4.1 1089 | dev: true 1090 | 1091 | /ansi-regex@5.0.1: 1092 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1093 | engines: {node: '>=8'} 1094 | dev: true 1095 | 1096 | /ansi-styles@3.2.1: 1097 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 1098 | engines: {node: '>=4'} 1099 | dependencies: 1100 | color-convert: 1.9.3 1101 | dev: false 1102 | 1103 | /ansi-styles@4.3.0: 1104 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1105 | engines: {node: '>=8'} 1106 | dependencies: 1107 | color-convert: 2.0.1 1108 | dev: true 1109 | 1110 | /any-promise@1.3.0: 1111 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 1112 | dev: true 1113 | 1114 | /anymatch@3.1.3: 1115 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1116 | engines: {node: '>= 8'} 1117 | dependencies: 1118 | normalize-path: 3.0.0 1119 | picomatch: 2.3.1 1120 | 1121 | /arg@5.0.2: 1122 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 1123 | dev: true 1124 | 1125 | /argparse@2.0.1: 1126 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1127 | 1128 | /array-union@2.1.0: 1129 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 1130 | engines: {node: '>=8'} 1131 | dev: true 1132 | 1133 | /autoprefixer@10.4.14(postcss@8.4.24): 1134 | resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} 1135 | engines: {node: ^10 || ^12 || >=14} 1136 | hasBin: true 1137 | peerDependencies: 1138 | postcss: ^8.1.0 1139 | dependencies: 1140 | browserslist: 4.21.8 1141 | caniuse-lite: 1.0.30001503 1142 | fraction.js: 4.2.0 1143 | normalize-range: 0.1.2 1144 | picocolors: 1.0.0 1145 | postcss: 8.4.24 1146 | postcss-value-parser: 4.2.0 1147 | dev: true 1148 | 1149 | /balanced-match@1.0.2: 1150 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1151 | dev: true 1152 | 1153 | /binary-extensions@2.2.0: 1154 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1155 | engines: {node: '>=8'} 1156 | 1157 | /brace-expansion@1.1.11: 1158 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1159 | dependencies: 1160 | balanced-match: 1.0.2 1161 | concat-map: 0.0.1 1162 | dev: true 1163 | 1164 | /braces@3.0.2: 1165 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1166 | engines: {node: '>=8'} 1167 | dependencies: 1168 | fill-range: 7.0.1 1169 | 1170 | /browserslist@4.21.10: 1171 | resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} 1172 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1173 | hasBin: true 1174 | dependencies: 1175 | caniuse-lite: 1.0.30001519 1176 | electron-to-chromium: 1.4.488 1177 | node-releases: 2.0.13 1178 | update-browserslist-db: 1.0.11(browserslist@4.21.10) 1179 | dev: false 1180 | 1181 | /browserslist@4.21.8: 1182 | resolution: {integrity: sha512-j+7xYe+v+q2Id9qbBeCI8WX5NmZSRe8es1+0xntD/+gaWXznP8tFEkv5IgSaHf5dS1YwVMbX/4W6m937mj+wQw==} 1183 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1184 | hasBin: true 1185 | dependencies: 1186 | caniuse-lite: 1.0.30001503 1187 | electron-to-chromium: 1.4.430 1188 | node-releases: 2.0.12 1189 | update-browserslist-db: 1.0.11(browserslist@4.21.8) 1190 | dev: true 1191 | 1192 | /callsites@3.1.0: 1193 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1194 | engines: {node: '>=6'} 1195 | 1196 | /camelcase-css@2.0.1: 1197 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 1198 | engines: {node: '>= 6'} 1199 | dev: true 1200 | 1201 | /camelcase@6.3.0: 1202 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 1203 | engines: {node: '>=10'} 1204 | dev: false 1205 | 1206 | /caniuse-lite@1.0.30001503: 1207 | resolution: {integrity: sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw==} 1208 | dev: true 1209 | 1210 | /caniuse-lite@1.0.30001519: 1211 | resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} 1212 | dev: false 1213 | 1214 | /chalk@2.4.2: 1215 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1216 | engines: {node: '>=4'} 1217 | dependencies: 1218 | ansi-styles: 3.2.1 1219 | escape-string-regexp: 1.0.5 1220 | supports-color: 5.5.0 1221 | dev: false 1222 | 1223 | /chalk@4.1.2: 1224 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1225 | engines: {node: '>=10'} 1226 | dependencies: 1227 | ansi-styles: 4.3.0 1228 | supports-color: 7.2.0 1229 | dev: true 1230 | 1231 | /chokidar@3.5.3: 1232 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1233 | engines: {node: '>= 8.10.0'} 1234 | dependencies: 1235 | anymatch: 3.1.3 1236 | braces: 3.0.2 1237 | glob-parent: 5.1.2 1238 | is-binary-path: 2.1.0 1239 | is-glob: 4.0.3 1240 | normalize-path: 3.0.0 1241 | readdirp: 3.6.0 1242 | optionalDependencies: 1243 | fsevents: 2.3.2 1244 | 1245 | /clsx@2.0.0: 1246 | resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 1247 | engines: {node: '>=6'} 1248 | dev: false 1249 | 1250 | /color-convert@1.9.3: 1251 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1252 | dependencies: 1253 | color-name: 1.1.3 1254 | dev: false 1255 | 1256 | /color-convert@2.0.1: 1257 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1258 | engines: {node: '>=7.0.0'} 1259 | dependencies: 1260 | color-name: 1.1.4 1261 | dev: true 1262 | 1263 | /color-name@1.1.3: 1264 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1265 | dev: false 1266 | 1267 | /color-name@1.1.4: 1268 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1269 | dev: true 1270 | 1271 | /commander@4.1.1: 1272 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1273 | engines: {node: '>= 6'} 1274 | dev: true 1275 | 1276 | /concat-map@0.0.1: 1277 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1278 | dev: true 1279 | 1280 | /convert-source-map@1.9.0: 1281 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 1282 | dev: false 1283 | 1284 | /cosmiconfig@8.2.0: 1285 | resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} 1286 | engines: {node: '>=14'} 1287 | dependencies: 1288 | import-fresh: 3.3.0 1289 | js-yaml: 4.1.0 1290 | parse-json: 5.2.0 1291 | path-type: 4.0.0 1292 | dev: false 1293 | 1294 | /cross-spawn@7.0.3: 1295 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1296 | engines: {node: '>= 8'} 1297 | dependencies: 1298 | path-key: 3.1.1 1299 | shebang-command: 2.0.0 1300 | which: 2.0.2 1301 | dev: true 1302 | 1303 | /cssesc@3.0.0: 1304 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1305 | engines: {node: '>=4'} 1306 | hasBin: true 1307 | dev: true 1308 | 1309 | /csstype@3.1.2: 1310 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 1311 | 1312 | /debug@4.3.4: 1313 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1314 | engines: {node: '>=6.0'} 1315 | peerDependencies: 1316 | supports-color: '*' 1317 | peerDependenciesMeta: 1318 | supports-color: 1319 | optional: true 1320 | dependencies: 1321 | ms: 2.1.2 1322 | 1323 | /deep-is@0.1.4: 1324 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1325 | dev: true 1326 | 1327 | /didyoumean@1.2.2: 1328 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1329 | dev: true 1330 | 1331 | /dir-glob@3.0.1: 1332 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1333 | engines: {node: '>=8'} 1334 | dependencies: 1335 | path-type: 4.0.0 1336 | dev: true 1337 | 1338 | /dlv@1.1.3: 1339 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1340 | dev: true 1341 | 1342 | /doctrine@3.0.0: 1343 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1344 | engines: {node: '>=6.0.0'} 1345 | dependencies: 1346 | esutils: 2.0.3 1347 | dev: true 1348 | 1349 | /electron-to-chromium@1.4.430: 1350 | resolution: {integrity: sha512-FytjTbGwz///F+ToZ5XSeXbbSaXalsVRXsz2mHityI5gfxft7ieW3HqFLkU5V1aIrY42aflICqbmFoDxW10etg==} 1351 | dev: true 1352 | 1353 | /electron-to-chromium@1.4.488: 1354 | resolution: {integrity: sha512-Dv4sTjiW7t/UWGL+H8ZkgIjtUAVZDgb/PwGWvMsCT7jipzUV/u5skbLXPFKb6iV0tiddVi/bcS2/kUrczeWgIQ==} 1355 | dev: false 1356 | 1357 | /entities@4.5.0: 1358 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1359 | engines: {node: '>=0.12'} 1360 | dev: false 1361 | 1362 | /error-ex@1.3.2: 1363 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1364 | dependencies: 1365 | is-arrayish: 0.2.1 1366 | dev: false 1367 | 1368 | /esbuild@0.17.19: 1369 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 1370 | engines: {node: '>=12'} 1371 | hasBin: true 1372 | requiresBuild: true 1373 | optionalDependencies: 1374 | '@esbuild/android-arm': 0.17.19 1375 | '@esbuild/android-arm64': 0.17.19 1376 | '@esbuild/android-x64': 0.17.19 1377 | '@esbuild/darwin-arm64': 0.17.19 1378 | '@esbuild/darwin-x64': 0.17.19 1379 | '@esbuild/freebsd-arm64': 0.17.19 1380 | '@esbuild/freebsd-x64': 0.17.19 1381 | '@esbuild/linux-arm': 0.17.19 1382 | '@esbuild/linux-arm64': 0.17.19 1383 | '@esbuild/linux-ia32': 0.17.19 1384 | '@esbuild/linux-loong64': 0.17.19 1385 | '@esbuild/linux-mips64el': 0.17.19 1386 | '@esbuild/linux-ppc64': 0.17.19 1387 | '@esbuild/linux-riscv64': 0.17.19 1388 | '@esbuild/linux-s390x': 0.17.19 1389 | '@esbuild/linux-x64': 0.17.19 1390 | '@esbuild/netbsd-x64': 0.17.19 1391 | '@esbuild/openbsd-x64': 0.17.19 1392 | '@esbuild/sunos-x64': 0.17.19 1393 | '@esbuild/win32-arm64': 0.17.19 1394 | '@esbuild/win32-ia32': 0.17.19 1395 | '@esbuild/win32-x64': 0.17.19 1396 | 1397 | /escalade@3.1.1: 1398 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1399 | engines: {node: '>=6'} 1400 | 1401 | /escape-string-regexp@1.0.5: 1402 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1403 | engines: {node: '>=0.8.0'} 1404 | dev: false 1405 | 1406 | /escape-string-regexp@4.0.0: 1407 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1408 | engines: {node: '>=10'} 1409 | dev: true 1410 | 1411 | /eslint-plugin-react-hooks@4.6.0(eslint@8.42.0): 1412 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} 1413 | engines: {node: '>=10'} 1414 | peerDependencies: 1415 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 1416 | dependencies: 1417 | eslint: 8.42.0 1418 | dev: true 1419 | 1420 | /eslint-plugin-react-refresh@0.3.5(eslint@8.42.0): 1421 | resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} 1422 | peerDependencies: 1423 | eslint: '>=7' 1424 | dependencies: 1425 | eslint: 8.42.0 1426 | dev: true 1427 | 1428 | /eslint-scope@5.1.1: 1429 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1430 | engines: {node: '>=8.0.0'} 1431 | dependencies: 1432 | esrecurse: 4.3.0 1433 | estraverse: 4.3.0 1434 | dev: true 1435 | 1436 | /eslint-scope@7.2.0: 1437 | resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} 1438 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1439 | dependencies: 1440 | esrecurse: 4.3.0 1441 | estraverse: 5.3.0 1442 | dev: true 1443 | 1444 | /eslint-visitor-keys@3.4.1: 1445 | resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} 1446 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1447 | dev: true 1448 | 1449 | /eslint@8.42.0: 1450 | resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} 1451 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1452 | hasBin: true 1453 | dependencies: 1454 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) 1455 | '@eslint-community/regexpp': 4.5.1 1456 | '@eslint/eslintrc': 2.0.3 1457 | '@eslint/js': 8.42.0 1458 | '@humanwhocodes/config-array': 0.11.10 1459 | '@humanwhocodes/module-importer': 1.0.1 1460 | '@nodelib/fs.walk': 1.2.8 1461 | ajv: 6.12.6 1462 | chalk: 4.1.2 1463 | cross-spawn: 7.0.3 1464 | debug: 4.3.4 1465 | doctrine: 3.0.0 1466 | escape-string-regexp: 4.0.0 1467 | eslint-scope: 7.2.0 1468 | eslint-visitor-keys: 3.4.1 1469 | espree: 9.5.2 1470 | esquery: 1.5.0 1471 | esutils: 2.0.3 1472 | fast-deep-equal: 3.1.3 1473 | file-entry-cache: 6.0.1 1474 | find-up: 5.0.0 1475 | glob-parent: 6.0.2 1476 | globals: 13.20.0 1477 | graphemer: 1.4.0 1478 | ignore: 5.2.4 1479 | import-fresh: 3.3.0 1480 | imurmurhash: 0.1.4 1481 | is-glob: 4.0.3 1482 | is-path-inside: 3.0.3 1483 | js-yaml: 4.1.0 1484 | json-stable-stringify-without-jsonify: 1.0.1 1485 | levn: 0.4.1 1486 | lodash.merge: 4.6.2 1487 | minimatch: 3.1.2 1488 | natural-compare: 1.4.0 1489 | optionator: 0.9.1 1490 | strip-ansi: 6.0.1 1491 | strip-json-comments: 3.1.1 1492 | text-table: 0.2.0 1493 | transitivePeerDependencies: 1494 | - supports-color 1495 | dev: true 1496 | 1497 | /espree@9.5.2: 1498 | resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} 1499 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1500 | dependencies: 1501 | acorn: 8.8.2 1502 | acorn-jsx: 5.3.2(acorn@8.8.2) 1503 | eslint-visitor-keys: 3.4.1 1504 | dev: true 1505 | 1506 | /esquery@1.5.0: 1507 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1508 | engines: {node: '>=0.10'} 1509 | dependencies: 1510 | estraverse: 5.3.0 1511 | dev: true 1512 | 1513 | /esrecurse@4.3.0: 1514 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1515 | engines: {node: '>=4.0'} 1516 | dependencies: 1517 | estraverse: 5.3.0 1518 | dev: true 1519 | 1520 | /estraverse@4.3.0: 1521 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1522 | engines: {node: '>=4.0'} 1523 | dev: true 1524 | 1525 | /estraverse@5.3.0: 1526 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1527 | engines: {node: '>=4.0'} 1528 | dev: true 1529 | 1530 | /estree-walker@2.0.2: 1531 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1532 | dev: false 1533 | 1534 | /esutils@2.0.3: 1535 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1536 | engines: {node: '>=0.10.0'} 1537 | dev: true 1538 | 1539 | /fast-deep-equal@3.1.3: 1540 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1541 | dev: true 1542 | 1543 | /fast-glob@3.2.12: 1544 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 1545 | engines: {node: '>=8.6.0'} 1546 | dependencies: 1547 | '@nodelib/fs.stat': 2.0.5 1548 | '@nodelib/fs.walk': 1.2.8 1549 | glob-parent: 5.1.2 1550 | merge2: 1.4.1 1551 | micromatch: 4.0.5 1552 | dev: true 1553 | 1554 | /fast-json-stable-stringify@2.1.0: 1555 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1556 | dev: true 1557 | 1558 | /fast-levenshtein@2.0.6: 1559 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1560 | dev: true 1561 | 1562 | /fastq@1.15.0: 1563 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1564 | dependencies: 1565 | reusify: 1.0.4 1566 | dev: true 1567 | 1568 | /file-entry-cache@6.0.1: 1569 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1570 | engines: {node: ^10.12.0 || >=12.0.0} 1571 | dependencies: 1572 | flat-cache: 3.0.4 1573 | dev: true 1574 | 1575 | /fill-range@7.0.1: 1576 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1577 | engines: {node: '>=8'} 1578 | dependencies: 1579 | to-regex-range: 5.0.1 1580 | 1581 | /find-up@5.0.0: 1582 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1583 | engines: {node: '>=10'} 1584 | dependencies: 1585 | locate-path: 6.0.0 1586 | path-exists: 4.0.0 1587 | dev: true 1588 | 1589 | /flat-cache@3.0.4: 1590 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1591 | engines: {node: ^10.12.0 || >=12.0.0} 1592 | dependencies: 1593 | flatted: 3.2.7 1594 | rimraf: 3.0.2 1595 | dev: true 1596 | 1597 | /flatted@3.2.7: 1598 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1599 | dev: true 1600 | 1601 | /fraction.js@4.2.0: 1602 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 1603 | dev: true 1604 | 1605 | /fs.realpath@1.0.0: 1606 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1607 | dev: true 1608 | 1609 | /fsevents@2.3.2: 1610 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1611 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1612 | os: [darwin] 1613 | requiresBuild: true 1614 | optional: true 1615 | 1616 | /function-bind@1.1.1: 1617 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1618 | dev: true 1619 | 1620 | /gensync@1.0.0-beta.2: 1621 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1622 | engines: {node: '>=6.9.0'} 1623 | dev: false 1624 | 1625 | /glob-parent@5.1.2: 1626 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1627 | engines: {node: '>= 6'} 1628 | dependencies: 1629 | is-glob: 4.0.3 1630 | 1631 | /glob-parent@6.0.2: 1632 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1633 | engines: {node: '>=10.13.0'} 1634 | dependencies: 1635 | is-glob: 4.0.3 1636 | dev: true 1637 | 1638 | /glob@7.1.6: 1639 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 1640 | dependencies: 1641 | fs.realpath: 1.0.0 1642 | inflight: 1.0.6 1643 | inherits: 2.0.4 1644 | minimatch: 3.1.2 1645 | once: 1.4.0 1646 | path-is-absolute: 1.0.1 1647 | dev: true 1648 | 1649 | /glob@7.2.3: 1650 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1651 | dependencies: 1652 | fs.realpath: 1.0.0 1653 | inflight: 1.0.6 1654 | inherits: 2.0.4 1655 | minimatch: 3.1.2 1656 | once: 1.4.0 1657 | path-is-absolute: 1.0.1 1658 | dev: true 1659 | 1660 | /globals@11.12.0: 1661 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1662 | engines: {node: '>=4'} 1663 | dev: false 1664 | 1665 | /globals@13.20.0: 1666 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 1667 | engines: {node: '>=8'} 1668 | dependencies: 1669 | type-fest: 0.20.2 1670 | dev: true 1671 | 1672 | /globby@11.1.0: 1673 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1674 | engines: {node: '>=10'} 1675 | dependencies: 1676 | array-union: 2.1.0 1677 | dir-glob: 3.0.1 1678 | fast-glob: 3.2.12 1679 | ignore: 5.2.4 1680 | merge2: 1.4.1 1681 | slash: 3.0.0 1682 | dev: true 1683 | 1684 | /globrex@0.1.2: 1685 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1686 | dev: false 1687 | 1688 | /grapheme-splitter@1.0.4: 1689 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 1690 | dev: true 1691 | 1692 | /graphemer@1.4.0: 1693 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1694 | dev: true 1695 | 1696 | /has-flag@3.0.0: 1697 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1698 | engines: {node: '>=4'} 1699 | dev: false 1700 | 1701 | /has-flag@4.0.0: 1702 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1703 | engines: {node: '>=8'} 1704 | dev: true 1705 | 1706 | /has@1.0.3: 1707 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1708 | engines: {node: '>= 0.4.0'} 1709 | dependencies: 1710 | function-bind: 1.1.1 1711 | dev: true 1712 | 1713 | /ignore@5.2.4: 1714 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1715 | engines: {node: '>= 4'} 1716 | dev: true 1717 | 1718 | /immutable@4.3.0: 1719 | resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} 1720 | 1721 | /import-fresh@3.3.0: 1722 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1723 | engines: {node: '>=6'} 1724 | dependencies: 1725 | parent-module: 1.0.1 1726 | resolve-from: 4.0.0 1727 | 1728 | /imurmurhash@0.1.4: 1729 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1730 | engines: {node: '>=0.8.19'} 1731 | dev: true 1732 | 1733 | /inflight@1.0.6: 1734 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1735 | dependencies: 1736 | once: 1.4.0 1737 | wrappy: 1.0.2 1738 | dev: true 1739 | 1740 | /inherits@2.0.4: 1741 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1742 | dev: true 1743 | 1744 | /is-arrayish@0.2.1: 1745 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1746 | dev: false 1747 | 1748 | /is-binary-path@2.1.0: 1749 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1750 | engines: {node: '>=8'} 1751 | dependencies: 1752 | binary-extensions: 2.2.0 1753 | 1754 | /is-core-module@2.12.1: 1755 | resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} 1756 | dependencies: 1757 | has: 1.0.3 1758 | dev: true 1759 | 1760 | /is-extglob@2.1.1: 1761 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1762 | engines: {node: '>=0.10.0'} 1763 | 1764 | /is-glob@4.0.3: 1765 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1766 | engines: {node: '>=0.10.0'} 1767 | dependencies: 1768 | is-extglob: 2.1.1 1769 | 1770 | /is-number@7.0.0: 1771 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1772 | engines: {node: '>=0.12.0'} 1773 | 1774 | /is-path-inside@3.0.3: 1775 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1776 | engines: {node: '>=8'} 1777 | dev: true 1778 | 1779 | /isexe@2.0.0: 1780 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1781 | dev: true 1782 | 1783 | /jiti@1.18.2: 1784 | resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} 1785 | hasBin: true 1786 | dev: true 1787 | 1788 | /js-tokens@4.0.0: 1789 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1790 | dev: false 1791 | 1792 | /js-yaml@4.1.0: 1793 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1794 | hasBin: true 1795 | dependencies: 1796 | argparse: 2.0.1 1797 | 1798 | /jsesc@2.5.2: 1799 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1800 | engines: {node: '>=4'} 1801 | hasBin: true 1802 | dev: false 1803 | 1804 | /json-parse-even-better-errors@2.3.1: 1805 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1806 | dev: false 1807 | 1808 | /json-schema-traverse@0.4.1: 1809 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1810 | dev: true 1811 | 1812 | /json-stable-stringify-without-jsonify@1.0.1: 1813 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1814 | dev: true 1815 | 1816 | /json5@2.2.3: 1817 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1818 | engines: {node: '>=6'} 1819 | hasBin: true 1820 | dev: false 1821 | 1822 | /levn@0.4.1: 1823 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1824 | engines: {node: '>= 0.8.0'} 1825 | dependencies: 1826 | prelude-ls: 1.2.1 1827 | type-check: 0.4.0 1828 | dev: true 1829 | 1830 | /lilconfig@2.1.0: 1831 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1832 | engines: {node: '>=10'} 1833 | dev: true 1834 | 1835 | /lines-and-columns@1.2.4: 1836 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1837 | 1838 | /locate-path@6.0.0: 1839 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1840 | engines: {node: '>=10'} 1841 | dependencies: 1842 | p-locate: 5.0.0 1843 | dev: true 1844 | 1845 | /lodash.merge@4.6.2: 1846 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1847 | dev: true 1848 | 1849 | /loose-envify@1.4.0: 1850 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1851 | hasBin: true 1852 | dependencies: 1853 | js-tokens: 4.0.0 1854 | dev: false 1855 | 1856 | /lru-cache@5.1.1: 1857 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1858 | dependencies: 1859 | yallist: 3.1.1 1860 | dev: false 1861 | 1862 | /lru-cache@6.0.0: 1863 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1864 | engines: {node: '>=10'} 1865 | dependencies: 1866 | yallist: 4.0.0 1867 | dev: true 1868 | 1869 | /merge2@1.4.1: 1870 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1871 | engines: {node: '>= 8'} 1872 | dev: true 1873 | 1874 | /micromatch@4.0.5: 1875 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1876 | engines: {node: '>=8.6'} 1877 | dependencies: 1878 | braces: 3.0.2 1879 | picomatch: 2.3.1 1880 | dev: true 1881 | 1882 | /minimatch@3.1.2: 1883 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1884 | dependencies: 1885 | brace-expansion: 1.1.11 1886 | dev: true 1887 | 1888 | /monaco-editor@0.40.0: 1889 | resolution: {integrity: sha512-1wymccLEuFSMBvCk/jT1YDW/GuxMLYwnFwF9CDyYCxoTw2Pt379J3FUhwy9c43j51JdcxVPjwk0jm0EVDsBS2g==} 1890 | dev: false 1891 | 1892 | /ms@2.1.2: 1893 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1894 | 1895 | /mz@2.7.0: 1896 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1897 | dependencies: 1898 | any-promise: 1.3.0 1899 | object-assign: 4.1.1 1900 | thenify-all: 1.6.0 1901 | dev: true 1902 | 1903 | /nanoid@3.3.6: 1904 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1905 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1906 | hasBin: true 1907 | 1908 | /natural-compare-lite@1.4.0: 1909 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 1910 | dev: true 1911 | 1912 | /natural-compare@1.4.0: 1913 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1914 | dev: true 1915 | 1916 | /node-releases@2.0.12: 1917 | resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} 1918 | dev: true 1919 | 1920 | /node-releases@2.0.13: 1921 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 1922 | dev: false 1923 | 1924 | /normalize-path@3.0.0: 1925 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1926 | engines: {node: '>=0.10.0'} 1927 | 1928 | /normalize-range@0.1.2: 1929 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1930 | engines: {node: '>=0.10.0'} 1931 | dev: true 1932 | 1933 | /object-assign@4.1.1: 1934 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1935 | engines: {node: '>=0.10.0'} 1936 | dev: true 1937 | 1938 | /object-hash@3.0.0: 1939 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1940 | engines: {node: '>= 6'} 1941 | dev: true 1942 | 1943 | /once@1.4.0: 1944 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1945 | dependencies: 1946 | wrappy: 1.0.2 1947 | dev: true 1948 | 1949 | /optionator@0.9.1: 1950 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 1951 | engines: {node: '>= 0.8.0'} 1952 | dependencies: 1953 | deep-is: 0.1.4 1954 | fast-levenshtein: 2.0.6 1955 | levn: 0.4.1 1956 | prelude-ls: 1.2.1 1957 | type-check: 0.4.0 1958 | word-wrap: 1.2.3 1959 | dev: true 1960 | 1961 | /p-limit@3.1.0: 1962 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1963 | engines: {node: '>=10'} 1964 | dependencies: 1965 | yocto-queue: 0.1.0 1966 | dev: true 1967 | 1968 | /p-locate@5.0.0: 1969 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1970 | engines: {node: '>=10'} 1971 | dependencies: 1972 | p-limit: 3.1.0 1973 | dev: true 1974 | 1975 | /parent-module@1.0.1: 1976 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1977 | engines: {node: '>=6'} 1978 | dependencies: 1979 | callsites: 3.1.0 1980 | 1981 | /parse-json@5.2.0: 1982 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1983 | engines: {node: '>=8'} 1984 | dependencies: 1985 | '@babel/code-frame': 7.22.10 1986 | error-ex: 1.3.2 1987 | json-parse-even-better-errors: 2.3.1 1988 | lines-and-columns: 1.2.4 1989 | dev: false 1990 | 1991 | /path-exists@4.0.0: 1992 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1993 | engines: {node: '>=8'} 1994 | dev: true 1995 | 1996 | /path-is-absolute@1.0.1: 1997 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1998 | engines: {node: '>=0.10.0'} 1999 | dev: true 2000 | 2001 | /path-key@3.1.1: 2002 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2003 | engines: {node: '>=8'} 2004 | dev: true 2005 | 2006 | /path-parse@1.0.7: 2007 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2008 | dev: true 2009 | 2010 | /path-type@4.0.0: 2011 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2012 | engines: {node: '>=8'} 2013 | 2014 | /picocolors@1.0.0: 2015 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2016 | 2017 | /picomatch@2.3.1: 2018 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2019 | engines: {node: '>=8.6'} 2020 | 2021 | /pify@2.3.0: 2022 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 2023 | engines: {node: '>=0.10.0'} 2024 | dev: true 2025 | 2026 | /pirates@4.0.5: 2027 | resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} 2028 | engines: {node: '>= 6'} 2029 | dev: true 2030 | 2031 | /postcss-import@15.1.0(postcss@8.4.24): 2032 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 2033 | engines: {node: '>=14.0.0'} 2034 | peerDependencies: 2035 | postcss: ^8.0.0 2036 | dependencies: 2037 | postcss: 8.4.24 2038 | postcss-value-parser: 4.2.0 2039 | read-cache: 1.0.0 2040 | resolve: 1.22.2 2041 | dev: true 2042 | 2043 | /postcss-js@4.0.1(postcss@8.4.24): 2044 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 2045 | engines: {node: ^12 || ^14 || >= 16} 2046 | peerDependencies: 2047 | postcss: ^8.4.21 2048 | dependencies: 2049 | camelcase-css: 2.0.1 2050 | postcss: 8.4.24 2051 | dev: true 2052 | 2053 | /postcss-load-config@4.0.1(postcss@8.4.24): 2054 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} 2055 | engines: {node: '>= 14'} 2056 | peerDependencies: 2057 | postcss: '>=8.0.9' 2058 | ts-node: '>=9.0.0' 2059 | peerDependenciesMeta: 2060 | postcss: 2061 | optional: true 2062 | ts-node: 2063 | optional: true 2064 | dependencies: 2065 | lilconfig: 2.1.0 2066 | postcss: 8.4.24 2067 | yaml: 2.3.1 2068 | dev: true 2069 | 2070 | /postcss-nested@6.0.1(postcss@8.4.24): 2071 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 2072 | engines: {node: '>=12.0'} 2073 | peerDependencies: 2074 | postcss: ^8.2.14 2075 | dependencies: 2076 | postcss: 8.4.24 2077 | postcss-selector-parser: 6.0.13 2078 | dev: true 2079 | 2080 | /postcss-selector-parser@6.0.13: 2081 | resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} 2082 | engines: {node: '>=4'} 2083 | dependencies: 2084 | cssesc: 3.0.0 2085 | util-deprecate: 1.0.2 2086 | dev: true 2087 | 2088 | /postcss-value-parser@4.2.0: 2089 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2090 | dev: true 2091 | 2092 | /postcss@8.4.24: 2093 | resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} 2094 | engines: {node: ^10 || ^12 || >=14} 2095 | dependencies: 2096 | nanoid: 3.3.6 2097 | picocolors: 1.0.0 2098 | source-map-js: 1.0.2 2099 | 2100 | /prelude-ls@1.2.1: 2101 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2102 | engines: {node: '>= 0.8.0'} 2103 | dev: true 2104 | 2105 | /prettier-plugin-tailwindcss@0.2.8(prettier@2.8.8): 2106 | resolution: {integrity: sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==} 2107 | engines: {node: '>=12.17.0'} 2108 | peerDependencies: 2109 | '@ianvs/prettier-plugin-sort-imports': '*' 2110 | '@prettier/plugin-pug': '*' 2111 | '@shopify/prettier-plugin-liquid': '*' 2112 | '@shufo/prettier-plugin-blade': '*' 2113 | '@trivago/prettier-plugin-sort-imports': '*' 2114 | prettier: '>=2.2.0' 2115 | prettier-plugin-astro: '*' 2116 | prettier-plugin-css-order: '*' 2117 | prettier-plugin-import-sort: '*' 2118 | prettier-plugin-jsdoc: '*' 2119 | prettier-plugin-organize-attributes: '*' 2120 | prettier-plugin-organize-imports: '*' 2121 | prettier-plugin-style-order: '*' 2122 | prettier-plugin-svelte: '*' 2123 | prettier-plugin-twig-melody: '*' 2124 | peerDependenciesMeta: 2125 | '@ianvs/prettier-plugin-sort-imports': 2126 | optional: true 2127 | '@prettier/plugin-pug': 2128 | optional: true 2129 | '@shopify/prettier-plugin-liquid': 2130 | optional: true 2131 | '@shufo/prettier-plugin-blade': 2132 | optional: true 2133 | '@trivago/prettier-plugin-sort-imports': 2134 | optional: true 2135 | prettier-plugin-astro: 2136 | optional: true 2137 | prettier-plugin-css-order: 2138 | optional: true 2139 | prettier-plugin-import-sort: 2140 | optional: true 2141 | prettier-plugin-jsdoc: 2142 | optional: true 2143 | prettier-plugin-organize-attributes: 2144 | optional: true 2145 | prettier-plugin-organize-imports: 2146 | optional: true 2147 | prettier-plugin-style-order: 2148 | optional: true 2149 | prettier-plugin-svelte: 2150 | optional: true 2151 | prettier-plugin-twig-melody: 2152 | optional: true 2153 | dependencies: 2154 | prettier: 2.8.8 2155 | dev: true 2156 | 2157 | /prettier@2.8.8: 2158 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 2159 | engines: {node: '>=10.13.0'} 2160 | hasBin: true 2161 | dev: true 2162 | 2163 | /punycode@2.3.0: 2164 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 2165 | engines: {node: '>=6'} 2166 | dev: true 2167 | 2168 | /queue-microtask@1.2.3: 2169 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2170 | dev: true 2171 | 2172 | /react-dom@18.2.0(react@18.2.0): 2173 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 2174 | peerDependencies: 2175 | react: ^18.2.0 2176 | dependencies: 2177 | loose-envify: 1.4.0 2178 | react: 18.2.0 2179 | scheduler: 0.23.0 2180 | dev: false 2181 | 2182 | /react-textarea-autosize@8.5.2(@types/react@18.2.12)(react@18.2.0): 2183 | resolution: {integrity: sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==} 2184 | engines: {node: '>=10'} 2185 | peerDependencies: 2186 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2187 | dependencies: 2188 | '@babel/runtime': 7.22.6 2189 | react: 18.2.0 2190 | use-composed-ref: 1.3.0(react@18.2.0) 2191 | use-latest: 1.2.1(@types/react@18.2.12)(react@18.2.0) 2192 | transitivePeerDependencies: 2193 | - '@types/react' 2194 | dev: false 2195 | 2196 | /react@18.2.0: 2197 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 2198 | engines: {node: '>=0.10.0'} 2199 | dependencies: 2200 | loose-envify: 1.4.0 2201 | dev: false 2202 | 2203 | /read-cache@1.0.0: 2204 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 2205 | dependencies: 2206 | pify: 2.3.0 2207 | dev: true 2208 | 2209 | /readdirp@3.6.0: 2210 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2211 | engines: {node: '>=8.10.0'} 2212 | dependencies: 2213 | picomatch: 2.3.1 2214 | 2215 | /regenerator-runtime@0.13.11: 2216 | resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} 2217 | dev: false 2218 | 2219 | /resolve-from@4.0.0: 2220 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2221 | engines: {node: '>=4'} 2222 | 2223 | /resolve@1.22.2: 2224 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} 2225 | hasBin: true 2226 | dependencies: 2227 | is-core-module: 2.12.1 2228 | path-parse: 1.0.7 2229 | supports-preserve-symlinks-flag: 1.0.0 2230 | dev: true 2231 | 2232 | /reusify@1.0.4: 2233 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2234 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2235 | dev: true 2236 | 2237 | /rimraf@3.0.2: 2238 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2239 | hasBin: true 2240 | dependencies: 2241 | glob: 7.2.3 2242 | dev: true 2243 | 2244 | /rollup@3.25.1: 2245 | resolution: {integrity: sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==} 2246 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 2247 | hasBin: true 2248 | optionalDependencies: 2249 | fsevents: 2.3.2 2250 | 2251 | /run-parallel@1.2.0: 2252 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2253 | dependencies: 2254 | queue-microtask: 1.2.3 2255 | dev: true 2256 | 2257 | /sass@1.63.4: 2258 | resolution: {integrity: sha512-Sx/+weUmK+oiIlI+9sdD0wZHsqpbgQg8wSwSnGBjwb5GwqFhYNwwnI+UWZtLjKvKyFlKkatRK235qQ3mokyPoQ==} 2259 | engines: {node: '>=14.0.0'} 2260 | hasBin: true 2261 | dependencies: 2262 | chokidar: 3.5.3 2263 | immutable: 4.3.0 2264 | source-map-js: 1.0.2 2265 | 2266 | /scheduler@0.23.0: 2267 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 2268 | dependencies: 2269 | loose-envify: 1.4.0 2270 | dev: false 2271 | 2272 | /semver@6.3.1: 2273 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2274 | hasBin: true 2275 | dev: false 2276 | 2277 | /semver@7.5.1: 2278 | resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} 2279 | engines: {node: '>=10'} 2280 | hasBin: true 2281 | dependencies: 2282 | lru-cache: 6.0.0 2283 | dev: true 2284 | 2285 | /shebang-command@2.0.0: 2286 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2287 | engines: {node: '>=8'} 2288 | dependencies: 2289 | shebang-regex: 3.0.0 2290 | dev: true 2291 | 2292 | /shebang-regex@3.0.0: 2293 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2294 | engines: {node: '>=8'} 2295 | dev: true 2296 | 2297 | /slash@3.0.0: 2298 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2299 | engines: {node: '>=8'} 2300 | dev: true 2301 | 2302 | /sonner@0.6.2(react-dom@18.2.0)(react@18.2.0): 2303 | resolution: {integrity: sha512-bh4FWhYoNN481ZIW94W4e0kSLBTMGislYg2YXvDS1px1AJJz4erQe9jHV8s5pS1VMVDgfh3CslNSFLaU6Ldrnw==} 2304 | peerDependencies: 2305 | react: ^18.0.0 2306 | react-dom: ^18.0.0 2307 | dependencies: 2308 | react: 18.2.0 2309 | react-dom: 18.2.0(react@18.2.0) 2310 | dev: false 2311 | 2312 | /source-map-js@1.0.2: 2313 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2314 | engines: {node: '>=0.10.0'} 2315 | 2316 | /strip-ansi@6.0.1: 2317 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2318 | engines: {node: '>=8'} 2319 | dependencies: 2320 | ansi-regex: 5.0.1 2321 | dev: true 2322 | 2323 | /strip-json-comments@3.1.1: 2324 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2325 | engines: {node: '>=8'} 2326 | dev: true 2327 | 2328 | /sucrase@3.32.0: 2329 | resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} 2330 | engines: {node: '>=8'} 2331 | hasBin: true 2332 | dependencies: 2333 | '@jridgewell/gen-mapping': 0.3.3 2334 | commander: 4.1.1 2335 | glob: 7.1.6 2336 | lines-and-columns: 1.2.4 2337 | mz: 2.7.0 2338 | pirates: 4.0.5 2339 | ts-interface-checker: 0.1.13 2340 | dev: true 2341 | 2342 | /supports-color@5.5.0: 2343 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2344 | engines: {node: '>=4'} 2345 | dependencies: 2346 | has-flag: 3.0.0 2347 | dev: false 2348 | 2349 | /supports-color@7.2.0: 2350 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2351 | engines: {node: '>=8'} 2352 | dependencies: 2353 | has-flag: 4.0.0 2354 | dev: true 2355 | 2356 | /supports-preserve-symlinks-flag@1.0.0: 2357 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2358 | engines: {node: '>= 0.4'} 2359 | dev: true 2360 | 2361 | /svg-parser@2.0.4: 2362 | resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} 2363 | dev: false 2364 | 2365 | /tailwindcss@3.3.2: 2366 | resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} 2367 | engines: {node: '>=14.0.0'} 2368 | hasBin: true 2369 | dependencies: 2370 | '@alloc/quick-lru': 5.2.0 2371 | arg: 5.0.2 2372 | chokidar: 3.5.3 2373 | didyoumean: 1.2.2 2374 | dlv: 1.1.3 2375 | fast-glob: 3.2.12 2376 | glob-parent: 6.0.2 2377 | is-glob: 4.0.3 2378 | jiti: 1.18.2 2379 | lilconfig: 2.1.0 2380 | micromatch: 4.0.5 2381 | normalize-path: 3.0.0 2382 | object-hash: 3.0.0 2383 | picocolors: 1.0.0 2384 | postcss: 8.4.24 2385 | postcss-import: 15.1.0(postcss@8.4.24) 2386 | postcss-js: 4.0.1(postcss@8.4.24) 2387 | postcss-load-config: 4.0.1(postcss@8.4.24) 2388 | postcss-nested: 6.0.1(postcss@8.4.24) 2389 | postcss-selector-parser: 6.0.13 2390 | postcss-value-parser: 4.2.0 2391 | resolve: 1.22.2 2392 | sucrase: 3.32.0 2393 | transitivePeerDependencies: 2394 | - ts-node 2395 | dev: true 2396 | 2397 | /text-table@0.2.0: 2398 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2399 | dev: true 2400 | 2401 | /thenify-all@1.6.0: 2402 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2403 | engines: {node: '>=0.8'} 2404 | dependencies: 2405 | thenify: 3.3.1 2406 | dev: true 2407 | 2408 | /thenify@3.3.1: 2409 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2410 | dependencies: 2411 | any-promise: 1.3.0 2412 | dev: true 2413 | 2414 | /to-fast-properties@2.0.0: 2415 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 2416 | engines: {node: '>=4'} 2417 | dev: false 2418 | 2419 | /to-regex-range@5.0.1: 2420 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2421 | engines: {node: '>=8.0'} 2422 | dependencies: 2423 | is-number: 7.0.0 2424 | 2425 | /ts-interface-checker@0.1.13: 2426 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2427 | dev: true 2428 | 2429 | /tsconfck@2.1.2(typescript@5.1.3): 2430 | resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} 2431 | engines: {node: ^14.13.1 || ^16 || >=18} 2432 | hasBin: true 2433 | peerDependencies: 2434 | typescript: ^4.3.5 || ^5.0.0 2435 | peerDependenciesMeta: 2436 | typescript: 2437 | optional: true 2438 | dependencies: 2439 | typescript: 5.1.3 2440 | dev: false 2441 | 2442 | /tslib@1.14.1: 2443 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2444 | dev: true 2445 | 2446 | /tsutils@3.21.0(typescript@5.1.3): 2447 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2448 | engines: {node: '>= 6'} 2449 | peerDependencies: 2450 | 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' 2451 | dependencies: 2452 | tslib: 1.14.1 2453 | typescript: 5.1.3 2454 | dev: true 2455 | 2456 | /type-check@0.4.0: 2457 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2458 | engines: {node: '>= 0.8.0'} 2459 | dependencies: 2460 | prelude-ls: 1.2.1 2461 | dev: true 2462 | 2463 | /type-fest@0.20.2: 2464 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2465 | engines: {node: '>=10'} 2466 | dev: true 2467 | 2468 | /typescript@5.1.3: 2469 | resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} 2470 | engines: {node: '>=14.17'} 2471 | hasBin: true 2472 | 2473 | /update-browserslist-db@1.0.11(browserslist@4.21.10): 2474 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} 2475 | hasBin: true 2476 | peerDependencies: 2477 | browserslist: '>= 4.21.0' 2478 | dependencies: 2479 | browserslist: 4.21.10 2480 | escalade: 3.1.1 2481 | picocolors: 1.0.0 2482 | dev: false 2483 | 2484 | /update-browserslist-db@1.0.11(browserslist@4.21.8): 2485 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} 2486 | hasBin: true 2487 | peerDependencies: 2488 | browserslist: '>= 4.21.0' 2489 | dependencies: 2490 | browserslist: 4.21.8 2491 | escalade: 3.1.1 2492 | picocolors: 1.0.0 2493 | dev: true 2494 | 2495 | /uri-js@4.4.1: 2496 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2497 | dependencies: 2498 | punycode: 2.3.0 2499 | dev: true 2500 | 2501 | /use-composed-ref@1.3.0(react@18.2.0): 2502 | resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} 2503 | peerDependencies: 2504 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2505 | dependencies: 2506 | react: 18.2.0 2507 | dev: false 2508 | 2509 | /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.12)(react@18.2.0): 2510 | resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} 2511 | peerDependencies: 2512 | '@types/react': '*' 2513 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2514 | peerDependenciesMeta: 2515 | '@types/react': 2516 | optional: true 2517 | dependencies: 2518 | '@types/react': 18.2.12 2519 | react: 18.2.0 2520 | dev: false 2521 | 2522 | /use-latest@1.2.1(@types/react@18.2.12)(react@18.2.0): 2523 | resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} 2524 | peerDependencies: 2525 | '@types/react': '*' 2526 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2527 | peerDependenciesMeta: 2528 | '@types/react': 2529 | optional: true 2530 | dependencies: 2531 | '@types/react': 18.2.12 2532 | react: 18.2.0 2533 | use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.12)(react@18.2.0) 2534 | dev: false 2535 | 2536 | /use-sync-external-store@1.2.0(react@18.2.0): 2537 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} 2538 | peerDependencies: 2539 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2540 | dependencies: 2541 | react: 18.2.0 2542 | dev: false 2543 | 2544 | /util-deprecate@1.0.2: 2545 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2546 | dev: true 2547 | 2548 | /vite-plugin-svgr@3.2.0(vite@4.3.9): 2549 | resolution: {integrity: sha512-Uvq6niTvhqJU6ga78qLKBFJSDvxWhOnyfQSoKpDPMAGxJPo5S3+9hyjExE5YDj6Lpa4uaLkGc1cBgxXov+LjSw==} 2550 | peerDependencies: 2551 | vite: ^2.6.0 || 3 || 4 2552 | dependencies: 2553 | '@rollup/pluginutils': 5.0.2 2554 | '@svgr/core': 7.0.0 2555 | '@svgr/plugin-jsx': 7.0.0 2556 | vite: 4.3.9(sass@1.63.4) 2557 | transitivePeerDependencies: 2558 | - rollup 2559 | - supports-color 2560 | dev: false 2561 | 2562 | /vite-tsconfig-paths@4.2.0(typescript@5.1.3)(vite@4.3.9): 2563 | resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} 2564 | peerDependencies: 2565 | vite: '*' 2566 | peerDependenciesMeta: 2567 | vite: 2568 | optional: true 2569 | dependencies: 2570 | debug: 4.3.4 2571 | globrex: 0.1.2 2572 | tsconfck: 2.1.2(typescript@5.1.3) 2573 | vite: 4.3.9(sass@1.63.4) 2574 | transitivePeerDependencies: 2575 | - supports-color 2576 | - typescript 2577 | dev: false 2578 | 2579 | /vite@4.3.9(sass@1.63.4): 2580 | resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} 2581 | engines: {node: ^14.18.0 || >=16.0.0} 2582 | hasBin: true 2583 | peerDependencies: 2584 | '@types/node': '>= 14' 2585 | less: '*' 2586 | sass: '*' 2587 | stylus: '*' 2588 | sugarss: '*' 2589 | terser: ^5.4.0 2590 | peerDependenciesMeta: 2591 | '@types/node': 2592 | optional: true 2593 | less: 2594 | optional: true 2595 | sass: 2596 | optional: true 2597 | stylus: 2598 | optional: true 2599 | sugarss: 2600 | optional: true 2601 | terser: 2602 | optional: true 2603 | dependencies: 2604 | esbuild: 0.17.19 2605 | postcss: 8.4.24 2606 | rollup: 3.25.1 2607 | sass: 1.63.4 2608 | optionalDependencies: 2609 | fsevents: 2.3.2 2610 | 2611 | /which@2.0.2: 2612 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2613 | engines: {node: '>= 8'} 2614 | hasBin: true 2615 | dependencies: 2616 | isexe: 2.0.0 2617 | dev: true 2618 | 2619 | /word-wrap@1.2.3: 2620 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 2621 | engines: {node: '>=0.10.0'} 2622 | dev: true 2623 | 2624 | /wrappy@1.0.2: 2625 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2626 | dev: true 2627 | 2628 | /yallist@3.1.1: 2629 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2630 | dev: false 2631 | 2632 | /yallist@4.0.0: 2633 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2634 | dev: true 2635 | 2636 | /yaml@2.3.1: 2637 | resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} 2638 | engines: {node: '>= 14'} 2639 | dev: true 2640 | 2641 | /yocto-queue@0.1.0: 2642 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2643 | engines: {node: '>=10'} 2644 | dev: true 2645 | 2646 | /zustand@4.4.1(@types/react@18.2.12)(react@18.2.0): 2647 | resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} 2648 | engines: {node: '>=12.7.0'} 2649 | peerDependencies: 2650 | '@types/react': '>=16.8' 2651 | immer: '>=9.0' 2652 | react: '>=16.8' 2653 | peerDependenciesMeta: 2654 | '@types/react': 2655 | optional: true 2656 | immer: 2657 | optional: true 2658 | react: 2659 | optional: true 2660 | dependencies: 2661 | '@types/react': 18.2.12 2662 | react: 18.2.0 2663 | use-sync-external-store: 1.2.0(react@18.2.0) 2664 | dev: false 2665 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /prettier.config.cjs: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | module.exports = { 3 | jsxSingleQuote: true, 4 | jsxBracketSameLine: true, 5 | printWidth: 120, 6 | singleQuote: true, 7 | trailingComma: 'none', 8 | useTabs: true, 9 | tabWidth: 2, 10 | semi: false, 11 | arrowParens: 'avoid', 12 | 13 | plugins: [require('prettier-plugin-tailwindcss')] 14 | } 15 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YYsuni/code-mind/0c8ca241b217c78df087a6581dff998588abd4be/screenshot.png -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import CodeMind from './components/code-mind' 2 | import { Toaster } from 'sonner' 3 | 4 | function App() { 5 | return ( 6 | <> 7 |
8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | ) 17 | } 18 | 19 | export default App 20 | -------------------------------------------------------------------------------- /src/components/code-mind.tsx: -------------------------------------------------------------------------------- 1 | import './monacoWorker' 2 | 3 | import { createContext, useEffect, useState } from 'react' 4 | import MindContainer from './mind-container' 5 | import MindNode from './mind-node' 6 | import { stateStore } from '../lib/save' 7 | import MindControl from './mind-control' 8 | 9 | export const MindContext = createContext({ 10 | distance: 0, 11 | gap: 0, 12 | edgeType: 'line', 13 | layoutFlag: 0, 14 | updateLayout: () => {}, 15 | maxWidth: 0, 16 | minWidth: 0, 17 | saveFlag: 0 18 | }) 19 | 20 | interface Props { 21 | distance?: number 22 | gap?: number 23 | edgeType?: string 24 | maxWidth?: number 25 | minWidth?: number 26 | } 27 | 28 | export default function CodeMind({ 29 | distance = 36, 30 | gap = 16, 31 | edgeType = 'line', 32 | maxWidth = 400, 33 | minWidth = 100 34 | }: Props) { 35 | const [layoutFlag, setLayoutFlag] = useState(0) 36 | const [saveFlag, setSaveFlag] = useState(0) 37 | 38 | // Initialize 39 | useEffect(() => { 40 | // Initialize save handle 41 | stateStore.saveHandle = () => { 42 | setSaveFlag(state => ++state) 43 | } 44 | }, []) 45 | 46 | return ( 47 | setLayoutFlag(state => state + 1), 54 | maxWidth, 55 | minWidth, 56 | saveFlag 57 | }}> 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | -------------------------------------------------------------------------------- /src/components/color-picker.tsx: -------------------------------------------------------------------------------- 1 | export default function ColorPicker() { 2 | return ( 3 |
4 |
5 | 11 | 17 |
18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /src/components/editable-node.tsx: -------------------------------------------------------------------------------- 1 | import { forwardRef, memo, useContext, useEffect, useImperativeHandle, useReducer, useRef, useState } from 'react' 2 | import { MindContext } from './code-mind' 3 | import * as monaco from 'monaco-editor/esm/vs/editor/editor.api' 4 | import { getMonacoContent } from '@/utils' 5 | import clsx from 'clsx' 6 | import { useSelectState } from '@/hooks/useSelectState' 7 | 8 | interface Props { 9 | generateNextSibling: () => void 10 | generateChild: () => void 11 | deleteCurrent: () => void 12 | node: MindNode 13 | } 14 | 15 | const _EditableNode = forwardRef((props, ref) => { 16 | const { generateNextSibling, generateChild, deleteCurrent, node } = props 17 | const { maxWidth, minWidth, updateLayout } = useContext(MindContext) 18 | 19 | const innerRef = useRef(null) 20 | const [value, setValue] = useState(node.value) 21 | const [type, setType] = useState(node.type || 'text') 22 | const [code, setCode] = useState(node.code || '') 23 | 24 | const [editable, _setEditable] = useState(false) 25 | const setEditable = (bool: boolean) => { 26 | if (!bool) { 27 | if (innerRef.current) setValue(innerRef.current.innerHTML) 28 | } 29 | _setEditable(bool) 30 | } 31 | 32 | const [style, dispatchStyle] = useReducer(styleReducer, node.style || {}) 33 | useEffect(() => { 34 | if (innerRef.current) { 35 | innerRef.current.reactStyle = style 36 | innerRef.current.dispatchStyle = dispatchStyle 37 | } 38 | }, [innerRef.current, style]) 39 | 40 | // Update node object values 41 | useEffect(() => { 42 | node.value = value 43 | node.type = type 44 | node.code = code 45 | }, [value, type, code]) 46 | 47 | // New node can be edited immediately. 48 | useEffect(() => { 49 | if (node.isNew) { 50 | innerRef.current!.focus() 51 | const selection = window.getSelection() 52 | selection?.selectAllChildren(innerRef.current!) 53 | 54 | node.isNew = false 55 | } 56 | }, [node]) 57 | 58 | // Changes in height will trigger a global update of the lines. 59 | const [height, setHeight] = useState(0) 60 | useEffect(() => { 61 | updateLayout() 62 | }, [height]) 63 | useEffect(() => { 64 | const resizeObserver = new ResizeObserver(() => { 65 | setHeight(innerRef.current!.scrollHeight) 66 | }) 67 | 68 | resizeObserver.observe(innerRef.current!) 69 | 70 | return () => { 71 | resizeObserver.disconnect() 72 | } 73 | }, [innerRef.current]) 74 | 75 | // Monaco Editor 76 | const editorRef = useRef(null) 77 | const [editor, setEditor] = useState(null) 78 | useEffect(() => { 79 | if (type === 'code' && editorRef.current && editable) { 80 | const _editor = monaco.editor.create(editorRef.current!, { 81 | value: code, 82 | language: 'typescript', 83 | minimap: { enabled: false }, 84 | scrollbar: { 85 | vertical: 'hidden' 86 | }, 87 | tabSize: 2, 88 | scrollBeyondLastLine: false 89 | }) 90 | const _model = _editor.getModel() 91 | 92 | const end = () => { 93 | setCode(_editor.getValue()) 94 | setValue(getMonacoContent(innerRef.current)) 95 | _model?.dispose() 96 | _editor.dispose() 97 | _setEditable(false) 98 | setEditor(null) 99 | } 100 | 101 | _editor.focus() 102 | 103 | _model?.onDidChangeContent(event => { 104 | if (_editor.getValue() === '/text') { 105 | setValue('') 106 | setCode('') 107 | setType('text') 108 | setTimeout(() => { 109 | innerRef.current?.focus() 110 | setEditable(true) 111 | }, 100) 112 | } 113 | }) 114 | 115 | _editor.onDidBlurEditorWidget(end) 116 | 117 | _editor.onKeyDown(event => { 118 | if (event.keyCode === 9) { 119 | end() 120 | setTimeout(() => innerRef.current?.focus()) 121 | } 122 | }) 123 | 124 | setEditor(_editor) 125 | } 126 | }, [type, editorRef, editable, code]) 127 | 128 | useImperativeHandle( 129 | ref, 130 | () => ({ 131 | getContent() { 132 | if (type === 'code') return getMonacoContent(innerRef.current) 133 | return innerRef.current!.innerHTML 134 | }, 135 | getType() { 136 | return type 137 | }, 138 | getCode() { 139 | return editor ? editor.getValue() : code 140 | }, 141 | getStyle() { 142 | return style 143 | } 144 | }), 145 | [type, code, editor, style] 146 | ) 147 | 148 | const { current } = useSelectState() 149 | 150 | if (type === 'code') { 151 | return editable ? ( 152 |
153 |
154 |
155 | ) : ( 156 |
innerRef.current!.focus()} 161 | onDoubleClick={() => setEditable(true)} 162 | className='relative h-[400px] w-[400px] shrink-0 cursor-default break-all rounded bg-white/90 py-4 pr-4 font-medium outline-2 outline-offset-2 outline-focus focus:outline' 163 | onKeyDown={event => { 164 | if (event.key === 'Enter' && !event.shiftKey) { 165 | event.preventDefault() 166 | generateNextSibling() 167 | } else if (event.key === 'Tab') { 168 | event.preventDefault() 169 | generateChild() 170 | } else if (!editable && (event.key === 'Delete' || event.key === 'Backspace')) { 171 | deleteCurrent() 172 | } 173 | }} 174 | /> 175 | ) 176 | } else 177 | return ( 178 |
setEditable(true)} 183 | onBlur={() => { 184 | setEditable(false) 185 | }} 186 | onKeyDown={event => { 187 | if (event.key === 'Enter') { 188 | if (editable) { 189 | if (!event.shiftKey) { 190 | setEditable(false) 191 | } 192 | } else { 193 | event.preventDefault() 194 | generateNextSibling() 195 | } 196 | } else if (event.key === 'Tab') { 197 | if (editable) { 198 | event.preventDefault() 199 | setEditable(false) 200 | } else { 201 | event.preventDefault() 202 | generateChild() 203 | } 204 | } else if (event.key === 'Escape') { 205 | setEditable(false) 206 | } else if ( 207 | (!editable || innerRef.current!.innerHTML === '') && 208 | (event.key === 'Delete' || event.key === 'Backspace') 209 | ) { 210 | deleteCurrent() 211 | } else if (editable && event.key === 'e' && innerRef.current?.innerText === '/cod') { 212 | event.preventDefault() 213 | setValue('') 214 | setType('code') 215 | } else if ( 216 | !editable && 217 | !/^.{2,}/.test(event.key) && 218 | !event.shiftKey && 219 | !event.altKey && 220 | !event.metaKey && 221 | !event.ctrlKey 222 | ) { 223 | setEditable(true) 224 | } 225 | }} 226 | contentEditable={editable} 227 | className={clsx('mind-node', current && current === innerRef.current && 'selected')} 228 | id='mind-node' 229 | style={{ maxWidth, minWidth, ...style }} 230 | /> 231 | ) 232 | }) 233 | 234 | const EditableNode = memo(_EditableNode) 235 | 236 | export default EditableNode 237 | 238 | const styleReducer: React.Reducer< 239 | React.CSSProperties, 240 | { type: 'setWidth' | 'setMinWidth' | 'setMaxWidth' | 'setHeight' | 'setBackgroundColor'; payload: string | number } 241 | > = (style, action) => { 242 | switch (action.type) { 243 | case 'setWidth': 244 | return { ...style, width: action.payload } 245 | case 'setMinWidth': 246 | return { ...style, minWidth: action.payload } 247 | case 'setMaxWidth': 248 | return { ...style, maxWidth: action.payload } 249 | case 'setHeight': 250 | return { ...style, height: action.payload } 251 | case 'setBackgroundColor': 252 | return { ...style, backgroundColor: String(action.payload) } 253 | 254 | default: { 255 | throw Error('Unknown action: ' + action.type) 256 | } 257 | } 258 | } 259 | -------------------------------------------------------------------------------- /src/components/mind-container.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react' 2 | import { useSpring, animated } from '@react-spring/web' 3 | import { containerState, controls } from '@/share' 4 | import { createUseGesture, dragAction, pinchAction, wheelAction } from '@use-gesture/react' 5 | import Scene from '@/themes/sunset/scene' 6 | import { containerListener } from '@/hooks/useSelectState' 7 | import { MAX_SCALE, MIN_SCALE } from '@/consts' 8 | 9 | const useGesture = createUseGesture([dragAction, pinchAction, wheelAction]) 10 | 11 | export default function MindContainer({ children }: PropsWithChildren) { 12 | const [springs, api] = useSpring(() => ({ 13 | from: { x: containerState.x(), y: containerState.y(), scale: containerState.scale }, 14 | config: { tension: 100, friction: 5, mass: 0.1 } 15 | })) 16 | 17 | // Initialize controls in share file 18 | useEffect(() => { 19 | controls.setScale = (s: number) => { 20 | containerState.scale = s 21 | api.start({ scale: s }) 22 | } 23 | controls.clearOffset = () => { 24 | containerState.offsetX = 0 25 | containerState.offsetY = 0 26 | containerState.initialX = 0 27 | containerState.initialY = 0 28 | containerState.wheelX = 0 29 | containerState.wheelY = 0 30 | api.start({ x: 0, y: 0 }) 31 | } 32 | }, [api]) 33 | 34 | const containerRef = useRef(null) 35 | 36 | // Prevent default gesture event 37 | useEffect(() => { 38 | const handler = (e: Event) => e.preventDefault() 39 | document.addEventListener('gesturestart', handler) 40 | document.addEventListener('gesturechange', handler) 41 | document.addEventListener('gestureend', handler) 42 | 43 | return () => { 44 | document.removeEventListener('gesturestart', handler) 45 | document.removeEventListener('gesturechange', handler) 46 | document.removeEventListener('gestureend', handler) 47 | } 48 | }, []) 49 | 50 | useGesture( 51 | { 52 | onPinch: ({ offset: [s] }) => { 53 | api.start({ scale: s }) 54 | containerState.scale = s 55 | }, 56 | onDrag: ({ offset, target, cancel, pinching }) => { 57 | if (pinching) return cancel() 58 | 59 | containerState.offsetX = offset[0] 60 | containerState.offsetY = offset[1] 61 | api.set({ x: containerState.x(), y: containerState.y() }) 62 | }, 63 | onWheel: ({ offset, pinching, event }) => { 64 | if (!pinching && !event.ctrlKey) { 65 | containerState.wheelX = offset[0] 66 | containerState.wheelY = offset[1] 67 | api.set({ x: containerState.x(), y: containerState.y() }) 68 | } else { 69 | offset[0] = containerState.wheelX 70 | offset[1] = containerState.wheelY 71 | } 72 | } 73 | }, 74 | { 75 | target: containerRef, 76 | pinch: { scaleBounds: { min: MIN_SCALE, max: MAX_SCALE }, rubberband: true }, 77 | drag: { pointer: { keys: false, buttons: 'ontouchstart' in window ? 1 : 4 } } 78 | } 79 | ) 80 | 81 | // Grabbing cursor 82 | useEffect(() => { 83 | const mousedownHandler = (event: MouseEvent) => { 84 | if ((event.button === 1 || event.buttons === 4) && containerRef.current) { 85 | containerRef.current.style.cursor = 'grabbing' 86 | } 87 | } 88 | const mouseupHandler = (event: MouseEvent) => { 89 | if ((event.button === 1 || event.buttons === 4) && containerRef.current) { 90 | containerRef.current.style.cursor = 'auto' 91 | } 92 | } 93 | 94 | containerRef.current?.addEventListener('mousedown', mousedownHandler) 95 | containerRef.current?.addEventListener('mouseup', mouseupHandler) 96 | 97 | return () => { 98 | containerRef.current?.removeEventListener('mousedown', mousedownHandler) 99 | containerRef.current?.removeEventListener('mouseup', mouseupHandler) 100 | } 101 | }, []) 102 | 103 | return ( 104 |
109 |
110 | 111 | 112 | 113 | 114 | {children} 115 | 116 |
117 |
118 | ) 119 | } 120 | -------------------------------------------------------------------------------- /src/components/mind-control.tsx: -------------------------------------------------------------------------------- 1 | import { ReactComponent as BrushSVG } from '@/svgs/brush.svg' 2 | import { ReactComponent as ZoomInSVG } from '@/svgs/zoom-in.svg' 3 | import { ReactComponent as ZoomOutSVG } from '@/svgs/zoom-out.svg' 4 | import { ReactComponent as CenterSVG } from '@/svgs/center.svg' 5 | import { ReactComponent as BoldSVG } from '@/svgs/bold.svg' 6 | import { ReactComponent as ItalicSVG } from '@/svgs/italic.svg' 7 | import { ReactComponent as StrikeThroughSVG } from '@/svgs/strike-through.svg' 8 | import { containerState, controls } from '@/share' 9 | import { useContext, useEffect, useRef, useState } from 'react' 10 | import { useSelectState } from '@/hooks/useSelectState' 11 | import { MindContext } from './code-mind' 12 | import { MAX_SCALE, MIN_SCALE } from '@/consts' 13 | import ColorPicker from './color-picker' 14 | 15 | export default function MindControl() { 16 | return ( 17 | 48 | ) 49 | } 50 | 51 | function Brush() { 52 | const { maxWidth, minWidth } = useContext(MindContext) 53 | 54 | const [show, setShow] = useState(false) 55 | const [_, updateState] = useState(0) 56 | const ref = useRef(null) 57 | 58 | const { current } = useSelectState() 59 | 60 | useEffect(() => { 61 | if (current && show) { 62 | if (ref.current && current.reactStyle) { 63 | const minWidthElement = ref.current.querySelector('input[name="min-width"]') as HTMLInputElement 64 | if (minWidthElement) 65 | if ('minWidth' in current.reactStyle) minWidthElement.value = String(current.reactStyle.minWidth) 66 | else minWidthElement.value = '' 67 | 68 | const maxWidthElement = ref.current.querySelector('input[name="max-width"]') as HTMLInputElement 69 | if (maxWidthElement) 70 | if ('maxWidth' in current.reactStyle) maxWidthElement.value = String(current.reactStyle.maxWidth) 71 | else maxWidthElement.value = '' 72 | 73 | const widthElement = ref.current.querySelector('input[name="width"]') as HTMLInputElement 74 | if (widthElement) 75 | if ('width' in current.reactStyle) widthElement.value = String(current.reactStyle.width) 76 | else widthElement.value = '' 77 | 78 | const heightElement = ref.current.querySelector('input[name="height"]') as HTMLInputElement 79 | if (heightElement) 80 | if ('height' in current.reactStyle) heightElement.value = String(current.reactStyle.height) 81 | else heightElement.value = '' 82 | } 83 | 84 | const observer = new ResizeObserver(() => updateState(state => ++state)) 85 | observer.observe(current, { box: 'border-box' }) 86 | 87 | return () => observer.disconnect() 88 | } 89 | }, [current, show]) 90 | 91 | const normalChangeHanlder = 92 | (action: 'setMinWidth' | 'setMaxWidth' | 'setWidth' | 'setHeight') => 93 | (event: React.ChangeEvent) => { 94 | if (current?.dispatchStyle) { 95 | const target = event.target as HTMLInputElement 96 | 97 | if (!target.value) { 98 | current.dispatchStyle({ type: action, payload: '' }) 99 | } else { 100 | const value = +target.value 101 | 102 | if (!Object.is(value, NaN)) current.dispatchStyle({ type: action, payload: value }) 103 | } 104 | } 105 | } 106 | 107 | return ( 108 | <> 109 | 110 | 117 | 118 | {show && 119 | (current ? ( 120 |
124 |
125 | 145 | 165 | 185 | 186 | 206 |
207 | 208 |
209 | 210 |
211 | Fill 212 | 213 | 216 |
217 | 218 | 219 |
220 | 221 |
222 | Text 223 | 224 | 227 |
228 |
229 |
230 | 236 | 242 |
243 | 244 |
245 | 248 | 251 | 254 | 255 | 256 |
257 |
258 | ) : ( 259 |
262 |

Null

263 |

Please select the node

264 |
265 | ))} 266 | 267 | 268 | ) 269 | } 270 | -------------------------------------------------------------------------------- /src/components/mind-edge.tsx: -------------------------------------------------------------------------------- 1 | import { useContext, useEffect, useState } from 'react' 2 | import clsx from 'clsx' 3 | import { MindContext } from './code-mind' 4 | import { containerState } from '@/share' 5 | import { amendDistance } from '@/utils' 6 | 7 | interface Props { 8 | parentNode?: NodeRef 9 | childNode: NodeRef 10 | siblings?: MindNode[] 11 | type?: LineType 12 | } 13 | 14 | export default function MindEdge({ parentNode, childNode, siblings, type = 'bezier' }: Props) { 15 | const { distance, layoutFlag } = useContext(MindContext) 16 | 17 | const [height, setHeight] = useState(0) 18 | 19 | useEffect(() => { 20 | if (parentNode?.current && childNode.current) { 21 | const { top: pTop, height: pheight } = parentNode.current.getBoundingClientRect() 22 | const { top: cTop, height: cHeight } = childNode.current.getBoundingClientRect() 23 | 24 | let height = pTop - cTop + (pheight - cHeight) / 2 25 | height /= containerState.scale 26 | 27 | setHeight(height) 28 | } 29 | }, [siblings, layoutFlag]) 30 | 31 | const h = Math.abs(height) 32 | 33 | const distance_amend = amendDistance(distance, siblings) 34 | 35 | if (parentNode?.current && childNode.current) 36 | if (h > 2) { 37 | switch (type) { 38 | case 'bezier': 39 | return ( 40 | 50 | 51 | 52 | ) 53 | case 'right-angle': 54 | return ( 55 |
61 |
65 |
66 | ) 67 | case 'straight-with-handle': 68 | return ( 69 | 79 | 80 | 81 | 82 | ) 83 | case 'straight': 84 | default: 85 | return ( 86 | 95 | 96 | 97 | ) 98 | } 99 | } else 100 | return ( 101 |
105 | ) 106 | 107 | return null 108 | } 109 | -------------------------------------------------------------------------------- /src/components/mind-node.tsx: -------------------------------------------------------------------------------- 1 | import { Dispatch, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react' 2 | import MindEdge from './mind-edge' 3 | import { MindContext } from './code-mind' 4 | import EditableNode from './editable-node' 5 | import { stateStore } from '../lib/save' 6 | import { amendDistance } from '@/utils' 7 | 8 | interface Props { 9 | index?: number 10 | parentID?: string 11 | node: MindNode 12 | parentRef?: NodeRef 13 | siblings?: MindNode[] 14 | setParentChildren?: Dispatch 15 | } 16 | 17 | export default function MindNode({ node, parentRef, siblings, setParentChildren, index, parentID }: Props) { 18 | const { distance, gap, updateLayout, saveFlag } = useContext(MindContext) 19 | 20 | const nodeRef = useRef(null) 21 | const contentRef = useRef<{ 22 | getContent: () => string 23 | getType: () => NodeType 24 | getCode: () => string 25 | getStyle: () => React.CSSProperties 26 | }>(null) 27 | 28 | const [children, setChildren] = useState(node.children) 29 | 30 | const generateNextSibling = useCallback(() => { 31 | if (siblings && setParentChildren) { 32 | const nextIndex = (index || 0) + 1 33 | const nextNode: MindNode = { 34 | id: String(Date.now()), 35 | value: 'Example ' + (siblings.length + 1), 36 | isNew: true, 37 | isFirstEdit: true 38 | } 39 | siblings.splice(nextIndex, 0, nextNode) 40 | setParentChildren(siblings.slice()) 41 | updateLayout() 42 | } 43 | }, [siblings, index]) 44 | 45 | const generateChild = useCallback(() => { 46 | if (!Array.isArray(children)) { 47 | setChildren([{ id: String(Date.now()), value: 'Example 1', isNew: true, isFirstEdit: true }]) 48 | } else { 49 | setChildren([ 50 | ...children, 51 | { id: String(Date.now()), value: 'Example ' + (children.length + 1), isNew: true, isFirstEdit: true } 52 | ]) 53 | } 54 | updateLayout() 55 | }, [children]) 56 | 57 | const deleteCurrent = useCallback(() => { 58 | if (siblings && setParentChildren) { 59 | siblings?.splice(index!, 1) 60 | setParentChildren(siblings?.slice()) 61 | updateLayout() 62 | } 63 | }, [siblings, index]) 64 | 65 | const SingleNode = useMemo( 66 | () => ( 67 |
68 | 75 | 76 | 77 |
78 | ), 79 | [generateNextSibling, generateNextSibling, generateChild] 80 | ) 81 | 82 | // Save feature: Push current state object to the stateStore. 83 | useEffect(() => { 84 | const currentNode: MindNode = { 85 | id: node.id, 86 | value: contentRef.current?.getContent() || '', 87 | parentID, 88 | type: contentRef.current?.getType() || 'text', 89 | style: contentRef.current?.getStyle() 90 | } 91 | if (currentNode.type === 'code') currentNode.code = contentRef.current?.getCode() || '' 92 | 93 | stateStore.current.push(currentNode) 94 | }, [saveFlag]) 95 | 96 | const distance_amend = amendDistance(distance, children) 97 | 98 | if (Array.isArray(children) && children.length > 0) { 99 | return ( 100 |
101 | {SingleNode} 102 |
103 | {children.map((item, index) => ( 104 | 113 | ))} 114 |
115 |
116 | ) 117 | } 118 | 119 | return SingleNode 120 | } 121 | -------------------------------------------------------------------------------- /src/components/monacoWorker.ts: -------------------------------------------------------------------------------- 1 | import * as monaco from 'monaco-editor' 2 | import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker' 3 | import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker' 4 | import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker' 5 | 6 | self.MonacoEnvironment = { 7 | getWorker(_: any, label: string) { 8 | if (label === 'json') { 9 | return new jsonWorker() 10 | } 11 | 12 | if (label === 'typescript' || label === 'javascript') { 13 | return new tsWorker() 14 | } 15 | return new editorWorker() 16 | } 17 | } 18 | 19 | monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true) 20 | 21 | // Import the relevant CSS files directly. 22 | monaco.editor 23 | .create(document.createElement('div'), { 24 | value: '', 25 | language: 'typescript', 26 | minimap: { enabled: false }, 27 | scrollbar: { 28 | vertical: 'hidden' 29 | }, 30 | tabSize: 2, 31 | scrollBeyondLastLine: false 32 | }) 33 | .dispose() 34 | -------------------------------------------------------------------------------- /src/consts.ts: -------------------------------------------------------------------------------- 1 | export const initialNode: MindNode = { 2 | id: '0', 3 | value: 'CodeMind', 4 | children: [ 5 | { id: '1-0', value: 'Example 1', isFirstEdit: true }, 6 | { id: '1-1', value: 'Example 2', isFirstEdit: true } 7 | ] 8 | } 9 | 10 | export const MAX_SCALE = 2.5 11 | export const MIN_SCALE = 0.5 12 | -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.svg' { 2 | const src: string 3 | export default src 4 | export const ReactComponent: React.FC> 5 | } 6 | 7 | declare type PropsWithChildren = React.PropsWithChildren 8 | 9 | declare type NodeElement = HTMLDivElement & { 10 | reactStyle?: React.CSSProperties 11 | dispatchStyle?: React.Dispatch<{ 12 | type: 'setWidth' | 'setMinWidth' | 'setMaxWidth' | 'setHeight' | 'setBackgroundColor' 13 | payload: string | number 14 | }> 15 | } 16 | declare type NodeRef = React.RefObject 17 | 18 | declare type LineType = 'straight' | 'straight-with-handle' | 'right-angle' | 'bezier' 19 | declare type NodeType = 'text' | 'code' 20 | 21 | declare type MindNode = { 22 | id: string 23 | parentID?: string 24 | value: string 25 | children?: MindNode[] 26 | isNew?: boolean 27 | isFirstEdit?: boolean 28 | type?: NodeType 29 | code?: string 30 | style?: React.CSSProperties 31 | } 32 | -------------------------------------------------------------------------------- /src/hooks/useFocusState.ts: -------------------------------------------------------------------------------- 1 | import { createStore, useStore } from 'zustand' 2 | 3 | export const focusStateStore = createStore(() => ({ 4 | current: null as NodeElement | null 5 | })) 6 | 7 | export function useFocusState() { 8 | const store = useStore(focusStateStore) 9 | 10 | return store 11 | } 12 | 13 | window.addEventListener( 14 | 'focus', 15 | event => { 16 | const target = event.target 17 | if (target && target instanceof HTMLDivElement && target.id === 'mind-node') { 18 | focusStateStore.setState({ current: target }) 19 | } 20 | }, 21 | { capture: true } 22 | ) 23 | window.addEventListener( 24 | 'blur', 25 | event => { 26 | const target = event.target 27 | if (target && target instanceof HTMLDivElement && target.id === 'mind-node') { 28 | if (target === focusStateStore.getState().current) focusStateStore.setState({ current: null }) 29 | } 30 | }, 31 | { capture: true } 32 | ) 33 | -------------------------------------------------------------------------------- /src/hooks/useSelectState.ts: -------------------------------------------------------------------------------- 1 | import { createStore, useStore } from 'zustand' 2 | 3 | export const selectStateStore = createStore(() => ({ 4 | current: null as NodeElement | null 5 | })) 6 | 7 | export function useSelectState() { 8 | const store = useStore(selectStateStore) 9 | 10 | return store 11 | } 12 | 13 | export const containerListener = (event: React.MouseEvent) => { 14 | const target = event.target 15 | 16 | if (target && target instanceof HTMLDivElement && target.id === 'mind-node') { 17 | // Nothing now 18 | } else { 19 | selectStateStore.setState({ current: null }) 20 | } 21 | } 22 | 23 | window.addEventListener( 24 | 'focus', 25 | event => { 26 | const target = event.target 27 | if (target && target instanceof HTMLDivElement && target.id === 'mind-node') { 28 | if (target !== selectStateStore.getState().current) selectStateStore.setState({ current: target }) 29 | } 30 | }, 31 | { capture: true } 32 | ) 33 | -------------------------------------------------------------------------------- /src/lib/save.ts: -------------------------------------------------------------------------------- 1 | import { isObject } from '@/utils' 2 | import { containerState } from '../share' 3 | import { getStorage, setStorage } from './storage' 4 | import { toast } from 'sonner' 5 | import { initialNode } from '@/consts' 6 | 7 | export const stateStore = { 8 | current: [] as MindNode[], 9 | saveHandle: () => {}, 10 | local: getLocalNodeTree() 11 | } 12 | 13 | export function getLocalNodeTree() { 14 | const local = getStorage('state') 15 | 16 | if (local) { 17 | const state: MindNode[] = JSON.parse(local) 18 | 19 | if (Array.isArray(state)) { 20 | const rootNode = state.find(item => !item.parentID) as MindNode 21 | 22 | const nodeMap = new Map() 23 | state.forEach(item => { 24 | nodeMap.set(item.id, item) 25 | }) 26 | state.forEach(item => { 27 | if (nodeMap.has(item.parentID)) { 28 | const node = nodeMap.get(item.parentID) 29 | 30 | if (Array.isArray(node!.children)) { 31 | node!.children.push(item) 32 | } else { 33 | node!.children = [item] 34 | } 35 | } 36 | }) 37 | 38 | return rootNode 39 | } 40 | } 41 | 42 | return initialNode 43 | } 44 | 45 | export function getLocalContainerState() { 46 | const local = getStorage('container') 47 | 48 | if (local) { 49 | const state = JSON.parse(local) 50 | 51 | if (isObject(state)) { 52 | return state 53 | } 54 | } 55 | 56 | return null 57 | } 58 | 59 | async function save() { 60 | return new Promise(resolve => { 61 | stateStore.current = [] 62 | 63 | stateStore.saveHandle() 64 | 65 | setTimeout(() => { 66 | const state = JSON.stringify(stateStore.current) 67 | 68 | setStorage('state', state) 69 | saveContainerState() 70 | 71 | resolve(true) 72 | }, 0) 73 | }) 74 | } 75 | 76 | function saveContainerState() { 77 | const containerState_amend = { 78 | initialX: containerState.x(), 79 | initialY: containerState.y(), 80 | scale: containerState.scale 81 | } 82 | 83 | setStorage('container', JSON.stringify(containerState_amend)) 84 | } 85 | 86 | window.addEventListener('keydown', async event => { 87 | if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 's') { 88 | event.preventDefault() 89 | await save() 90 | toast.success('Saved to local storage!') 91 | } 92 | }) 93 | -------------------------------------------------------------------------------- /src/lib/storage.ts: -------------------------------------------------------------------------------- 1 | const state = 'state' 2 | const container = 'container' 3 | 4 | type Key = typeof state | typeof container 5 | 6 | export const setStorage = (key: Key, value: string) => { 7 | window.localStorage.setItem(key, value) 8 | } 9 | 10 | export const getStorage = (key: Key) => { 11 | if (typeof window !== 'undefined') return window.localStorage.getItem(key) 12 | } 13 | 14 | export const removeStorage = (key: Key) => { 15 | if (typeof window !== 'undefined') return window.localStorage.removeItem(key) 16 | } 17 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import ReactDOM from 'react-dom/client' 2 | import App from './App.tsx' 3 | import './styles' 4 | 5 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render() 6 | -------------------------------------------------------------------------------- /src/share.ts: -------------------------------------------------------------------------------- 1 | import { getLocalContainerState } from './lib/save' 2 | 3 | export const containerState = { 4 | initialX: 0, 5 | initialY: 0, 6 | offsetX: 0, 7 | offsetY: 0, 8 | wheelX: 0, 9 | wheelY: 0, 10 | x() { 11 | return this.offsetX - this.wheelX + this.initialX 12 | }, 13 | y() { 14 | return this.offsetY - this.wheelY + this.initialY 15 | }, 16 | 17 | scale: 1, 18 | 19 | ...getLocalContainerState() 20 | } as { 21 | initialX: number 22 | initialY: number 23 | offsetX: number 24 | offsetY: number 25 | wheelX: number 26 | wheelY: number 27 | x: () => number 28 | y: () => number 29 | scale: number 30 | } 31 | 32 | export const controls = { 33 | setScale(s: number) {}, 34 | clearOffset() {} 35 | } 36 | -------------------------------------------------------------------------------- /src/styles/index.scss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @import './monaco'; 6 | @import './mind-node'; 7 | 8 | html, 9 | body, 10 | #root { 11 | height: 100%; 12 | } 13 | 14 | *:focus-visible { 15 | @apply outline-focus; 16 | } 17 | 18 | body { 19 | @apply bg-bg text-text; 20 | } 21 | 22 | * { 23 | scrollbar-width: none; 24 | &::-webkit-scrollbar { 25 | display: none; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/styles/mind-node.scss: -------------------------------------------------------------------------------- 1 | .mind-node { 2 | @apply relative w-max shrink-0 break-all rounded-md bg-white/80 px-6 py-3 text-sm font-medium backdrop-blur focus:outline-none; 3 | 4 | &.selected { 5 | @apply outline outline-2 outline-offset-2 outline-focus; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/styles/monaco.scss: -------------------------------------------------------------------------------- 1 | .code-mind { 2 | .monaco-editor { 3 | --vscode-editor-background: transparent; 4 | --vscode-editorGutter-background: transparent; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/svgs/bold.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /src/svgs/brush.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/svgs/center.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/svgs/italic.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /src/svgs/strike-through.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /src/svgs/zoom-in.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/svgs/zoom-out.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/themes/sunset/goose-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/themes/sunset/goose-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/themes/sunset/islet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/themes/sunset/scene.tsx: -------------------------------------------------------------------------------- 1 | import { ReactComponent as SunSVG } from './sun.svg' 2 | import { ReactComponent as Goose1SVG } from './goose-1.svg' 3 | import { ReactComponent as Goose2SVG } from './goose-2.svg' 4 | import src_shallowWave from './wave-shallow.svg' 5 | import src_deepWave from './wave-deep.svg' 6 | import { ReactComponent as IsletSVG } from './islet.svg' 7 | 8 | export default function Scene() { 9 | return ( 10 |
11 | 12 | 13 | 14 | 15 |
18 |
26 |
27 |
30 |
38 |
39 | 40 | {/* */} 41 |
42 | ) 43 | } 44 | -------------------------------------------------------------------------------- /src/themes/sunset/sun.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/themes/sunset/wave-deep.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/themes/sunset/wave-shallow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | let tCanvas: HTMLCanvasElement | null = null 2 | export function getTextWidth(text: string, font = 'normal 16px Poppins') { 3 | const canvas = tCanvas || (tCanvas = document.createElement('canvas')) 4 | const context = canvas.getContext('2d') 5 | context!.font = font 6 | return context!.measureText(text).width 7 | } 8 | 9 | export function amendDistance(distance: number, siblings?: unknown[]) { 10 | if (siblings && siblings.length > 3) { 11 | return ((siblings.length - 3 + 5) / 5) * distance 12 | } 13 | return distance 14 | } 15 | 16 | export function getMonacoContent(monacoElement?: HTMLDivElement | null) { 17 | if (!monacoElement) return '' 18 | 19 | const marginElement = monacoElement.querySelector('.monaco-editor .margin-view-overlays') 20 | 21 | const contentElement = monacoElement.querySelector('.monaco-editor .view-lines') 22 | 23 | if (marginElement && contentElement) { 24 | return `
${marginElement.outerHTML}
${contentElement.outerHTML}
` 25 | } 26 | 27 | return '' 28 | } 29 | 30 | export function isObject(o: unknown) { 31 | return Object.prototype.toString.call(o) === '[object Object]' 32 | } 33 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ['./src/**/*.{html,tsx,jsx,css}', './index.html'], 4 | theme: { 5 | extend: { 6 | fontFamily: { 7 | sans: ['Poppins', 'sans-serif'] 8 | }, 9 | colors: { 10 | bg: '#FEF3E1', 11 | text: 'black', 12 | focus: '#51A8B9', 13 | edge: '#FED2CB', 14 | '#1': '#FD9886', 15 | '#2': '#51A8B9' 16 | }, 17 | screens: { 18 | 'max-xl': { max: '1280px' }, 19 | 'max-lg': { max: '1024px' }, 20 | 'max-md': { max: '768px' }, 21 | 'max-sm': { max: '640px' }, 22 | 'max-xs': { max: '360px' } 23 | } 24 | } 25 | }, 26 | plugins: [] 27 | } 28 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noFallthroughCasesInSwitch": true, 20 | 21 | "baseUrl": ".", 22 | "paths": { 23 | "@/*": ["./src/*"] 24 | } 25 | }, 26 | "include": ["src", ".eslintrc.cjs", "vite.config.ts"], 27 | "references": [{ "path": "./tsconfig.node.json" }] 28 | } 29 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react-swc' 3 | import tsconfigPaths from 'vite-tsconfig-paths' 4 | import svgr from 'vite-plugin-svgr' 5 | 6 | export default defineConfig({ 7 | plugins: [react(), svgr(), tsconfigPaths()], 8 | server: { 9 | port: 2222, 10 | host: '0.0.0.0' 11 | }, 12 | build: { 13 | sourcemap: true 14 | }, 15 | resolve: { 16 | extensions: ['.tsx', '.ts', '.jsx', '.js', '.json', '.scss', '.mjs', '.mts'] 17 | } 18 | }) 19 | --------------------------------------------------------------------------------