├── .gitignore ├── LICENSE.md ├── README.md ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── public ├── albums.json ├── scroll-timeline.js └── vite.svg ├── src ├── App.css ├── App.jsx ├── Coverflow.jsx ├── assets │ └── react.svg ├── index.css ├── main.jsx └── styles.css └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Addy Osmani, Bramus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Flow 2 | 3 | This project is a React application built with Vite, demonstrating a Coverflow component. It uses the CSS scroll-driven animation effect to create a visually appealing coverflow effect for displaying album covers. It supports prefetching images using Fetch Priority. 4 | 5 | ![](https://res.cloudinary.com/ddxwdqwkr/image/upload/v1743977334/addy/Screenshot_2025-04-06_at_3.07.07_PM.webp) 6 | 7 | 8 | ## Setup 9 | 10 | 1. Clone the repository: 11 | ```bash 12 | git clone https://github.com/addyosmani/react-flow.git 13 | cd react-flow 14 | ``` 15 | 2. Install dependencies: 16 | ```bash 17 | npm install 18 | ``` 19 | 20 | ## Available Scripts 21 | 22 | In the project directory, you can run: 23 | 24 | ### `npm run dev` 25 | 26 | Runs the app in development mode using Vite. 27 | Open [http://localhost:5173](http://localhost:5173) (or the port shown in the terminal) to view it in the browser. 28 | 29 | The page will reload if you make edits. 30 | You will also see any lint errors in the console. 31 | 32 | ### `npm run build` 33 | 34 | Builds the app for production to the `dist` folder. 35 | It correctly bundles React in production mode and optimizes the build for the best performance. 36 | 37 | ### `npm run lint` 38 | 39 | Runs the ESLint linter to check for code style issues. 40 | 41 | ### `npm run preview` 42 | 43 | Serves the production build locally to preview it. 44 | 45 | ## Using the Coverflow Component 46 | 47 | The core of this project is the `Coverflow` component located in `src/Coverflow.jsx`. 48 | 49 | ### Basic Usage 50 | 51 | Import the component and render it in your application: 52 | 53 | ```jsx 54 | import React from 'react'; 55 | import Coverflow from './Coverflow'; // Adjust the import path as needed 56 | import './App.css'; // Or your main CSS file 57 | 58 | function App() { 59 | return ( 60 |
61 |

React Coverflow Demo

62 | 63 |
64 | ); 65 | } 66 | 67 | export default App; 68 | ``` 69 | 70 | ### Configuration 71 | 72 | The `Coverflow` component accepts the following props: 73 | 74 | * **`dataUrl`** (string, optional): The URL to fetch the album data from. 75 | * Defaults to `/albums.json`. 76 | * The component expects the data to be a JSON array of objects. Each object should have at least an `image_url` property (for the image source) and preferably `title` and `artists` properties (used for the image `alt` text). A unique `key` (like `position` in the default data) is also recommended for React list rendering. 77 | 78 | Example structure: 79 | ```json 80 | [ 81 | { 82 | "position": 1, 83 | "title": "Album Title", 84 | "artists": "Artist Name", 85 | "image_url": "https://example.com/image.jpg" 86 | }, 87 | ] 88 | ``` 89 | 90 | To use a different data source, provide the URL via the prop: 91 | 92 | ```jsx 93 | 94 | ``` 95 | 96 | Or fetch from an external API: 97 | 98 | ```jsx 99 | 100 | ``` 101 | 102 | ### Styling 103 | 104 | The component relies on CSS for the coverflow effect. Basic styles are included in `src/styles.css`. You may need to adjust or extend these styles depending on your application's layout and design. The scroll-driven animation logic is in `public/scroll-timeline.js`, which is loaded by `index.html`. 105 | 106 | ## Acknowledgements 107 | 108 | The CSS scroll-driven animation effect is based on the original demo by Bramus Van Damme: 109 | [https://scroll-driven-animations.style/demos/cover-flow/css/](https://scroll-driven-animations.style/demos/cover-flow/css/) 110 | 111 | ## License 112 | 113 | This project is licensed under the terms of the [MIT License](LICENSE.md). 114 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import reactHooks from 'eslint-plugin-react-hooks' 4 | import reactRefresh from 'eslint-plugin-react-refresh' 5 | 6 | export default [ 7 | { ignores: ['dist'] }, 8 | { 9 | files: ['**/*.{js,jsx}'], 10 | languageOptions: { 11 | ecmaVersion: 2020, 12 | globals: globals.browser, 13 | parserOptions: { 14 | ecmaVersion: 'latest', 15 | ecmaFeatures: { jsx: true }, 16 | sourceType: 'module', 17 | }, 18 | }, 19 | plugins: { 20 | 'react-hooks': reactHooks, 21 | 'react-refresh': reactRefresh, 22 | }, 23 | rules: { 24 | ...js.configs.recommended.rules, 25 | ...reactHooks.configs.recommended.rules, 26 | 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], 27 | 'react-refresh/only-export-components': [ 28 | 'warn', 29 | { allowConstantExport: true }, 30 | ], 31 | }, 32 | }, 33 | ] 34 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | React Coverflow Component 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-flow", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "react-flow", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "prop-types": "^15.8.1", 12 | "react": "^19.0.0", 13 | "react-dom": "^19.0.0" 14 | }, 15 | "devDependencies": { 16 | "@eslint/js": "^9.21.0", 17 | "@types/react": "^19.0.10", 18 | "@types/react-dom": "^19.0.4", 19 | "@vitejs/plugin-react": "^4.3.4", 20 | "eslint": "^9.21.0", 21 | "eslint-plugin-react-hooks": "^5.1.0", 22 | "eslint-plugin-react-refresh": "^0.4.19", 23 | "globals": "^15.15.0", 24 | "vite": "^6.2.0" 25 | } 26 | }, 27 | "node_modules/@ampproject/remapping": { 28 | "version": "2.3.0", 29 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 30 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 31 | "dev": true, 32 | "dependencies": { 33 | "@jridgewell/gen-mapping": "^0.3.5", 34 | "@jridgewell/trace-mapping": "^0.3.24" 35 | }, 36 | "engines": { 37 | "node": ">=6.0.0" 38 | } 39 | }, 40 | "node_modules/@babel/code-frame": { 41 | "version": "7.26.2", 42 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", 43 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 44 | "dev": true, 45 | "dependencies": { 46 | "@babel/helper-validator-identifier": "^7.25.9", 47 | "js-tokens": "^4.0.0", 48 | "picocolors": "^1.0.0" 49 | }, 50 | "engines": { 51 | "node": ">=6.9.0" 52 | } 53 | }, 54 | "node_modules/@babel/compat-data": { 55 | "version": "7.26.8", 56 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", 57 | "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", 58 | "dev": true, 59 | "engines": { 60 | "node": ">=6.9.0" 61 | } 62 | }, 63 | "node_modules/@babel/core": { 64 | "version": "7.26.10", 65 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", 66 | "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", 67 | "dev": true, 68 | "dependencies": { 69 | "@ampproject/remapping": "^2.2.0", 70 | "@babel/code-frame": "^7.26.2", 71 | "@babel/generator": "^7.26.10", 72 | "@babel/helper-compilation-targets": "^7.26.5", 73 | "@babel/helper-module-transforms": "^7.26.0", 74 | "@babel/helpers": "^7.26.10", 75 | "@babel/parser": "^7.26.10", 76 | "@babel/template": "^7.26.9", 77 | "@babel/traverse": "^7.26.10", 78 | "@babel/types": "^7.26.10", 79 | "convert-source-map": "^2.0.0", 80 | "debug": "^4.1.0", 81 | "gensync": "^1.0.0-beta.2", 82 | "json5": "^2.2.3", 83 | "semver": "^6.3.1" 84 | }, 85 | "engines": { 86 | "node": ">=6.9.0" 87 | }, 88 | "funding": { 89 | "type": "opencollective", 90 | "url": "https://opencollective.com/babel" 91 | } 92 | }, 93 | "node_modules/@babel/generator": { 94 | "version": "7.27.0", 95 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", 96 | "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", 97 | "dev": true, 98 | "dependencies": { 99 | "@babel/parser": "^7.27.0", 100 | "@babel/types": "^7.27.0", 101 | "@jridgewell/gen-mapping": "^0.3.5", 102 | "@jridgewell/trace-mapping": "^0.3.25", 103 | "jsesc": "^3.0.2" 104 | }, 105 | "engines": { 106 | "node": ">=6.9.0" 107 | } 108 | }, 109 | "node_modules/@babel/helper-compilation-targets": { 110 | "version": "7.27.0", 111 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", 112 | "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", 113 | "dev": true, 114 | "dependencies": { 115 | "@babel/compat-data": "^7.26.8", 116 | "@babel/helper-validator-option": "^7.25.9", 117 | "browserslist": "^4.24.0", 118 | "lru-cache": "^5.1.1", 119 | "semver": "^6.3.1" 120 | }, 121 | "engines": { 122 | "node": ">=6.9.0" 123 | } 124 | }, 125 | "node_modules/@babel/helper-module-imports": { 126 | "version": "7.25.9", 127 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", 128 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", 129 | "dev": true, 130 | "dependencies": { 131 | "@babel/traverse": "^7.25.9", 132 | "@babel/types": "^7.25.9" 133 | }, 134 | "engines": { 135 | "node": ">=6.9.0" 136 | } 137 | }, 138 | "node_modules/@babel/helper-module-transforms": { 139 | "version": "7.26.0", 140 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", 141 | "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", 142 | "dev": true, 143 | "dependencies": { 144 | "@babel/helper-module-imports": "^7.25.9", 145 | "@babel/helper-validator-identifier": "^7.25.9", 146 | "@babel/traverse": "^7.25.9" 147 | }, 148 | "engines": { 149 | "node": ">=6.9.0" 150 | }, 151 | "peerDependencies": { 152 | "@babel/core": "^7.0.0" 153 | } 154 | }, 155 | "node_modules/@babel/helper-plugin-utils": { 156 | "version": "7.26.5", 157 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", 158 | "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", 159 | "dev": true, 160 | "engines": { 161 | "node": ">=6.9.0" 162 | } 163 | }, 164 | "node_modules/@babel/helper-string-parser": { 165 | "version": "7.25.9", 166 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 167 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 168 | "dev": true, 169 | "engines": { 170 | "node": ">=6.9.0" 171 | } 172 | }, 173 | "node_modules/@babel/helper-validator-identifier": { 174 | "version": "7.25.9", 175 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 176 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 177 | "dev": true, 178 | "engines": { 179 | "node": ">=6.9.0" 180 | } 181 | }, 182 | "node_modules/@babel/helper-validator-option": { 183 | "version": "7.25.9", 184 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", 185 | "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", 186 | "dev": true, 187 | "engines": { 188 | "node": ">=6.9.0" 189 | } 190 | }, 191 | "node_modules/@babel/helpers": { 192 | "version": "7.27.0", 193 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", 194 | "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", 195 | "dev": true, 196 | "dependencies": { 197 | "@babel/template": "^7.27.0", 198 | "@babel/types": "^7.27.0" 199 | }, 200 | "engines": { 201 | "node": ">=6.9.0" 202 | } 203 | }, 204 | "node_modules/@babel/parser": { 205 | "version": "7.27.0", 206 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", 207 | "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", 208 | "dev": true, 209 | "dependencies": { 210 | "@babel/types": "^7.27.0" 211 | }, 212 | "bin": { 213 | "parser": "bin/babel-parser.js" 214 | }, 215 | "engines": { 216 | "node": ">=6.0.0" 217 | } 218 | }, 219 | "node_modules/@babel/plugin-transform-react-jsx-self": { 220 | "version": "7.25.9", 221 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", 222 | "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", 223 | "dev": true, 224 | "dependencies": { 225 | "@babel/helper-plugin-utils": "^7.25.9" 226 | }, 227 | "engines": { 228 | "node": ">=6.9.0" 229 | }, 230 | "peerDependencies": { 231 | "@babel/core": "^7.0.0-0" 232 | } 233 | }, 234 | "node_modules/@babel/plugin-transform-react-jsx-source": { 235 | "version": "7.25.9", 236 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", 237 | "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", 238 | "dev": true, 239 | "dependencies": { 240 | "@babel/helper-plugin-utils": "^7.25.9" 241 | }, 242 | "engines": { 243 | "node": ">=6.9.0" 244 | }, 245 | "peerDependencies": { 246 | "@babel/core": "^7.0.0-0" 247 | } 248 | }, 249 | "node_modules/@babel/template": { 250 | "version": "7.27.0", 251 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", 252 | "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", 253 | "dev": true, 254 | "dependencies": { 255 | "@babel/code-frame": "^7.26.2", 256 | "@babel/parser": "^7.27.0", 257 | "@babel/types": "^7.27.0" 258 | }, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | } 262 | }, 263 | "node_modules/@babel/traverse": { 264 | "version": "7.27.0", 265 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", 266 | "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", 267 | "dev": true, 268 | "dependencies": { 269 | "@babel/code-frame": "^7.26.2", 270 | "@babel/generator": "^7.27.0", 271 | "@babel/parser": "^7.27.0", 272 | "@babel/template": "^7.27.0", 273 | "@babel/types": "^7.27.0", 274 | "debug": "^4.3.1", 275 | "globals": "^11.1.0" 276 | }, 277 | "engines": { 278 | "node": ">=6.9.0" 279 | } 280 | }, 281 | "node_modules/@babel/traverse/node_modules/globals": { 282 | "version": "11.12.0", 283 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 284 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 285 | "dev": true, 286 | "engines": { 287 | "node": ">=4" 288 | } 289 | }, 290 | "node_modules/@babel/types": { 291 | "version": "7.27.0", 292 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", 293 | "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", 294 | "dev": true, 295 | "dependencies": { 296 | "@babel/helper-string-parser": "^7.25.9", 297 | "@babel/helper-validator-identifier": "^7.25.9" 298 | }, 299 | "engines": { 300 | "node": ">=6.9.0" 301 | } 302 | }, 303 | "node_modules/@esbuild/aix-ppc64": { 304 | "version": "0.25.2", 305 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", 306 | "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", 307 | "cpu": [ 308 | "ppc64" 309 | ], 310 | "dev": true, 311 | "optional": true, 312 | "os": [ 313 | "aix" 314 | ], 315 | "engines": { 316 | "node": ">=18" 317 | } 318 | }, 319 | "node_modules/@esbuild/android-arm": { 320 | "version": "0.25.2", 321 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", 322 | "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", 323 | "cpu": [ 324 | "arm" 325 | ], 326 | "dev": true, 327 | "optional": true, 328 | "os": [ 329 | "android" 330 | ], 331 | "engines": { 332 | "node": ">=18" 333 | } 334 | }, 335 | "node_modules/@esbuild/android-arm64": { 336 | "version": "0.25.2", 337 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", 338 | "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", 339 | "cpu": [ 340 | "arm64" 341 | ], 342 | "dev": true, 343 | "optional": true, 344 | "os": [ 345 | "android" 346 | ], 347 | "engines": { 348 | "node": ">=18" 349 | } 350 | }, 351 | "node_modules/@esbuild/android-x64": { 352 | "version": "0.25.2", 353 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", 354 | "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", 355 | "cpu": [ 356 | "x64" 357 | ], 358 | "dev": true, 359 | "optional": true, 360 | "os": [ 361 | "android" 362 | ], 363 | "engines": { 364 | "node": ">=18" 365 | } 366 | }, 367 | "node_modules/@esbuild/darwin-arm64": { 368 | "version": "0.25.2", 369 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", 370 | "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", 371 | "cpu": [ 372 | "arm64" 373 | ], 374 | "dev": true, 375 | "optional": true, 376 | "os": [ 377 | "darwin" 378 | ], 379 | "engines": { 380 | "node": ">=18" 381 | } 382 | }, 383 | "node_modules/@esbuild/darwin-x64": { 384 | "version": "0.25.2", 385 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", 386 | "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", 387 | "cpu": [ 388 | "x64" 389 | ], 390 | "dev": true, 391 | "optional": true, 392 | "os": [ 393 | "darwin" 394 | ], 395 | "engines": { 396 | "node": ">=18" 397 | } 398 | }, 399 | "node_modules/@esbuild/freebsd-arm64": { 400 | "version": "0.25.2", 401 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", 402 | "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", 403 | "cpu": [ 404 | "arm64" 405 | ], 406 | "dev": true, 407 | "optional": true, 408 | "os": [ 409 | "freebsd" 410 | ], 411 | "engines": { 412 | "node": ">=18" 413 | } 414 | }, 415 | "node_modules/@esbuild/freebsd-x64": { 416 | "version": "0.25.2", 417 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", 418 | "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", 419 | "cpu": [ 420 | "x64" 421 | ], 422 | "dev": true, 423 | "optional": true, 424 | "os": [ 425 | "freebsd" 426 | ], 427 | "engines": { 428 | "node": ">=18" 429 | } 430 | }, 431 | "node_modules/@esbuild/linux-arm": { 432 | "version": "0.25.2", 433 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", 434 | "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", 435 | "cpu": [ 436 | "arm" 437 | ], 438 | "dev": true, 439 | "optional": true, 440 | "os": [ 441 | "linux" 442 | ], 443 | "engines": { 444 | "node": ">=18" 445 | } 446 | }, 447 | "node_modules/@esbuild/linux-arm64": { 448 | "version": "0.25.2", 449 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", 450 | "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", 451 | "cpu": [ 452 | "arm64" 453 | ], 454 | "dev": true, 455 | "optional": true, 456 | "os": [ 457 | "linux" 458 | ], 459 | "engines": { 460 | "node": ">=18" 461 | } 462 | }, 463 | "node_modules/@esbuild/linux-ia32": { 464 | "version": "0.25.2", 465 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", 466 | "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", 467 | "cpu": [ 468 | "ia32" 469 | ], 470 | "dev": true, 471 | "optional": true, 472 | "os": [ 473 | "linux" 474 | ], 475 | "engines": { 476 | "node": ">=18" 477 | } 478 | }, 479 | "node_modules/@esbuild/linux-loong64": { 480 | "version": "0.25.2", 481 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", 482 | "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", 483 | "cpu": [ 484 | "loong64" 485 | ], 486 | "dev": true, 487 | "optional": true, 488 | "os": [ 489 | "linux" 490 | ], 491 | "engines": { 492 | "node": ">=18" 493 | } 494 | }, 495 | "node_modules/@esbuild/linux-mips64el": { 496 | "version": "0.25.2", 497 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", 498 | "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", 499 | "cpu": [ 500 | "mips64el" 501 | ], 502 | "dev": true, 503 | "optional": true, 504 | "os": [ 505 | "linux" 506 | ], 507 | "engines": { 508 | "node": ">=18" 509 | } 510 | }, 511 | "node_modules/@esbuild/linux-ppc64": { 512 | "version": "0.25.2", 513 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", 514 | "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", 515 | "cpu": [ 516 | "ppc64" 517 | ], 518 | "dev": true, 519 | "optional": true, 520 | "os": [ 521 | "linux" 522 | ], 523 | "engines": { 524 | "node": ">=18" 525 | } 526 | }, 527 | "node_modules/@esbuild/linux-riscv64": { 528 | "version": "0.25.2", 529 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", 530 | "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", 531 | "cpu": [ 532 | "riscv64" 533 | ], 534 | "dev": true, 535 | "optional": true, 536 | "os": [ 537 | "linux" 538 | ], 539 | "engines": { 540 | "node": ">=18" 541 | } 542 | }, 543 | "node_modules/@esbuild/linux-s390x": { 544 | "version": "0.25.2", 545 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", 546 | "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", 547 | "cpu": [ 548 | "s390x" 549 | ], 550 | "dev": true, 551 | "optional": true, 552 | "os": [ 553 | "linux" 554 | ], 555 | "engines": { 556 | "node": ">=18" 557 | } 558 | }, 559 | "node_modules/@esbuild/linux-x64": { 560 | "version": "0.25.2", 561 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", 562 | "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", 563 | "cpu": [ 564 | "x64" 565 | ], 566 | "dev": true, 567 | "optional": true, 568 | "os": [ 569 | "linux" 570 | ], 571 | "engines": { 572 | "node": ">=18" 573 | } 574 | }, 575 | "node_modules/@esbuild/netbsd-arm64": { 576 | "version": "0.25.2", 577 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", 578 | "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", 579 | "cpu": [ 580 | "arm64" 581 | ], 582 | "dev": true, 583 | "optional": true, 584 | "os": [ 585 | "netbsd" 586 | ], 587 | "engines": { 588 | "node": ">=18" 589 | } 590 | }, 591 | "node_modules/@esbuild/netbsd-x64": { 592 | "version": "0.25.2", 593 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", 594 | "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", 595 | "cpu": [ 596 | "x64" 597 | ], 598 | "dev": true, 599 | "optional": true, 600 | "os": [ 601 | "netbsd" 602 | ], 603 | "engines": { 604 | "node": ">=18" 605 | } 606 | }, 607 | "node_modules/@esbuild/openbsd-arm64": { 608 | "version": "0.25.2", 609 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", 610 | "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", 611 | "cpu": [ 612 | "arm64" 613 | ], 614 | "dev": true, 615 | "optional": true, 616 | "os": [ 617 | "openbsd" 618 | ], 619 | "engines": { 620 | "node": ">=18" 621 | } 622 | }, 623 | "node_modules/@esbuild/openbsd-x64": { 624 | "version": "0.25.2", 625 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", 626 | "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", 627 | "cpu": [ 628 | "x64" 629 | ], 630 | "dev": true, 631 | "optional": true, 632 | "os": [ 633 | "openbsd" 634 | ], 635 | "engines": { 636 | "node": ">=18" 637 | } 638 | }, 639 | "node_modules/@esbuild/sunos-x64": { 640 | "version": "0.25.2", 641 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", 642 | "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", 643 | "cpu": [ 644 | "x64" 645 | ], 646 | "dev": true, 647 | "optional": true, 648 | "os": [ 649 | "sunos" 650 | ], 651 | "engines": { 652 | "node": ">=18" 653 | } 654 | }, 655 | "node_modules/@esbuild/win32-arm64": { 656 | "version": "0.25.2", 657 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", 658 | "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", 659 | "cpu": [ 660 | "arm64" 661 | ], 662 | "dev": true, 663 | "optional": true, 664 | "os": [ 665 | "win32" 666 | ], 667 | "engines": { 668 | "node": ">=18" 669 | } 670 | }, 671 | "node_modules/@esbuild/win32-ia32": { 672 | "version": "0.25.2", 673 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", 674 | "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", 675 | "cpu": [ 676 | "ia32" 677 | ], 678 | "dev": true, 679 | "optional": true, 680 | "os": [ 681 | "win32" 682 | ], 683 | "engines": { 684 | "node": ">=18" 685 | } 686 | }, 687 | "node_modules/@esbuild/win32-x64": { 688 | "version": "0.25.2", 689 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", 690 | "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", 691 | "cpu": [ 692 | "x64" 693 | ], 694 | "dev": true, 695 | "optional": true, 696 | "os": [ 697 | "win32" 698 | ], 699 | "engines": { 700 | "node": ">=18" 701 | } 702 | }, 703 | "node_modules/@eslint-community/eslint-utils": { 704 | "version": "4.5.1", 705 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", 706 | "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", 707 | "dev": true, 708 | "dependencies": { 709 | "eslint-visitor-keys": "^3.4.3" 710 | }, 711 | "engines": { 712 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 713 | }, 714 | "funding": { 715 | "url": "https://opencollective.com/eslint" 716 | }, 717 | "peerDependencies": { 718 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 719 | } 720 | }, 721 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 722 | "version": "3.4.3", 723 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 724 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 725 | "dev": true, 726 | "engines": { 727 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 728 | }, 729 | "funding": { 730 | "url": "https://opencollective.com/eslint" 731 | } 732 | }, 733 | "node_modules/@eslint-community/regexpp": { 734 | "version": "4.12.1", 735 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 736 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 737 | "dev": true, 738 | "engines": { 739 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 740 | } 741 | }, 742 | "node_modules/@eslint/config-array": { 743 | "version": "0.20.0", 744 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", 745 | "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", 746 | "dev": true, 747 | "dependencies": { 748 | "@eslint/object-schema": "^2.1.6", 749 | "debug": "^4.3.1", 750 | "minimatch": "^3.1.2" 751 | }, 752 | "engines": { 753 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 754 | } 755 | }, 756 | "node_modules/@eslint/config-helpers": { 757 | "version": "0.2.1", 758 | "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", 759 | "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", 760 | "dev": true, 761 | "engines": { 762 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 763 | } 764 | }, 765 | "node_modules/@eslint/core": { 766 | "version": "0.12.0", 767 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", 768 | "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", 769 | "dev": true, 770 | "dependencies": { 771 | "@types/json-schema": "^7.0.15" 772 | }, 773 | "engines": { 774 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 775 | } 776 | }, 777 | "node_modules/@eslint/eslintrc": { 778 | "version": "3.3.1", 779 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", 780 | "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 781 | "dev": true, 782 | "dependencies": { 783 | "ajv": "^6.12.4", 784 | "debug": "^4.3.2", 785 | "espree": "^10.0.1", 786 | "globals": "^14.0.0", 787 | "ignore": "^5.2.0", 788 | "import-fresh": "^3.2.1", 789 | "js-yaml": "^4.1.0", 790 | "minimatch": "^3.1.2", 791 | "strip-json-comments": "^3.1.1" 792 | }, 793 | "engines": { 794 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 795 | }, 796 | "funding": { 797 | "url": "https://opencollective.com/eslint" 798 | } 799 | }, 800 | "node_modules/@eslint/eslintrc/node_modules/globals": { 801 | "version": "14.0.0", 802 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 803 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 804 | "dev": true, 805 | "engines": { 806 | "node": ">=18" 807 | }, 808 | "funding": { 809 | "url": "https://github.com/sponsors/sindresorhus" 810 | } 811 | }, 812 | "node_modules/@eslint/js": { 813 | "version": "9.24.0", 814 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", 815 | "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", 816 | "dev": true, 817 | "engines": { 818 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 819 | } 820 | }, 821 | "node_modules/@eslint/object-schema": { 822 | "version": "2.1.6", 823 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 824 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 825 | "dev": true, 826 | "engines": { 827 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 828 | } 829 | }, 830 | "node_modules/@eslint/plugin-kit": { 831 | "version": "0.2.8", 832 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", 833 | "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", 834 | "dev": true, 835 | "dependencies": { 836 | "@eslint/core": "^0.13.0", 837 | "levn": "^0.4.1" 838 | }, 839 | "engines": { 840 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 841 | } 842 | }, 843 | "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { 844 | "version": "0.13.0", 845 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", 846 | "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", 847 | "dev": true, 848 | "dependencies": { 849 | "@types/json-schema": "^7.0.15" 850 | }, 851 | "engines": { 852 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 853 | } 854 | }, 855 | "node_modules/@humanfs/core": { 856 | "version": "0.19.1", 857 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 858 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 859 | "dev": true, 860 | "engines": { 861 | "node": ">=18.18.0" 862 | } 863 | }, 864 | "node_modules/@humanfs/node": { 865 | "version": "0.16.6", 866 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 867 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 868 | "dev": true, 869 | "dependencies": { 870 | "@humanfs/core": "^0.19.1", 871 | "@humanwhocodes/retry": "^0.3.0" 872 | }, 873 | "engines": { 874 | "node": ">=18.18.0" 875 | } 876 | }, 877 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 878 | "version": "0.3.1", 879 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 880 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 881 | "dev": true, 882 | "engines": { 883 | "node": ">=18.18" 884 | }, 885 | "funding": { 886 | "type": "github", 887 | "url": "https://github.com/sponsors/nzakas" 888 | } 889 | }, 890 | "node_modules/@humanwhocodes/module-importer": { 891 | "version": "1.0.1", 892 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 893 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 894 | "dev": true, 895 | "engines": { 896 | "node": ">=12.22" 897 | }, 898 | "funding": { 899 | "type": "github", 900 | "url": "https://github.com/sponsors/nzakas" 901 | } 902 | }, 903 | "node_modules/@humanwhocodes/retry": { 904 | "version": "0.4.2", 905 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", 906 | "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", 907 | "dev": true, 908 | "engines": { 909 | "node": ">=18.18" 910 | }, 911 | "funding": { 912 | "type": "github", 913 | "url": "https://github.com/sponsors/nzakas" 914 | } 915 | }, 916 | "node_modules/@jridgewell/gen-mapping": { 917 | "version": "0.3.8", 918 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 919 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 920 | "dev": true, 921 | "dependencies": { 922 | "@jridgewell/set-array": "^1.2.1", 923 | "@jridgewell/sourcemap-codec": "^1.4.10", 924 | "@jridgewell/trace-mapping": "^0.3.24" 925 | }, 926 | "engines": { 927 | "node": ">=6.0.0" 928 | } 929 | }, 930 | "node_modules/@jridgewell/resolve-uri": { 931 | "version": "3.1.2", 932 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 933 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 934 | "dev": true, 935 | "engines": { 936 | "node": ">=6.0.0" 937 | } 938 | }, 939 | "node_modules/@jridgewell/set-array": { 940 | "version": "1.2.1", 941 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 942 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 943 | "dev": true, 944 | "engines": { 945 | "node": ">=6.0.0" 946 | } 947 | }, 948 | "node_modules/@jridgewell/sourcemap-codec": { 949 | "version": "1.5.0", 950 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 951 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 952 | "dev": true 953 | }, 954 | "node_modules/@jridgewell/trace-mapping": { 955 | "version": "0.3.25", 956 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 957 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 958 | "dev": true, 959 | "dependencies": { 960 | "@jridgewell/resolve-uri": "^3.1.0", 961 | "@jridgewell/sourcemap-codec": "^1.4.14" 962 | } 963 | }, 964 | "node_modules/@rollup/rollup-android-arm-eabi": { 965 | "version": "4.39.0", 966 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", 967 | "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", 968 | "cpu": [ 969 | "arm" 970 | ], 971 | "dev": true, 972 | "optional": true, 973 | "os": [ 974 | "android" 975 | ] 976 | }, 977 | "node_modules/@rollup/rollup-android-arm64": { 978 | "version": "4.39.0", 979 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", 980 | "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", 981 | "cpu": [ 982 | "arm64" 983 | ], 984 | "dev": true, 985 | "optional": true, 986 | "os": [ 987 | "android" 988 | ] 989 | }, 990 | "node_modules/@rollup/rollup-darwin-arm64": { 991 | "version": "4.39.0", 992 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", 993 | "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", 994 | "cpu": [ 995 | "arm64" 996 | ], 997 | "dev": true, 998 | "optional": true, 999 | "os": [ 1000 | "darwin" 1001 | ] 1002 | }, 1003 | "node_modules/@rollup/rollup-darwin-x64": { 1004 | "version": "4.39.0", 1005 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", 1006 | "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", 1007 | "cpu": [ 1008 | "x64" 1009 | ], 1010 | "dev": true, 1011 | "optional": true, 1012 | "os": [ 1013 | "darwin" 1014 | ] 1015 | }, 1016 | "node_modules/@rollup/rollup-freebsd-arm64": { 1017 | "version": "4.39.0", 1018 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", 1019 | "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", 1020 | "cpu": [ 1021 | "arm64" 1022 | ], 1023 | "dev": true, 1024 | "optional": true, 1025 | "os": [ 1026 | "freebsd" 1027 | ] 1028 | }, 1029 | "node_modules/@rollup/rollup-freebsd-x64": { 1030 | "version": "4.39.0", 1031 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", 1032 | "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", 1033 | "cpu": [ 1034 | "x64" 1035 | ], 1036 | "dev": true, 1037 | "optional": true, 1038 | "os": [ 1039 | "freebsd" 1040 | ] 1041 | }, 1042 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1043 | "version": "4.39.0", 1044 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", 1045 | "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", 1046 | "cpu": [ 1047 | "arm" 1048 | ], 1049 | "dev": true, 1050 | "optional": true, 1051 | "os": [ 1052 | "linux" 1053 | ] 1054 | }, 1055 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1056 | "version": "4.39.0", 1057 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", 1058 | "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", 1059 | "cpu": [ 1060 | "arm" 1061 | ], 1062 | "dev": true, 1063 | "optional": true, 1064 | "os": [ 1065 | "linux" 1066 | ] 1067 | }, 1068 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 1069 | "version": "4.39.0", 1070 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", 1071 | "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", 1072 | "cpu": [ 1073 | "arm64" 1074 | ], 1075 | "dev": true, 1076 | "optional": true, 1077 | "os": [ 1078 | "linux" 1079 | ] 1080 | }, 1081 | "node_modules/@rollup/rollup-linux-arm64-musl": { 1082 | "version": "4.39.0", 1083 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", 1084 | "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", 1085 | "cpu": [ 1086 | "arm64" 1087 | ], 1088 | "dev": true, 1089 | "optional": true, 1090 | "os": [ 1091 | "linux" 1092 | ] 1093 | }, 1094 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1095 | "version": "4.39.0", 1096 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", 1097 | "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", 1098 | "cpu": [ 1099 | "loong64" 1100 | ], 1101 | "dev": true, 1102 | "optional": true, 1103 | "os": [ 1104 | "linux" 1105 | ] 1106 | }, 1107 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1108 | "version": "4.39.0", 1109 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", 1110 | "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", 1111 | "cpu": [ 1112 | "ppc64" 1113 | ], 1114 | "dev": true, 1115 | "optional": true, 1116 | "os": [ 1117 | "linux" 1118 | ] 1119 | }, 1120 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1121 | "version": "4.39.0", 1122 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", 1123 | "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", 1124 | "cpu": [ 1125 | "riscv64" 1126 | ], 1127 | "dev": true, 1128 | "optional": true, 1129 | "os": [ 1130 | "linux" 1131 | ] 1132 | }, 1133 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 1134 | "version": "4.39.0", 1135 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", 1136 | "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", 1137 | "cpu": [ 1138 | "riscv64" 1139 | ], 1140 | "dev": true, 1141 | "optional": true, 1142 | "os": [ 1143 | "linux" 1144 | ] 1145 | }, 1146 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1147 | "version": "4.39.0", 1148 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", 1149 | "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", 1150 | "cpu": [ 1151 | "s390x" 1152 | ], 1153 | "dev": true, 1154 | "optional": true, 1155 | "os": [ 1156 | "linux" 1157 | ] 1158 | }, 1159 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1160 | "version": "4.39.0", 1161 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", 1162 | "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", 1163 | "cpu": [ 1164 | "x64" 1165 | ], 1166 | "dev": true, 1167 | "optional": true, 1168 | "os": [ 1169 | "linux" 1170 | ] 1171 | }, 1172 | "node_modules/@rollup/rollup-linux-x64-musl": { 1173 | "version": "4.39.0", 1174 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", 1175 | "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", 1176 | "cpu": [ 1177 | "x64" 1178 | ], 1179 | "dev": true, 1180 | "optional": true, 1181 | "os": [ 1182 | "linux" 1183 | ] 1184 | }, 1185 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1186 | "version": "4.39.0", 1187 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", 1188 | "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", 1189 | "cpu": [ 1190 | "arm64" 1191 | ], 1192 | "dev": true, 1193 | "optional": true, 1194 | "os": [ 1195 | "win32" 1196 | ] 1197 | }, 1198 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1199 | "version": "4.39.0", 1200 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", 1201 | "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", 1202 | "cpu": [ 1203 | "ia32" 1204 | ], 1205 | "dev": true, 1206 | "optional": true, 1207 | "os": [ 1208 | "win32" 1209 | ] 1210 | }, 1211 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1212 | "version": "4.39.0", 1213 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", 1214 | "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", 1215 | "cpu": [ 1216 | "x64" 1217 | ], 1218 | "dev": true, 1219 | "optional": true, 1220 | "os": [ 1221 | "win32" 1222 | ] 1223 | }, 1224 | "node_modules/@types/babel__core": { 1225 | "version": "7.20.5", 1226 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 1227 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 1228 | "dev": true, 1229 | "dependencies": { 1230 | "@babel/parser": "^7.20.7", 1231 | "@babel/types": "^7.20.7", 1232 | "@types/babel__generator": "*", 1233 | "@types/babel__template": "*", 1234 | "@types/babel__traverse": "*" 1235 | } 1236 | }, 1237 | "node_modules/@types/babel__generator": { 1238 | "version": "7.27.0", 1239 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", 1240 | "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", 1241 | "dev": true, 1242 | "dependencies": { 1243 | "@babel/types": "^7.0.0" 1244 | } 1245 | }, 1246 | "node_modules/@types/babel__template": { 1247 | "version": "7.4.4", 1248 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 1249 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 1250 | "dev": true, 1251 | "dependencies": { 1252 | "@babel/parser": "^7.1.0", 1253 | "@babel/types": "^7.0.0" 1254 | } 1255 | }, 1256 | "node_modules/@types/babel__traverse": { 1257 | "version": "7.20.7", 1258 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", 1259 | "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", 1260 | "dev": true, 1261 | "dependencies": { 1262 | "@babel/types": "^7.20.7" 1263 | } 1264 | }, 1265 | "node_modules/@types/estree": { 1266 | "version": "1.0.7", 1267 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 1268 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 1269 | "dev": true 1270 | }, 1271 | "node_modules/@types/json-schema": { 1272 | "version": "7.0.15", 1273 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1274 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1275 | "dev": true 1276 | }, 1277 | "node_modules/@types/react": { 1278 | "version": "19.1.0", 1279 | "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", 1280 | "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", 1281 | "dev": true, 1282 | "dependencies": { 1283 | "csstype": "^3.0.2" 1284 | } 1285 | }, 1286 | "node_modules/@types/react-dom": { 1287 | "version": "19.1.1", 1288 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.1.tgz", 1289 | "integrity": "sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==", 1290 | "dev": true, 1291 | "peerDependencies": { 1292 | "@types/react": "^19.0.0" 1293 | } 1294 | }, 1295 | "node_modules/@vitejs/plugin-react": { 1296 | "version": "4.3.4", 1297 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", 1298 | "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", 1299 | "dev": true, 1300 | "dependencies": { 1301 | "@babel/core": "^7.26.0", 1302 | "@babel/plugin-transform-react-jsx-self": "^7.25.9", 1303 | "@babel/plugin-transform-react-jsx-source": "^7.25.9", 1304 | "@types/babel__core": "^7.20.5", 1305 | "react-refresh": "^0.14.2" 1306 | }, 1307 | "engines": { 1308 | "node": "^14.18.0 || >=16.0.0" 1309 | }, 1310 | "peerDependencies": { 1311 | "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" 1312 | } 1313 | }, 1314 | "node_modules/acorn": { 1315 | "version": "8.14.1", 1316 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 1317 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 1318 | "dev": true, 1319 | "bin": { 1320 | "acorn": "bin/acorn" 1321 | }, 1322 | "engines": { 1323 | "node": ">=0.4.0" 1324 | } 1325 | }, 1326 | "node_modules/acorn-jsx": { 1327 | "version": "5.3.2", 1328 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1329 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1330 | "dev": true, 1331 | "peerDependencies": { 1332 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1333 | } 1334 | }, 1335 | "node_modules/ajv": { 1336 | "version": "6.12.6", 1337 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1338 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1339 | "dev": true, 1340 | "dependencies": { 1341 | "fast-deep-equal": "^3.1.1", 1342 | "fast-json-stable-stringify": "^2.0.0", 1343 | "json-schema-traverse": "^0.4.1", 1344 | "uri-js": "^4.2.2" 1345 | }, 1346 | "funding": { 1347 | "type": "github", 1348 | "url": "https://github.com/sponsors/epoberezkin" 1349 | } 1350 | }, 1351 | "node_modules/ansi-styles": { 1352 | "version": "4.3.0", 1353 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1354 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1355 | "dev": true, 1356 | "dependencies": { 1357 | "color-convert": "^2.0.1" 1358 | }, 1359 | "engines": { 1360 | "node": ">=8" 1361 | }, 1362 | "funding": { 1363 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1364 | } 1365 | }, 1366 | "node_modules/argparse": { 1367 | "version": "2.0.1", 1368 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1369 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1370 | "dev": true 1371 | }, 1372 | "node_modules/balanced-match": { 1373 | "version": "1.0.2", 1374 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1375 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1376 | "dev": true 1377 | }, 1378 | "node_modules/brace-expansion": { 1379 | "version": "1.1.11", 1380 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1381 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1382 | "dev": true, 1383 | "dependencies": { 1384 | "balanced-match": "^1.0.0", 1385 | "concat-map": "0.0.1" 1386 | } 1387 | }, 1388 | "node_modules/browserslist": { 1389 | "version": "4.24.4", 1390 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", 1391 | "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", 1392 | "dev": true, 1393 | "funding": [ 1394 | { 1395 | "type": "opencollective", 1396 | "url": "https://opencollective.com/browserslist" 1397 | }, 1398 | { 1399 | "type": "tidelift", 1400 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1401 | }, 1402 | { 1403 | "type": "github", 1404 | "url": "https://github.com/sponsors/ai" 1405 | } 1406 | ], 1407 | "dependencies": { 1408 | "caniuse-lite": "^1.0.30001688", 1409 | "electron-to-chromium": "^1.5.73", 1410 | "node-releases": "^2.0.19", 1411 | "update-browserslist-db": "^1.1.1" 1412 | }, 1413 | "bin": { 1414 | "browserslist": "cli.js" 1415 | }, 1416 | "engines": { 1417 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1418 | } 1419 | }, 1420 | "node_modules/callsites": { 1421 | "version": "3.1.0", 1422 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1423 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1424 | "dev": true, 1425 | "engines": { 1426 | "node": ">=6" 1427 | } 1428 | }, 1429 | "node_modules/caniuse-lite": { 1430 | "version": "1.0.30001712", 1431 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz", 1432 | "integrity": "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==", 1433 | "dev": true, 1434 | "funding": [ 1435 | { 1436 | "type": "opencollective", 1437 | "url": "https://opencollective.com/browserslist" 1438 | }, 1439 | { 1440 | "type": "tidelift", 1441 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1442 | }, 1443 | { 1444 | "type": "github", 1445 | "url": "https://github.com/sponsors/ai" 1446 | } 1447 | ] 1448 | }, 1449 | "node_modules/chalk": { 1450 | "version": "4.1.2", 1451 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1452 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1453 | "dev": true, 1454 | "dependencies": { 1455 | "ansi-styles": "^4.1.0", 1456 | "supports-color": "^7.1.0" 1457 | }, 1458 | "engines": { 1459 | "node": ">=10" 1460 | }, 1461 | "funding": { 1462 | "url": "https://github.com/chalk/chalk?sponsor=1" 1463 | } 1464 | }, 1465 | "node_modules/color-convert": { 1466 | "version": "2.0.1", 1467 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1468 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1469 | "dev": true, 1470 | "dependencies": { 1471 | "color-name": "~1.1.4" 1472 | }, 1473 | "engines": { 1474 | "node": ">=7.0.0" 1475 | } 1476 | }, 1477 | "node_modules/color-name": { 1478 | "version": "1.1.4", 1479 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1480 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1481 | "dev": true 1482 | }, 1483 | "node_modules/concat-map": { 1484 | "version": "0.0.1", 1485 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1486 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1487 | "dev": true 1488 | }, 1489 | "node_modules/convert-source-map": { 1490 | "version": "2.0.0", 1491 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1492 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1493 | "dev": true 1494 | }, 1495 | "node_modules/cross-spawn": { 1496 | "version": "7.0.6", 1497 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1498 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1499 | "dev": true, 1500 | "dependencies": { 1501 | "path-key": "^3.1.0", 1502 | "shebang-command": "^2.0.0", 1503 | "which": "^2.0.1" 1504 | }, 1505 | "engines": { 1506 | "node": ">= 8" 1507 | } 1508 | }, 1509 | "node_modules/csstype": { 1510 | "version": "3.1.3", 1511 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1512 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1513 | "dev": true 1514 | }, 1515 | "node_modules/debug": { 1516 | "version": "4.4.0", 1517 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1518 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1519 | "dev": true, 1520 | "dependencies": { 1521 | "ms": "^2.1.3" 1522 | }, 1523 | "engines": { 1524 | "node": ">=6.0" 1525 | }, 1526 | "peerDependenciesMeta": { 1527 | "supports-color": { 1528 | "optional": true 1529 | } 1530 | } 1531 | }, 1532 | "node_modules/deep-is": { 1533 | "version": "0.1.4", 1534 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1535 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1536 | "dev": true 1537 | }, 1538 | "node_modules/electron-to-chromium": { 1539 | "version": "1.5.132", 1540 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.132.tgz", 1541 | "integrity": "sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==", 1542 | "dev": true 1543 | }, 1544 | "node_modules/esbuild": { 1545 | "version": "0.25.2", 1546 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", 1547 | "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", 1548 | "dev": true, 1549 | "hasInstallScript": true, 1550 | "bin": { 1551 | "esbuild": "bin/esbuild" 1552 | }, 1553 | "engines": { 1554 | "node": ">=18" 1555 | }, 1556 | "optionalDependencies": { 1557 | "@esbuild/aix-ppc64": "0.25.2", 1558 | "@esbuild/android-arm": "0.25.2", 1559 | "@esbuild/android-arm64": "0.25.2", 1560 | "@esbuild/android-x64": "0.25.2", 1561 | "@esbuild/darwin-arm64": "0.25.2", 1562 | "@esbuild/darwin-x64": "0.25.2", 1563 | "@esbuild/freebsd-arm64": "0.25.2", 1564 | "@esbuild/freebsd-x64": "0.25.2", 1565 | "@esbuild/linux-arm": "0.25.2", 1566 | "@esbuild/linux-arm64": "0.25.2", 1567 | "@esbuild/linux-ia32": "0.25.2", 1568 | "@esbuild/linux-loong64": "0.25.2", 1569 | "@esbuild/linux-mips64el": "0.25.2", 1570 | "@esbuild/linux-ppc64": "0.25.2", 1571 | "@esbuild/linux-riscv64": "0.25.2", 1572 | "@esbuild/linux-s390x": "0.25.2", 1573 | "@esbuild/linux-x64": "0.25.2", 1574 | "@esbuild/netbsd-arm64": "0.25.2", 1575 | "@esbuild/netbsd-x64": "0.25.2", 1576 | "@esbuild/openbsd-arm64": "0.25.2", 1577 | "@esbuild/openbsd-x64": "0.25.2", 1578 | "@esbuild/sunos-x64": "0.25.2", 1579 | "@esbuild/win32-arm64": "0.25.2", 1580 | "@esbuild/win32-ia32": "0.25.2", 1581 | "@esbuild/win32-x64": "0.25.2" 1582 | } 1583 | }, 1584 | "node_modules/escalade": { 1585 | "version": "3.2.0", 1586 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1587 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1588 | "dev": true, 1589 | "engines": { 1590 | "node": ">=6" 1591 | } 1592 | }, 1593 | "node_modules/escape-string-regexp": { 1594 | "version": "4.0.0", 1595 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1596 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1597 | "dev": true, 1598 | "engines": { 1599 | "node": ">=10" 1600 | }, 1601 | "funding": { 1602 | "url": "https://github.com/sponsors/sindresorhus" 1603 | } 1604 | }, 1605 | "node_modules/eslint": { 1606 | "version": "9.24.0", 1607 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", 1608 | "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", 1609 | "dev": true, 1610 | "dependencies": { 1611 | "@eslint-community/eslint-utils": "^4.2.0", 1612 | "@eslint-community/regexpp": "^4.12.1", 1613 | "@eslint/config-array": "^0.20.0", 1614 | "@eslint/config-helpers": "^0.2.0", 1615 | "@eslint/core": "^0.12.0", 1616 | "@eslint/eslintrc": "^3.3.1", 1617 | "@eslint/js": "9.24.0", 1618 | "@eslint/plugin-kit": "^0.2.7", 1619 | "@humanfs/node": "^0.16.6", 1620 | "@humanwhocodes/module-importer": "^1.0.1", 1621 | "@humanwhocodes/retry": "^0.4.2", 1622 | "@types/estree": "^1.0.6", 1623 | "@types/json-schema": "^7.0.15", 1624 | "ajv": "^6.12.4", 1625 | "chalk": "^4.0.0", 1626 | "cross-spawn": "^7.0.6", 1627 | "debug": "^4.3.2", 1628 | "escape-string-regexp": "^4.0.0", 1629 | "eslint-scope": "^8.3.0", 1630 | "eslint-visitor-keys": "^4.2.0", 1631 | "espree": "^10.3.0", 1632 | "esquery": "^1.5.0", 1633 | "esutils": "^2.0.2", 1634 | "fast-deep-equal": "^3.1.3", 1635 | "file-entry-cache": "^8.0.0", 1636 | "find-up": "^5.0.0", 1637 | "glob-parent": "^6.0.2", 1638 | "ignore": "^5.2.0", 1639 | "imurmurhash": "^0.1.4", 1640 | "is-glob": "^4.0.0", 1641 | "json-stable-stringify-without-jsonify": "^1.0.1", 1642 | "lodash.merge": "^4.6.2", 1643 | "minimatch": "^3.1.2", 1644 | "natural-compare": "^1.4.0", 1645 | "optionator": "^0.9.3" 1646 | }, 1647 | "bin": { 1648 | "eslint": "bin/eslint.js" 1649 | }, 1650 | "engines": { 1651 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1652 | }, 1653 | "funding": { 1654 | "url": "https://eslint.org/donate" 1655 | }, 1656 | "peerDependencies": { 1657 | "jiti": "*" 1658 | }, 1659 | "peerDependenciesMeta": { 1660 | "jiti": { 1661 | "optional": true 1662 | } 1663 | } 1664 | }, 1665 | "node_modules/eslint-plugin-react-hooks": { 1666 | "version": "5.2.0", 1667 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", 1668 | "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", 1669 | "dev": true, 1670 | "engines": { 1671 | "node": ">=10" 1672 | }, 1673 | "peerDependencies": { 1674 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 1675 | } 1676 | }, 1677 | "node_modules/eslint-plugin-react-refresh": { 1678 | "version": "0.4.19", 1679 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", 1680 | "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", 1681 | "dev": true, 1682 | "peerDependencies": { 1683 | "eslint": ">=8.40" 1684 | } 1685 | }, 1686 | "node_modules/eslint-scope": { 1687 | "version": "8.3.0", 1688 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", 1689 | "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", 1690 | "dev": true, 1691 | "dependencies": { 1692 | "esrecurse": "^4.3.0", 1693 | "estraverse": "^5.2.0" 1694 | }, 1695 | "engines": { 1696 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1697 | }, 1698 | "funding": { 1699 | "url": "https://opencollective.com/eslint" 1700 | } 1701 | }, 1702 | "node_modules/eslint-visitor-keys": { 1703 | "version": "4.2.0", 1704 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 1705 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 1706 | "dev": true, 1707 | "engines": { 1708 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1709 | }, 1710 | "funding": { 1711 | "url": "https://opencollective.com/eslint" 1712 | } 1713 | }, 1714 | "node_modules/espree": { 1715 | "version": "10.3.0", 1716 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 1717 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 1718 | "dev": true, 1719 | "dependencies": { 1720 | "acorn": "^8.14.0", 1721 | "acorn-jsx": "^5.3.2", 1722 | "eslint-visitor-keys": "^4.2.0" 1723 | }, 1724 | "engines": { 1725 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1726 | }, 1727 | "funding": { 1728 | "url": "https://opencollective.com/eslint" 1729 | } 1730 | }, 1731 | "node_modules/esquery": { 1732 | "version": "1.6.0", 1733 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1734 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1735 | "dev": true, 1736 | "dependencies": { 1737 | "estraverse": "^5.1.0" 1738 | }, 1739 | "engines": { 1740 | "node": ">=0.10" 1741 | } 1742 | }, 1743 | "node_modules/esrecurse": { 1744 | "version": "4.3.0", 1745 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1746 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1747 | "dev": true, 1748 | "dependencies": { 1749 | "estraverse": "^5.2.0" 1750 | }, 1751 | "engines": { 1752 | "node": ">=4.0" 1753 | } 1754 | }, 1755 | "node_modules/estraverse": { 1756 | "version": "5.3.0", 1757 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1758 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1759 | "dev": true, 1760 | "engines": { 1761 | "node": ">=4.0" 1762 | } 1763 | }, 1764 | "node_modules/esutils": { 1765 | "version": "2.0.3", 1766 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1767 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1768 | "dev": true, 1769 | "engines": { 1770 | "node": ">=0.10.0" 1771 | } 1772 | }, 1773 | "node_modules/fast-deep-equal": { 1774 | "version": "3.1.3", 1775 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1776 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1777 | "dev": true 1778 | }, 1779 | "node_modules/fast-json-stable-stringify": { 1780 | "version": "2.1.0", 1781 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1782 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1783 | "dev": true 1784 | }, 1785 | "node_modules/fast-levenshtein": { 1786 | "version": "2.0.6", 1787 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1788 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1789 | "dev": true 1790 | }, 1791 | "node_modules/file-entry-cache": { 1792 | "version": "8.0.0", 1793 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 1794 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 1795 | "dev": true, 1796 | "dependencies": { 1797 | "flat-cache": "^4.0.0" 1798 | }, 1799 | "engines": { 1800 | "node": ">=16.0.0" 1801 | } 1802 | }, 1803 | "node_modules/find-up": { 1804 | "version": "5.0.0", 1805 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1806 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1807 | "dev": true, 1808 | "dependencies": { 1809 | "locate-path": "^6.0.0", 1810 | "path-exists": "^4.0.0" 1811 | }, 1812 | "engines": { 1813 | "node": ">=10" 1814 | }, 1815 | "funding": { 1816 | "url": "https://github.com/sponsors/sindresorhus" 1817 | } 1818 | }, 1819 | "node_modules/flat-cache": { 1820 | "version": "4.0.1", 1821 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 1822 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 1823 | "dev": true, 1824 | "dependencies": { 1825 | "flatted": "^3.2.9", 1826 | "keyv": "^4.5.4" 1827 | }, 1828 | "engines": { 1829 | "node": ">=16" 1830 | } 1831 | }, 1832 | "node_modules/flatted": { 1833 | "version": "3.3.3", 1834 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 1835 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 1836 | "dev": true 1837 | }, 1838 | "node_modules/fsevents": { 1839 | "version": "2.3.3", 1840 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1841 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1842 | "dev": true, 1843 | "hasInstallScript": true, 1844 | "optional": true, 1845 | "os": [ 1846 | "darwin" 1847 | ], 1848 | "engines": { 1849 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1850 | } 1851 | }, 1852 | "node_modules/gensync": { 1853 | "version": "1.0.0-beta.2", 1854 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1855 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1856 | "dev": true, 1857 | "engines": { 1858 | "node": ">=6.9.0" 1859 | } 1860 | }, 1861 | "node_modules/glob-parent": { 1862 | "version": "6.0.2", 1863 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1864 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1865 | "dev": true, 1866 | "dependencies": { 1867 | "is-glob": "^4.0.3" 1868 | }, 1869 | "engines": { 1870 | "node": ">=10.13.0" 1871 | } 1872 | }, 1873 | "node_modules/globals": { 1874 | "version": "15.15.0", 1875 | "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", 1876 | "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", 1877 | "dev": true, 1878 | "engines": { 1879 | "node": ">=18" 1880 | }, 1881 | "funding": { 1882 | "url": "https://github.com/sponsors/sindresorhus" 1883 | } 1884 | }, 1885 | "node_modules/has-flag": { 1886 | "version": "4.0.0", 1887 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1888 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1889 | "dev": true, 1890 | "engines": { 1891 | "node": ">=8" 1892 | } 1893 | }, 1894 | "node_modules/ignore": { 1895 | "version": "5.3.2", 1896 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1897 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1898 | "dev": true, 1899 | "engines": { 1900 | "node": ">= 4" 1901 | } 1902 | }, 1903 | "node_modules/import-fresh": { 1904 | "version": "3.3.1", 1905 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 1906 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 1907 | "dev": true, 1908 | "dependencies": { 1909 | "parent-module": "^1.0.0", 1910 | "resolve-from": "^4.0.0" 1911 | }, 1912 | "engines": { 1913 | "node": ">=6" 1914 | }, 1915 | "funding": { 1916 | "url": "https://github.com/sponsors/sindresorhus" 1917 | } 1918 | }, 1919 | "node_modules/imurmurhash": { 1920 | "version": "0.1.4", 1921 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1922 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1923 | "dev": true, 1924 | "engines": { 1925 | "node": ">=0.8.19" 1926 | } 1927 | }, 1928 | "node_modules/is-extglob": { 1929 | "version": "2.1.1", 1930 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1931 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1932 | "dev": true, 1933 | "engines": { 1934 | "node": ">=0.10.0" 1935 | } 1936 | }, 1937 | "node_modules/is-glob": { 1938 | "version": "4.0.3", 1939 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1940 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1941 | "dev": true, 1942 | "dependencies": { 1943 | "is-extglob": "^2.1.1" 1944 | }, 1945 | "engines": { 1946 | "node": ">=0.10.0" 1947 | } 1948 | }, 1949 | "node_modules/isexe": { 1950 | "version": "2.0.0", 1951 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1952 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1953 | "dev": true 1954 | }, 1955 | "node_modules/js-tokens": { 1956 | "version": "4.0.0", 1957 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1958 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1959 | }, 1960 | "node_modules/js-yaml": { 1961 | "version": "4.1.0", 1962 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1963 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1964 | "dev": true, 1965 | "dependencies": { 1966 | "argparse": "^2.0.1" 1967 | }, 1968 | "bin": { 1969 | "js-yaml": "bin/js-yaml.js" 1970 | } 1971 | }, 1972 | "node_modules/jsesc": { 1973 | "version": "3.1.0", 1974 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 1975 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 1976 | "dev": true, 1977 | "bin": { 1978 | "jsesc": "bin/jsesc" 1979 | }, 1980 | "engines": { 1981 | "node": ">=6" 1982 | } 1983 | }, 1984 | "node_modules/json-buffer": { 1985 | "version": "3.0.1", 1986 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1987 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1988 | "dev": true 1989 | }, 1990 | "node_modules/json-schema-traverse": { 1991 | "version": "0.4.1", 1992 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1993 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1994 | "dev": true 1995 | }, 1996 | "node_modules/json-stable-stringify-without-jsonify": { 1997 | "version": "1.0.1", 1998 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1999 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2000 | "dev": true 2001 | }, 2002 | "node_modules/json5": { 2003 | "version": "2.2.3", 2004 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2005 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2006 | "dev": true, 2007 | "bin": { 2008 | "json5": "lib/cli.js" 2009 | }, 2010 | "engines": { 2011 | "node": ">=6" 2012 | } 2013 | }, 2014 | "node_modules/keyv": { 2015 | "version": "4.5.4", 2016 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 2017 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2018 | "dev": true, 2019 | "dependencies": { 2020 | "json-buffer": "3.0.1" 2021 | } 2022 | }, 2023 | "node_modules/levn": { 2024 | "version": "0.4.1", 2025 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2026 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2027 | "dev": true, 2028 | "dependencies": { 2029 | "prelude-ls": "^1.2.1", 2030 | "type-check": "~0.4.0" 2031 | }, 2032 | "engines": { 2033 | "node": ">= 0.8.0" 2034 | } 2035 | }, 2036 | "node_modules/locate-path": { 2037 | "version": "6.0.0", 2038 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2039 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2040 | "dev": true, 2041 | "dependencies": { 2042 | "p-locate": "^5.0.0" 2043 | }, 2044 | "engines": { 2045 | "node": ">=10" 2046 | }, 2047 | "funding": { 2048 | "url": "https://github.com/sponsors/sindresorhus" 2049 | } 2050 | }, 2051 | "node_modules/lodash.merge": { 2052 | "version": "4.6.2", 2053 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2054 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2055 | "dev": true 2056 | }, 2057 | "node_modules/loose-envify": { 2058 | "version": "1.4.0", 2059 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2060 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2061 | "dependencies": { 2062 | "js-tokens": "^3.0.0 || ^4.0.0" 2063 | }, 2064 | "bin": { 2065 | "loose-envify": "cli.js" 2066 | } 2067 | }, 2068 | "node_modules/lru-cache": { 2069 | "version": "5.1.1", 2070 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2071 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2072 | "dev": true, 2073 | "dependencies": { 2074 | "yallist": "^3.0.2" 2075 | } 2076 | }, 2077 | "node_modules/minimatch": { 2078 | "version": "3.1.2", 2079 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2080 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2081 | "dev": true, 2082 | "dependencies": { 2083 | "brace-expansion": "^1.1.7" 2084 | }, 2085 | "engines": { 2086 | "node": "*" 2087 | } 2088 | }, 2089 | "node_modules/ms": { 2090 | "version": "2.1.3", 2091 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2092 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2093 | "dev": true 2094 | }, 2095 | "node_modules/nanoid": { 2096 | "version": "3.3.11", 2097 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 2098 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 2099 | "dev": true, 2100 | "funding": [ 2101 | { 2102 | "type": "github", 2103 | "url": "https://github.com/sponsors/ai" 2104 | } 2105 | ], 2106 | "bin": { 2107 | "nanoid": "bin/nanoid.cjs" 2108 | }, 2109 | "engines": { 2110 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2111 | } 2112 | }, 2113 | "node_modules/natural-compare": { 2114 | "version": "1.4.0", 2115 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2116 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2117 | "dev": true 2118 | }, 2119 | "node_modules/node-releases": { 2120 | "version": "2.0.19", 2121 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 2122 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 2123 | "dev": true 2124 | }, 2125 | "node_modules/object-assign": { 2126 | "version": "4.1.1", 2127 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2128 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2129 | "engines": { 2130 | "node": ">=0.10.0" 2131 | } 2132 | }, 2133 | "node_modules/optionator": { 2134 | "version": "0.9.4", 2135 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 2136 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 2137 | "dev": true, 2138 | "dependencies": { 2139 | "deep-is": "^0.1.3", 2140 | "fast-levenshtein": "^2.0.6", 2141 | "levn": "^0.4.1", 2142 | "prelude-ls": "^1.2.1", 2143 | "type-check": "^0.4.0", 2144 | "word-wrap": "^1.2.5" 2145 | }, 2146 | "engines": { 2147 | "node": ">= 0.8.0" 2148 | } 2149 | }, 2150 | "node_modules/p-limit": { 2151 | "version": "3.1.0", 2152 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2153 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2154 | "dev": true, 2155 | "dependencies": { 2156 | "yocto-queue": "^0.1.0" 2157 | }, 2158 | "engines": { 2159 | "node": ">=10" 2160 | }, 2161 | "funding": { 2162 | "url": "https://github.com/sponsors/sindresorhus" 2163 | } 2164 | }, 2165 | "node_modules/p-locate": { 2166 | "version": "5.0.0", 2167 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2168 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2169 | "dev": true, 2170 | "dependencies": { 2171 | "p-limit": "^3.0.2" 2172 | }, 2173 | "engines": { 2174 | "node": ">=10" 2175 | }, 2176 | "funding": { 2177 | "url": "https://github.com/sponsors/sindresorhus" 2178 | } 2179 | }, 2180 | "node_modules/parent-module": { 2181 | "version": "1.0.1", 2182 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2183 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2184 | "dev": true, 2185 | "dependencies": { 2186 | "callsites": "^3.0.0" 2187 | }, 2188 | "engines": { 2189 | "node": ">=6" 2190 | } 2191 | }, 2192 | "node_modules/path-exists": { 2193 | "version": "4.0.0", 2194 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2195 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2196 | "dev": true, 2197 | "engines": { 2198 | "node": ">=8" 2199 | } 2200 | }, 2201 | "node_modules/path-key": { 2202 | "version": "3.1.1", 2203 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2204 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2205 | "dev": true, 2206 | "engines": { 2207 | "node": ">=8" 2208 | } 2209 | }, 2210 | "node_modules/picocolors": { 2211 | "version": "1.1.1", 2212 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2213 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2214 | "dev": true 2215 | }, 2216 | "node_modules/postcss": { 2217 | "version": "8.5.3", 2218 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 2219 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 2220 | "dev": true, 2221 | "funding": [ 2222 | { 2223 | "type": "opencollective", 2224 | "url": "https://opencollective.com/postcss/" 2225 | }, 2226 | { 2227 | "type": "tidelift", 2228 | "url": "https://tidelift.com/funding/github/npm/postcss" 2229 | }, 2230 | { 2231 | "type": "github", 2232 | "url": "https://github.com/sponsors/ai" 2233 | } 2234 | ], 2235 | "dependencies": { 2236 | "nanoid": "^3.3.8", 2237 | "picocolors": "^1.1.1", 2238 | "source-map-js": "^1.2.1" 2239 | }, 2240 | "engines": { 2241 | "node": "^10 || ^12 || >=14" 2242 | } 2243 | }, 2244 | "node_modules/prelude-ls": { 2245 | "version": "1.2.1", 2246 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2247 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2248 | "dev": true, 2249 | "engines": { 2250 | "node": ">= 0.8.0" 2251 | } 2252 | }, 2253 | "node_modules/prop-types": { 2254 | "version": "15.8.1", 2255 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 2256 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 2257 | "dependencies": { 2258 | "loose-envify": "^1.4.0", 2259 | "object-assign": "^4.1.1", 2260 | "react-is": "^16.13.1" 2261 | } 2262 | }, 2263 | "node_modules/punycode": { 2264 | "version": "2.3.1", 2265 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2266 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2267 | "dev": true, 2268 | "engines": { 2269 | "node": ">=6" 2270 | } 2271 | }, 2272 | "node_modules/react": { 2273 | "version": "19.1.0", 2274 | "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", 2275 | "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", 2276 | "engines": { 2277 | "node": ">=0.10.0" 2278 | } 2279 | }, 2280 | "node_modules/react-dom": { 2281 | "version": "19.1.0", 2282 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", 2283 | "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", 2284 | "dependencies": { 2285 | "scheduler": "^0.26.0" 2286 | }, 2287 | "peerDependencies": { 2288 | "react": "^19.1.0" 2289 | } 2290 | }, 2291 | "node_modules/react-is": { 2292 | "version": "16.13.1", 2293 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2294 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 2295 | }, 2296 | "node_modules/react-refresh": { 2297 | "version": "0.14.2", 2298 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", 2299 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", 2300 | "dev": true, 2301 | "engines": { 2302 | "node": ">=0.10.0" 2303 | } 2304 | }, 2305 | "node_modules/resolve-from": { 2306 | "version": "4.0.0", 2307 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2308 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2309 | "dev": true, 2310 | "engines": { 2311 | "node": ">=4" 2312 | } 2313 | }, 2314 | "node_modules/rollup": { 2315 | "version": "4.39.0", 2316 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", 2317 | "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", 2318 | "dev": true, 2319 | "dependencies": { 2320 | "@types/estree": "1.0.7" 2321 | }, 2322 | "bin": { 2323 | "rollup": "dist/bin/rollup" 2324 | }, 2325 | "engines": { 2326 | "node": ">=18.0.0", 2327 | "npm": ">=8.0.0" 2328 | }, 2329 | "optionalDependencies": { 2330 | "@rollup/rollup-android-arm-eabi": "4.39.0", 2331 | "@rollup/rollup-android-arm64": "4.39.0", 2332 | "@rollup/rollup-darwin-arm64": "4.39.0", 2333 | "@rollup/rollup-darwin-x64": "4.39.0", 2334 | "@rollup/rollup-freebsd-arm64": "4.39.0", 2335 | "@rollup/rollup-freebsd-x64": "4.39.0", 2336 | "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", 2337 | "@rollup/rollup-linux-arm-musleabihf": "4.39.0", 2338 | "@rollup/rollup-linux-arm64-gnu": "4.39.0", 2339 | "@rollup/rollup-linux-arm64-musl": "4.39.0", 2340 | "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", 2341 | "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", 2342 | "@rollup/rollup-linux-riscv64-gnu": "4.39.0", 2343 | "@rollup/rollup-linux-riscv64-musl": "4.39.0", 2344 | "@rollup/rollup-linux-s390x-gnu": "4.39.0", 2345 | "@rollup/rollup-linux-x64-gnu": "4.39.0", 2346 | "@rollup/rollup-linux-x64-musl": "4.39.0", 2347 | "@rollup/rollup-win32-arm64-msvc": "4.39.0", 2348 | "@rollup/rollup-win32-ia32-msvc": "4.39.0", 2349 | "@rollup/rollup-win32-x64-msvc": "4.39.0", 2350 | "fsevents": "~2.3.2" 2351 | } 2352 | }, 2353 | "node_modules/scheduler": { 2354 | "version": "0.26.0", 2355 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", 2356 | "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==" 2357 | }, 2358 | "node_modules/semver": { 2359 | "version": "6.3.1", 2360 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2361 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2362 | "dev": true, 2363 | "bin": { 2364 | "semver": "bin/semver.js" 2365 | } 2366 | }, 2367 | "node_modules/shebang-command": { 2368 | "version": "2.0.0", 2369 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2370 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2371 | "dev": true, 2372 | "dependencies": { 2373 | "shebang-regex": "^3.0.0" 2374 | }, 2375 | "engines": { 2376 | "node": ">=8" 2377 | } 2378 | }, 2379 | "node_modules/shebang-regex": { 2380 | "version": "3.0.0", 2381 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2382 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2383 | "dev": true, 2384 | "engines": { 2385 | "node": ">=8" 2386 | } 2387 | }, 2388 | "node_modules/source-map-js": { 2389 | "version": "1.2.1", 2390 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2391 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2392 | "dev": true, 2393 | "engines": { 2394 | "node": ">=0.10.0" 2395 | } 2396 | }, 2397 | "node_modules/strip-json-comments": { 2398 | "version": "3.1.1", 2399 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2400 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2401 | "dev": true, 2402 | "engines": { 2403 | "node": ">=8" 2404 | }, 2405 | "funding": { 2406 | "url": "https://github.com/sponsors/sindresorhus" 2407 | } 2408 | }, 2409 | "node_modules/supports-color": { 2410 | "version": "7.2.0", 2411 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2412 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2413 | "dev": true, 2414 | "dependencies": { 2415 | "has-flag": "^4.0.0" 2416 | }, 2417 | "engines": { 2418 | "node": ">=8" 2419 | } 2420 | }, 2421 | "node_modules/type-check": { 2422 | "version": "0.4.0", 2423 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2424 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2425 | "dev": true, 2426 | "dependencies": { 2427 | "prelude-ls": "^1.2.1" 2428 | }, 2429 | "engines": { 2430 | "node": ">= 0.8.0" 2431 | } 2432 | }, 2433 | "node_modules/update-browserslist-db": { 2434 | "version": "1.1.3", 2435 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 2436 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 2437 | "dev": true, 2438 | "funding": [ 2439 | { 2440 | "type": "opencollective", 2441 | "url": "https://opencollective.com/browserslist" 2442 | }, 2443 | { 2444 | "type": "tidelift", 2445 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2446 | }, 2447 | { 2448 | "type": "github", 2449 | "url": "https://github.com/sponsors/ai" 2450 | } 2451 | ], 2452 | "dependencies": { 2453 | "escalade": "^3.2.0", 2454 | "picocolors": "^1.1.1" 2455 | }, 2456 | "bin": { 2457 | "update-browserslist-db": "cli.js" 2458 | }, 2459 | "peerDependencies": { 2460 | "browserslist": ">= 4.21.0" 2461 | } 2462 | }, 2463 | "node_modules/uri-js": { 2464 | "version": "4.4.1", 2465 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2466 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2467 | "dev": true, 2468 | "dependencies": { 2469 | "punycode": "^2.1.0" 2470 | } 2471 | }, 2472 | "node_modules/vite": { 2473 | "version": "6.2.5", 2474 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", 2475 | "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", 2476 | "dev": true, 2477 | "dependencies": { 2478 | "esbuild": "^0.25.0", 2479 | "postcss": "^8.5.3", 2480 | "rollup": "^4.30.1" 2481 | }, 2482 | "bin": { 2483 | "vite": "bin/vite.js" 2484 | }, 2485 | "engines": { 2486 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 2487 | }, 2488 | "funding": { 2489 | "url": "https://github.com/vitejs/vite?sponsor=1" 2490 | }, 2491 | "optionalDependencies": { 2492 | "fsevents": "~2.3.3" 2493 | }, 2494 | "peerDependencies": { 2495 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 2496 | "jiti": ">=1.21.0", 2497 | "less": "*", 2498 | "lightningcss": "^1.21.0", 2499 | "sass": "*", 2500 | "sass-embedded": "*", 2501 | "stylus": "*", 2502 | "sugarss": "*", 2503 | "terser": "^5.16.0", 2504 | "tsx": "^4.8.1", 2505 | "yaml": "^2.4.2" 2506 | }, 2507 | "peerDependenciesMeta": { 2508 | "@types/node": { 2509 | "optional": true 2510 | }, 2511 | "jiti": { 2512 | "optional": true 2513 | }, 2514 | "less": { 2515 | "optional": true 2516 | }, 2517 | "lightningcss": { 2518 | "optional": true 2519 | }, 2520 | "sass": { 2521 | "optional": true 2522 | }, 2523 | "sass-embedded": { 2524 | "optional": true 2525 | }, 2526 | "stylus": { 2527 | "optional": true 2528 | }, 2529 | "sugarss": { 2530 | "optional": true 2531 | }, 2532 | "terser": { 2533 | "optional": true 2534 | }, 2535 | "tsx": { 2536 | "optional": true 2537 | }, 2538 | "yaml": { 2539 | "optional": true 2540 | } 2541 | } 2542 | }, 2543 | "node_modules/which": { 2544 | "version": "2.0.2", 2545 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2546 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2547 | "dev": true, 2548 | "dependencies": { 2549 | "isexe": "^2.0.0" 2550 | }, 2551 | "bin": { 2552 | "node-which": "bin/node-which" 2553 | }, 2554 | "engines": { 2555 | "node": ">= 8" 2556 | } 2557 | }, 2558 | "node_modules/word-wrap": { 2559 | "version": "1.2.5", 2560 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2561 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2562 | "dev": true, 2563 | "engines": { 2564 | "node": ">=0.10.0" 2565 | } 2566 | }, 2567 | "node_modules/yallist": { 2568 | "version": "3.1.1", 2569 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 2570 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 2571 | "dev": true 2572 | }, 2573 | "node_modules/yocto-queue": { 2574 | "version": "0.1.0", 2575 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2576 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2577 | "dev": true, 2578 | "engines": { 2579 | "node": ">=10" 2580 | }, 2581 | "funding": { 2582 | "url": "https://github.com/sponsors/sindresorhus" 2583 | } 2584 | } 2585 | } 2586 | } 2587 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-flow", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "prop-types": "^15.8.1", 14 | "react": "^19.0.0", 15 | "react-dom": "^19.0.0" 16 | }, 17 | "devDependencies": { 18 | "@eslint/js": "^9.21.0", 19 | "@types/react": "^19.0.10", 20 | "@types/react-dom": "^19.0.4", 21 | "@vitejs/plugin-react": "^4.3.4", 22 | "eslint": "^9.21.0", 23 | "eslint-plugin-react-hooks": "^5.1.0", 24 | "eslint-plugin-react-refresh": "^0.4.19", 25 | "globals": "^15.15.0", 26 | "vite": "^6.2.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /public/albums.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "position": 97, 4 | "title": "Rage Against the Machine", 5 | "artists": "Rage Against the Machine", 6 | "album": "Rage Against the Machine", 7 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/8e/08/bf/8e08bf66-8690-1ba7-affb-fe173c08623d/074645295923.jpg/550x550bb.jpg" 8 | }, 9 | { 10 | "position": 98, 11 | "title": "ASTROWORLD", 12 | "artists": "Travis Scott", 13 | "album": "ASTROWORLD", 14 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/30/66/90/306690d4-2a29-402e-e406-6b319ce7731a/886447227169.jpg/550x550bb.jpg" 15 | }, 16 | { 17 | "position": 99, 18 | "title": "Hotel California", 19 | "artists": "Eagles", 20 | "album": "Hotel California ", 21 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/88/16/2c/88162c3d-46db-8321-61f3-3a47404cfe76/075596050920.jpg/550x550bb.jpg" 22 | }, 23 | { 24 | "position": 100, 25 | "title": "Body Talk", 26 | "artists": "Robyn", 27 | "album": "Body Talk", 28 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music118/v4/9e/66/3a/9e663ae4-4a96-31b4-147c-5ce1d555ff32/00602527569970.rgb.jpg/550x550bb.jpg" 29 | }, 30 | { 31 | "position": 96, 32 | "title": "Pure Heroine", 33 | "artists": "Lorde", 34 | "album": "Pure Heroine", 35 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music126/v4/e1/d3/23/e1d323d6-a7e4-6d5e-e6f6-5105c76db133/13UAAIM68691.rgb.jpg/550x550bb.jpg" 36 | }, 37 | { 38 | "position": 95, 39 | "title": "Confessions", 40 | "artists": "USHER", 41 | "album": "Confessions ", 42 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/02/c6/e1/02c6e1cd-8d57-97b4-6ef1-77d2be004509/mzi.sjrqsmrq.jpg/550x550bb.jpg" 43 | }, 44 | { 45 | "position": 94, 46 | "title": "Untrue", 47 | "artists": "Burial", 48 | "album": "Untrue", 49 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music116/v4/9d/0f/1c/9d0f1c2b-2fae-d8ac-3920-ce9ec5bc85b5/7982.jpg/550x550bb.jpg" 50 | }, 51 | { 52 | "position": 93, 53 | "title": "A Seat at the Table", 54 | "artists": "Solange", 55 | "album": "A Seat at the Table", 56 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/76/2b/c4/762bc430-fae3-3262-ef16-bd74bad9cdea/886446143170.jpg/550x550bb.jpg" 57 | }, 58 | { 59 | "position": 92, 60 | "title": "Flower Boy", 61 | "artists": "Tyler, The Creator", 62 | "album": "Flower Boy", 63 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/fd/fd/8c/fdfd8c26-b8f9-4768-41d3-b24773250c65/886446605814.jpg/550x550bb.jpg" 64 | }, 65 | { 66 | "position": 91, 67 | "title": "Listen Without Prejudice, Vol. 1", 68 | "artists": "George Michael", 69 | "album": "Listen Without Prejudice, Vol. 1", 70 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music112/v4/44/37/ff/4437ffa7-375d-dc2a-4a47-2ec6925caf98/196589205032.jpg/550x550bb.jpg" 71 | }, 72 | { 73 | "position": 90, 74 | "title": "Back in Black", 75 | "artists": "AC/DC", 76 | "album": "Back in Black", 77 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/1e/14/58/1e145814-281a-58e0-3ab1-145f5d1af421/886443673441.jpg/550x550bb.jpg" 78 | }, 79 | { 80 | "position": 89, 81 | "title": "The Fame Monster (Deluxe Edition)", 82 | "artists": "Lady Gaga", 83 | "album": "The Fame Monster (Deluxe Edition)", 84 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/1b/98/88/1b9888da-6a1f-bff0-ec03-518f445019f6/19UMGIM73435.rgb.jpg/550x550bb.jpg" 85 | }, 86 | { 87 | "position": 88, 88 | "title": "I Put a Spell on You", 89 | "artists": "Nina Simone", 90 | "album": "I Put a Spell on You", 91 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music126/v4/18/db/05/18db0507-f276-d93d-a4a7-e856a3f1590a/13UAAIM08283.rgb.jpg/550x550bb.jpg" 92 | }, 93 | { 94 | "position": 87, 95 | "title": "Blue Lines", 96 | "artists": "Massive Attack", 97 | "album": "Blue Lines", 98 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/e5/f7/c0/e5f7c07d-2182-e732-8ad6-be03814fe93c/13UABIM04453.rgb.jpg/550x550bb.jpg" 99 | }, 100 | { 101 | "position": 86, 102 | "title": "My Life", 103 | "artists": "Mary J. Blige", 104 | "album": "My Life", 105 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music116/v4/f8/8c/9a/f88c9a3f-64cd-9a3a-3a82-f2a7f732ce9c/19UMGIM98447.rgb.jpg/550x550bb.jpg" 106 | }, 107 | { 108 | "position": 85, 109 | "title": "Golden Hour", 110 | "artists": "Kacey Musgraves", 111 | "album": "Golden Hour", 112 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/61/45/e8/6145e88a-6a79-fab1-ad8f-5ffdcbf44a28/18UMGIM03879.rgb.jpg/550x550bb.jpg" 113 | }, 114 | { 115 | "position": 84, 116 | "title": "Doggystyle", 117 | "artists": "Snoop Dogg", 118 | "album": "Doggystyle", 119 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music126/v4/f6/fb/31/f6fb3104-cded-a755-53c9-be0a5527b5bc/659783313694_cover.jpg/550x550bb.jpg" 120 | }, 121 | { 122 | "position": 83, 123 | "title": "Horses ", 124 | "artists": "Patti Smith", 125 | "album": "Horses ", 126 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music211/v4/0b/cd/a8/0bcda80a-0046-aa13-1416-71d844dfb711/886445500394.jpg/550x550bb.jpg" 127 | }, 128 | { 129 | "position": 82, 130 | "title": "Get Rich or Die Tryin'", 131 | "artists": "50 Cent", 132 | "album": "Get Rich or Die Tryin'", 133 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/51/a6/c9/51a6c989-f81d-42b3-c94c-e889a7c07885/06UMGIM15592.rgb.jpg/550x550bb.jpg" 134 | }, 135 | { 136 | "position": 81, 137 | "title": "After the Gold Rush", 138 | "artists": "Neil Young", 139 | "album": "After the Gold Rush", 140 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/88/9f/0a/889f0afc-ca89-5968-ef83-ab07f7184eb6/093624924753.jpg/550x550bb.jpg" 141 | }, 142 | { 143 | "position": 80, 144 | "title": "The Marshall Mathers LP", 145 | "artists": "Eminem", 146 | "album": "The Marshall Mathers LP", 147 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/f7/76/f4/f776f482-406b-301a-4145-14617d0b8cf5/00606949062927.rgb.jpg/550x550bb.jpg" 148 | }, 149 | { 150 | "position": 79, 151 | "title": "Norman F*****g Rockwell!", 152 | "artists": "Lana Del Rey", 153 | "album": "Norman F*****g Rockwell!", 154 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music126/v4/c6/5f/b9/c65fb9eb-da2f-89a9-b640-2fff1fc3a660/19UMGIM61350.rgb.jpg/550x550bb.jpg" 155 | }, 156 | { 157 | "position": 78, 158 | "title": "Goodbye Yellow Brick Road", 159 | "artists": "Elton John", 160 | "album": "Goodbye Yellow Brick Road", 161 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/b3/60/b6/b360b655-4d28-179d-d0d4-4e128ebdf4c9/13UAEIM19273.rgb.jpg/550x550bb.jpg" 162 | }, 163 | { 164 | "position": 77, 165 | "title": "Like a Prayer", 166 | "artists": "Madonna", 167 | "album": "Like a Prayer", 168 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music114/v4/20/3c/f5/203cf53d-689e-528f-29d7-ba33758254aa/mzi.rotbotfl.jpg/550x550bb.jpg" 169 | }, 170 | { 171 | "position": 76, 172 | "title": "Un Verano Sin Ti ", 173 | "artists": "Bad Bunny", 174 | "album": "Un Verano Sin Ti ", 175 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music112/v4/3e/04/eb/3e04ebf6-370f-f59d-ec84-2c2643db92f1/196626945068.jpg/550x550bb.jpg" 176 | }, 177 | { 178 | "position": 75, 179 | "title": "Supa Dupa Fly", 180 | "artists": "Missy Elliott", 181 | "album": "Supa Dupa Fly", 182 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music/b5/1a/e3/mzi.gjotvoax.jpg/550x550bb.jpg" 183 | }, 184 | { 185 | "position": 74, 186 | "title": "The Downward Spiral", 187 | "artists": "Nine Inch Nails", 188 | "album": "The Downward Spiral", 189 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/55/e0/85/55e0851e-11df-3b6a-7c54-4eef0efc2bed/15UMGIM67680.rgb.jpg/550x550bb.jpg" 190 | }, 191 | { 192 | "position": 73, 193 | "title": "Aja", 194 | "artists": "Steely Dan", 195 | "album": "Aja", 196 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music126/v4/c2/3c/54/c23c5414-20d1-7aea-f0f5-187974c58d65/23UMGIM79990.rgb.jpg/550x550bb.jpg" 197 | }, 198 | { 199 | "position": 72, 200 | "title": "SOS", 201 | "artists": "SZA", 202 | "album": "SOS", 203 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/bd/3b/a9/bd3ba9fb-9609-144f-bcfe-ead67b5f6ab3/196589564931.jpg/550x550bb.jpg" 204 | }, 205 | { 206 | "position": 71, 207 | "title": "Trans-Europe Express", 208 | "artists": "Kraftwerk", 209 | "album": "Trans-Europe Express", 210 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/e2/80/bc/e280bcf9-4048-8c42-2b6b-d8b9c9bbed52/5099996602058_1500x1500_300dpi.jpg/550x550bb.jpg" 211 | }, 212 | { 213 | "position": 70, 214 | "title": "Straight Outta Compton", 215 | "artists": "N.W.A", 216 | "album": "Straight Outta Compton", 217 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/e3/82/52/e38252e8-148d-551e-2216-4b51e847f1bd/00602547276506.rgb.jpg/550x550bb.jpg" 218 | }, 219 | { 220 | "position": 69, 221 | "title": "Master of Puppets ", 222 | "artists": "Metallica", 223 | "album": "Master of Puppets ", 224 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music118/v4/69/f9/05/69f905ed-ff04-58a2-8de2-1b5338745f19/858978005226.png/550x550bb.jpg" 225 | }, 226 | { 227 | "position": 67, 228 | "title": "Dummy", 229 | "artists": "Portishead", 230 | "album": "Dummy", 231 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/c1/71/93/c1719342-df7d-e9c5-c87c-53dae5afb289/00042282855329.rgb.jpg/550x550bb.jpg" 232 | }, 233 | { 234 | "position": 66, 235 | "title": "The Queen Is Dead", 236 | "artists": "The Smiths", 237 | "album": "The Queen Is Dead", 238 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/1a/e8/70/1ae870c3-b402-096b-c4c4-8022af5a2ed9/745099189662.jpg/550x550bb.jpg" 239 | }, 240 | { 241 | "position": 65, 242 | "title": "3 Feet High and Rising", 243 | "artists": "De La Soul", 244 | "album": "3 Feet High and Rising", 245 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music126/v4/13/1e/c3/131ec37d-d764-51a6-c800-ace81490e20d/810098502627.png/550x550bb.jpg" 246 | }, 247 | { 248 | "position": 64, 249 | "title": "Baduizm", 250 | "artists": "Erykah Badu", 251 | "album": "Baduizm", 252 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/86/ce/c1/86cec101-bf1f-c565-e794-656b108f3ee1/15UMGIM77651.rgb.jpg/550x550bb.jpg" 253 | }, 254 | { 255 | "position": 63, 256 | "title": "Are You Experienced", 257 | "artists": "The Jimi Hendrix Experience", 258 | "album": "Are You Experienced", 259 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/00/67/45/006745f5-95d5-5a06-35ed-d515e9cfd7d8/dj.tbwlxwoh.jpg/550x550bb.jpg" 260 | }, 261 | { 262 | "position": 61, 263 | "title": "Love Deluxe", 264 | "artists": "Sade", 265 | "album": "Love Deluxe", 266 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/18/c8/d7/18c8d7bc-8491-09e6-df0d-6e0a83ead680/mzi.wsikzifg.jpg/550x550bb.jpg" 267 | }, 268 | { 269 | "position": 60, 270 | "title": "The Velvet Underground & Nico", 271 | "artists": "The Velvet Underground & Nico", 272 | "album": "The Velvet Underground & Nico", 273 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music112/v4/92/93/39/9293397f-a707-237e-ec7e-0ca613a67e3c/06UMGIM04143.rgb.jpg/550x550bb.jpg" 274 | }, 275 | { 276 | "position": 59, 277 | "title": "AM ", 278 | "artists": "Arctic Monkeys", 279 | "album": "AM ", 280 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music113/v4/cc/0f/2d/cc0f2d02-5ff1-10e7-eea2-76863a55dbad/887828031795.png/550x550bb.jpg" 281 | }, 282 | { 283 | "position": 58, 284 | "title": "(What’s the Story) Morning Glory?", 285 | "artists": "Oasis", 286 | "album": "(What’s the Story) Morning Glory?", 287 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music113/v4/04/92/e0/0492e08b-cbcc-9969-9ad6-8f5a0888068c/5051961007107.jpg/550x550bb.jpg" 288 | }, 289 | { 290 | "position": 57, 291 | "title": "Voodoo", 292 | "artists": "D'Angelo", 293 | "album": "Voodoo", 294 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/fd/be/cd/fdbecdf2-5bf5-09fc-8fab-6e93250ebda4/13ULAIM54464.rgb.jpg/550x550bb.jpg" 295 | }, 296 | { 297 | "position": 56, 298 | "title": "Disintegration ", 299 | "artists": "The Cure", 300 | "album": "Disintegration ", 301 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music/93/3c/2c/mzi.ujtdsknz.jpg/550x550bb.jpg" 302 | }, 303 | { 304 | "position": 55, 305 | "title": "ANTI ", 306 | "artists": "Rihanna", 307 | "album": "ANTI ", 308 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music113/v4/11/e9/60/11e9600c-7f3a-424b-1643-97c69f7e8067/16UMGIM03373.rgb.jpg/550x550bb.jpg" 309 | }, 310 | { 311 | "position": 54, 312 | "title": "A Love Supreme", 313 | "artists": "John Coltrane", 314 | "album": "A Love Supreme", 315 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music114/v4/e5/24/aa/e524aacd-467b-66f3-8931-0fcd6750a4b9/08UMGIM07914.rgb.jpg/550x550bb.jpg" 316 | }, 317 | { 318 | "position": 53, 319 | "title": "Exile on Main St.", 320 | "artists": "The Rolling Stones", 321 | "album": "Exile on Main St.", 322 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/b6/7b/df/b67bdff8-4e30-d46d-e869-fc0f38462f4c/08UMGIM15728.rgb.jpg/550x550bb.jpg" 323 | }, 324 | { 325 | "position": 52, 326 | "title": "Appetite for Destruction", 327 | "artists": "Guns N' Roses", 328 | "album": "Appetite for Destruction", 329 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/a0/4d/c4/a04dc484-03cc-02aa-fa82-5334fcb4bc16/18UMGIM24878.rgb.jpg/550x550bb.jpg" 330 | }, 331 | { 332 | "position": 51, 333 | "title": "Sign O’ the Times ", 334 | "artists": "Prince", 335 | "album": "Sign O’ the Times ", 336 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/a9/52/38/a95238ab-10f9-e407-4bc8-755148d32d65/886448874546.jpg/550x550bb.jpg" 337 | }, 338 | { 339 | "position": 50, 340 | "title": "Hounds of Love ", 341 | "artists": "Kate Bush", 342 | "album": "Hounds of Love ", 343 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music116/v4/62/97/32/62973286-5bb3-0de7-c051-8b2de8d95472/cover.jpg/550x550bb.jpg" 344 | }, 345 | { 346 | "position": 49, 347 | "title": "The Joshua Tree", 348 | "artists": "U2", 349 | "album": "The Joshua Tree", 350 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/8f/e2/c3/8fe2c384-f6cb-9af7-371d-2b6a9b204e59/17UMGIM79292.rgb.jpg/550x550bb.jpg" 351 | }, 352 | { 353 | "position": 48, 354 | "title": "Paul’s Boutique ", 355 | "artists": "Beastie Boys", 356 | "album": "Paul’s Boutique ", 357 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music118/v4/bf/b9/82/bfb9825b-e130-0664-2f2f-3a766a1161c6/05099969330056.rgb.jpg/550x550bb.jpg" 358 | }, 359 | { 360 | "position": 47, 361 | "title": "Take Care", 362 | "artists": "Drake", 363 | "album": "Take Care", 364 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/74/fb/d3/74fbd365-bd52-23b4-604b-7f164407b0a9/00602527899107.rgb.jpg/550x550bb.jpg" 365 | }, 366 | { 367 | "position": 46, 368 | "title": "Exodus ", 369 | "artists": "Bob Marley & The Wailers", 370 | "album": "Exodus ", 371 | "image_url": "https://is1-ssl.mzstatic.com/image/thumb/Music116/v4/23/fa/f8/23faf820-c4fa-2bf1-d672-846971f5cf5c/06UMGIM31355.rgb.jpg/550x550bb.jpg" 372 | } 373 | ] -------------------------------------------------------------------------------- /public/scroll-timeline.js: -------------------------------------------------------------------------------- 1 | var __defProp=Object.defineProperty,__defNormalProp=(e,t,n)=>t in e?__defProp(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,__publicField=(e,t,n)=>(__defNormalProp(e,"symbol"!=typeof t?t+"":t,n),n);!function(){"use strict";class e{}class t extends e{constructor(e){super(),__publicField(this,"value"),this.value=e}}class n extends e{constructor(e){super(),__publicField(this,"value"),this.value=e}}class i extends e{constructor(e){super(),__publicField(this,"value"),this.value=e}}class r extends e{constructor(e,t="unrestricted"){super(),__publicField(this,"type"),__publicField(this,"value"),this.value=e,this.type=t}}class o extends e{constructor(e){super(),__publicField(this,"value"),this.value=e}}class s extends e{}class a extends e{constructor(e){super(),__publicField(this,"value"),this.value=e}}class l extends e{}class c extends e{constructor(e){super(),__publicField(this,"value"),this.value=e}}class u extends e{constructor(e,t="integer"){super(),__publicField(this,"value"),__publicField(this,"type"),this.value=e,this.type=t}}class m extends e{constructor(e){super(),__publicField(this,"value"),this.value=e}}class f extends e{constructor(e,t,n){super(),__publicField(this,"value"),__publicField(this,"type"),__publicField(this,"unit"),this.value=e,this.type=t,this.unit=n}}class h extends e{}class p extends e{}class d extends e{}class S extends e{}class g extends e{}class v extends e{}class T extends e{}class y extends e{}class w extends e{}class x extends e{}class b extends e{}class C extends e{}class E{constructor(e){__publicField(this,"input"),__publicField(this,"index",0),this.input=e}consume(){const e=this.input.codePointAt(this.index);return void 0!==e&&(this.index+=String.fromCodePoint(e).length),e}reconsume(e){void 0!==e&&(this.index-=String.fromCodePoint(e).length)}peek(){const e=[];let t=this.index;for(let n=0;n<3&&t=48&&e<=57}function I(e){return P(e)||e>=65&&e<=70||e>=97&&e<=102}function R(e){return function(e){return function(e){return e>=65&&e<=90}(e)||function(e){return e>=97&&e<=122}(e)}(e)||function(e){return e>=128}(e)||95===e}function N(e){return R(e)||P(e)||45===e}function A(e){return e>=0&&e<=8||11===e||e>=14&&e<=31||127===e}function V(e,t){return 92===e&&!k(t)}function _(e,t,n){return 45===e?R(t)||45===t||V(t,n):!!R(e)||92===e&&V(e,t)}function L(e,t,n){return 43===e||45===e?P(t)||46===t&&P(n):P(46===e?t:e)}function O(e){const t=e.consume();if(I(t)){let n=[t];for(;I(...e.peek())&&n.length<5;)n.push(e.consume());M(...e.peek())&&e.consume();const i=parseInt(String.fromCodePoint(...n),16);return 0===i||i>1114111?65533:i}return void 0===t?65533:t}function U(e,t){const n=new o("");for(;;){const i=e.consume();if(i===t)return n;if(void 0===i)return n;if(10===i)return e.reconsume(i),new s;if(92===i){const t=e.peek()[0];void 0===t||(k(t)?e.consume():n.value+=String.fromCodePoint(O(e)))}else n.value+=String.fromCodePoint(i)}}function j(e){let t="";for(;;){const n=e.consume();if(N(n))t+=String.fromCodePoint(n);else{if(!V(...e.peek()))return e.reconsume(n),t;t+=String.fromCodePoint(O(e))}}}function W(e){let t=function(e){let t="integer",n="";for([43,45].includes(e.peek()[0])&&(n+=String.fromCodePoint(e.consume()));P(...e.peek());)n+=String.fromCodePoint(e.consume());if(46===e.peek()[0]&&P(e.peek()[1]))for(n+=String.fromCodePoint(e.consume(),e.consume()),t="number";P(...e.peek());)n+=String.fromCodePoint(e.consume());return[69,101].includes(e.peek()[0])&&([45,43].includes(e.peek()[1])&&P(e.peek()[2])?(n+=String.fromCodePoint(e.consume(),e.consume(),e.consume()),t="number"):P(e.peek()[1])&&(n+=String.fromCodePoint(e.consume(),e.consume()),t="number")),{value:parseFloat(n),type:t}}(e);return _(...e.peek())?new f(t.value,t.type,j(e)):37===e.peek()[0]?(e.consume(),new m(t.value)):new u(t.value,t.type)}function F(e){for(;;){const t=e.consume();if(41===t||void 0===t)return;V(...e.peek())&&O(e)}}function D(e){const i=j(e);if(i.match(/url/i)&&40===e.peek()[0]){for(e.consume();M(e.peek()[0])&&M(e.peek()[1]);)e.consume();return[34,39].includes(e.peek()[0])||M(e.peek()[0])&&[34,39].includes(e.peek()[1])?new n(i):function(e){const t=new a("");for(;M(...e.peek());)e.consume();for(;;){const n=e.consume();if(41===n)return t;if(void 0===n)return t;if(M(n)){for(;M(...e.peek());)e.consume();return 41===e.peek()[0]||void 0===e.peek()[0]?(e.consume(),t):(F(e),new l)}if([34,39,40].includes(n)||A(n))return F(e),new l;if(92===n){if(!V(...e.peek()))return F(e),new l;t.value+=O(e)}else t.value+=String.fromCodePoint(n)}}(e)}return 40===e.peek()[0]?(e.consume(),new n(i)):new t(i)}function z(e){const t=e.consume(),n=e.peek();if(M(t)){for(;M(...e.peek());)e.consume();return new h}if(34===t)return U(e,t);if(35===t){if(N(n[0])||V(...n)){const t=new r;return _(...n)&&(t.type="id"),t.value=j(e),t}return new c(String.fromCodePoint(t))}return 39===t?U(e,t):40===t?new w:41===t?new x:43===t?L(...n)?(e.reconsume(t),W(e)):new c(String.fromCodePoint(t)):44===t?new v:45===t?L(...e.peek())?(e.reconsume(t),W(e)):45===e.peek()[0]&&62===e.peek()[1]?(e.consume(),e.consume(),new d):_(...e.peek())?(e.reconsume(t),D(e)):new c(String.fromCodePoint(t)):46===t?L(...e.peek())?(e.reconsume(t),W(e)):new c(String.fromCodePoint(t)):58===t?new S:59===t?new g:60===t?33===n[0]&&45===n[1]&&45===n[2]?(e.consume(),e.consume(),e.consume(),new p):new c(String.fromCodePoint(t)):64===t?_(...n)?new i(j(e)):new c(String.fromCodePoint(t)):91===t?new T:92===t?V(...n)?(e.reconsume(t),D(e)):new c(String.fromCodePoint(t)):93===t?new y:123===t?new b:125===t?new C:P(t)?(e.reconsume(t),W(e)):R(t)?(e.reconsume(t),D(e)):void 0===t?void 0:new c(String.fromCodePoint(t))}const H=new Set(["px","deg","s","hz","dppx","number","fr"]);function $(e){return H.has(e.toLowerCase())}function q(e,t){if(["x","y"].includes(e))return e;if(!t)throw new Error("To determine the normalized axis the computedStyle of the source is required.");const n="horizontal-tb"==t.writingMode;if("block"===e)e=n?"y":"x";else{if("inline"!==e)throw new TypeError(`Invalid axis “${e}”`);e=n?"x":"y"}return e}function B(e){const t=[];let n=0;function i(){let t=0;const i=n;for(;n(e.has(n[t])?e.get(n[t]).push(n):e.set(n[t],[n]),e)),new Map)}function G(e,t){const n=[],i=[];for(const r of e)t(r)?n.push(r):i.push(r);return[n,i]}function Q(e,t={}){function n(e){return Array.from(e).map((e=>Q(e,t)))}if(e instanceof CSSUnitValue){if("percent"===e.unit&&t.percentageReference){const n=e.value/100*t.percentageReference.value,i=t.percentageReference.unit;return new CSSUnitValue(n,i)}const n=e.toSum();if(n&&1===n.values.length&&(e=n.values[0]),e instanceof CSSUnitValue&&"em"===e.unit&&t.fontSize&&(e=new CSSUnitValue(e.value*t.fontSize.value,t.fontSize.unit)),e instanceof CSSKeywordValue){if("e"===e.value)return new CSSUnitValue(Math.E,"number");if("pi"===e.value)return new CSSUnitValue(Math.PI,"number")}return e}if(!e.operator)return e;switch(e.operator){case"sum":e=new CSSMathSum(...n(e.values));break;case"product":e=new CSSMathProduct(...n(e.values));break;case"negate":e=new CSSMathNegate(Q(e.value,t));break;case"clamp":e=new CSSMathClamp(Q(e.lower,t),Q(e.value,t),Q(e.upper,t));break;case"invert":e=new CSSMathInvert(Q(e.value,t));break;case"min":e=new CSSMathMin(...n(e.values));break;case"max":e=new CSSMathMax(...n(e.values))}if(e instanceof CSSMathMin||e instanceof CSSMathMax){const t=Array.from(e.values);if(t.every((e=>e instanceof CSSUnitValue&&"percent"!==e.unit&&$(e.unit)&&e.unit===t[0].unit))){const n=Math[e.operator].apply(Math,t.map((({value:e})=>e)));return new CSSUnitValue(n,t[0].unit)}}if(e instanceof CSSMathMin||e instanceof CSSMathMax){const t=Array.from(e.values),[n,i]=G(t,(e=>e instanceof CSSUnitValue&&"percent"!==e.unit)),r=Array.from(K(n,"unit").values());if(r.some((e=>e.length>0))){const t=r.map((t=>{const n=Math[e.operator].apply(Math,t.map((({value:e})=>e)));return new CSSUnitValue(n,t[0].unit)}));e=e instanceof CSSMathMin?new CSSMathMin(...t,...i):new CSSMathMax(...t,...i)}return 1===t.length?t[0]:e}if(e instanceof CSSMathNegate)return e.value instanceof CSSUnitValue?new CSSUnitValue(0-e.value.value,e.value.unit):e.value instanceof CSSMathNegate?e.value.value:e;if(e instanceof CSSMathInvert)return e.value instanceof CSSMathInvert?e.value.value:e;if(e instanceof CSSMathSum){let t=function(e){const t=e.filter((e=>e instanceof CSSUnitValue));return[...e.filter((e=>!(e instanceof CSSUnitValue))),...Array.from(K(t,"unit").entries()).map((([e,t])=>{const n=t.reduce(((e,{value:t})=>e+t),0);return new CSSUnitValue(n,e)}))]},n=[];for(const i of e.values)i instanceof CSSMathSum?n.push(...i.values):n.push(i);return n=t(n),1===n.length?n[0]:new CSSMathSum(...n)}if(e instanceof CSSMathProduct){let t=[];for(const r of e.values)r instanceof CSSMathProduct?t.push(...r.values):t.push(r);const[n,i]=G(t,(e=>e instanceof CSSUnitValue&&"number"===e.unit));if(n.length>1){const e=n.reduce(((e,{value:t})=>e*t),1);t=[new CSSUnitValue(e,"number"),...i]}if(2===t.length){let e,n;for(const i of t)i instanceof CSSUnitValue&&"number"===i.unit?e=i:i instanceof CSSMathSum&&[...i.values].every((e=>e instanceof CSSUnitValue))&&(n=i);if(e&&n)return new CSSMathSum(...[...n.values].map((t=>new CSSUnitValue(t.value*e.value,t.unit))))}if(t.every((e=>e instanceof CSSUnitValue&&$(e.unit)||e instanceof CSSMathInvert&&e.value instanceof CSSUnitValue&&$(e.value.unit)))){const e=new CSSMathProduct(...t).toSum();if(e&&1===e.values.length)return e.values[0]}return new CSSMathProduct(...t)}return e}const X=null,Y=["percent","length","angle","time","frequency","resolution","flex"],J={fontRelativeLengths:{units:new Set(["em","rem","ex","rex","cap","rcap","ch","rch","ic","ric","lh","rlh"])},viewportRelativeLengths:{units:new Set(["vw","lvw","svw","dvw","vh","lvh","svh","dvh","vi","lvi","svi","dvi","vb","lvb","svb","dvb","vmin","lvmin","svmin","dvmin","vmax","lvmax","svmax","dvmax"])},absoluteLengths:{units:new Set(["cm","mm","Q","in","pt","pc","px"]),compatible:!0,canonicalUnit:"px",ratios:{cm:96/2.54,mm:96/2.54/10,Q:96/2.54/40,in:96,pc:16,pt:96/72,px:1}},angle:{units:new Set(["deg","grad","rad","turn"]),compatible:!0,canonicalUnit:"deg",ratios:{deg:1,grad:.9,rad:180/Math.PI,turn:360}},time:{units:new Set(["s","ms"]),compatible:!0,canonicalUnit:"s",ratios:{s:1,ms:.001}},frequency:{units:new Set(["hz","khz"]),compatible:!0,canonicalUnit:"hz",ratios:{hz:1,khz:1e3}},resolution:{units:new Set(["dpi","dpcm","dppx"]),compatible:!0,canonicalUnit:"dppx",ratios:{dpi:1/96,dpcm:2.54/96,dppx:1}}},Z=new Map;for(const Vt of Object.values(J))if(Vt.compatible)for(const e of Vt.units)Z.set(e,Vt);function ee(e){return Z.get(e)}function te(e,t){const n={...e};for(const i of Object.keys(t))n[i]?n[i]+=t[i]:n[i]=t[i];return n}function ne(e){return"number"===e?{}:"percent"===e?{percent:1}:J.absoluteLengths.units.has(e)||J.fontRelativeLengths.units.has(e)||J.viewportRelativeLengths.units.has(e)?{length:1}:J.angle.units.has(e)?{angle:1}:J.time.units.has(e)?{time:1}:J.frequency.units.has(e)?{frequency:1}:J.resolution.units.has(e)?{resolution:1}:"fr"===e?{flex:1}:X}function ie(e){if(e instanceof CSSUnitValue){let{unit:t,value:n}=e;const i=ee(e.unit);return i&&t!==i.canonicalUnit&&(n*=i.ratios[t],t=i.canonicalUnit),"number"===t?[[n,{}]]:[[n,{[t]:1}]]}if(e instanceof CSSMathInvert){if(!(e.value instanceof CSSUnitValue))throw new Error("Not implemented");const t=ie(e.value);if(t===X)return X;if(t.length>1)return X;const n=t[0],i={};for(const[e,r]of Object.entries(n[1]))i[e]=-1*r;return t[0]=[1/n[0],i],t}if(e instanceof CSSMathProduct){let t=[[1,{}]];for(const n of e.values){const e=ie(n),i=[];if(e===X)return X;for(const n of t)for(const t of e)i.push([n[0]*t[0],te(n[1],t[1])]);t=i}return t}throw new Error("Not implemented")}function re(e,t){if(ne(t)===X)throw new SyntaxError("The string did not match the expected pattern.");const n=ie(e);if(!n)throw new TypeError;if(n.length>1)throw new TypeError("Sum has more than one item");const i=function(e,t){const n=e.unit,i=e.value,r=ee(n),o=ee(t);if(!o||r!==o)return X;return new CSSUnitValue(i*o.ratios[n]/o.ratios[t],t)}(oe(n[0]),t);if(i===X)throw new TypeError;return i}function oe(e){const[t,n]=e,i=Object.entries(n);if(i.length>1)return X;if(0===i.length)return new CSSUnitValue(t,"number");const r=i[0];return 1!==r[1]?X:new CSSUnitValue(t,r[0])}function se(e,...t){if(t&&t.length)throw new Error("Not implemented");const n=ie(e).map((e=>oe(e)));if(n.some((e=>e===X)))throw new TypeError("Type error");return new CSSMathSum(...n)}function ae(e,t){if(e.percentHint&&t.percentHint&&e.percentHint!==t.percentHint)return X;const n={...e,percentHint:e.percentHint??t.percentHint};for(const i of Y)t[i]&&(n[i]??(n[i]=0),n[i]+=t[i]);return n}class CSSFunction{constructor(e,t){__publicField(this,"name"),__publicField(this,"values"),this.name=e,this.values=t}}class CSSSimpleBlock{constructor(e,t){__publicField(this,"value"),__publicField(this,"associatedToken"),this.value=e,this.associatedToken=t}}function le(e){if(Array.isArray(e))return e;if("string"==typeof e)return function(e){const t=new E(e),n=[];for(;;){const e=z(t);if(void 0===e)return n;n.push(e)}}(e);throw new TypeError("Invalid input type "+typeof e)}function ce(e){const t=e.shift();return t instanceof b||t instanceof T||t instanceof w?function(e,t){let n;if(t instanceof b)n=C;else if(t instanceof w)n=x;else{if(!(t instanceof T))return;n=y}const i=new CSSSimpleBlock([],t);for(;;){const t=e.shift();if(t instanceof n)return i;if(void 0===t)return i;e.unshift(t),i.value.push(ce(e))}}(e,t):t instanceof n?function(e,t){const n=new CSSFunction(e.value,[]);for(;;){const e=t.shift();if(e instanceof x)return n;if(void 0===e)return n;t.unshift(e),n.values.push(ce(t))}}(t,e):t}function ue(e){if(e instanceof w||e instanceof x)return 6;if(e instanceof c){switch(e.value){case"*":case"/":return 4;case"+":case"-":return 2}}}function me(e){return e[e.length-1]}function fe(e,t,n){const i=["+","-"].includes(e.value)?"ADDITION":"MULTIPLICATION",r=t.type===i?t.values:[t],o=n.type===i?n.values:[n];return"-"===e.value?o[0]={type:"NEGATE",value:o[0]}:"/"===e.value&&(o[0]={type:"INVERT",value:o[0]}),{type:i,values:[...r,...o]}}function he(e){if("ADDITION"===e.type)return new CSSMathSum(...e.values.map((e=>he(e))));if("MULTIPLICATION"===e.type)return new CSSMathProduct(...e.values.map((e=>he(e))));if("NEGATE"===e.type)return new CSSMathNegate(he(e.value));if("INVERT"===e.type)return new CSSMathInvert(he(e.value));if(e instanceof CSSSimpleBlock)return pe(new CSSFunction("calc",e.value));if(e instanceof t){if("e"===e.value)return new CSSUnitValue(Math.E,"number");if("pi"===e.value)return new CSSUnitValue(Math.PI,"number");throw new SyntaxError("Invalid math expression")}return de(e)}function pe(e){if("min"===e.name||"max"===e.name){const t=e.values.filter((e=>!(e instanceof h||e instanceof v))).map((e=>Q(pe(new CSSFunction("calc",e)))));return"min"===e.name?new CSSMathMin(...t):new CSSMathMax(...t)}if("calc"!==e.name)return null;const n=he(function(e){const n=[],i=[];for(;e.length;){const r=e.shift();if(r instanceof u||r instanceof f||r instanceof m||r instanceof CSSFunction||r instanceof CSSSimpleBlock||r instanceof t)i.push(r);else if(r instanceof c&&["*","/","+","-"].includes(r.value)){for(;n.length&&!(me(n)instanceof w)&&ue(me(n))>ue(r);){const e=n.pop(),t=i.pop(),r=i.pop();i.push(fe(e,r,t))}n.push(r)}else if(r instanceof w)n.push(r);else if(r instanceof x){if(!n.length)return null;for(;!(me(n)instanceof w);){const e=n.pop(),t=i.pop(),r=i.pop();i.push(fe(e,r,t))}if(!(me(n)instanceof w))return null;n.pop()}else if(!(r instanceof h))return null}for(;n.length;){if(me(n)instanceof w)return null;const e=n.pop(),t=i.pop(),r=i.pop();i.push(fe(e,r,t))}return i[0]}([...e.values]));let i;try{i=Q(n)}catch(r){(new CSSStyleSheet).insertRule("error",0)}return i instanceof CSSUnitValue?new CSSMathSum(i):i}function de(e){return e instanceof CSSFunction&&["calc","min","max","clamp"].includes(e.name)?pe(e):e instanceof u&&0===e.value&&!e.unit?new CSSUnitValue(0,"px"):e instanceof u?new CSSUnitValue(e.value,"number"):e instanceof m?new CSSUnitValue(e.value,"percent"):e instanceof f?new CSSUnitValue(e.value,e.unit):void 0}function Se(e){const t=function(e){const t=le(e);for(;t[0]instanceof h;)t.shift();if(void 0===t[0])return null;const n=ce(t);for(;t[0]instanceof h;)t.shift();return void 0===t[0]?n:null}(e);if(null===t&&(new CSSStyleSheet).insertRule("error",0),t instanceof u||t instanceof m||t instanceof f||t instanceof CSSFunction||(new CSSStyleSheet).insertRule("error",0),t instanceof f){null===ne(t.unit)&&(new CSSStyleSheet).insertRule("error",0)}return de(t)}!function(){let e=new WeakMap;function t(e){const t=[];for(let i=0;ie.type())).reduce(ae)}},CSSMathNegate:class extends CSSMathValue{constructor(e){super([arguments[0]],"negate","-")}get value(){return e.get(this).values[0]}type(){return this.value.type()}},CSSMathInvert:class extends CSSMathValue{constructor(e){super([1,arguments[0]],"invert","calc"," / ")}get value(){return e.get(this).values[1]}type(){return function(e){const t={};for(const n of Y)t[n]=-1*e[n];return t}(e.get(this).values[1].type())}},CSSMathMax:class extends CSSMathValue{constructor(){super(arguments,"max")}},CSSMathMin:class extends CSSMathValue{constructor(){super(arguments,"min")}}};if(!window.CSS&&!Reflect.defineProperty(window,"CSS",{value:{}}))throw Error("Error installing CSSOM support");window.CSSUnitValue||["number","percent","em","ex","px","cm","mm","in","pt","pc","Q","vw","vh","vmin","vmax","rems","ch","deg","rad","grad","turn","ms","s","Hz","kHz","dppx","dpi","dpcm","fr"].forEach((e=>{if(!Reflect.defineProperty(CSS,e,{value:t=>new CSSUnitValue(t,e)}))throw Error(`Error installing CSS.${e}`)}));for(let[i,r]of Object.entries(n))if(!(i in window)&&!Reflect.defineProperty(window,i,{value:r}))throw Error(`Error installing CSSOM support for ${i}`)}();const ge="block";let ve=new WeakMap,Te=new WeakMap;const ye=["entry","exit","cover","contain","entry-crossing","exit-crossing"];function we(e){return e===document.scrollingElement?document:e}function xe(e){Ee(e);let t=ve.get(e).animations;if(0===t.length)return;let n=e.currentTime;for(let i=0;i{for(const e of t.timelineRefs){const t=e.deref();t&&xe(t)}t.updateScheduled=!1})),t.updateScheduled=!0)}function Re(e,t){const n=ve.get(e),i=n.source;if(i!=t){if(i){const t=Te.get(i);if(t){t.timelineRefs.delete(e);const n=Array.from(t.timelineRefs).filter((e=>void 0===e.deref()));for(const e of n)t.timelineRefs.delete(e);0===t.timelineRefs.size&&(t.disconnect(),Te.delete(i))}}if(n.source=t,t){let i=Te.get(t);if(!i){i={timelineRefs:new Set,sourceMeasurements:Me(t)},Te.set(t,i);const e=new ResizeObserver((e=>{for(const t of e)Ie(n.source)}));e.observe(t);for(const n of t.children)e.observe(n);const r=new MutationObserver((e=>{for(const t of e)Ie(t.target)}));r.observe(t,{attributes:!0,attributeFilter:["style","class"]});const o=()=>{i.sourceMeasurements.scrollLeft=t.scrollLeft,i.sourceMeasurements.scrollTop=t.scrollTop;for(const e of i.timelineRefs){const t=e.deref();t&&xe(t)}};we(t).addEventListener("scroll",o),i.disconnect=()=>{e.disconnect(),r.disconnect(),we(t).removeEventListener("scroll",o)}}i.timelineRefs.add(new WeakRef(e))}}}function Ne(e,t){let n=ve.get(e).animations;for(let i=0;i{xe(e)}))}class ScrollTimeline{constructor(e){ve.set(this,{source:null,axis:ge,anonymousSource:e?e.anonymousSource:null,anonymousTarget:e?e.anonymousTarget:null,subject:null,inset:null,animations:[],subjectMeasurements:null});if(Re(this,e&&void 0!==e.source?e.source:document.scrollingElement),e&&void 0!==e.axis&&e.axis!=ge){if(!ke(e.axis))throw TypeError("Invalid axis");ve.get(this).axis=e.axis}xe(this)}set source(e){Re(this,e),xe(this)}get source(){return ve.get(this).source}set axis(e){if(!ke(e))throw TypeError("Invalid axis");ve.get(this).axis=e,xe(this)}get axis(){return ve.get(this).axis}get duration(){return CSS.percent(100)}get phase(){const e=this.source;if(!e)return"inactive";let t=getComputedStyle(e);return"none"==t.display?"inactive":e==document.scrollingElement||"visible"!=t.overflow&&"clip"!=t.overflow?"active":"inactive"}get currentTime(){const e=null,t=this.source;if(!t||!t.isConnected)return e;if("inactive"==this.phase)return e;const n=getComputedStyle(t);if("inline"===n.display||"none"===n.display)return e;const i=this.axis,r=be(t,i),o=function(e,t){const n=Te.get(e).sourceMeasurements,i="horizontal-tb"==getComputedStyle(e).writingMode;return"block"===t?t=i?"y":"x":"inline"===t&&(t=i?"x":"y"),"y"===t?n.scrollHeight-n.clientHeight:"x"===t?n.scrollWidth-n.clientWidth:void 0}(t,i);return o>0?CSS.percent(100*r/o):CSS.percent(100)}get __polyfill(){return!0}}function Ve(e,t){let n=e.parentElement;for(;null!=n;){if(t(n))return n;n=n.parentElement}}function _e(e,t){switch(e){case"root":return document.scrollingElement;case"nearest":return We(t);case"self":return t;default:throw new TypeError("Invalid ScrollTimeline Source Type.")}}function Le(e){switch(getComputedStyle(e).display){case"block":case"inline-block":case"list-item":case"table":case"table-caption":case"flow-root":case"flex":case"grid":return!0}return!1}function Oe(e){const t=getComputedStyle(e);return"none"!=t.transform||"none"!=t.perspective||("transform"==t.willChange||"perspective"==t.willChange||("none"!=t.filter||"filter"==t.willChange||"none"!=t.backdropFilter))}function Ue(e){return"static"!=getComputedStyle(e).position||Oe(e)}function je(e){switch(getComputedStyle(e).position){case"static":case"relative":case"sticky":return Ve(e,Le);case"absolute":return Ve(e,Ue);case"fixed":return Ve(e,Oe)}}function We(e){if(e&&e.isConnected){for(;e=je(e);){switch(getComputedStyle(e)["overflow-x"]){case"auto":case"scroll":case"hidden":return e==document.body&&"visible"==getComputedStyle(document.scrollingElement).overflow?document.scrollingElement:e}}return document.scrollingElement}}function Fe(e,t){const n=ve.get(e),i=n.subjectMeasurements,r=Te.get(n.source).sourceMeasurements;return"inactive"===e.phase?null:e instanceof $e?De(t,r,i,n.axis,n.inset):null}function De(e,t,n,i,r){const o="rtl"==t.direction||"vertical-rl"==t.writingMode;let s,a,l={fontSize:n.fontSize};"x"===q(i,t)?(s=n.offsetWidth,a=n.left,l.scrollPadding=[t.scrollPaddingLeft,t.scrollPaddingRight],o&&(a+=t.scrollWidth-t.clientWidth,l.scrollPadding=[t.scrollPaddingRight,t.scrollPaddingLeft]),l.containerSize=t.clientWidth):(s=n.offsetHeight,a=n.top,l.scrollPadding=[t.scrollPaddingTop,t.scrollPaddingBottom],l.containerSize=t.clientHeight);const c=function(e,t){const n={start:0,end:0};if(!e)return n;const[i,r]=[e.start,e.end].map(((e,n)=>"auto"===e?"auto"===t.scrollPadding[n]?0:parseFloat(t.scrollPadding[n]):Ce(e,{percentageReference:CSS.px(t.containerSize),fontSize:CSS.px(parseFloat(t.fontSize))})));return{start:i,end:r}}(r,l),u=a-l.containerSize+c.end,m=a+s-c.start,f=u+s,h=m-s,p=Math.min(f,h),d=Math.max(f,h);let S,g;const v=s>l.containerSize-c.start-c.end;switch(e){case"cover":S=u,g=m;break;case"contain":S=p,g=d;break;case"entry":S=u,g=p;break;case"exit":S=d,g=m;break;case"entry-crossing":S=u,g=v?d:p;break;case"exit-crossing":S=v?p:d,g=m}return{start:S,end:g}}function ze(e,t){if(e instanceof $e){const{rangeName:n,offset:i}=t;return He(Fe(e,n),i,Fe(e,"cover"),e.subject)}if(e instanceof ScrollTimeline){const{axis:n,source:i}=e,{sourceMeasurements:r}=Te.get(i);let o;o="x"===q(n,r)?r.scrollWidth-r.clientWidth:r.scrollHeight-r.clientHeight;return Ce(t,{percentageReference:CSS.px(o)})/o}unsupportedTimeline(e)}function He(e,t,n,i){if(!e||!n)return 0;let r=getComputedStyle(i);return(Ce(t,{percentageReference:CSS.px(e.end-e.start),fontSize:CSS.px(parseFloat(r.fontSize))})+e.start-n.start)/(n.end-n.start)}let $e=class ViewTimeline extends ScrollTimeline{constructor(e){super(e);const t=ve.get(this);if(t.subject=e&&e.subject?e.subject:void 0,e&&e.inset&&(t.inset=function(e){if(!e)return{start:0,end:0};let t;if(t="string"==typeof e?B(e).map((t=>{if("auto"===t)return"auto";try{return CSSNumericValue.parse(t)}catch(n){throw TypeError(`Could not parse inset "${e}"`)}})):Array.isArray(e)?e:[e],0===t.length||t.length>2)throw TypeError("Invalid inset");for(const n of t){if("auto"===n)continue;const e=n.type();if(1!==e.length&&1!==e.percent)throw TypeError("Invalid inset")}return{start:t[0],end:t[1]??t[0]}}(e.inset)),t.subject){new ResizeObserver((()=>{Ie(t.source)})).observe(t.subject);new MutationObserver((()=>{Ie(t.source)})).observe(t.subject,{attributes:!0,attributeFilter:["class","style"]})}Ee(this),t.subjectMeasurements=Pe(t.source,t.subject),xe(this)}get source(){return Ee(this),ve.get(this).source}set source(e){throw new Error("Cannot set the source of a view timeline")}get subject(){return ve.get(this).subject}get axis(){return ve.get(this).axis}get currentTime(){const e=null,t=be(this.source,this.axis);if(t==e)return e;const n=Fe(this,"cover");if(!n)return e;const i=(t-n.start)/(n.end-n.start);return CSS.percent(100*i)}get startOffset(){return CSS.px(Fe(this,"cover").start)}get endOffset(){return CSS.px(Fe(this,"cover").end)}};const qe=document.getAnimations,Be=window.Element.prototype.getAnimations,Ke=window.Element.prototype.animate,Ge=window.Animation;class Qe{constructor(){this.state="pending",this.nativeResolve=this.nativeReject=null,this.promise=new Promise(((e,t)=>{this.nativeResolve=e,this.nativeReject=t}))}resolve(e){this.state="resolved",this.nativeResolve(e)}reject(e){this.state="rejected",this.promise.catch((()=>{})),this.nativeReject(e)}}function Xe(e){e.readyPromise=new Qe,requestAnimationFrame((()=>{var t;null!==((null==(t=e.timeline)?void 0:t.currentTime)??null)&&(dt(e),"play"!==e.pendingTask||null===e.startTime&&null===e.holdTime?"pause"===e.pendingTask&&tt(e):et(e))}))}function Ye(){return new DOMException("The user aborted a request","AbortError")}function Je(e,t){if(null===t)return t;if("number"!=typeof t)throw new DOMException(`Unexpected value: ${t}. Cannot convert to CssNumberish`,"InvalidStateError");const n=e.rangeDuration??100,i=at(e),r=i?n*t/i:0;return CSS.percent(r)}function Ze(e,t){if(e.timeline){if(null===t)return t;if("percent"===t.unit){const n=e.rangeDuration??100,i=at(e);return t.value*i/n}throw new DOMException("CSSNumericValue must be a percentage for progress based animations.","NotSupportedError")}{if(null==t||"number"==typeof t)return t;const e=t.to("ms");if(e)return e.value;throw new DOMException("CSSNumericValue must be either a number or a time value for time based animations.","InvalidStateError")}}function et(e){const t=Ze(e,e.timeline.currentTime);if(null!=e.holdTime)rt(e),0==e.animation.playbackRate?e.startTime=t:(e.startTime=t-e.holdTime/e.animation.playbackRate,e.holdTime=null);else if(null!==e.startTime&&null!==e.pendingPlaybackRate){const n=(t-e.startTime)*e.animation.playbackRate;rt(e);const i=e.animation.playbackRate;0==i?(e.holdTime=null,e.startTime=t):e.startTime=t-n/i}e.readyPromise&&"pending"==e.readyPromise.state&&e.readyPromise.resolve(e.proxy),st(e,!1,!1),lt(e),e.pendingTask=null}function tt(e){const t=Ze(e,e.timeline.currentTime);null!=e.startTime&&null==e.holdTime&&(e.holdTime=(t-e.startTime)*e.animation.playbackRate),rt(e),e.startTime=null,e.readyPromise.resolve(e.proxy),st(e,!1,!1),lt(e),e.pendingTask=null}function nt(e){if(!e.finishedPromise||"pending"!=e.finishedPromise.state)return;if("finished"!=e.proxy.playState)return;e.finishedPromise.resolve(e.proxy),e.animation.pause();const t=new CustomEvent("finish",{detail:{currentTime:e.proxy.currentTime,timelineTime:e.proxy.timeline.currentTime}});Object.defineProperty(t,"currentTime",{get:function(){return this.detail.currentTime}}),Object.defineProperty(t,"timelineTime",{get:function(){return this.detail.timelineTime}}),requestAnimationFrame((()=>{queueMicrotask((()=>{e.animation.dispatchEvent(t)}))}))}function it(e){return null!==e.pendingPlaybackRate?e.pendingPlaybackRate:e.animation.playbackRate}function rt(e){null!==e.pendingPlaybackRate&&(e.animation.playbackRate=e.pendingPlaybackRate,e.pendingPlaybackRate=null)}function ot(e){if(!e.timeline)return null;const t=Ze(e,e.timeline.currentTime);if(null===t)return null;if(null===e.startTime)return null;let n=(t-e.startTime)*e.animation.playbackRate;return-0==n&&(n=0),n}function st(e,t,n){if(!e.timeline)return;let i=t?Ze(e,e.proxy.currentTime):ot(e);if(i&&null!=e.startTime&&!e.proxy.pending){const n=it(e),r=at(e);let o=e.previousCurrentTime;n>0&&i>=r&&null!=e.previousCurrentTime?((null===o||o0)&&(o=0),e.holdTime=t?i:o):0!=n&&(t&&null!==e.holdTime&&(e.startTime=function(e,t){if(!e.timeline)return null;const n=Ze(e,e.timeline.currentTime);return null==n?null:n-t/e.animation.playbackRate}(e,e.holdTime)),e.holdTime=null)}lt(e),e.previousCurrentTime=Ze(e,e.proxy.currentTime);"finished"==e.proxy.playState?(e.finishedPromise||(e.finishedPromise=new Qe),"pending"==e.finishedPromise.state&&(n?nt(e):Promise.resolve().then((()=>{nt(e)})))):(e.finishedPromise&&"resolved"==e.finishedPromise.state&&(e.finishedPromise=new Qe),"paused"!=e.animation.playState&&e.animation.pause())}function at(e){const t=function(e){const t=e.proxy.effect.getTiming();return e.normalizedTiming||t}(e),n=t.delay+t.endDelay+t.iterations*t.duration;return Math.max(0,n)}function lt(e){if(e.timeline)if(null!==e.startTime){const t=e.timeline.currentTime;if(null==t)return;ct(e,(Ze(e,t)-e.startTime)*e.animation.playbackRate)}else null!==e.holdTime&&ct(e,e.holdTime)}function ct(e,t){const n=e.timeline,i=e.animation.playbackRate,r=n.currentTime&&n.currentTime.value==(i<0?0:100)?i<0?.001:-.001:0;e.animation.currentTime=t+r}function ut(e,t){if(!e.timeline)return;const n="paused"==e.proxy.playState&&e.proxy.pending;let i=!1,r=Ze(e,e.proxy.currentTime);0==it(e)&&null==r&&(e.holdTime=0),null==r&&(e.autoAlignStartTime=!0),("finished"===e.proxy.playState||n)&&(e.holdTime=null,e.startTime=null,e.autoAlignStartTime=!0),e.holdTime&&(e.startTime=null),e.pendingTask&&(e.pendingTask=null,i=!0),(null!==e.holdTime||e.autoAlignStartTime||n||null!==e.pendingPlaybackRate)&&(e.readyPromise&&!i&&(e.readyPromise=null),lt(e),e.readyPromise||Xe(e),e.pendingTask="play",Ae(e.timeline,e.animation,mt.bind(e.proxy)),st(e,!1,!1))}function mt(e){const t=ht.get(this);if(!t)return;if(null==e)return void("paused"!==t.proxy.playState&&"idle"!=t.animation.playState&&t.animation.cancel());dt(t),t.pendingTask&&requestAnimationFrame((()=>{"play"!==t.pendingTask||null===t.startTime&&null===t.holdTime?"pause"===t.pendingTask&&tt(t):et(t)}));const n=this.playState;if("running"==n||"finished"==n){const n=Ze(t,e);ct(t,(n-Ze(t,this.startTime))*this.playbackRate),st(t,!1,!1)}}function ft(e){e.specifiedTiming=null}let ht=new WeakMap;window.addEventListener("pagehide",(e=>{ht=new WeakMap}),!1);let pt=new WeakMap;function dt(e){if(!e.autoAlignStartTime)return;if(!e.timeline||!e.timeline.currentTime)return;if("idle"===e.proxy.playState||"paused"===e.proxy.playState&&null!==e.holdTime)return;const t=e.rangeDuration;let n,i;try{n=CSS.percent(100*function(e){if(!e.animationRange)return 0;const t="normal"===e.animationRange.start?gt(e.timeline):e.animationRange.start;return ze(e.timeline,t)}(e))}catch(o){n=CSS.percent(0),e.animationRange.start="normal",console.warn("Exception when calculating start offset",o)}try{i=CSS.percent(100*(1-function(e){if(!e.animationRange)return 0;const t="normal"===e.animationRange.end?vt(e.timeline):e.animationRange.end;return 1-ze(e.timeline,t)}(e)))}catch(o){i=CSS.percent(100),e.animationRange.end="normal",console.warn("Exception when calculating end offset",o)}e.rangeDuration=i.value-n.value;const r=it(e);e.startTime=Ze(e,r>=0?n:i),e.holdTime=null,e.rangeDuration!==t&&ft(e)}function St(e){throw new Error("Unsupported timeline class")}function gt(e){return e instanceof ViewTimeline?{rangeName:"cover",offset:CSS.percent(0)}:e instanceof ScrollTimeline?CSS.percent(0):void St()}function vt(e){return e instanceof ViewTimeline?{rangeName:"cover",offset:CSS.percent(100)}:e instanceof ScrollTimeline?CSS.percent(100):void St()}function Tt(e,t){if(!t)return{start:"normal",end:"normal"};const n={start:gt(e),end:vt(e)};if(e instanceof ViewTimeline){const e=B(t),i=[],r=[];if(e.forEach((e=>{if(ye.includes(e))i.push(e);else try{r.push(CSSNumericValue.parse(e))}catch(n){throw TypeError(`Could not parse range "${t}"`)}})),i.length>2||r.length>2||1==r.length)throw TypeError("Invalid time range or unsupported time range format.");return i.length&&(n.start.rangeName=i[0],n.end.rangeName=i.length>1?i[1]:i[0]),r.length>1&&(n.start.offset=r[0],n.end.offset=r[1]),n}if(e instanceof ScrollTimeline){const e=t.split(" ");if(2!=e.length)throw TypeError("Invalid time range or unsupported time range format.");return n.start=CSSNumericValue.parse(e[0]),n.end=CSSNumericValue.parse(e[1]),n}St()}function yt(e,t,n){if(!t||"normal"===t)return"normal";if(e instanceof ViewTimeline){let e="cover",i="start"===n?CSS.percent(0):CSS.percent(100);if(t instanceof Object)void 0!==t.rangeName&&(e=t.rangeName),void 0!==t.offset&&(i=t.offset);else{const n=B(t);1===n.length?ye.includes(n[0])?e=n[0]:i=Q(CSSNumericValue.parse(n[0]),{}):2===n.length&&(e=n[0],i=Q(CSSNumericValue.parse(n[1]),{}))}if(!ye.includes(e))throw TypeError("Invalid range name");return{rangeName:e,offset:i}}if(e instanceof ScrollTimeline)return CSSNumericValue.parse(t);St()}class wt{constructor(e,t,n={}){const i=t instanceof ScrollTimeline,r=e instanceof Ge?e:new Ge(e,i?void 0:t);pt.set(r,this),ht.set(this,{animation:r,timeline:i?t:void 0,playState:i?"idle":null,readyPromise:null,finishedPromise:null,startTime:null,holdTime:null,rangeDuration:null,previousCurrentTime:null,autoAlignStartTime:!1,pendingPlaybackRate:null,pendingTask:null,specifiedTiming:null,normalizedTiming:null,effect:null,animationRange:i?Tt(t,n["animation-range"]):null,proxy:this})}get effect(){const e=ht.get(this);return e.timeline?(e.effect||(e.effect=function(e){const t=e.animation.effect,n=t.updateTiming,i={apply:function(n){t.getTiming();const i=n.apply(t);if(e.timeline){const t=e.duration??100;i.localTime=Je(e,i.localTime),i.endTime=Je(e,i.endTime),i.activeDuration=Je(e,i.activeDuration);const n=at(e),r=i.iterations?(n-i.delay-i.endDelay)/i.iterations:0;i.duration=n?CSS.percent(t*r/n):CSS.percent(0),void 0===e.timeline.currentTime&&(i.localTime=null)}return i}},r={apply:function(i,r){if(e.specifiedTiming)return e.specifiedTiming;e.specifiedTiming=i.apply(t);let o,s=Object.assign({},e.specifiedTiming);if(s.duration===1/0)throw TypeError("Effect duration cannot be Infinity when used with Scroll Timelines");return(null===s.duration||"auto"===s.duration||e.autoDurationEffect)&&e.timeline&&(e.autoDurationEffect=!0,s.delay=0,s.endDelay=0,o=s.iterations?1e5:0,s.duration=s.iterations?(o-s.delay-s.endDelay)/s.iterations:0,s.duration<0&&(s.duration=0,s.endDelay=o-s.delay),n.apply(t,[s])),e.normalizedTiming=s,e.specifiedTiming}},o={apply:function(n,i,r){if(r&&r.length){if(e.timeline&&r[0]){const t=r[0],n=t.duration;if(n===1/0)throw TypeError("Effect duration cannot be Infinity when used with Scroll Timelines");if(t.iterations===1/0)throw TypeError("Effect iterations cannot be Infinity when used with Scroll Timelines");void 0!==n&&"auto"!==n&&(e.autoDurationEffect=null)}e.specifiedTiming&&n.apply(t,[e.specifiedTiming]),n.apply(t,r),ft(e)}}},s=new Proxy(t,{get:function(e,n){const i=e[n];return"function"==typeof i?i.bind(t):i},set:function(e,t,n){return e[t]=n,!0}});return s.getComputedTiming=new Proxy(t.getComputedTiming,i),s.getTiming=new Proxy(t.getTiming,r),s.updateTiming=new Proxy(t.updateTiming,o),s}(e)),e.effect):e.animation.effect}set effect(e){const t=ht.get(this);t.animation.effect=e,t.effect=null,t.autoDurationEffect=null}get timeline(){const e=ht.get(this);return e.timeline||e.animation.timeline}set timeline(e){const t=ht.get(this),n=this.timeline;if(n==e)return;const i=this.playState,r=this.currentTime;let o,s=at(t);o=null===r?null:0===s?0:Ze(t,r)/s;const a=n instanceof ScrollTimeline,l=e instanceof ScrollTimeline,c=this.pending;if(a&&Ne(t.timeline,t.animation),l)return t.timeline=e,rt(t),t.autoAlignStartTime=!0,t.startTime=null,t.holdTime=null,"running"!==i&&"finished"!==i||(t.readyPromise&&"resolved"!==t.readyPromise.state||Xe(t),t.pendingTask="play",Ae(t.timeline,t.animation,mt.bind(this))),"paused"===i&&null!==o&&(t.holdTime=o*s),c&&(t.readyPromise&&"resolved"!=t.readyPromise.state||Xe(t),t.pendingTask="paused"==i?"pause":"play"),null!==t.startTime&&(t.holdTime=null),void st(t,!1,!1);if(t.animation.timeline!=e)throw TypeError("Unsupported timeline: "+e);if(Ne(t.timeline,t.animation),t.timeline=null,a)switch(null!==r&&(t.animation.currentTime=o*at(t)),i){case"paused":t.animation.pause();break;case"running":case"finished":t.animation.play()}}get startTime(){const e=ht.get(this);return e.timeline?Je(e,e.startTime):e.animation.startTime}set startTime(e){const t=ht.get(this);if(e=Ze(t,e),!t.timeline)return void(t.animation.startTime=e);t.autoAlignStartTime=!1;null==Ze(t,t.timeline.currentTime)&&null!=t.startTime&&(t.holdTime=null,lt(t));const n=Ze(t,this.currentTime);rt(t),t.startTime=e,null!==t.startTime&&0!=t.animation.playbackRate?t.holdTime=null:t.holdTime=n,t.pendingTask&&(t.pendingTask=null,t.readyPromise.resolve(this)),st(t,!0,!1),lt(t)}get currentTime(){const e=ht.get(this);return e.timeline?null!=e.holdTime?Je(e,e.holdTime):Je(e,ot(e)):e.animation.currentTime}set currentTime(e){const t=ht.get(this);t.timeline?(!function(e,t){if(null==t&&null!==e.currentTime)throw new TypeError;t=Ze(e,t),e.autoAlignStartTime=!1,null!==e.holdTime||null===e.startTime||"inactive"===e.timeline.phase||0===e.animation.playbackRate?e.holdTime=t:e.startTime=Ze(e,e.timeline.currentTime)-t/e.animation.playbackRate,"inactive"===e.timeline.phase&&(e.startTime=null),e.previousCurrentTime=null}(t,e),"pause"==t.pendingTask&&(t.holdTime=Ze(t,e),rt(t),t.startTime=null,t.pendingTask=null,t.readyPromise.resolve(this)),st(t,!0,!1)):t.animation.currentTime=e}get playbackRate(){return ht.get(this).animation.playbackRate}set playbackRate(e){const t=ht.get(this);if(!t.timeline)return void(t.animation.playbackRate=e);t.pendingPlaybackRate=null;const n=this.currentTime;t.animation.playbackRate=e,null!==n&&(this.currentTime=n)}get playState(){const e=ht.get(this);if(!e.timeline)return e.animation.playState;const t=Ze(e,this.currentTime);if(null===t&&null===e.startTime&&null==e.pendingTask)return"idle";if("pause"==e.pendingTask||null===e.startTime&&"play"!=e.pendingTask)return"paused";if(null!=t){if(e.animation.playbackRate>0&&t>=at(e))return"finished";if(e.animation.playbackRate<0&&t<=0)return"finished"}return"running"}get rangeStart(){var e;return(null==(e=ht.get(this).animationRange)?void 0:e.start)??"normal"}set rangeStart(e){const t=ht.get(this);if(!t.timeline)return t.animation.rangeStart=e;if(t.timeline instanceof ScrollTimeline){t.animationRange.start=yt(t.timeline,e,"start"),dt(t),lt(t)}}get rangeEnd(){var e;return(null==(e=ht.get(this).animationRange)?void 0:e.end)??"normal"}set rangeEnd(e){const t=ht.get(this);if(!t.timeline)return t.animation.rangeEnd=e;if(t.timeline instanceof ScrollTimeline){t.animationRange.end=yt(t.timeline,e,"end"),dt(t),lt(t)}}get replaceState(){return ht.get(this).animation.pending}get pending(){const e=ht.get(this);return e.timeline?!!e.readyPromise&&"pending"==e.readyPromise.state:e.animation.pending}finish(){const e=ht.get(this);if(!e.timeline)return void e.animation.finish();const t=it(e),n=at(e);if(0==t)throw new DOMException("Cannot finish Animation with a playbackRate of 0.","InvalidStateError");if(t>0&&n==1/0)throw new DOMException("Cannot finish Animation with an infinite target effect end.","InvalidStateError");rt(e);const i=t<0?0:n;this.currentTime=Je(e,i);const r=Ze(e,e.timeline.currentTime);null===e.startTime&&null!==r&&(e.startTime=r-i/e.animation.playbackRate),"pause"==e.pendingTask&&null!==e.startTime&&(e.holdTime=null,e.pendingTask=null,e.readyPromise.resolve(this)),"play"==e.pendingTask&&null!==e.startTime&&(e.pendingTask=null,e.readyPromise.resolve(this)),st(e,!0,!0)}play(){const e=ht.get(this);e.timeline?ut(e):e.animation.play()}pause(){const e=ht.get(this);e.timeline?"paused"!=this.playState&&(null===e.animation.currentTime&&(e.autoAlignStartTime=!0),"play"==e.pendingTask?e.pendingTask=null:e.readyPromise=null,e.readyPromise||Xe(e),e.pendingTask="pause",Ae(e.timeline,e.animation,mt.bind(e.proxy))):e.animation.pause()}reverse(){const e=ht.get(this),t=it(e),n=Ze(e,this.currentTime),i=at(e)==1/0,r=0!=t&&(t<0||n>0||!i);if(!e.timeline||!r)return r&&(e.pendingPlaybackRate=-it(e)),void e.animation.reverse();if("inactive"==e.timeline.phase)throw new DOMException("Cannot reverse an animation with no active timeline","InvalidStateError");this.updatePlaybackRate(-t),ut(e)}updatePlaybackRate(e){const t=ht.get(this);if(t.pendingPlaybackRate=e,!t.timeline)return void t.animation.updatePlaybackRate(e);const n=this.playState;if(!t.readyPromise||"pending"!=t.readyPromise.state)switch(n){case"idle":case"paused":rt(t);break;case"finished":const n=Ze(t,t.timeline.currentTime),i=null!==n?(n-t.startTime)*t.animation.playbackRate:null;t.startTime=0==e?n:null!=n&&null!=i?(n-i)/e:null,rt(t),st(t,!1,!1),lt(t);break;default:ut(t)}}persist(){ht.get(this).animation.persist()}get id(){return ht.get(this).animation.id}set id(e){ht.get(this).animation.id=e}cancel(){const e=ht.get(this);e.timeline?("idle"!=this.playState&&(!function(e){e.pendingTask&&(e.pendingTask=null,rt(e),e.readyPromise.reject(Ye()),Xe(e),e.readyPromise.resolve(e.proxy))}(e),e.finishedPromise&&"pending"==e.finishedPromise.state&&e.finishedPromise.reject(Ye()),e.finishedPromise=new Qe,e.animation.cancel()),e.startTime=null,e.holdTime=null,Ne(e.timeline,e.animation)):e.animation.cancel()}get onfinish(){return ht.get(this).animation.onfinish}set onfinish(e){ht.get(this).animation.onfinish=e}get oncancel(){return ht.get(this).animation.oncancel}set oncancel(e){ht.get(this).animation.oncancel=e}get onremove(){return ht.get(this).animation.onremove}set onremove(e){ht.get(this).animation.onremove=e}get finished(){const e=ht.get(this);return e.timeline?(e.finishedPromise||(e.finishedPromise=new Qe),e.finishedPromise.promise):e.animation.finished}get ready(){const e=ht.get(this);return e.timeline?(e.readyPromise||(e.readyPromise=new Qe,e.readyPromise.resolve(this)),e.readyPromise.promise):e.animation.ready}addEventListener(e,t,n){ht.get(this).animation.addEventListener(e,t,n)}removeEventListener(e,t,n){ht.get(this).animation.removeEventListener(e,t,n)}dispatchEvent(e){ht.get(this).animation.dispatchEvent(e)}}function xt(e,t){const n=t.timeline;n instanceof ScrollTimeline&&delete t.timeline;const i=Ke.apply(this,[e,t]),r=new wt(i,n);if(n instanceof ScrollTimeline){i.pause();ht.get(r).animationRange={start:yt(n,t.rangeStart,"start"),end:yt(n,t.rangeEnd,"end")},r.play()}return r}function bt(e){for(let t=0;t=i.sheetSrc.length));){if(this.lookAhead("/*",i)){for(;this.lookAhead("/*",i);)this.eatComment(i),this.eatWhitespace(i);continue}const e=this.parseQualifiedRule(i);e&&(t?this.parseKeyframesAndSaveNameMapping(e,i):this.handleScrollTimelineProps(e,i))}return i.sheetSrc}getAnimationTimelineOptions(e,t){for(let n=this.cssRulesWithTimelineName.length-1;n>=0;n--){const i=this.cssRulesWithTimelineName[n];try{if(t.matches(i.selector)&&(!i["animation-name"]||i["animation-name"]==e))return{"animation-timeline":i["animation-timeline"],"animation-range":i["animation-range"]}}catch{}}return null}getAnonymousScrollTimelineOptions(e,t){const n=this.anonymousScrollTimelineOptions.get(e);return n?{anonymousSource:n.source,anonymousTarget:t,source:_e(n.source??"nearest",t),axis:n.axis?n.axis:"block"}:null}getScrollTimelineOptions(e,t){const n=this.getAnonymousScrollTimelineOptions(e,t);if(n)return n;for(let i=this.sourceSelectorToScrollTimeline.length-1;i>=0;i--){const n=this.sourceSelectorToScrollTimeline[i];if(n.name==e){const e=this.findPreviousSiblingOrAncestorMatchingSelector(t,n.selector);if(e)return{source:e,...n.axis?{axis:n.axis}:{}}}}return null}findPreviousSiblingOrAncestorMatchingSelector(e,t){let n=e;for(;n;){if(n.matches(t))return n;n=n.previousElementSibling||n.parentElement}return null}getAnonymousViewTimelineOptions(e,t){const n=this.anonymousViewTimelineOptions.get(e);return n?{subject:t,axis:n.axis?n.axis:"block",inset:n.inset?n.inset:"auto"}:null}getViewTimelineOptions(e,t){const n=this.getAnonymousViewTimelineOptions(e,t);if(n)return n;for(let i=this.subjectSelectorToViewTimeline.length-1;i>=0;i--){const n=this.subjectSelectorToViewTimeline[i];if(n.name==e){const e=this.findPreviousSiblingOrAncestorMatchingSelector(t,n.selector);if(e)return{subject:e,axis:n.axis,inset:n.inset}}}return null}handleScrollTimelineProps(e,t){if(e.selector.includes("@keyframes"))return;const n=e.block.contents.includes("animation-name:"),i=e.block.contents.includes("animation-timeline:"),r=e.block.contents.includes("animation:");if(this.saveSourceSelectorToScrollTimeline(e),this.saveSubjectSelectorToViewTimeline(e),!i&&!n&&!r)return;let o=[],s=[],a=!1;i&&(o=this.extractScrollTimelineNames(e.block.contents)),n&&(s=this.extractMatches(e.block.contents,kt.ANIMATION_NAME)),i&&n||(r&&this.extractMatches(e.block.contents,kt.ANIMATION).forEach((t=>{const n=this.extractAnimationName(t);n&&i&&s.push(n),i&&(this.hasDuration(t)||(this.hasAutoDuration(t)&&(e.block.contents=e.block.contents.replace("auto"," ")),e.block.contents=e.block.contents.replace(t," 1s "+t),a=!0))})),a&&this.replacePart(e.block.startIndex,e.block.endIndex,e.block.contents,t)),this.saveRelationInList(e,o,s)}saveSourceSelectorToScrollTimeline(e){const t=e.block.contents.includes("scroll-timeline:"),n=e.block.contents.includes("scroll-timeline-name:"),i=e.block.contents.includes("scroll-timeline-axis:");if(!t&&!n)return;let r=[];if(t){const t=this.extractMatches(e.block.contents,kt.SCROLL_TIMELINE);for(const n of t){const t=this.split(n);let i={selector:e.selector,name:""};1==t.length?i.name=t[0]:2==t.length&&(Mt.includes(t[0])?(i.axis=t[0],i.name=t[1]):(i.axis=t[1],i.name=t[0])),r.push(i)}}if(n){const t=this.extractMatches(e.block.contents,kt.SCROLL_TIMELINE_NAME);for(let n=0;nMt.includes(e))),o.length!=t.length)throw new Error("Invalid axis")}for(let s=0;sMt.includes(e))),a.length!=t.length)throw new Error("Invalid axis")}for(let l=0;l{return t=e,kt.TIME.exec(t);var t})).length>=1}hasAutoDuration(e){return e.split(" ").filter((e=>"auto"===e)).length>=1}saveRelationInList(e,t,n){let i=[];e.block.contents.includes("animation-range:")&&(i=this.extractMatches(e.block.contents,kt.ANIMATION_TIME_RANGE));const r=Math.max(t.length,n.length,i.length);for(let o=0;oe.trim())).forEach((e=>{if(function(e){return(e.startsWith("scroll")||e.startsWith("view"))&&e.includes("(")}(e)){const t=this.saveAnonymousTimelineName(e);n.push(t)}else n.push(e)})),n}saveAnonymousTimelineName(e){const t=":t"+this.nextAnonymousTimelineNameIndex++;return e.startsWith("scroll(")?this.anonymousScrollTimelineOptions.set(t,this.parseAnonymousScrollTimeline(e)):this.anonymousViewTimelineOptions.set(t,this.parseAnonymousViewTimeline(e)),t}parseAnonymousScrollTimeline(e){const t=kt.ANONYMOUS_SCROLL_TIMELINE.exec(e);if(!t)return null;const n=t[1],i={};return n.split(" ").forEach((e=>{Mt.includes(e)?i.axis=e:Pt.includes(e)&&(i.source=e)})),i}parseAnonymousViewTimeline(e){const t=kt.ANONYMOUS_VIEW_TIMELINE.exec(e);if(!t)return null;const n=t[1],i={};return n.split(" ").forEach((e=>{Mt.includes(e)?i.axis=e:i.inset=i.inset?`${i.inset} ${e}`:e})),i}extractAnimationName(e){return this.findMatchingEntryInContainer(e,this.keyframeNamesSelectors)}findMatchingEntryInContainer(e,t){const n=e.split(" ").filter((e=>t.has(e)));return n?n[0]:null}parseIdentifier(e){kt.IDENTIFIER.lastIndex=e.index;const t=kt.IDENTIFIER.exec(e.sheetSrc);if(!t)throw this.parseError(e,"Expected an identifier");return e.index+=t[0].length,t[0]}parseKeyframesAndSaveNameMapping(e,t){if(e.selector.startsWith("@keyframes")){const n=this.replaceKeyframesAndGetMapping(e,t);e.selector.split(" ").forEach(((e,t)=>{t>0&&this.keyframeNamesSelectors.set(e,n)}))}}replaceKeyframesAndGetMapping(e,t){function n(e){return ye.some((t=>e.startsWith(t)))}const i=e.block.contents,r=function(e){let t=0,n=-1,i=-1;const r=[];for(let o=0;o{const i=e.split(" ").map((e=>e.trim())).filter((e=>""!=e)).join(" ");const r=o.size;o.set(r,i),t.push(`${r}%`),n(i)&&(s=!0)})),a.push(t.join(",")),l==r.length-1?a.push(i.substring(r[l].end)):a.push(i.substring(r[l].end,r[l+1].start))}return s?(e.block.contents=a.join(""),this.replacePart(e.block.startIndex,e.block.endIndex,e.block.contents,t),o):new Map}parseQualifiedRule(e){const t=e.index,n=this.parseSelector(e).trim();if(!n)return;return{selector:n,block:this.eatBlock(e),startIndex:t,endIndex:e.index}}removeEnclosingDoubleQuotes(e){let t='"'==e[0]?1:0,n='"'==e[e.length-1]?e.length-1:e.length;return e.substring(t,n)}assertString(e,t){if(e.sheetSrc.substr(e.index,t.length)!=t)throw this.parseError(e,`Did not find expected sequence ${t}`);e.index+=t.length}replacePart(e,t,n,i){if(i.sheetSrc=i.sheetSrc.slice(0,e)+n+i.sheetSrc.slice(t),i.index>=t){const r=i.index-t;i.index=e+n.length+r}}eatComment(e){this.assertString(e,"/*"),this.eatUntil("*/",e,!0),this.assertString(e,"*/")}eatBlock(e){const t=e.index;this.assertString(e,"{");let n=1;for(;0!=n;)this.lookAhead("/*",e)?this.eatComment(e):("{"===e.sheetSrc[e.index]?n++:"}"===e.sheetSrc[e.index]&&n--,this.advance(e));const i=e.index;return{startIndex:t,endIndex:i,contents:e.sheetSrc.slice(t,i)}}advance(e){if(e.index++,e.index>e.sheetSrc.length)throw this.parseError(e,"Advanced beyond the end")}parseError(e,t){return Error(`(${e.name?e.name:""}): ${t}`)}eatUntil(e,t,n=!1){const i=t.index;for(;!this.lookAhead(e,t);)this.advance(t);return n&&(t.sheetSrc=t.sheetSrc.slice(0,i)+" ".repeat(t.index-i)+t.sheetSrc.slice(t.index)),t.sheetSrc.slice(i,t.index)}parseSelector(e){let t=e.index;if(this.eatUntil("{",e),t===e.index)throw Error("Empty selector");return e.sheetSrc.slice(t,e.index)}eatWhitespace(e){kt.WHITE_SPACE.lastIndex=e.index;const t=kt.WHITE_SPACE.exec(e.sheetSrc);t&&(e.index+=t[0].length)}lookAhead(e,t){return t.sheetSrc.substr(t.index,e.length)==e}peek(e){return e.sheetSrc[e.index]}extractMatches(e,t,n=","){return t.exec(e)[1].trim().split(n).map((e=>e.trim()))}split(e){return e.split(" ").map((e=>e.trim())).filter((e=>""!=e))}};function Rt(e,t,n,i,r,o){const s=Me(t),a=Pe(t,n);return He(De(e,s,a,i,r),o,De("cover",s,a,i,r),n)}function Nt(e,t,n){const i=It.getAnimationTimelineOptions(t,n);if(!i)return null;const r=i["animation-timeline"];if(!r)return null;let o=It.getScrollTimelineOptions(r,n)||It.getViewTimelineOptions(r,n);return o?(o.subject&&function(e,t){const n=We(t.subject),i=t.axis||t.axis;function r(e,r){let o=null;for(const[s,a]of e)if(s==100*r.offset){if("from"==a)o=0;else if("to"==a)o=100;else{const e=a.split(" ");o=1==e.length?parseFloat(e[0]):100*Rt(e[0],n,t.subject,i,t.inset,CSS.percent(parseFloat(e[1])))}break}return o}const o=It.keyframeNamesSelectors.get(e.animationName);if(o&&o.size){const t=[];e.effect.getKeyframes().forEach((e=>{const n=r(o,e);null!==n&&n>=0&&n<=100&&(e.offset=n/100,t.push(e))}));const n=t.sort(((e,t)=>e.offsett.offset?1:0));e.effect.setKeyframes(n)}}(e,o),{timeline:o.source?new ScrollTimeline(o):new $e(o),animOptions:i}):null}function At(){if(CSS.supports("animation-timeline: --works"))return!0;!function(){function e(e){if(0===e.innerHTML.trim().length)return;let t=It.transpileStyleSheet(e.innerHTML,!0);t=It.transpileStyleSheet(t,!1),e.innerHTML=t}function t(e){"text/css"!=e.type&&"stylesheet"!=e.rel||!e.href||new URL(e.href,document.baseURI).origin==location.origin&&fetch(e.getAttribute("href")).then((async t=>{const n=await t.text();let i=It.transpileStyleSheet(n,!0);if(i=It.transpileStyleSheet(n,!1),i!=n){const t=new Blob([i],{type:"text/css"}),n=URL.createObjectURL(t);e.setAttribute("href",n)}}))}new MutationObserver((n=>{for(const i of n)for(const n of i.addedNodes)n instanceof HTMLStyleElement&&e(n),n instanceof HTMLLinkElement&&t(n)})).observe(document.documentElement,{childList:!0,subtree:!0}),document.querySelectorAll("style").forEach((t=>e(t))),document.querySelectorAll("link").forEach((e=>t(e)))}();const e=CSS.supports;CSS.supports=t=>(t=t.replaceAll(/(animation-timeline|scroll-timeline(-(name|axis))?|view-timeline(-(name|axis|inset))?|timeline-scope)\s*:/g,"--supported-property:"),e(t)),window.addEventListener("animationstart",(e=>{e.target.getAnimations().filter((t=>t.animationName===e.animationName)).forEach((t=>{const n=Nt(t,t.animationName,e.target);if(n)if(!n.timeline||t instanceof wt)t.timeline=n.timeline;else{const e=new wt(t,n.timeline,n.animOptions);t.pause(),e.play()}}))}))}!function(){if(!At()){if(!Reflect.defineProperty(window,"ScrollTimeline",{value:ScrollTimeline}))throw Error("Error installing ScrollTimeline polyfill: could not attach ScrollTimeline to window");if(!Reflect.defineProperty(window,"ViewTimeline",{value:$e}))throw Error("Error installing ViewTimeline polyfill: could not attach ViewTimeline to window");if(!Reflect.defineProperty(Element.prototype,"animate",{value:xt}))throw Error("Error installing ScrollTimeline polyfill: could not attach WAAPI's animate to DOM Element");if(!Reflect.defineProperty(window,"Animation",{value:wt}))throw Error("Error installing Animation constructor.");if(!Reflect.defineProperty(Element.prototype,"getAnimations",{value:Ct}))throw Error("Error installing ScrollTimeline polyfill: could not attach WAAPI's getAnimations to DOM Element");if(!Reflect.defineProperty(document,"getAnimations",{value:Et}))throw Error("Error installing ScrollTimeline polyfill: could not attach WAAPI's getAnimations to document")}}()}(); 2 | //# sourceMappingURL=scroll-timeline.js.map 3 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | /* Default Vite styles removed. Add app-specific styles here if needed. */ 2 | -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Coverflow from './Coverflow'; 3 | import './App.css'; // Keep or remove based on styling needs 4 | 5 | function App() { 6 | return ( 7 |
8 |

React Coverflow

9 | 10 | {/* You can add other controls or content here if needed */} 11 |
12 | ); 13 | } 14 | 15 | export default App; 16 | -------------------------------------------------------------------------------- /src/Coverflow.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | import PropTypes from 'prop-types'; // Import PropTypes 3 | import './styles.css'; // Import the base styles 4 | 5 | function Coverflow({ dataUrl = '/albums.json' }) { // Accept dataUrl prop with default 6 | const [albums, setAlbums] = useState([]); 7 | const [error, setError] = useState(null); 8 | 9 | useEffect(() => { 10 | fetch(dataUrl) // Use the dataUrl prop 11 | .then(response => { 12 | if (!response.ok) { 13 | throw new Error(`HTTP error! status: ${response.status}`); 14 | } 15 | return response.json(); 16 | }) 17 | .then(data => { 18 | setAlbums(data); // Set state first 19 | 20 | // Prefetch images with low priority after setting state 21 | if (Array.isArray(data)) { 22 | data.forEach(album => { 23 | if (album.image_url) { 24 | fetch(album.image_url, { priority: 'low', cors: 'no-cors' }) // Use low priority for prefetch 25 | .then(res => { 26 | if (!res.ok) { 27 | console.warn(`Failed to prefetch image (status ${res.status}): ${album.image_url}`); 28 | } 29 | // We don't need the image body, just the request 30 | }) 31 | .catch(prefetchError => { 32 | console.warn(`Error prefetching image ${album.image_url}:`, prefetchError); 33 | }); 34 | } 35 | }); 36 | } 37 | }) 38 | .catch(error => { 39 | console.error('Error fetching albums:', error); 40 | setError(error.message); 41 | }); 42 | }, [dataUrl]); // Add dataUrl to dependency array 43 | 44 | // Basic click handler (can be expanded later) 45 | const handleCardClick = (url) => { 46 | // In a real app, you might use React Router or other navigation methods 47 | // For simplicity, we'll just log or use window.location for now 48 | console.log(`Navigating to: ${url}`); 49 | // window.location.href = url; // Uncomment if direct navigation is desired 50 | }; 51 | 52 | if (error) { 53 | return
Error loading albums: {error}
; 54 | } 55 | 56 | if (albums.length === 0) { 57 | return
Loading albums...
; 58 | } 59 | 60 | return ( 61 |
62 |
    63 | {albums.map((album, index) => ( 64 |
  • handleCardClick(album.some_url)} // Add URL if available in data */> 65 | {`${album.title} 72 | {/* Add title/artist info if needed */} 73 | {/*

    {album.title}

    */} 74 | {/*

    {album.artists}

    */} 75 |
  • 76 | ))} 77 |
