├── .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 | 
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 |
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 |
--------------------------------------------------------------------------------