78 |
79 | ); 80 | } 81 | 82 | // Add PropTypes for documentation and validation 83 | Coverflow.propTypes = { 84 | dataUrl: PropTypes.string, 85 | }; 86 | 87 | export default Coverflow; 88 | -------------------------------------------------------------------------------- /src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | /* Basic reset and font settings */ 2 | :root { 3 | font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; 4 | line-height: 1.5; 5 | font-weight: 400; 6 | 7 | font-synthesis: none; 8 | text-rendering: optimizeLegibility; 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | body { 14 | margin: 0; 15 | /* Removed display: flex, place-items: center, min-height */ 16 | } 17 | 18 | /* Remove other default styles like h1, button, a if they conflict */ 19 | /* Or ensure styles in styles.css have higher specificity */ 20 | -------------------------------------------------------------------------------- /src/main.jsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react' 2 | import { createRoot } from 'react-dom/client' 3 | import './index.css' 4 | import App from './App.jsx' 5 | 6 | createRoot(document.getElementById('root')).render( 7 | 8 | 9 | , 10 | ) 11 | -------------------------------------------------------------------------------- /src/styles.css: -------------------------------------------------------------------------------- 1 | @layer demo, meta; 2 | 3 | /* === META BOX STYLES (from original styles.css) === */ 4 | @layer meta { 5 | @layer metabox { 6 | #metabox { 7 | position: fixed; 8 | bottom: 1rem; 9 | right: 1rem; 10 | 11 | display: flex; 12 | flex-direction: column; 13 | gap: 1rem; 14 | font-size: 1.2rem; 15 | z-index: 2147483647; 16 | } 17 | 18 | /* Hide all but infobox when embedded */ 19 | .is-embed #metabox :is(#version-selector, #version-selector-popover, .button[href="/"]) { 20 | display: none; 21 | } 22 | 23 | #metabox :is(button, .button) { 24 | font-size: 2.5rem; 25 | line-height: 1; 26 | display: block; 27 | 28 | border: 0; 29 | background: transparent; 30 | padding: 0; 31 | cursor: pointer; 32 | 33 | opacity: 0.7; 34 | transition: opacity 0.25s ease-in-out; 35 | border-radius: 0.25rem; 36 | text-decoration: none; 37 | } 38 | 39 | #metabox :is(button, .button):active, 40 | #metabox :is(button, .button):focus { 41 | outline: 2px dashed rgb(0 0 0 / 0.5); 42 | outline-offset: 0.25rem; 43 | } 44 | 45 | #metabox > :is(button, .button):hover { 46 | opacity: 1 !important; 47 | } 48 | 49 | @keyframes pulsate { 50 | 80% { 51 | opacity: 1; 52 | } 53 | 85% { 54 | opacity: 1; 55 | } 56 | 90% { 57 | opacity: 0; 58 | } 59 | 95% { 60 | opacity: 1; 61 | } 62 | 100% { 63 | opacity: 0; 64 | } 65 | } 66 | 67 | #metabox > button.animated { 68 | animation: 5s pulsate ease-in alternate infinite; 69 | } 70 | 71 | #metabox > button.animated:hover, 72 | #metabox > button.animated:focus, 73 | #metabox:has(dialog[open]) > button.animated { 74 | animation: none; 75 | } 76 | 77 | #metabox > button[disabled] { 78 | cursor: not-allowed; 79 | outline: none !important; 80 | } 81 | } 82 | 83 | @layer infobox { 84 | @layer ui { 85 | #infobox[open] { 86 | box-sizing: border-box; 87 | margin: 10vh auto; 88 | width: 80vw; 89 | max-width: 90ch; 90 | max-height: 80vh; 91 | padding: 2rem; 92 | overscroll-behavior: contain; 93 | 94 | background: #eee; 95 | border: 0.25rem solid lightblue; 96 | overflow: auto; 97 | 98 | position: fixed; 99 | } 100 | 101 | #infobox::backdrop { 102 | background-color: rgb(0 0 0 / 0.5); 103 | } 104 | 105 | #infobox > :first-child { 106 | margin-top: 0; 107 | } 108 | #infobox > :last-child { 109 | margin-bottom: 0; 110 | } 111 | 112 | #infobox-close { 113 | /* Also inherits from `#metabox > button` */ 114 | position: absolute; 115 | right: 0.5rem; 116 | top: 0.5rem; 117 | 118 | filter: grayscale(); 119 | } 120 | #infobox-close:hover, 121 | #infobox-close:focus { 122 | filter: none; 123 | } 124 | } 125 | 126 | @layer code { 127 | #infobox pre { 128 | border: 1px solid #dedede; 129 | padding: 1em; 130 | background: #f7f7f7; 131 | font-family: "Monaspace", monospace; 132 | font-palette: --kung-fury; 133 | overflow-x: auto; 134 | border-left: 0.4em solid cornflowerblue; 135 | tab-size: 2; 136 | } 137 | 138 | #infobox code { 139 | font-family: "Monaspace", monospace; 140 | font-palette: --kung-fury; 141 | } 142 | 143 | #infobox code:not(pre code), 144 | #infobox output:not(code:has(output) output) { 145 | background: #f7f7f7; 146 | border: 1px solid rgb(0 0 0 / 0.2); 147 | padding: 0.1rem 0.3rem; 148 | margin: 0.1rem 0; 149 | border-radius: 0.2rem; 150 | display: inline-block; 151 | } 152 | } 153 | } 154 | 155 | @layer popover { 156 | [popovertarget][data-activeversion] { 157 | position: relative; 158 | } 159 | [popovertarget][data-activeversion]::after { 160 | content: attr(data-activeversion); 161 | position: absolute; 162 | bottom: 0; 163 | right: 0; 164 | z-index: 2; 165 | font-size: 0.8rem; 166 | font-weight: bold; 167 | padding: 0.1em; 168 | background-color: #1874bc; 169 | color: white; 170 | font-family: 'Courier New', Courier, monospace; 171 | font-variant-numeric: tabular-nums; 172 | display: block; 173 | min-width: 2ex; 174 | line-height: 1; 175 | } 176 | [popovertarget][data-activeversion][data-activelang="js"]::after { 177 | background-color: #f7df1e; 178 | color: #333; 179 | } 180 | [popovertarget] { 181 | anchor-name: --my-anchor-popover; 182 | } 183 | [popover] { 184 | inset: auto; 185 | width: auto; 186 | padding: 1rem 1rem 2rem 1rem; 187 | overflow: unset; 188 | bottom: calc(anchor(top) - 3rem); 189 | right: calc(anchor(right) + 3rem); 190 | } 191 | 192 | .no-anchor [popover] { 193 | min-width: 20rem; 194 | /* transform: translate(calc(-100% - 1rem), calc(-100% + 1rem)); */ 195 | z-index: 2147483647; 196 | bottom: 10rem; 197 | right: 4.5rem; 198 | } 199 | 200 | [popover] > :first-child { 201 | margin-top: 0; 202 | } 203 | [popover] > :last-child { 204 | margin-bottom: 0; 205 | } 206 | 207 | [popover] [data-lang]::before { 208 | content: attr(data-lang); 209 | font-size: 0.8rem; 210 | font-weight: bold; 211 | padding: 0.1em; 212 | background-color: blue; 213 | color: white; 214 | font-family: 'Courier New', Courier, monospace; 215 | font-variant-numeric: tabular-nums; 216 | background-color: #1874bc; 217 | display: inline-block; 218 | width: 2rem; 219 | text-align: center; 220 | vertical-align: middle; 221 | margin-right: 0.2rem; 222 | } 223 | [popover] [data-lang="js"]::before { 224 | background-color: #f7df1e; 225 | color: #333; 226 | } 227 | 228 | [popover] [data-selected] { 229 | font-weight: 700; 230 | } 231 | } 232 | 233 | @layer warning { 234 | .warning { 235 | box-sizing: border-box; 236 | padding: 1em; 237 | margin: 1em 0; 238 | border: 1px solid #ccc; 239 | background: rgba(255 255 205 / 0.8); 240 | } 241 | 242 | .warning > :first-child { 243 | margin-top: 0; 244 | } 245 | 246 | .warning > :last-child { 247 | margin-bottom: 0; 248 | } 249 | 250 | .warning a { 251 | color: blue; 252 | } 253 | .warning--info { 254 | border: 1px solid #123456; 255 | background: rgb(205 230 255 / 0.8); 256 | } 257 | .warning--alarm { 258 | border: 1px solid red; 259 | background: #ff000010; 260 | } 261 | 262 | @supports (animation-timeline: view()) { 263 | .warning:not([data-bug]) { 264 | display: none; 265 | } 266 | } 267 | 268 | @supports(animation-range: 0vh 90vh) { 269 | .warning[data-bug="1427062"] { 270 | display: none; 271 | } 272 | } 273 | } 274 | } 275 | 276 | /* === COVERFLOW STYLES (extracted from original index.html) === */ 277 | @layer demo.base, demo.components; 278 | 279 | :root { 280 | --cover-size: 200px; /* Define cover size */ 281 | } 282 | 283 | /* Basic layout for centering */ 284 | html, body { 285 | height: 100%; 286 | /* overflow: hidden; /* Might hide scrollbars needed for coverflow */ 287 | } 288 | body { 289 | display: grid; /* Use grid for centering */ 290 | place-items: center; 291 | background-color: #333; /* Example background */ 292 | color: white; 293 | margin: 16px; 294 | } 295 | 296 | @media (max-width: 768px) { 297 | body { 298 | place-items: initial; /* removes centering on mobile */ 299 | } 300 | } 301 | 302 | /* Animation that rotates the cover */ 303 | @keyframes rotate-cover { 304 | 0% { 305 | transform: translateX(-100%) rotateY(-45deg); 306 | } 307 | 35% { 308 | transform: translateX(0) rotateY(-45deg); 309 | } 310 | 50% { 311 | transform: rotateY(0deg) translateZ(calc(var(--cover-size) * 0.1)) scale(1.5); /* Adjust translateZ based on size */ 312 | } 313 | 65% { 314 | transform: translateX(0) rotateY(45deg); 315 | } 316 | 100% { 317 | transform: translateX(100%) rotateY(45deg); 318 | } 319 | } 320 | 321 | .cards-wrapper { 322 | perspective: calc(var(--cover-size) * 2); /* Adjust perspective based on size */ 323 | max-width: calc(var(--cover-size) * 6); /* Limit width */ 324 | overflow-x: scroll; /* Enable horizontal scrolling */ 325 | margin: 2rem auto; /* Center the wrapper */ 326 | padding: 2rem 0; /* Add padding for visual space */ 327 | } 328 | 329 | .cards { 330 | transform-style: preserve-3d; 331 | list-style: none; 332 | padding: 0 calc(var(--cover-size) * 2); /* Add padding so first/last items can center */ 333 | margin: 0; 334 | white-space: nowrap; /* Keep items in one line */ 335 | scroll-snap-type: x mandatory; /* Enable scroll snapping */ 336 | /* Ensure enough height for scaled items */ 337 | min-height: calc(var(--cover-size) * 1.6); 338 | position: relative; /* Needed for absolute positioning if used */ 339 | } 340 | 341 | .cards li { 342 | transform-style: preserve-3d; 343 | display: inline-block; /* Layout items horizontally */ 344 | width: var(--cover-size); 345 | aspect-ratio: 1; 346 | margin: 0 calc(var(--cover-size) * -0.1); /* Overlap items slightly */ 347 | scroll-snap-align: center; /* Snap items to center */ 348 | vertical-align: middle; /* Align items vertically */ 349 | position: relative; /* Needed for z-index or transform context */ 350 | } 351 | 352 | .cards li img { 353 | /* Apply the animation */ 354 | animation: linear rotate-cover both; 355 | animation-timeline: view(inline); /* Link to scroll position */ 356 | 357 | /* Initial state to prevent FOUC with polyfill */ 358 | transform: translateX(-100%) rotateY(-45deg); 359 | transform-style: preserve-3d; 360 | will-change: transform; 361 | 362 | /* Visual styles */ 363 | position: relative; 364 | user-select: none; 365 | display: block; /* Remove extra space below image */ 366 | width: 100%; 367 | height: auto; 368 | border-radius: 5px; /* Optional: rounded corners */ 369 | box-shadow: 0 4px 15px rgba(0,0,0,0.3); /* Optional: add shadow */ 370 | 371 | /* Reflection */ 372 | -webkit-box-reflect: below 0.5em linear-gradient(transparent, transparent 50%, rgba(0, 0, 0, 0.25)); 373 | } 374 | 375 | /* Optional: Alternative animation for main thread (controls not implemented yet) */ 376 | @keyframes rotate-cover--mt { 377 | 0% { 378 | transform: translateX(-100%) rotateY(-45deg); 379 | --force-mt: 1; 380 | } 381 | 35% { 382 | transform: translateX(0) rotateY(-45deg); 383 | } 384 | 50% { 385 | transform: rotateY(0deg) translateZ(calc(var(--cover-size) * 0.1)) scale(1.5); 386 | } 387 | 65% { 388 | transform: translateX(0) rotateY(45deg); 389 | } 390 | 100% { 391 | transform: translateX(100%) rotateY(45deg); 392 | --force-mt: 0; 393 | } 394 | } 395 | /* 396 | #controls:has(#force-main-thread:checked) ~ .cards li img { 397 | animation-name: rotate-cover--mt; 398 | } 399 | */ 400 | 401 | /* Hide controls if embedded (controls not implemented yet) */ 402 | /* 403 | .is-embed #controls { 404 | display: none; 405 | } 406 | */ 407 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vite.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | --------------------------------------------------------------------------------