Statusphere example with ESAV Live
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

init

rimar1337 ff3fc469

+5927
+11
.cta.json
··· 1 + { 2 + "projectName": "statusphere-esav-live", 3 + "mode": "file-router", 4 + "typescript": true, 5 + "tailwind": false, 6 + "packageManager": "npm", 7 + "git": true, 8 + "version": 1, 9 + "framework": "react-cra", 10 + "chosenAddOns": [] 11 + }
+9
.gitignore
··· 1 + node_modules 2 + .DS_Store 3 + dist 4 + dist-ssr 5 + *.local 6 + count.txt 7 + .env 8 + .nitro 9 + .tanstack
+11
.vscode/settings.json
··· 1 + { 2 + "files.watcherExclude": { 3 + "**/routeTree.gen.ts": true 4 + }, 5 + "search.exclude": { 6 + "**/routeTree.gen.ts": true 7 + }, 8 + "files.readonlyInclude": { 9 + "**/routeTree.gen.ts": true 10 + } 11 + }
+290
README.md
··· 1 + Welcome to your new TanStack app! 2 + 3 + # Getting Started 4 + 5 + To run this application: 6 + 7 + ```bash 8 + npm install 9 + npm run start 10 + ``` 11 + 12 + # Building For Production 13 + 14 + To build this application for production: 15 + 16 + ```bash 17 + npm run build 18 + ``` 19 + 20 + ## Testing 21 + 22 + This project uses [Vitest](https://vitest.dev/) for testing. You can run the tests with: 23 + 24 + ```bash 25 + npm run test 26 + ``` 27 + 28 + ## Styling 29 + 30 + This project uses CSS for styling. 31 + 32 + 33 + 34 + 35 + ## Routing 36 + This project uses [TanStack Router](https://tanstack.com/router). The initial setup is a file based router. Which means that the routes are managed as files in `src/routes`. 37 + 38 + ### Adding A Route 39 + 40 + To add a new route to your application just add another a new file in the `./src/routes` directory. 41 + 42 + TanStack will automatically generate the content of the route file for you. 43 + 44 + Now that you have two routes you can use a `Link` component to navigate between them. 45 + 46 + ### Adding Links 47 + 48 + To use SPA (Single Page Application) navigation you will need to import the `Link` component from `@tanstack/react-router`. 49 + 50 + ```tsx 51 + import { Link } from "@tanstack/react-router"; 52 + ``` 53 + 54 + Then anywhere in your JSX you can use it like so: 55 + 56 + ```tsx 57 + <Link to="/about">About</Link> 58 + ``` 59 + 60 + This will create a link that will navigate to the `/about` route. 61 + 62 + More information on the `Link` component can be found in the [Link documentation](https://tanstack.com/router/v1/docs/framework/react/api/router/linkComponent). 63 + 64 + ### Using A Layout 65 + 66 + In the File Based Routing setup the layout is located in `src/routes/__root.tsx`. Anything you add to the root route will appear in all the routes. The route content will appear in the JSX where you use the `<Outlet />` component. 67 + 68 + Here is an example layout that includes a header: 69 + 70 + ```tsx 71 + import { Outlet, createRootRoute } from '@tanstack/react-router' 72 + import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' 73 + 74 + import { Link } from "@tanstack/react-router"; 75 + 76 + export const Route = createRootRoute({ 77 + component: () => ( 78 + <> 79 + <header> 80 + <nav> 81 + <Link to="/">Home</Link> 82 + <Link to="/about">About</Link> 83 + </nav> 84 + </header> 85 + <Outlet /> 86 + <TanStackRouterDevtools /> 87 + </> 88 + ), 89 + }) 90 + ``` 91 + 92 + The `<TanStackRouterDevtools />` component is not required so you can remove it if you don't want it in your layout. 93 + 94 + More information on layouts can be found in the [Layouts documentation](https://tanstack.com/router/latest/docs/framework/react/guide/routing-concepts#layouts). 95 + 96 + 97 + ## Data Fetching 98 + 99 + There are multiple ways to fetch data in your application. You can use TanStack Query to fetch data from a server. But you can also use the `loader` functionality built into TanStack Router to load the data for a route before it's rendered. 100 + 101 + For example: 102 + 103 + ```tsx 104 + const peopleRoute = createRoute({ 105 + getParentRoute: () => rootRoute, 106 + path: "/people", 107 + loader: async () => { 108 + const response = await fetch("https://swapi.dev/api/people"); 109 + return response.json() as Promise<{ 110 + results: { 111 + name: string; 112 + }[]; 113 + }>; 114 + }, 115 + component: () => { 116 + const data = peopleRoute.useLoaderData(); 117 + return ( 118 + <ul> 119 + {data.results.map((person) => ( 120 + <li key={person.name}>{person.name}</li> 121 + ))} 122 + </ul> 123 + ); 124 + }, 125 + }); 126 + ``` 127 + 128 + Loaders simplify your data fetching logic dramatically. Check out more information in the [Loader documentation](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#loader-parameters). 129 + 130 + ### React-Query 131 + 132 + React-Query is an excellent addition or alternative to route loading and integrating it into you application is a breeze. 133 + 134 + First add your dependencies: 135 + 136 + ```bash 137 + npm install @tanstack/react-query @tanstack/react-query-devtools 138 + ``` 139 + 140 + Next we'll need to create a query client and provider. We recommend putting those in `main.tsx`. 141 + 142 + ```tsx 143 + import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; 144 + 145 + // ... 146 + 147 + const queryClient = new QueryClient(); 148 + 149 + // ... 150 + 151 + if (!rootElement.innerHTML) { 152 + const root = ReactDOM.createRoot(rootElement); 153 + 154 + root.render( 155 + <QueryClientProvider client={queryClient}> 156 + <RouterProvider router={router} /> 157 + </QueryClientProvider> 158 + ); 159 + } 160 + ``` 161 + 162 + You can also add TanStack Query Devtools to the root route (optional). 163 + 164 + ```tsx 165 + import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; 166 + 167 + const rootRoute = createRootRoute({ 168 + component: () => ( 169 + <> 170 + <Outlet /> 171 + <ReactQueryDevtools buttonPosition="top-right" /> 172 + <TanStackRouterDevtools /> 173 + </> 174 + ), 175 + }); 176 + ``` 177 + 178 + Now you can use `useQuery` to fetch your data. 179 + 180 + ```tsx 181 + import { useQuery } from "@tanstack/react-query"; 182 + 183 + import "./App.css"; 184 + 185 + function App() { 186 + const { data } = useQuery({ 187 + queryKey: ["people"], 188 + queryFn: () => 189 + fetch("https://swapi.dev/api/people") 190 + .then((res) => res.json()) 191 + .then((data) => data.results as { name: string }[]), 192 + initialData: [], 193 + }); 194 + 195 + return ( 196 + <div> 197 + <ul> 198 + {data.map((person) => ( 199 + <li key={person.name}>{person.name}</li> 200 + ))} 201 + </ul> 202 + </div> 203 + ); 204 + } 205 + 206 + export default App; 207 + ``` 208 + 209 + You can find out everything you need to know on how to use React-Query in the [React-Query documentation](https://tanstack.com/query/latest/docs/framework/react/overview). 210 + 211 + ## State Management 212 + 213 + Another common requirement for React applications is state management. There are many options for state management in React. TanStack Store provides a great starting point for your project. 214 + 215 + First you need to add TanStack Store as a dependency: 216 + 217 + ```bash 218 + npm install @tanstack/store 219 + ``` 220 + 221 + Now let's create a simple counter in the `src/App.tsx` file as a demonstration. 222 + 223 + ```tsx 224 + import { useStore } from "@tanstack/react-store"; 225 + import { Store } from "@tanstack/store"; 226 + import "./App.css"; 227 + 228 + const countStore = new Store(0); 229 + 230 + function App() { 231 + const count = useStore(countStore); 232 + return ( 233 + <div> 234 + <button onClick={() => countStore.setState((n) => n + 1)}> 235 + Increment - {count} 236 + </button> 237 + </div> 238 + ); 239 + } 240 + 241 + export default App; 242 + ``` 243 + 244 + One of the many nice features of TanStack Store is the ability to derive state from other state. That derived state will update when the base state updates. 245 + 246 + Let's check this out by doubling the count using derived state. 247 + 248 + ```tsx 249 + import { useStore } from "@tanstack/react-store"; 250 + import { Store, Derived } from "@tanstack/store"; 251 + import "./App.css"; 252 + 253 + const countStore = new Store(0); 254 + 255 + const doubledStore = new Derived({ 256 + fn: () => countStore.state * 2, 257 + deps: [countStore], 258 + }); 259 + doubledStore.mount(); 260 + 261 + function App() { 262 + const count = useStore(countStore); 263 + const doubledCount = useStore(doubledStore); 264 + 265 + return ( 266 + <div> 267 + <button onClick={() => countStore.setState((n) => n + 1)}> 268 + Increment - {count} 269 + </button> 270 + <div>Doubled - {doubledCount}</div> 271 + </div> 272 + ); 273 + } 274 + 275 + export default App; 276 + ``` 277 + 278 + We use the `Derived` class to create a new store that is derived from another store. The `Derived` class has a `mount` method that will start the derived store updating. 279 + 280 + Once we've created the derived store we can use it in the `App` component just like we would any other store using the `useStore` hook. 281 + 282 + You can find out everything you need to know on how to use TanStack Store in the [TanStack Store documentation](https://tanstack.com/store/latest). 283 + 284 + # Demo files 285 + 286 + Files prefixed with `demo` can be safely deleted. They are there to provide a starting point for you to play around with the features you've installed. 287 + 288 + # Learn More 289 + 290 + You can learn more about all of the offerings from TanStack in the [TanStack documentation](https://tanstack.com).
+20
index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 + <link rel="icon" href="/favicon.ico" /> 7 + <meta name="theme-color" content="#000000" /> 8 + <meta 9 + name="description" 10 + content="Web site created using create-tsrouter-app" 11 + /> 12 + <link rel="apple-touch-icon" href="/logo192.png" /> 13 + <link rel="manifest" href="/manifest.json" /> 14 + <title>Statusphere ESAV Live</title> 15 + </head> 16 + <body> 17 + <div id="app"></div> 18 + <script type="module" src="/src/main.tsx"></script> 19 + </body> 20 + </html>
+3919
package-lock.json
··· 1 + { 2 + "name": "statusphere-esav-live", 3 + "lockfileVersion": 3, 4 + "requires": true, 5 + "packages": { 6 + "": { 7 + "name": "statusphere-esav-live", 8 + "dependencies": { 9 + "@atproto/api": "^0.16.2", 10 + "@tanstack/query-db-collection": "^0.2.0", 11 + "@tanstack/react-db": "^0.1.1", 12 + "@tanstack/react-router": "^1.130.2", 13 + "@tanstack/react-router-devtools": "^1.130.2", 14 + "@tanstack/router-plugin": "^1.121.2", 15 + "jotai": "^2.13.0", 16 + "react": "^19.0.0", 17 + "react-dom": "^19.0.0" 18 + }, 19 + "devDependencies": { 20 + "@testing-library/dom": "^10.4.0", 21 + "@testing-library/react": "^16.2.0", 22 + "@types/react": "^19.0.8", 23 + "@types/react-dom": "^19.0.3", 24 + "@vitejs/plugin-react": "^4.3.4", 25 + "jsdom": "^26.0.0", 26 + "typescript": "^5.7.2", 27 + "vite": "^6.3.5", 28 + "vitest": "^3.0.5", 29 + "web-vitals": "^4.2.4" 30 + } 31 + }, 32 + "node_modules/@ampproject/remapping": { 33 + "version": "2.3.0", 34 + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 35 + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 36 + "license": "Apache-2.0", 37 + "dependencies": { 38 + "@jridgewell/gen-mapping": "^0.3.5", 39 + "@jridgewell/trace-mapping": "^0.3.24" 40 + }, 41 + "engines": { 42 + "node": ">=6.0.0" 43 + } 44 + }, 45 + "node_modules/@asamuzakjp/css-color": { 46 + "version": "3.2.0", 47 + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", 48 + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", 49 + "dev": true, 50 + "license": "MIT", 51 + "dependencies": { 52 + "@csstools/css-calc": "^2.1.3", 53 + "@csstools/css-color-parser": "^3.0.9", 54 + "@csstools/css-parser-algorithms": "^3.0.4", 55 + "@csstools/css-tokenizer": "^3.0.3", 56 + "lru-cache": "^10.4.3" 57 + } 58 + }, 59 + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { 60 + "version": "10.4.3", 61 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 62 + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 63 + "dev": true, 64 + "license": "ISC" 65 + }, 66 + "node_modules/@atproto/api": { 67 + "version": "0.16.2", 68 + "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.16.2.tgz", 69 + "integrity": "sha512-sSTg31J8ws8DNaoiizp+/uJideRxRaJsq+Nyl8rnSxGw0w3oCvoeRU19iRWh2t0jZEmiRJAGkveGu23NKmPYEQ==", 70 + "license": "MIT", 71 + "dependencies": { 72 + "@atproto/common-web": "^0.4.2", 73 + "@atproto/lexicon": "^0.4.12", 74 + "@atproto/syntax": "^0.4.0", 75 + "@atproto/xrpc": "^0.7.1", 76 + "await-lock": "^2.2.2", 77 + "multiformats": "^9.9.0", 78 + "tlds": "^1.234.0", 79 + "zod": "^3.23.8" 80 + } 81 + }, 82 + "node_modules/@atproto/common-web": { 83 + "version": "0.4.2", 84 + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.2.tgz", 85 + "integrity": "sha512-vrXwGNoFGogodjQvJDxAeP3QbGtawgZute2ed1XdRO0wMixLk3qewtikZm06H259QDJVu6voKC5mubml+WgQUw==", 86 + "license": "MIT", 87 + "dependencies": { 88 + "graphemer": "^1.4.0", 89 + "multiformats": "^9.9.0", 90 + "uint8arrays": "3.0.0", 91 + "zod": "^3.23.8" 92 + } 93 + }, 94 + "node_modules/@atproto/lexicon": { 95 + "version": "0.4.12", 96 + "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.12.tgz", 97 + "integrity": "sha512-fcEvEQ1GpQYF5igZ4IZjPWEoWVpsEF22L9RexxLS3ptfySXLflEyH384e7HITzO/73McDeaJx3lqHIuqn9ulnw==", 98 + "license": "MIT", 99 + "dependencies": { 100 + "@atproto/common-web": "^0.4.2", 101 + "@atproto/syntax": "^0.4.0", 102 + "iso-datestring-validator": "^2.2.2", 103 + "multiformats": "^9.9.0", 104 + "zod": "^3.23.8" 105 + } 106 + }, 107 + "node_modules/@atproto/syntax": { 108 + "version": "0.4.0", 109 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.0.tgz", 110 + "integrity": "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA==", 111 + "license": "MIT" 112 + }, 113 + "node_modules/@atproto/xrpc": { 114 + "version": "0.7.1", 115 + "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.1.tgz", 116 + "integrity": "sha512-ANHEzlskYlMEdH18m+Itp3a8d0pEJao2qoDybDoMupTnoeNkya4VKIaOgAi6ERQnqatBBZyn9asW+7rJmSt/8g==", 117 + "license": "MIT", 118 + "dependencies": { 119 + "@atproto/lexicon": "^0.4.12", 120 + "zod": "^3.23.8" 121 + } 122 + }, 123 + "node_modules/@babel/code-frame": { 124 + "version": "7.27.1", 125 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", 126 + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 127 + "license": "MIT", 128 + "dependencies": { 129 + "@babel/helper-validator-identifier": "^7.27.1", 130 + "js-tokens": "^4.0.0", 131 + "picocolors": "^1.1.1" 132 + }, 133 + "engines": { 134 + "node": ">=6.9.0" 135 + } 136 + }, 137 + "node_modules/@babel/compat-data": { 138 + "version": "7.28.0", 139 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", 140 + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", 141 + "license": "MIT", 142 + "engines": { 143 + "node": ">=6.9.0" 144 + } 145 + }, 146 + "node_modules/@babel/core": { 147 + "version": "7.28.0", 148 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", 149 + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", 150 + "license": "MIT", 151 + "dependencies": { 152 + "@ampproject/remapping": "^2.2.0", 153 + "@babel/code-frame": "^7.27.1", 154 + "@babel/generator": "^7.28.0", 155 + "@babel/helper-compilation-targets": "^7.27.2", 156 + "@babel/helper-module-transforms": "^7.27.3", 157 + "@babel/helpers": "^7.27.6", 158 + "@babel/parser": "^7.28.0", 159 + "@babel/template": "^7.27.2", 160 + "@babel/traverse": "^7.28.0", 161 + "@babel/types": "^7.28.0", 162 + "convert-source-map": "^2.0.0", 163 + "debug": "^4.1.0", 164 + "gensync": "^1.0.0-beta.2", 165 + "json5": "^2.2.3", 166 + "semver": "^6.3.1" 167 + }, 168 + "engines": { 169 + "node": ">=6.9.0" 170 + }, 171 + "funding": { 172 + "type": "opencollective", 173 + "url": "https://opencollective.com/babel" 174 + } 175 + }, 176 + "node_modules/@babel/generator": { 177 + "version": "7.28.0", 178 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", 179 + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", 180 + "license": "MIT", 181 + "dependencies": { 182 + "@babel/parser": "^7.28.0", 183 + "@babel/types": "^7.28.0", 184 + "@jridgewell/gen-mapping": "^0.3.12", 185 + "@jridgewell/trace-mapping": "^0.3.28", 186 + "jsesc": "^3.0.2" 187 + }, 188 + "engines": { 189 + "node": ">=6.9.0" 190 + } 191 + }, 192 + "node_modules/@babel/helper-annotate-as-pure": { 193 + "version": "7.27.3", 194 + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", 195 + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", 196 + "license": "MIT", 197 + "dependencies": { 198 + "@babel/types": "^7.27.3" 199 + }, 200 + "engines": { 201 + "node": ">=6.9.0" 202 + } 203 + }, 204 + "node_modules/@babel/helper-compilation-targets": { 205 + "version": "7.27.2", 206 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", 207 + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", 208 + "license": "MIT", 209 + "dependencies": { 210 + "@babel/compat-data": "^7.27.2", 211 + "@babel/helper-validator-option": "^7.27.1", 212 + "browserslist": "^4.24.0", 213 + "lru-cache": "^5.1.1", 214 + "semver": "^6.3.1" 215 + }, 216 + "engines": { 217 + "node": ">=6.9.0" 218 + } 219 + }, 220 + "node_modules/@babel/helper-create-class-features-plugin": { 221 + "version": "7.27.1", 222 + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", 223 + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", 224 + "license": "MIT", 225 + "dependencies": { 226 + "@babel/helper-annotate-as-pure": "^7.27.1", 227 + "@babel/helper-member-expression-to-functions": "^7.27.1", 228 + "@babel/helper-optimise-call-expression": "^7.27.1", 229 + "@babel/helper-replace-supers": "^7.27.1", 230 + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", 231 + "@babel/traverse": "^7.27.1", 232 + "semver": "^6.3.1" 233 + }, 234 + "engines": { 235 + "node": ">=6.9.0" 236 + }, 237 + "peerDependencies": { 238 + "@babel/core": "^7.0.0" 239 + } 240 + }, 241 + "node_modules/@babel/helper-globals": { 242 + "version": "7.28.0", 243 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", 244 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", 245 + "license": "MIT", 246 + "engines": { 247 + "node": ">=6.9.0" 248 + } 249 + }, 250 + "node_modules/@babel/helper-member-expression-to-functions": { 251 + "version": "7.27.1", 252 + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", 253 + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", 254 + "license": "MIT", 255 + "dependencies": { 256 + "@babel/traverse": "^7.27.1", 257 + "@babel/types": "^7.27.1" 258 + }, 259 + "engines": { 260 + "node": ">=6.9.0" 261 + } 262 + }, 263 + "node_modules/@babel/helper-module-imports": { 264 + "version": "7.27.1", 265 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", 266 + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", 267 + "license": "MIT", 268 + "dependencies": { 269 + "@babel/traverse": "^7.27.1", 270 + "@babel/types": "^7.27.1" 271 + }, 272 + "engines": { 273 + "node": ">=6.9.0" 274 + } 275 + }, 276 + "node_modules/@babel/helper-module-transforms": { 277 + "version": "7.27.3", 278 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", 279 + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", 280 + "license": "MIT", 281 + "dependencies": { 282 + "@babel/helper-module-imports": "^7.27.1", 283 + "@babel/helper-validator-identifier": "^7.27.1", 284 + "@babel/traverse": "^7.27.3" 285 + }, 286 + "engines": { 287 + "node": ">=6.9.0" 288 + }, 289 + "peerDependencies": { 290 + "@babel/core": "^7.0.0" 291 + } 292 + }, 293 + "node_modules/@babel/helper-optimise-call-expression": { 294 + "version": "7.27.1", 295 + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", 296 + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", 297 + "license": "MIT", 298 + "dependencies": { 299 + "@babel/types": "^7.27.1" 300 + }, 301 + "engines": { 302 + "node": ">=6.9.0" 303 + } 304 + }, 305 + "node_modules/@babel/helper-plugin-utils": { 306 + "version": "7.27.1", 307 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", 308 + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", 309 + "license": "MIT", 310 + "engines": { 311 + "node": ">=6.9.0" 312 + } 313 + }, 314 + "node_modules/@babel/helper-replace-supers": { 315 + "version": "7.27.1", 316 + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", 317 + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", 318 + "license": "MIT", 319 + "dependencies": { 320 + "@babel/helper-member-expression-to-functions": "^7.27.1", 321 + "@babel/helper-optimise-call-expression": "^7.27.1", 322 + "@babel/traverse": "^7.27.1" 323 + }, 324 + "engines": { 325 + "node": ">=6.9.0" 326 + }, 327 + "peerDependencies": { 328 + "@babel/core": "^7.0.0" 329 + } 330 + }, 331 + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { 332 + "version": "7.27.1", 333 + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", 334 + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", 335 + "license": "MIT", 336 + "dependencies": { 337 + "@babel/traverse": "^7.27.1", 338 + "@babel/types": "^7.27.1" 339 + }, 340 + "engines": { 341 + "node": ">=6.9.0" 342 + } 343 + }, 344 + "node_modules/@babel/helper-string-parser": { 345 + "version": "7.27.1", 346 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 347 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 348 + "license": "MIT", 349 + "engines": { 350 + "node": ">=6.9.0" 351 + } 352 + }, 353 + "node_modules/@babel/helper-validator-identifier": { 354 + "version": "7.27.1", 355 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", 356 + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", 357 + "license": "MIT", 358 + "engines": { 359 + "node": ">=6.9.0" 360 + } 361 + }, 362 + "node_modules/@babel/helper-validator-option": { 363 + "version": "7.27.1", 364 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 365 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 366 + "license": "MIT", 367 + "engines": { 368 + "node": ">=6.9.0" 369 + } 370 + }, 371 + "node_modules/@babel/helpers": { 372 + "version": "7.28.2", 373 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", 374 + "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", 375 + "license": "MIT", 376 + "dependencies": { 377 + "@babel/template": "^7.27.2", 378 + "@babel/types": "^7.28.2" 379 + }, 380 + "engines": { 381 + "node": ">=6.9.0" 382 + } 383 + }, 384 + "node_modules/@babel/parser": { 385 + "version": "7.28.0", 386 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", 387 + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", 388 + "license": "MIT", 389 + "dependencies": { 390 + "@babel/types": "^7.28.0" 391 + }, 392 + "bin": { 393 + "parser": "bin/babel-parser.js" 394 + }, 395 + "engines": { 396 + "node": ">=6.0.0" 397 + } 398 + }, 399 + "node_modules/@babel/plugin-syntax-jsx": { 400 + "version": "7.27.1", 401 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", 402 + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", 403 + "license": "MIT", 404 + "dependencies": { 405 + "@babel/helper-plugin-utils": "^7.27.1" 406 + }, 407 + "engines": { 408 + "node": ">=6.9.0" 409 + }, 410 + "peerDependencies": { 411 + "@babel/core": "^7.0.0-0" 412 + } 413 + }, 414 + "node_modules/@babel/plugin-syntax-typescript": { 415 + "version": "7.27.1", 416 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", 417 + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", 418 + "license": "MIT", 419 + "dependencies": { 420 + "@babel/helper-plugin-utils": "^7.27.1" 421 + }, 422 + "engines": { 423 + "node": ">=6.9.0" 424 + }, 425 + "peerDependencies": { 426 + "@babel/core": "^7.0.0-0" 427 + } 428 + }, 429 + "node_modules/@babel/plugin-transform-modules-commonjs": { 430 + "version": "7.27.1", 431 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", 432 + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", 433 + "license": "MIT", 434 + "dependencies": { 435 + "@babel/helper-module-transforms": "^7.27.1", 436 + "@babel/helper-plugin-utils": "^7.27.1" 437 + }, 438 + "engines": { 439 + "node": ">=6.9.0" 440 + }, 441 + "peerDependencies": { 442 + "@babel/core": "^7.0.0-0" 443 + } 444 + }, 445 + "node_modules/@babel/plugin-transform-react-jsx-self": { 446 + "version": "7.27.1", 447 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", 448 + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", 449 + "dev": true, 450 + "license": "MIT", 451 + "dependencies": { 452 + "@babel/helper-plugin-utils": "^7.27.1" 453 + }, 454 + "engines": { 455 + "node": ">=6.9.0" 456 + }, 457 + "peerDependencies": { 458 + "@babel/core": "^7.0.0-0" 459 + } 460 + }, 461 + "node_modules/@babel/plugin-transform-react-jsx-source": { 462 + "version": "7.27.1", 463 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", 464 + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", 465 + "dev": true, 466 + "license": "MIT", 467 + "dependencies": { 468 + "@babel/helper-plugin-utils": "^7.27.1" 469 + }, 470 + "engines": { 471 + "node": ">=6.9.0" 472 + }, 473 + "peerDependencies": { 474 + "@babel/core": "^7.0.0-0" 475 + } 476 + }, 477 + "node_modules/@babel/plugin-transform-typescript": { 478 + "version": "7.28.0", 479 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", 480 + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", 481 + "license": "MIT", 482 + "dependencies": { 483 + "@babel/helper-annotate-as-pure": "^7.27.3", 484 + "@babel/helper-create-class-features-plugin": "^7.27.1", 485 + "@babel/helper-plugin-utils": "^7.27.1", 486 + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", 487 + "@babel/plugin-syntax-typescript": "^7.27.1" 488 + }, 489 + "engines": { 490 + "node": ">=6.9.0" 491 + }, 492 + "peerDependencies": { 493 + "@babel/core": "^7.0.0-0" 494 + } 495 + }, 496 + "node_modules/@babel/preset-typescript": { 497 + "version": "7.27.1", 498 + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", 499 + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", 500 + "license": "MIT", 501 + "dependencies": { 502 + "@babel/helper-plugin-utils": "^7.27.1", 503 + "@babel/helper-validator-option": "^7.27.1", 504 + "@babel/plugin-syntax-jsx": "^7.27.1", 505 + "@babel/plugin-transform-modules-commonjs": "^7.27.1", 506 + "@babel/plugin-transform-typescript": "^7.27.1" 507 + }, 508 + "engines": { 509 + "node": ">=6.9.0" 510 + }, 511 + "peerDependencies": { 512 + "@babel/core": "^7.0.0-0" 513 + } 514 + }, 515 + "node_modules/@babel/runtime": { 516 + "version": "7.28.2", 517 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", 518 + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", 519 + "dev": true, 520 + "license": "MIT", 521 + "engines": { 522 + "node": ">=6.9.0" 523 + } 524 + }, 525 + "node_modules/@babel/template": { 526 + "version": "7.27.2", 527 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", 528 + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", 529 + "license": "MIT", 530 + "dependencies": { 531 + "@babel/code-frame": "^7.27.1", 532 + "@babel/parser": "^7.27.2", 533 + "@babel/types": "^7.27.1" 534 + }, 535 + "engines": { 536 + "node": ">=6.9.0" 537 + } 538 + }, 539 + "node_modules/@babel/traverse": { 540 + "version": "7.28.0", 541 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", 542 + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", 543 + "license": "MIT", 544 + "dependencies": { 545 + "@babel/code-frame": "^7.27.1", 546 + "@babel/generator": "^7.28.0", 547 + "@babel/helper-globals": "^7.28.0", 548 + "@babel/parser": "^7.28.0", 549 + "@babel/template": "^7.27.2", 550 + "@babel/types": "^7.28.0", 551 + "debug": "^4.3.1" 552 + }, 553 + "engines": { 554 + "node": ">=6.9.0" 555 + } 556 + }, 557 + "node_modules/@babel/types": { 558 + "version": "7.28.2", 559 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", 560 + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", 561 + "license": "MIT", 562 + "dependencies": { 563 + "@babel/helper-string-parser": "^7.27.1", 564 + "@babel/helper-validator-identifier": "^7.27.1" 565 + }, 566 + "engines": { 567 + "node": ">=6.9.0" 568 + } 569 + }, 570 + "node_modules/@csstools/color-helpers": { 571 + "version": "5.0.2", 572 + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", 573 + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", 574 + "dev": true, 575 + "funding": [ 576 + { 577 + "type": "github", 578 + "url": "https://github.com/sponsors/csstools" 579 + }, 580 + { 581 + "type": "opencollective", 582 + "url": "https://opencollective.com/csstools" 583 + } 584 + ], 585 + "license": "MIT-0", 586 + "engines": { 587 + "node": ">=18" 588 + } 589 + }, 590 + "node_modules/@csstools/css-calc": { 591 + "version": "2.1.4", 592 + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", 593 + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", 594 + "dev": true, 595 + "funding": [ 596 + { 597 + "type": "github", 598 + "url": "https://github.com/sponsors/csstools" 599 + }, 600 + { 601 + "type": "opencollective", 602 + "url": "https://opencollective.com/csstools" 603 + } 604 + ], 605 + "license": "MIT", 606 + "engines": { 607 + "node": ">=18" 608 + }, 609 + "peerDependencies": { 610 + "@csstools/css-parser-algorithms": "^3.0.5", 611 + "@csstools/css-tokenizer": "^3.0.4" 612 + } 613 + }, 614 + "node_modules/@csstools/css-color-parser": { 615 + "version": "3.0.10", 616 + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", 617 + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", 618 + "dev": true, 619 + "funding": [ 620 + { 621 + "type": "github", 622 + "url": "https://github.com/sponsors/csstools" 623 + }, 624 + { 625 + "type": "opencollective", 626 + "url": "https://opencollective.com/csstools" 627 + } 628 + ], 629 + "license": "MIT", 630 + "dependencies": { 631 + "@csstools/color-helpers": "^5.0.2", 632 + "@csstools/css-calc": "^2.1.4" 633 + }, 634 + "engines": { 635 + "node": ">=18" 636 + }, 637 + "peerDependencies": { 638 + "@csstools/css-parser-algorithms": "^3.0.5", 639 + "@csstools/css-tokenizer": "^3.0.4" 640 + } 641 + }, 642 + "node_modules/@csstools/css-parser-algorithms": { 643 + "version": "3.0.5", 644 + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", 645 + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", 646 + "dev": true, 647 + "funding": [ 648 + { 649 + "type": "github", 650 + "url": "https://github.com/sponsors/csstools" 651 + }, 652 + { 653 + "type": "opencollective", 654 + "url": "https://opencollective.com/csstools" 655 + } 656 + ], 657 + "license": "MIT", 658 + "engines": { 659 + "node": ">=18" 660 + }, 661 + "peerDependencies": { 662 + "@csstools/css-tokenizer": "^3.0.4" 663 + } 664 + }, 665 + "node_modules/@csstools/css-tokenizer": { 666 + "version": "3.0.4", 667 + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", 668 + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", 669 + "dev": true, 670 + "funding": [ 671 + { 672 + "type": "github", 673 + "url": "https://github.com/sponsors/csstools" 674 + }, 675 + { 676 + "type": "opencollective", 677 + "url": "https://opencollective.com/csstools" 678 + } 679 + ], 680 + "license": "MIT", 681 + "engines": { 682 + "node": ">=18" 683 + } 684 + }, 685 + "node_modules/@esbuild/aix-ppc64": { 686 + "version": "0.25.8", 687 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", 688 + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", 689 + "cpu": [ 690 + "ppc64" 691 + ], 692 + "license": "MIT", 693 + "optional": true, 694 + "os": [ 695 + "aix" 696 + ], 697 + "engines": { 698 + "node": ">=18" 699 + } 700 + }, 701 + "node_modules/@esbuild/android-arm": { 702 + "version": "0.25.8", 703 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", 704 + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", 705 + "cpu": [ 706 + "arm" 707 + ], 708 + "license": "MIT", 709 + "optional": true, 710 + "os": [ 711 + "android" 712 + ], 713 + "engines": { 714 + "node": ">=18" 715 + } 716 + }, 717 + "node_modules/@esbuild/android-arm64": { 718 + "version": "0.25.8", 719 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", 720 + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", 721 + "cpu": [ 722 + "arm64" 723 + ], 724 + "license": "MIT", 725 + "optional": true, 726 + "os": [ 727 + "android" 728 + ], 729 + "engines": { 730 + "node": ">=18" 731 + } 732 + }, 733 + "node_modules/@esbuild/android-x64": { 734 + "version": "0.25.8", 735 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", 736 + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", 737 + "cpu": [ 738 + "x64" 739 + ], 740 + "license": "MIT", 741 + "optional": true, 742 + "os": [ 743 + "android" 744 + ], 745 + "engines": { 746 + "node": ">=18" 747 + } 748 + }, 749 + "node_modules/@esbuild/darwin-arm64": { 750 + "version": "0.25.8", 751 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", 752 + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", 753 + "cpu": [ 754 + "arm64" 755 + ], 756 + "license": "MIT", 757 + "optional": true, 758 + "os": [ 759 + "darwin" 760 + ], 761 + "engines": { 762 + "node": ">=18" 763 + } 764 + }, 765 + "node_modules/@esbuild/darwin-x64": { 766 + "version": "0.25.8", 767 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", 768 + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", 769 + "cpu": [ 770 + "x64" 771 + ], 772 + "license": "MIT", 773 + "optional": true, 774 + "os": [ 775 + "darwin" 776 + ], 777 + "engines": { 778 + "node": ">=18" 779 + } 780 + }, 781 + "node_modules/@esbuild/freebsd-arm64": { 782 + "version": "0.25.8", 783 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", 784 + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", 785 + "cpu": [ 786 + "arm64" 787 + ], 788 + "license": "MIT", 789 + "optional": true, 790 + "os": [ 791 + "freebsd" 792 + ], 793 + "engines": { 794 + "node": ">=18" 795 + } 796 + }, 797 + "node_modules/@esbuild/freebsd-x64": { 798 + "version": "0.25.8", 799 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", 800 + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", 801 + "cpu": [ 802 + "x64" 803 + ], 804 + "license": "MIT", 805 + "optional": true, 806 + "os": [ 807 + "freebsd" 808 + ], 809 + "engines": { 810 + "node": ">=18" 811 + } 812 + }, 813 + "node_modules/@esbuild/linux-arm": { 814 + "version": "0.25.8", 815 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", 816 + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", 817 + "cpu": [ 818 + "arm" 819 + ], 820 + "license": "MIT", 821 + "optional": true, 822 + "os": [ 823 + "linux" 824 + ], 825 + "engines": { 826 + "node": ">=18" 827 + } 828 + }, 829 + "node_modules/@esbuild/linux-arm64": { 830 + "version": "0.25.8", 831 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", 832 + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", 833 + "cpu": [ 834 + "arm64" 835 + ], 836 + "license": "MIT", 837 + "optional": true, 838 + "os": [ 839 + "linux" 840 + ], 841 + "engines": { 842 + "node": ">=18" 843 + } 844 + }, 845 + "node_modules/@esbuild/linux-ia32": { 846 + "version": "0.25.8", 847 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", 848 + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", 849 + "cpu": [ 850 + "ia32" 851 + ], 852 + "license": "MIT", 853 + "optional": true, 854 + "os": [ 855 + "linux" 856 + ], 857 + "engines": { 858 + "node": ">=18" 859 + } 860 + }, 861 + "node_modules/@esbuild/linux-loong64": { 862 + "version": "0.25.8", 863 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", 864 + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", 865 + "cpu": [ 866 + "loong64" 867 + ], 868 + "license": "MIT", 869 + "optional": true, 870 + "os": [ 871 + "linux" 872 + ], 873 + "engines": { 874 + "node": ">=18" 875 + } 876 + }, 877 + "node_modules/@esbuild/linux-mips64el": { 878 + "version": "0.25.8", 879 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", 880 + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", 881 + "cpu": [ 882 + "mips64el" 883 + ], 884 + "license": "MIT", 885 + "optional": true, 886 + "os": [ 887 + "linux" 888 + ], 889 + "engines": { 890 + "node": ">=18" 891 + } 892 + }, 893 + "node_modules/@esbuild/linux-ppc64": { 894 + "version": "0.25.8", 895 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", 896 + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", 897 + "cpu": [ 898 + "ppc64" 899 + ], 900 + "license": "MIT", 901 + "optional": true, 902 + "os": [ 903 + "linux" 904 + ], 905 + "engines": { 906 + "node": ">=18" 907 + } 908 + }, 909 + "node_modules/@esbuild/linux-riscv64": { 910 + "version": "0.25.8", 911 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", 912 + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", 913 + "cpu": [ 914 + "riscv64" 915 + ], 916 + "license": "MIT", 917 + "optional": true, 918 + "os": [ 919 + "linux" 920 + ], 921 + "engines": { 922 + "node": ">=18" 923 + } 924 + }, 925 + "node_modules/@esbuild/linux-s390x": { 926 + "version": "0.25.8", 927 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", 928 + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", 929 + "cpu": [ 930 + "s390x" 931 + ], 932 + "license": "MIT", 933 + "optional": true, 934 + "os": [ 935 + "linux" 936 + ], 937 + "engines": { 938 + "node": ">=18" 939 + } 940 + }, 941 + "node_modules/@esbuild/linux-x64": { 942 + "version": "0.25.8", 943 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", 944 + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", 945 + "cpu": [ 946 + "x64" 947 + ], 948 + "license": "MIT", 949 + "optional": true, 950 + "os": [ 951 + "linux" 952 + ], 953 + "engines": { 954 + "node": ">=18" 955 + } 956 + }, 957 + "node_modules/@esbuild/netbsd-arm64": { 958 + "version": "0.25.8", 959 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", 960 + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", 961 + "cpu": [ 962 + "arm64" 963 + ], 964 + "license": "MIT", 965 + "optional": true, 966 + "os": [ 967 + "netbsd" 968 + ], 969 + "engines": { 970 + "node": ">=18" 971 + } 972 + }, 973 + "node_modules/@esbuild/netbsd-x64": { 974 + "version": "0.25.8", 975 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", 976 + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", 977 + "cpu": [ 978 + "x64" 979 + ], 980 + "license": "MIT", 981 + "optional": true, 982 + "os": [ 983 + "netbsd" 984 + ], 985 + "engines": { 986 + "node": ">=18" 987 + } 988 + }, 989 + "node_modules/@esbuild/openbsd-arm64": { 990 + "version": "0.25.8", 991 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", 992 + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", 993 + "cpu": [ 994 + "arm64" 995 + ], 996 + "license": "MIT", 997 + "optional": true, 998 + "os": [ 999 + "openbsd" 1000 + ], 1001 + "engines": { 1002 + "node": ">=18" 1003 + } 1004 + }, 1005 + "node_modules/@esbuild/openbsd-x64": { 1006 + "version": "0.25.8", 1007 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", 1008 + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", 1009 + "cpu": [ 1010 + "x64" 1011 + ], 1012 + "license": "MIT", 1013 + "optional": true, 1014 + "os": [ 1015 + "openbsd" 1016 + ], 1017 + "engines": { 1018 + "node": ">=18" 1019 + } 1020 + }, 1021 + "node_modules/@esbuild/openharmony-arm64": { 1022 + "version": "0.25.8", 1023 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", 1024 + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", 1025 + "cpu": [ 1026 + "arm64" 1027 + ], 1028 + "license": "MIT", 1029 + "optional": true, 1030 + "os": [ 1031 + "openharmony" 1032 + ], 1033 + "engines": { 1034 + "node": ">=18" 1035 + } 1036 + }, 1037 + "node_modules/@esbuild/sunos-x64": { 1038 + "version": "0.25.8", 1039 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", 1040 + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", 1041 + "cpu": [ 1042 + "x64" 1043 + ], 1044 + "license": "MIT", 1045 + "optional": true, 1046 + "os": [ 1047 + "sunos" 1048 + ], 1049 + "engines": { 1050 + "node": ">=18" 1051 + } 1052 + }, 1053 + "node_modules/@esbuild/win32-arm64": { 1054 + "version": "0.25.8", 1055 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", 1056 + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", 1057 + "cpu": [ 1058 + "arm64" 1059 + ], 1060 + "license": "MIT", 1061 + "optional": true, 1062 + "os": [ 1063 + "win32" 1064 + ], 1065 + "engines": { 1066 + "node": ">=18" 1067 + } 1068 + }, 1069 + "node_modules/@esbuild/win32-ia32": { 1070 + "version": "0.25.8", 1071 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", 1072 + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", 1073 + "cpu": [ 1074 + "ia32" 1075 + ], 1076 + "license": "MIT", 1077 + "optional": true, 1078 + "os": [ 1079 + "win32" 1080 + ], 1081 + "engines": { 1082 + "node": ">=18" 1083 + } 1084 + }, 1085 + "node_modules/@esbuild/win32-x64": { 1086 + "version": "0.25.8", 1087 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", 1088 + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", 1089 + "cpu": [ 1090 + "x64" 1091 + ], 1092 + "license": "MIT", 1093 + "optional": true, 1094 + "os": [ 1095 + "win32" 1096 + ], 1097 + "engines": { 1098 + "node": ">=18" 1099 + } 1100 + }, 1101 + "node_modules/@jridgewell/gen-mapping": { 1102 + "version": "0.3.12", 1103 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", 1104 + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", 1105 + "license": "MIT", 1106 + "dependencies": { 1107 + "@jridgewell/sourcemap-codec": "^1.5.0", 1108 + "@jridgewell/trace-mapping": "^0.3.24" 1109 + } 1110 + }, 1111 + "node_modules/@jridgewell/resolve-uri": { 1112 + "version": "3.1.2", 1113 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1114 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1115 + "license": "MIT", 1116 + "engines": { 1117 + "node": ">=6.0.0" 1118 + } 1119 + }, 1120 + "node_modules/@jridgewell/sourcemap-codec": { 1121 + "version": "1.5.4", 1122 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", 1123 + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", 1124 + "license": "MIT" 1125 + }, 1126 + "node_modules/@jridgewell/trace-mapping": { 1127 + "version": "0.3.29", 1128 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", 1129 + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", 1130 + "license": "MIT", 1131 + "dependencies": { 1132 + "@jridgewell/resolve-uri": "^3.1.0", 1133 + "@jridgewell/sourcemap-codec": "^1.4.14" 1134 + } 1135 + }, 1136 + "node_modules/@rolldown/pluginutils": { 1137 + "version": "1.0.0-beta.27", 1138 + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", 1139 + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", 1140 + "dev": true, 1141 + "license": "MIT" 1142 + }, 1143 + "node_modules/@rollup/rollup-android-arm-eabi": { 1144 + "version": "4.46.2", 1145 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", 1146 + "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", 1147 + "cpu": [ 1148 + "arm" 1149 + ], 1150 + "dev": true, 1151 + "license": "MIT", 1152 + "optional": true, 1153 + "os": [ 1154 + "android" 1155 + ] 1156 + }, 1157 + "node_modules/@rollup/rollup-android-arm64": { 1158 + "version": "4.46.2", 1159 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", 1160 + "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", 1161 + "cpu": [ 1162 + "arm64" 1163 + ], 1164 + "dev": true, 1165 + "license": "MIT", 1166 + "optional": true, 1167 + "os": [ 1168 + "android" 1169 + ] 1170 + }, 1171 + "node_modules/@rollup/rollup-darwin-arm64": { 1172 + "version": "4.46.2", 1173 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", 1174 + "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", 1175 + "cpu": [ 1176 + "arm64" 1177 + ], 1178 + "dev": true, 1179 + "license": "MIT", 1180 + "optional": true, 1181 + "os": [ 1182 + "darwin" 1183 + ] 1184 + }, 1185 + "node_modules/@rollup/rollup-darwin-x64": { 1186 + "version": "4.46.2", 1187 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", 1188 + "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", 1189 + "cpu": [ 1190 + "x64" 1191 + ], 1192 + "dev": true, 1193 + "license": "MIT", 1194 + "optional": true, 1195 + "os": [ 1196 + "darwin" 1197 + ] 1198 + }, 1199 + "node_modules/@rollup/rollup-freebsd-arm64": { 1200 + "version": "4.46.2", 1201 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", 1202 + "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", 1203 + "cpu": [ 1204 + "arm64" 1205 + ], 1206 + "dev": true, 1207 + "license": "MIT", 1208 + "optional": true, 1209 + "os": [ 1210 + "freebsd" 1211 + ] 1212 + }, 1213 + "node_modules/@rollup/rollup-freebsd-x64": { 1214 + "version": "4.46.2", 1215 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", 1216 + "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", 1217 + "cpu": [ 1218 + "x64" 1219 + ], 1220 + "dev": true, 1221 + "license": "MIT", 1222 + "optional": true, 1223 + "os": [ 1224 + "freebsd" 1225 + ] 1226 + }, 1227 + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1228 + "version": "4.46.2", 1229 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", 1230 + "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", 1231 + "cpu": [ 1232 + "arm" 1233 + ], 1234 + "dev": true, 1235 + "license": "MIT", 1236 + "optional": true, 1237 + "os": [ 1238 + "linux" 1239 + ] 1240 + }, 1241 + "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1242 + "version": "4.46.2", 1243 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", 1244 + "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", 1245 + "cpu": [ 1246 + "arm" 1247 + ], 1248 + "dev": true, 1249 + "license": "MIT", 1250 + "optional": true, 1251 + "os": [ 1252 + "linux" 1253 + ] 1254 + }, 1255 + "node_modules/@rollup/rollup-linux-arm64-gnu": { 1256 + "version": "4.46.2", 1257 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", 1258 + "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", 1259 + "cpu": [ 1260 + "arm64" 1261 + ], 1262 + "dev": true, 1263 + "license": "MIT", 1264 + "optional": true, 1265 + "os": [ 1266 + "linux" 1267 + ] 1268 + }, 1269 + "node_modules/@rollup/rollup-linux-arm64-musl": { 1270 + "version": "4.46.2", 1271 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", 1272 + "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", 1273 + "cpu": [ 1274 + "arm64" 1275 + ], 1276 + "dev": true, 1277 + "license": "MIT", 1278 + "optional": true, 1279 + "os": [ 1280 + "linux" 1281 + ] 1282 + }, 1283 + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1284 + "version": "4.46.2", 1285 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", 1286 + "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", 1287 + "cpu": [ 1288 + "loong64" 1289 + ], 1290 + "dev": true, 1291 + "license": "MIT", 1292 + "optional": true, 1293 + "os": [ 1294 + "linux" 1295 + ] 1296 + }, 1297 + "node_modules/@rollup/rollup-linux-ppc64-gnu": { 1298 + "version": "4.46.2", 1299 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", 1300 + "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", 1301 + "cpu": [ 1302 + "ppc64" 1303 + ], 1304 + "dev": true, 1305 + "license": "MIT", 1306 + "optional": true, 1307 + "os": [ 1308 + "linux" 1309 + ] 1310 + }, 1311 + "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1312 + "version": "4.46.2", 1313 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", 1314 + "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", 1315 + "cpu": [ 1316 + "riscv64" 1317 + ], 1318 + "dev": true, 1319 + "license": "MIT", 1320 + "optional": true, 1321 + "os": [ 1322 + "linux" 1323 + ] 1324 + }, 1325 + "node_modules/@rollup/rollup-linux-riscv64-musl": { 1326 + "version": "4.46.2", 1327 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", 1328 + "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", 1329 + "cpu": [ 1330 + "riscv64" 1331 + ], 1332 + "dev": true, 1333 + "license": "MIT", 1334 + "optional": true, 1335 + "os": [ 1336 + "linux" 1337 + ] 1338 + }, 1339 + "node_modules/@rollup/rollup-linux-s390x-gnu": { 1340 + "version": "4.46.2", 1341 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", 1342 + "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", 1343 + "cpu": [ 1344 + "s390x" 1345 + ], 1346 + "dev": true, 1347 + "license": "MIT", 1348 + "optional": true, 1349 + "os": [ 1350 + "linux" 1351 + ] 1352 + }, 1353 + "node_modules/@rollup/rollup-linux-x64-gnu": { 1354 + "version": "4.46.2", 1355 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", 1356 + "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", 1357 + "cpu": [ 1358 + "x64" 1359 + ], 1360 + "dev": true, 1361 + "license": "MIT", 1362 + "optional": true, 1363 + "os": [ 1364 + "linux" 1365 + ] 1366 + }, 1367 + "node_modules/@rollup/rollup-linux-x64-musl": { 1368 + "version": "4.46.2", 1369 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", 1370 + "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", 1371 + "cpu": [ 1372 + "x64" 1373 + ], 1374 + "dev": true, 1375 + "license": "MIT", 1376 + "optional": true, 1377 + "os": [ 1378 + "linux" 1379 + ] 1380 + }, 1381 + "node_modules/@rollup/rollup-win32-arm64-msvc": { 1382 + "version": "4.46.2", 1383 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", 1384 + "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", 1385 + "cpu": [ 1386 + "arm64" 1387 + ], 1388 + "dev": true, 1389 + "license": "MIT", 1390 + "optional": true, 1391 + "os": [ 1392 + "win32" 1393 + ] 1394 + }, 1395 + "node_modules/@rollup/rollup-win32-ia32-msvc": { 1396 + "version": "4.46.2", 1397 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", 1398 + "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", 1399 + "cpu": [ 1400 + "ia32" 1401 + ], 1402 + "dev": true, 1403 + "license": "MIT", 1404 + "optional": true, 1405 + "os": [ 1406 + "win32" 1407 + ] 1408 + }, 1409 + "node_modules/@rollup/rollup-win32-x64-msvc": { 1410 + "version": "4.46.2", 1411 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", 1412 + "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", 1413 + "cpu": [ 1414 + "x64" 1415 + ], 1416 + "dev": true, 1417 + "license": "MIT", 1418 + "optional": true, 1419 + "os": [ 1420 + "win32" 1421 + ] 1422 + }, 1423 + "node_modules/@standard-schema/spec": { 1424 + "version": "1.0.0", 1425 + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", 1426 + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", 1427 + "license": "MIT" 1428 + }, 1429 + "node_modules/@tanstack/db": { 1430 + "version": "0.1.1", 1431 + "resolved": "https://registry.npmjs.org/@tanstack/db/-/db-0.1.1.tgz", 1432 + "integrity": "sha512-WEaNEXspJrVQVjbeHFI2dIbtPINqaMCFDqFYhxwm6Ok8wS8SZ5grxbzMdZavvMapxrwdEHk3po2igEEfnTT6VQ==", 1433 + "license": "MIT", 1434 + "dependencies": { 1435 + "@standard-schema/spec": "^1.0.0", 1436 + "@tanstack/db-ivm": "0.1.0" 1437 + }, 1438 + "peerDependencies": { 1439 + "typescript": ">=4.7" 1440 + } 1441 + }, 1442 + "node_modules/@tanstack/db-ivm": { 1443 + "version": "0.1.0", 1444 + "resolved": "https://registry.npmjs.org/@tanstack/db-ivm/-/db-ivm-0.1.0.tgz", 1445 + "integrity": "sha512-eL55yH6fvs97nSEeDFUP3+UmQxIDobLvKN0N/k3D0liP8lsNDbDog8SXoD8aCK47RxYaXWGt1yX9mSI7UI357A==", 1446 + "license": "MIT", 1447 + "dependencies": { 1448 + "fractional-indexing": "^3.2.0", 1449 + "murmurhash-js": "^1.0.0", 1450 + "sorted-btree": "^1.8.1" 1451 + }, 1452 + "peerDependencies": { 1453 + "typescript": ">=4.7" 1454 + } 1455 + }, 1456 + "node_modules/@tanstack/history": { 1457 + "version": "1.130.12", 1458 + "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.130.12.tgz", 1459 + "integrity": "sha512-2VO1nNFDWojgZ7Uqv/OJfH6LphZQ1kE6l8sI3YBgSPtj3qN6I/rsoTHW9rGjwiDO8sQoDRXod2hpH6HMs5NDsw==", 1460 + "license": "MIT", 1461 + "engines": { 1462 + "node": ">=12" 1463 + }, 1464 + "funding": { 1465 + "type": "github", 1466 + "url": "https://github.com/sponsors/tannerlinsley" 1467 + } 1468 + }, 1469 + "node_modules/@tanstack/query-core": { 1470 + "version": "5.83.1", 1471 + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.83.1.tgz", 1472 + "integrity": "sha512-OG69LQgT7jSp+5pPuCfzltq/+7l2xoweggjme9vlbCPa/d7D7zaqv5vN/S82SzSYZ4EDLTxNO1PWrv49RAS64Q==", 1473 + "license": "MIT", 1474 + "peer": true, 1475 + "funding": { 1476 + "type": "github", 1477 + "url": "https://github.com/sponsors/tannerlinsley" 1478 + } 1479 + }, 1480 + "node_modules/@tanstack/query-db-collection": { 1481 + "version": "0.2.0", 1482 + "resolved": "https://registry.npmjs.org/@tanstack/query-db-collection/-/query-db-collection-0.2.0.tgz", 1483 + "integrity": "sha512-45x9vX1nr3hC1SWfWEh00hIQEK9rydu8Fb7kGDobzshCHwJaWj0Cc9fBy9bpL7R/xaGu3pdTkzCsjolUcKxo3g==", 1484 + "license": "MIT", 1485 + "dependencies": { 1486 + "@tanstack/db": "0.1.1" 1487 + }, 1488 + "peerDependencies": { 1489 + "@tanstack/query-core": "^5.0.0", 1490 + "typescript": ">=4.7" 1491 + } 1492 + }, 1493 + "node_modules/@tanstack/react-db": { 1494 + "version": "0.1.1", 1495 + "resolved": "https://registry.npmjs.org/@tanstack/react-db/-/react-db-0.1.1.tgz", 1496 + "integrity": "sha512-W1aw3q9oyIBkW/FzlaNtyP1+Xq4xVsjWJgN3rQfAA6XjGw6VhnF9jERrXbq7dC79egY+ZnOPvWlJSxuEzTI9Lw==", 1497 + "license": "MIT", 1498 + "dependencies": { 1499 + "@tanstack/db": "0.1.1", 1500 + "use-sync-external-store": "^1.2.0" 1501 + }, 1502 + "peerDependencies": { 1503 + "react": ">=16.8.0" 1504 + } 1505 + }, 1506 + "node_modules/@tanstack/react-router": { 1507 + "version": "1.130.12", 1508 + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.130.12.tgz", 1509 + "integrity": "sha512-7BYgOpGc1vK8MH1LIFLLBudGpH46GQy+hewnP7dNQJ4KHmkwPHv958L1IMA9jU/rs5g1ZH5n1f33BAMOBXUMYQ==", 1510 + "license": "MIT", 1511 + "dependencies": { 1512 + "@tanstack/history": "1.130.12", 1513 + "@tanstack/react-store": "^0.7.0", 1514 + "@tanstack/router-core": "1.130.12", 1515 + "isbot": "^5.1.22", 1516 + "tiny-invariant": "^1.3.3", 1517 + "tiny-warning": "^1.0.3" 1518 + }, 1519 + "engines": { 1520 + "node": ">=12" 1521 + }, 1522 + "funding": { 1523 + "type": "github", 1524 + "url": "https://github.com/sponsors/tannerlinsley" 1525 + }, 1526 + "peerDependencies": { 1527 + "react": ">=18.0.0 || >=19.0.0", 1528 + "react-dom": ">=18.0.0 || >=19.0.0" 1529 + } 1530 + }, 1531 + "node_modules/@tanstack/react-router-devtools": { 1532 + "version": "1.130.13", 1533 + "resolved": "https://registry.npmjs.org/@tanstack/react-router-devtools/-/react-router-devtools-1.130.13.tgz", 1534 + "integrity": "sha512-cY+jYxEP4/WNDgFFlI5/1u2U9zY9zHmJDoNxCF3NiaSgtAIVHdCKRGvfG6oRl6EposNGtn+JJhQkMkfAyoN9lQ==", 1535 + "license": "MIT", 1536 + "dependencies": { 1537 + "@tanstack/router-devtools-core": "1.130.13" 1538 + }, 1539 + "engines": { 1540 + "node": ">=12" 1541 + }, 1542 + "funding": { 1543 + "type": "github", 1544 + "url": "https://github.com/sponsors/tannerlinsley" 1545 + }, 1546 + "peerDependencies": { 1547 + "@tanstack/react-router": "^1.130.12", 1548 + "react": ">=18.0.0 || >=19.0.0", 1549 + "react-dom": ">=18.0.0 || >=19.0.0" 1550 + } 1551 + }, 1552 + "node_modules/@tanstack/react-store": { 1553 + "version": "0.7.3", 1554 + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.7.3.tgz", 1555 + "integrity": "sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==", 1556 + "license": "MIT", 1557 + "dependencies": { 1558 + "@tanstack/store": "0.7.2", 1559 + "use-sync-external-store": "^1.5.0" 1560 + }, 1561 + "funding": { 1562 + "type": "github", 1563 + "url": "https://github.com/sponsors/tannerlinsley" 1564 + }, 1565 + "peerDependencies": { 1566 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 1567 + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 1568 + } 1569 + }, 1570 + "node_modules/@tanstack/router-core": { 1571 + "version": "1.130.12", 1572 + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.130.12.tgz", 1573 + "integrity": "sha512-emq3cRU9Na1hnIToojzkfJcOZm/MG2bv9M+Kr/elUxEf83enGEwQXC1EKezTuwNgeJrOv8vPJdEhWM7IQodnHQ==", 1574 + "license": "MIT", 1575 + "dependencies": { 1576 + "@tanstack/history": "1.130.12", 1577 + "@tanstack/store": "^0.7.0", 1578 + "cookie-es": "^1.2.2", 1579 + "seroval": "^1.3.2", 1580 + "seroval-plugins": "^1.3.2", 1581 + "tiny-invariant": "^1.3.3", 1582 + "tiny-warning": "^1.0.3" 1583 + }, 1584 + "engines": { 1585 + "node": ">=12" 1586 + }, 1587 + "funding": { 1588 + "type": "github", 1589 + "url": "https://github.com/sponsors/tannerlinsley" 1590 + } 1591 + }, 1592 + "node_modules/@tanstack/router-devtools-core": { 1593 + "version": "1.130.13", 1594 + "resolved": "https://registry.npmjs.org/@tanstack/router-devtools-core/-/router-devtools-core-1.130.13.tgz", 1595 + "integrity": "sha512-Fn8lwnc5zvyllaDQNY6qTSTtKZsEY4mlZlJVTmC2/vvY1susXUA0NQPmpBquJYQAHJGzqPX83h/yKb7hzBSH3g==", 1596 + "license": "MIT", 1597 + "dependencies": { 1598 + "clsx": "^2.1.1", 1599 + "goober": "^2.1.16", 1600 + "solid-js": "^1.9.5" 1601 + }, 1602 + "engines": { 1603 + "node": ">=12" 1604 + }, 1605 + "funding": { 1606 + "type": "github", 1607 + "url": "https://github.com/sponsors/tannerlinsley" 1608 + }, 1609 + "peerDependencies": { 1610 + "@tanstack/router-core": "^1.130.12", 1611 + "csstype": "^3.0.10", 1612 + "solid-js": ">=1.9.5", 1613 + "tiny-invariant": "^1.3.3" 1614 + }, 1615 + "peerDependenciesMeta": { 1616 + "csstype": { 1617 + "optional": true 1618 + } 1619 + } 1620 + }, 1621 + "node_modules/@tanstack/router-generator": { 1622 + "version": "1.130.15", 1623 + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.130.15.tgz", 1624 + "integrity": "sha512-2TICfuSN8oYydTHd+nATkKV4B37XRrAWrwK9+g5dPVUP9lhLy7FQy3IVcb1HRXFXvW0zr5zPNxXErTrOmrceyA==", 1625 + "license": "MIT", 1626 + "dependencies": { 1627 + "@tanstack/router-core": "1.130.12", 1628 + "@tanstack/router-utils": "1.130.12", 1629 + "@tanstack/virtual-file-routes": "1.129.7", 1630 + "prettier": "^3.5.0", 1631 + "recast": "^0.23.11", 1632 + "source-map": "^0.7.4", 1633 + "tsx": "^4.19.2", 1634 + "zod": "^3.24.2" 1635 + }, 1636 + "engines": { 1637 + "node": ">=12" 1638 + }, 1639 + "funding": { 1640 + "type": "github", 1641 + "url": "https://github.com/sponsors/tannerlinsley" 1642 + } 1643 + }, 1644 + "node_modules/@tanstack/router-plugin": { 1645 + "version": "1.130.15", 1646 + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.130.15.tgz", 1647 + "integrity": "sha512-ovYGN0a5CxIPkVdbJPLAqwlE0eUYhHm0PkPCH0TxR24XpEGaCxAOw92DriLRZj9R4xTg5oeJqM+3wiZJfujx/A==", 1648 + "license": "MIT", 1649 + "dependencies": { 1650 + "@babel/core": "^7.27.7", 1651 + "@babel/plugin-syntax-jsx": "^7.27.1", 1652 + "@babel/plugin-syntax-typescript": "^7.27.1", 1653 + "@babel/template": "^7.27.2", 1654 + "@babel/traverse": "^7.27.7", 1655 + "@babel/types": "^7.27.7", 1656 + "@tanstack/router-core": "1.130.12", 1657 + "@tanstack/router-generator": "1.130.15", 1658 + "@tanstack/router-utils": "1.130.12", 1659 + "@tanstack/virtual-file-routes": "1.129.7", 1660 + "babel-dead-code-elimination": "^1.0.10", 1661 + "chokidar": "^3.6.0", 1662 + "unplugin": "^2.1.2", 1663 + "zod": "^3.24.2" 1664 + }, 1665 + "engines": { 1666 + "node": ">=12" 1667 + }, 1668 + "funding": { 1669 + "type": "github", 1670 + "url": "https://github.com/sponsors/tannerlinsley" 1671 + }, 1672 + "peerDependencies": { 1673 + "@rsbuild/core": ">=1.0.2", 1674 + "@tanstack/react-router": "^1.130.12", 1675 + "vite": ">=5.0.0 || >=6.0.0", 1676 + "vite-plugin-solid": "^2.11.2", 1677 + "webpack": ">=5.92.0" 1678 + }, 1679 + "peerDependenciesMeta": { 1680 + "@rsbuild/core": { 1681 + "optional": true 1682 + }, 1683 + "@tanstack/react-router": { 1684 + "optional": true 1685 + }, 1686 + "vite": { 1687 + "optional": true 1688 + }, 1689 + "vite-plugin-solid": { 1690 + "optional": true 1691 + }, 1692 + "webpack": { 1693 + "optional": true 1694 + } 1695 + } 1696 + }, 1697 + "node_modules/@tanstack/router-utils": { 1698 + "version": "1.130.12", 1699 + "resolved": "https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.130.12.tgz", 1700 + "integrity": "sha512-vyk7qduNrVrJWgUXHqRyZrFLOL9YJ/4ycN5PbJ2cLRBln01NkG/abKTHi32V31yMehxkxAO0EoicicvalnV0FA==", 1701 + "license": "MIT", 1702 + "dependencies": { 1703 + "@babel/core": "^7.27.4", 1704 + "@babel/generator": "^7.27.5", 1705 + "@babel/parser": "^7.27.5", 1706 + "@babel/preset-typescript": "^7.27.1", 1707 + "ansis": "^4.1.0", 1708 + "diff": "^8.0.2" 1709 + }, 1710 + "engines": { 1711 + "node": ">=12" 1712 + }, 1713 + "funding": { 1714 + "type": "github", 1715 + "url": "https://github.com/sponsors/tannerlinsley" 1716 + } 1717 + }, 1718 + "node_modules/@tanstack/store": { 1719 + "version": "0.7.2", 1720 + "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.7.2.tgz", 1721 + "integrity": "sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==", 1722 + "license": "MIT", 1723 + "funding": { 1724 + "type": "github", 1725 + "url": "https://github.com/sponsors/tannerlinsley" 1726 + } 1727 + }, 1728 + "node_modules/@tanstack/virtual-file-routes": { 1729 + "version": "1.129.7", 1730 + "resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.129.7.tgz", 1731 + "integrity": "sha512-a+MxoAXG+Sq94Jp67OtveKOp2vQq75AWdVI8DRt6w19B0NEqpfm784FTLbVp/qdR1wmxCOmKAvElGSIiBOx5OQ==", 1732 + "license": "MIT", 1733 + "engines": { 1734 + "node": ">=12" 1735 + }, 1736 + "funding": { 1737 + "type": "github", 1738 + "url": "https://github.com/sponsors/tannerlinsley" 1739 + } 1740 + }, 1741 + "node_modules/@testing-library/dom": { 1742 + "version": "10.4.1", 1743 + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", 1744 + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", 1745 + "dev": true, 1746 + "license": "MIT", 1747 + "dependencies": { 1748 + "@babel/code-frame": "^7.10.4", 1749 + "@babel/runtime": "^7.12.5", 1750 + "@types/aria-query": "^5.0.1", 1751 + "aria-query": "5.3.0", 1752 + "dom-accessibility-api": "^0.5.9", 1753 + "lz-string": "^1.5.0", 1754 + "picocolors": "1.1.1", 1755 + "pretty-format": "^27.0.2" 1756 + }, 1757 + "engines": { 1758 + "node": ">=18" 1759 + } 1760 + }, 1761 + "node_modules/@testing-library/react": { 1762 + "version": "16.3.0", 1763 + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", 1764 + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", 1765 + "dev": true, 1766 + "license": "MIT", 1767 + "dependencies": { 1768 + "@babel/runtime": "^7.12.5" 1769 + }, 1770 + "engines": { 1771 + "node": ">=18" 1772 + }, 1773 + "peerDependencies": { 1774 + "@testing-library/dom": "^10.0.0", 1775 + "@types/react": "^18.0.0 || ^19.0.0", 1776 + "@types/react-dom": "^18.0.0 || ^19.0.0", 1777 + "react": "^18.0.0 || ^19.0.0", 1778 + "react-dom": "^18.0.0 || ^19.0.0" 1779 + }, 1780 + "peerDependenciesMeta": { 1781 + "@types/react": { 1782 + "optional": true 1783 + }, 1784 + "@types/react-dom": { 1785 + "optional": true 1786 + } 1787 + } 1788 + }, 1789 + "node_modules/@types/aria-query": { 1790 + "version": "5.0.4", 1791 + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", 1792 + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", 1793 + "dev": true, 1794 + "license": "MIT" 1795 + }, 1796 + "node_modules/@types/babel__core": { 1797 + "version": "7.20.5", 1798 + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 1799 + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 1800 + "dev": true, 1801 + "license": "MIT", 1802 + "dependencies": { 1803 + "@babel/parser": "^7.20.7", 1804 + "@babel/types": "^7.20.7", 1805 + "@types/babel__generator": "*", 1806 + "@types/babel__template": "*", 1807 + "@types/babel__traverse": "*" 1808 + } 1809 + }, 1810 + "node_modules/@types/babel__generator": { 1811 + "version": "7.27.0", 1812 + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", 1813 + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", 1814 + "dev": true, 1815 + "license": "MIT", 1816 + "dependencies": { 1817 + "@babel/types": "^7.0.0" 1818 + } 1819 + }, 1820 + "node_modules/@types/babel__template": { 1821 + "version": "7.4.4", 1822 + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 1823 + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 1824 + "dev": true, 1825 + "license": "MIT", 1826 + "dependencies": { 1827 + "@babel/parser": "^7.1.0", 1828 + "@babel/types": "^7.0.0" 1829 + } 1830 + }, 1831 + "node_modules/@types/babel__traverse": { 1832 + "version": "7.28.0", 1833 + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", 1834 + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", 1835 + "dev": true, 1836 + "license": "MIT", 1837 + "dependencies": { 1838 + "@babel/types": "^7.28.2" 1839 + } 1840 + }, 1841 + "node_modules/@types/chai": { 1842 + "version": "5.2.2", 1843 + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", 1844 + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", 1845 + "dev": true, 1846 + "license": "MIT", 1847 + "dependencies": { 1848 + "@types/deep-eql": "*" 1849 + } 1850 + }, 1851 + "node_modules/@types/deep-eql": { 1852 + "version": "4.0.2", 1853 + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", 1854 + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", 1855 + "dev": true, 1856 + "license": "MIT" 1857 + }, 1858 + "node_modules/@types/estree": { 1859 + "version": "1.0.8", 1860 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 1861 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 1862 + "devOptional": true, 1863 + "license": "MIT" 1864 + }, 1865 + "node_modules/@types/react": { 1866 + "version": "19.1.9", 1867 + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz", 1868 + "integrity": "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==", 1869 + "devOptional": true, 1870 + "license": "MIT", 1871 + "dependencies": { 1872 + "csstype": "^3.0.2" 1873 + } 1874 + }, 1875 + "node_modules/@types/react-dom": { 1876 + "version": "19.1.7", 1877 + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", 1878 + "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", 1879 + "dev": true, 1880 + "license": "MIT", 1881 + "peerDependencies": { 1882 + "@types/react": "^19.0.0" 1883 + } 1884 + }, 1885 + "node_modules/@vitejs/plugin-react": { 1886 + "version": "4.7.0", 1887 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", 1888 + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", 1889 + "dev": true, 1890 + "license": "MIT", 1891 + "dependencies": { 1892 + "@babel/core": "^7.28.0", 1893 + "@babel/plugin-transform-react-jsx-self": "^7.27.1", 1894 + "@babel/plugin-transform-react-jsx-source": "^7.27.1", 1895 + "@rolldown/pluginutils": "1.0.0-beta.27", 1896 + "@types/babel__core": "^7.20.5", 1897 + "react-refresh": "^0.17.0" 1898 + }, 1899 + "engines": { 1900 + "node": "^14.18.0 || >=16.0.0" 1901 + }, 1902 + "peerDependencies": { 1903 + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" 1904 + } 1905 + }, 1906 + "node_modules/@vitest/expect": { 1907 + "version": "3.2.4", 1908 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", 1909 + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", 1910 + "dev": true, 1911 + "license": "MIT", 1912 + "dependencies": { 1913 + "@types/chai": "^5.2.2", 1914 + "@vitest/spy": "3.2.4", 1915 + "@vitest/utils": "3.2.4", 1916 + "chai": "^5.2.0", 1917 + "tinyrainbow": "^2.0.0" 1918 + }, 1919 + "funding": { 1920 + "url": "https://opencollective.com/vitest" 1921 + } 1922 + }, 1923 + "node_modules/@vitest/mocker": { 1924 + "version": "3.2.4", 1925 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", 1926 + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", 1927 + "dev": true, 1928 + "license": "MIT", 1929 + "dependencies": { 1930 + "@vitest/spy": "3.2.4", 1931 + "estree-walker": "^3.0.3", 1932 + "magic-string": "^0.30.17" 1933 + }, 1934 + "funding": { 1935 + "url": "https://opencollective.com/vitest" 1936 + }, 1937 + "peerDependencies": { 1938 + "msw": "^2.4.9", 1939 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" 1940 + }, 1941 + "peerDependenciesMeta": { 1942 + "msw": { 1943 + "optional": true 1944 + }, 1945 + "vite": { 1946 + "optional": true 1947 + } 1948 + } 1949 + }, 1950 + "node_modules/@vitest/pretty-format": { 1951 + "version": "3.2.4", 1952 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", 1953 + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", 1954 + "dev": true, 1955 + "license": "MIT", 1956 + "dependencies": { 1957 + "tinyrainbow": "^2.0.0" 1958 + }, 1959 + "funding": { 1960 + "url": "https://opencollective.com/vitest" 1961 + } 1962 + }, 1963 + "node_modules/@vitest/runner": { 1964 + "version": "3.2.4", 1965 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", 1966 + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", 1967 + "dev": true, 1968 + "license": "MIT", 1969 + "dependencies": { 1970 + "@vitest/utils": "3.2.4", 1971 + "pathe": "^2.0.3", 1972 + "strip-literal": "^3.0.0" 1973 + }, 1974 + "funding": { 1975 + "url": "https://opencollective.com/vitest" 1976 + } 1977 + }, 1978 + "node_modules/@vitest/snapshot": { 1979 + "version": "3.2.4", 1980 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", 1981 + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", 1982 + "dev": true, 1983 + "license": "MIT", 1984 + "dependencies": { 1985 + "@vitest/pretty-format": "3.2.4", 1986 + "magic-string": "^0.30.17", 1987 + "pathe": "^2.0.3" 1988 + }, 1989 + "funding": { 1990 + "url": "https://opencollective.com/vitest" 1991 + } 1992 + }, 1993 + "node_modules/@vitest/spy": { 1994 + "version": "3.2.4", 1995 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", 1996 + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", 1997 + "dev": true, 1998 + "license": "MIT", 1999 + "dependencies": { 2000 + "tinyspy": "^4.0.3" 2001 + }, 2002 + "funding": { 2003 + "url": "https://opencollective.com/vitest" 2004 + } 2005 + }, 2006 + "node_modules/@vitest/utils": { 2007 + "version": "3.2.4", 2008 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", 2009 + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", 2010 + "dev": true, 2011 + "license": "MIT", 2012 + "dependencies": { 2013 + "@vitest/pretty-format": "3.2.4", 2014 + "loupe": "^3.1.4", 2015 + "tinyrainbow": "^2.0.0" 2016 + }, 2017 + "funding": { 2018 + "url": "https://opencollective.com/vitest" 2019 + } 2020 + }, 2021 + "node_modules/acorn": { 2022 + "version": "8.15.0", 2023 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 2024 + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 2025 + "license": "MIT", 2026 + "bin": { 2027 + "acorn": "bin/acorn" 2028 + }, 2029 + "engines": { 2030 + "node": ">=0.4.0" 2031 + } 2032 + }, 2033 + "node_modules/agent-base": { 2034 + "version": "7.1.4", 2035 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", 2036 + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", 2037 + "dev": true, 2038 + "license": "MIT", 2039 + "engines": { 2040 + "node": ">= 14" 2041 + } 2042 + }, 2043 + "node_modules/ansi-regex": { 2044 + "version": "5.0.1", 2045 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2046 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2047 + "dev": true, 2048 + "license": "MIT", 2049 + "engines": { 2050 + "node": ">=8" 2051 + } 2052 + }, 2053 + "node_modules/ansi-styles": { 2054 + "version": "5.2.0", 2055 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 2056 + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 2057 + "dev": true, 2058 + "license": "MIT", 2059 + "engines": { 2060 + "node": ">=10" 2061 + }, 2062 + "funding": { 2063 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2064 + } 2065 + }, 2066 + "node_modules/ansis": { 2067 + "version": "4.1.0", 2068 + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", 2069 + "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", 2070 + "license": "ISC", 2071 + "engines": { 2072 + "node": ">=14" 2073 + } 2074 + }, 2075 + "node_modules/anymatch": { 2076 + "version": "3.1.3", 2077 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 2078 + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 2079 + "license": "ISC", 2080 + "dependencies": { 2081 + "normalize-path": "^3.0.0", 2082 + "picomatch": "^2.0.4" 2083 + }, 2084 + "engines": { 2085 + "node": ">= 8" 2086 + } 2087 + }, 2088 + "node_modules/aria-query": { 2089 + "version": "5.3.0", 2090 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", 2091 + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", 2092 + "dev": true, 2093 + "license": "Apache-2.0", 2094 + "dependencies": { 2095 + "dequal": "^2.0.3" 2096 + } 2097 + }, 2098 + "node_modules/assertion-error": { 2099 + "version": "2.0.1", 2100 + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", 2101 + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", 2102 + "dev": true, 2103 + "license": "MIT", 2104 + "engines": { 2105 + "node": ">=12" 2106 + } 2107 + }, 2108 + "node_modules/ast-types": { 2109 + "version": "0.16.1", 2110 + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", 2111 + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", 2112 + "license": "MIT", 2113 + "dependencies": { 2114 + "tslib": "^2.0.1" 2115 + }, 2116 + "engines": { 2117 + "node": ">=4" 2118 + } 2119 + }, 2120 + "node_modules/await-lock": { 2121 + "version": "2.2.2", 2122 + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", 2123 + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", 2124 + "license": "MIT" 2125 + }, 2126 + "node_modules/babel-dead-code-elimination": { 2127 + "version": "1.0.10", 2128 + "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.10.tgz", 2129 + "integrity": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==", 2130 + "license": "MIT", 2131 + "dependencies": { 2132 + "@babel/core": "^7.23.7", 2133 + "@babel/parser": "^7.23.6", 2134 + "@babel/traverse": "^7.23.7", 2135 + "@babel/types": "^7.23.6" 2136 + } 2137 + }, 2138 + "node_modules/binary-extensions": { 2139 + "version": "2.3.0", 2140 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 2141 + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 2142 + "license": "MIT", 2143 + "engines": { 2144 + "node": ">=8" 2145 + }, 2146 + "funding": { 2147 + "url": "https://github.com/sponsors/sindresorhus" 2148 + } 2149 + }, 2150 + "node_modules/braces": { 2151 + "version": "3.0.3", 2152 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 2153 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 2154 + "license": "MIT", 2155 + "dependencies": { 2156 + "fill-range": "^7.1.1" 2157 + }, 2158 + "engines": { 2159 + "node": ">=8" 2160 + } 2161 + }, 2162 + "node_modules/browserslist": { 2163 + "version": "4.25.1", 2164 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", 2165 + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", 2166 + "funding": [ 2167 + { 2168 + "type": "opencollective", 2169 + "url": "https://opencollective.com/browserslist" 2170 + }, 2171 + { 2172 + "type": "tidelift", 2173 + "url": "https://tidelift.com/funding/github/npm/browserslist" 2174 + }, 2175 + { 2176 + "type": "github", 2177 + "url": "https://github.com/sponsors/ai" 2178 + } 2179 + ], 2180 + "license": "MIT", 2181 + "dependencies": { 2182 + "caniuse-lite": "^1.0.30001726", 2183 + "electron-to-chromium": "^1.5.173", 2184 + "node-releases": "^2.0.19", 2185 + "update-browserslist-db": "^1.1.3" 2186 + }, 2187 + "bin": { 2188 + "browserslist": "cli.js" 2189 + }, 2190 + "engines": { 2191 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2192 + } 2193 + }, 2194 + "node_modules/cac": { 2195 + "version": "6.7.14", 2196 + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 2197 + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 2198 + "dev": true, 2199 + "license": "MIT", 2200 + "engines": { 2201 + "node": ">=8" 2202 + } 2203 + }, 2204 + "node_modules/caniuse-lite": { 2205 + "version": "1.0.30001731", 2206 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", 2207 + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", 2208 + "funding": [ 2209 + { 2210 + "type": "opencollective", 2211 + "url": "https://opencollective.com/browserslist" 2212 + }, 2213 + { 2214 + "type": "tidelift", 2215 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 2216 + }, 2217 + { 2218 + "type": "github", 2219 + "url": "https://github.com/sponsors/ai" 2220 + } 2221 + ], 2222 + "license": "CC-BY-4.0" 2223 + }, 2224 + "node_modules/chai": { 2225 + "version": "5.2.1", 2226 + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", 2227 + "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", 2228 + "dev": true, 2229 + "license": "MIT", 2230 + "dependencies": { 2231 + "assertion-error": "^2.0.1", 2232 + "check-error": "^2.1.1", 2233 + "deep-eql": "^5.0.1", 2234 + "loupe": "^3.1.0", 2235 + "pathval": "^2.0.0" 2236 + }, 2237 + "engines": { 2238 + "node": ">=18" 2239 + } 2240 + }, 2241 + "node_modules/check-error": { 2242 + "version": "2.1.1", 2243 + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", 2244 + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", 2245 + "dev": true, 2246 + "license": "MIT", 2247 + "engines": { 2248 + "node": ">= 16" 2249 + } 2250 + }, 2251 + "node_modules/chokidar": { 2252 + "version": "3.6.0", 2253 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 2254 + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 2255 + "license": "MIT", 2256 + "dependencies": { 2257 + "anymatch": "~3.1.2", 2258 + "braces": "~3.0.2", 2259 + "glob-parent": "~5.1.2", 2260 + "is-binary-path": "~2.1.0", 2261 + "is-glob": "~4.0.1", 2262 + "normalize-path": "~3.0.0", 2263 + "readdirp": "~3.6.0" 2264 + }, 2265 + "engines": { 2266 + "node": ">= 8.10.0" 2267 + }, 2268 + "funding": { 2269 + "url": "https://paulmillr.com/funding/" 2270 + }, 2271 + "optionalDependencies": { 2272 + "fsevents": "~2.3.2" 2273 + } 2274 + }, 2275 + "node_modules/clsx": { 2276 + "version": "2.1.1", 2277 + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 2278 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 2279 + "license": "MIT", 2280 + "engines": { 2281 + "node": ">=6" 2282 + } 2283 + }, 2284 + "node_modules/convert-source-map": { 2285 + "version": "2.0.0", 2286 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 2287 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 2288 + "license": "MIT" 2289 + }, 2290 + "node_modules/cookie-es": { 2291 + "version": "1.2.2", 2292 + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", 2293 + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", 2294 + "license": "MIT" 2295 + }, 2296 + "node_modules/cssstyle": { 2297 + "version": "4.6.0", 2298 + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", 2299 + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", 2300 + "dev": true, 2301 + "license": "MIT", 2302 + "dependencies": { 2303 + "@asamuzakjp/css-color": "^3.2.0", 2304 + "rrweb-cssom": "^0.8.0" 2305 + }, 2306 + "engines": { 2307 + "node": ">=18" 2308 + } 2309 + }, 2310 + "node_modules/csstype": { 2311 + "version": "3.1.3", 2312 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 2313 + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 2314 + "license": "MIT" 2315 + }, 2316 + "node_modules/data-urls": { 2317 + "version": "5.0.0", 2318 + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", 2319 + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", 2320 + "dev": true, 2321 + "license": "MIT", 2322 + "dependencies": { 2323 + "whatwg-mimetype": "^4.0.0", 2324 + "whatwg-url": "^14.0.0" 2325 + }, 2326 + "engines": { 2327 + "node": ">=18" 2328 + } 2329 + }, 2330 + "node_modules/debug": { 2331 + "version": "4.4.1", 2332 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 2333 + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 2334 + "license": "MIT", 2335 + "dependencies": { 2336 + "ms": "^2.1.3" 2337 + }, 2338 + "engines": { 2339 + "node": ">=6.0" 2340 + }, 2341 + "peerDependenciesMeta": { 2342 + "supports-color": { 2343 + "optional": true 2344 + } 2345 + } 2346 + }, 2347 + "node_modules/decimal.js": { 2348 + "version": "10.6.0", 2349 + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", 2350 + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", 2351 + "dev": true, 2352 + "license": "MIT" 2353 + }, 2354 + "node_modules/deep-eql": { 2355 + "version": "5.0.2", 2356 + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", 2357 + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", 2358 + "dev": true, 2359 + "license": "MIT", 2360 + "engines": { 2361 + "node": ">=6" 2362 + } 2363 + }, 2364 + "node_modules/dequal": { 2365 + "version": "2.0.3", 2366 + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 2367 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 2368 + "dev": true, 2369 + "license": "MIT", 2370 + "engines": { 2371 + "node": ">=6" 2372 + } 2373 + }, 2374 + "node_modules/diff": { 2375 + "version": "8.0.2", 2376 + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", 2377 + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", 2378 + "license": "BSD-3-Clause", 2379 + "engines": { 2380 + "node": ">=0.3.1" 2381 + } 2382 + }, 2383 + "node_modules/dom-accessibility-api": { 2384 + "version": "0.5.16", 2385 + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", 2386 + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", 2387 + "dev": true, 2388 + "license": "MIT" 2389 + }, 2390 + "node_modules/electron-to-chromium": { 2391 + "version": "1.5.198", 2392 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.198.tgz", 2393 + "integrity": "sha512-G5COfnp3w+ydVu80yprgWSfmfQaYRh9DOxfhAxstLyetKaLyl55QrNjx8C38Pc/C+RaDmb1M0Lk8wPEMQ+bGgQ==", 2394 + "license": "ISC" 2395 + }, 2396 + "node_modules/entities": { 2397 + "version": "6.0.1", 2398 + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", 2399 + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", 2400 + "dev": true, 2401 + "license": "BSD-2-Clause", 2402 + "engines": { 2403 + "node": ">=0.12" 2404 + }, 2405 + "funding": { 2406 + "url": "https://github.com/fb55/entities?sponsor=1" 2407 + } 2408 + }, 2409 + "node_modules/es-module-lexer": { 2410 + "version": "1.7.0", 2411 + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", 2412 + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", 2413 + "dev": true, 2414 + "license": "MIT" 2415 + }, 2416 + "node_modules/esbuild": { 2417 + "version": "0.25.8", 2418 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", 2419 + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", 2420 + "hasInstallScript": true, 2421 + "license": "MIT", 2422 + "bin": { 2423 + "esbuild": "bin/esbuild" 2424 + }, 2425 + "engines": { 2426 + "node": ">=18" 2427 + }, 2428 + "optionalDependencies": { 2429 + "@esbuild/aix-ppc64": "0.25.8", 2430 + "@esbuild/android-arm": "0.25.8", 2431 + "@esbuild/android-arm64": "0.25.8", 2432 + "@esbuild/android-x64": "0.25.8", 2433 + "@esbuild/darwin-arm64": "0.25.8", 2434 + "@esbuild/darwin-x64": "0.25.8", 2435 + "@esbuild/freebsd-arm64": "0.25.8", 2436 + "@esbuild/freebsd-x64": "0.25.8", 2437 + "@esbuild/linux-arm": "0.25.8", 2438 + "@esbuild/linux-arm64": "0.25.8", 2439 + "@esbuild/linux-ia32": "0.25.8", 2440 + "@esbuild/linux-loong64": "0.25.8", 2441 + "@esbuild/linux-mips64el": "0.25.8", 2442 + "@esbuild/linux-ppc64": "0.25.8", 2443 + "@esbuild/linux-riscv64": "0.25.8", 2444 + "@esbuild/linux-s390x": "0.25.8", 2445 + "@esbuild/linux-x64": "0.25.8", 2446 + "@esbuild/netbsd-arm64": "0.25.8", 2447 + "@esbuild/netbsd-x64": "0.25.8", 2448 + "@esbuild/openbsd-arm64": "0.25.8", 2449 + "@esbuild/openbsd-x64": "0.25.8", 2450 + "@esbuild/openharmony-arm64": "0.25.8", 2451 + "@esbuild/sunos-x64": "0.25.8", 2452 + "@esbuild/win32-arm64": "0.25.8", 2453 + "@esbuild/win32-ia32": "0.25.8", 2454 + "@esbuild/win32-x64": "0.25.8" 2455 + } 2456 + }, 2457 + "node_modules/escalade": { 2458 + "version": "3.2.0", 2459 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 2460 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 2461 + "license": "MIT", 2462 + "engines": { 2463 + "node": ">=6" 2464 + } 2465 + }, 2466 + "node_modules/esprima": { 2467 + "version": "4.0.1", 2468 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 2469 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 2470 + "license": "BSD-2-Clause", 2471 + "bin": { 2472 + "esparse": "bin/esparse.js", 2473 + "esvalidate": "bin/esvalidate.js" 2474 + }, 2475 + "engines": { 2476 + "node": ">=4" 2477 + } 2478 + }, 2479 + "node_modules/estree-walker": { 2480 + "version": "3.0.3", 2481 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 2482 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 2483 + "dev": true, 2484 + "license": "MIT", 2485 + "dependencies": { 2486 + "@types/estree": "^1.0.0" 2487 + } 2488 + }, 2489 + "node_modules/expect-type": { 2490 + "version": "1.2.2", 2491 + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", 2492 + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", 2493 + "dev": true, 2494 + "license": "Apache-2.0", 2495 + "engines": { 2496 + "node": ">=12.0.0" 2497 + } 2498 + }, 2499 + "node_modules/fill-range": { 2500 + "version": "7.1.1", 2501 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2502 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2503 + "license": "MIT", 2504 + "dependencies": { 2505 + "to-regex-range": "^5.0.1" 2506 + }, 2507 + "engines": { 2508 + "node": ">=8" 2509 + } 2510 + }, 2511 + "node_modules/fractional-indexing": { 2512 + "version": "3.2.0", 2513 + "resolved": "https://registry.npmjs.org/fractional-indexing/-/fractional-indexing-3.2.0.tgz", 2514 + "integrity": "sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==", 2515 + "license": "CC0-1.0", 2516 + "engines": { 2517 + "node": "^14.13.1 || >=16.0.0" 2518 + } 2519 + }, 2520 + "node_modules/fsevents": { 2521 + "version": "2.3.3", 2522 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2523 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2524 + "hasInstallScript": true, 2525 + "license": "MIT", 2526 + "optional": true, 2527 + "os": [ 2528 + "darwin" 2529 + ], 2530 + "engines": { 2531 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2532 + } 2533 + }, 2534 + "node_modules/gensync": { 2535 + "version": "1.0.0-beta.2", 2536 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2537 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2538 + "license": "MIT", 2539 + "engines": { 2540 + "node": ">=6.9.0" 2541 + } 2542 + }, 2543 + "node_modules/get-tsconfig": { 2544 + "version": "4.10.1", 2545 + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", 2546 + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", 2547 + "license": "MIT", 2548 + "dependencies": { 2549 + "resolve-pkg-maps": "^1.0.0" 2550 + }, 2551 + "funding": { 2552 + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 2553 + } 2554 + }, 2555 + "node_modules/glob-parent": { 2556 + "version": "5.1.2", 2557 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2558 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2559 + "license": "ISC", 2560 + "dependencies": { 2561 + "is-glob": "^4.0.1" 2562 + }, 2563 + "engines": { 2564 + "node": ">= 6" 2565 + } 2566 + }, 2567 + "node_modules/goober": { 2568 + "version": "2.1.16", 2569 + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", 2570 + "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", 2571 + "license": "MIT", 2572 + "peerDependencies": { 2573 + "csstype": "^3.0.10" 2574 + } 2575 + }, 2576 + "node_modules/graphemer": { 2577 + "version": "1.4.0", 2578 + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 2579 + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 2580 + "license": "MIT" 2581 + }, 2582 + "node_modules/html-encoding-sniffer": { 2583 + "version": "4.0.0", 2584 + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", 2585 + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", 2586 + "dev": true, 2587 + "license": "MIT", 2588 + "dependencies": { 2589 + "whatwg-encoding": "^3.1.1" 2590 + }, 2591 + "engines": { 2592 + "node": ">=18" 2593 + } 2594 + }, 2595 + "node_modules/http-proxy-agent": { 2596 + "version": "7.0.2", 2597 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 2598 + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 2599 + "dev": true, 2600 + "license": "MIT", 2601 + "dependencies": { 2602 + "agent-base": "^7.1.0", 2603 + "debug": "^4.3.4" 2604 + }, 2605 + "engines": { 2606 + "node": ">= 14" 2607 + } 2608 + }, 2609 + "node_modules/https-proxy-agent": { 2610 + "version": "7.0.6", 2611 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 2612 + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 2613 + "dev": true, 2614 + "license": "MIT", 2615 + "dependencies": { 2616 + "agent-base": "^7.1.2", 2617 + "debug": "4" 2618 + }, 2619 + "engines": { 2620 + "node": ">= 14" 2621 + } 2622 + }, 2623 + "node_modules/iconv-lite": { 2624 + "version": "0.6.3", 2625 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 2626 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 2627 + "dev": true, 2628 + "license": "MIT", 2629 + "dependencies": { 2630 + "safer-buffer": ">= 2.1.2 < 3.0.0" 2631 + }, 2632 + "engines": { 2633 + "node": ">=0.10.0" 2634 + } 2635 + }, 2636 + "node_modules/is-binary-path": { 2637 + "version": "2.1.0", 2638 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2639 + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2640 + "license": "MIT", 2641 + "dependencies": { 2642 + "binary-extensions": "^2.0.0" 2643 + }, 2644 + "engines": { 2645 + "node": ">=8" 2646 + } 2647 + }, 2648 + "node_modules/is-extglob": { 2649 + "version": "2.1.1", 2650 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2651 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2652 + "license": "MIT", 2653 + "engines": { 2654 + "node": ">=0.10.0" 2655 + } 2656 + }, 2657 + "node_modules/is-glob": { 2658 + "version": "4.0.3", 2659 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2660 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2661 + "license": "MIT", 2662 + "dependencies": { 2663 + "is-extglob": "^2.1.1" 2664 + }, 2665 + "engines": { 2666 + "node": ">=0.10.0" 2667 + } 2668 + }, 2669 + "node_modules/is-number": { 2670 + "version": "7.0.0", 2671 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2672 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2673 + "license": "MIT", 2674 + "engines": { 2675 + "node": ">=0.12.0" 2676 + } 2677 + }, 2678 + "node_modules/is-potential-custom-element-name": { 2679 + "version": "1.0.1", 2680 + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 2681 + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", 2682 + "dev": true, 2683 + "license": "MIT" 2684 + }, 2685 + "node_modules/isbot": { 2686 + "version": "5.1.29", 2687 + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.29.tgz", 2688 + "integrity": "sha512-DelDWWoa3mBoyWTq3wjp+GIWx/yZdN7zLUE7NFhKjAiJ+uJVRkbLlwykdduCE4sPUUy8mlTYTmdhBUYu91F+sw==", 2689 + "license": "Unlicense", 2690 + "engines": { 2691 + "node": ">=18" 2692 + } 2693 + }, 2694 + "node_modules/iso-datestring-validator": { 2695 + "version": "2.2.2", 2696 + "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz", 2697 + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==", 2698 + "license": "MIT" 2699 + }, 2700 + "node_modules/jotai": { 2701 + "version": "2.13.0", 2702 + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.13.0.tgz", 2703 + "integrity": "sha512-H43zXdanNTdpfOEJ4NVbm4hgmrctpXLZagjJNcqAywhUv+sTE7esvFjwm5oBg/ywT9Qw63lIkM6fjrhFuW8UDg==", 2704 + "license": "MIT", 2705 + "engines": { 2706 + "node": ">=12.20.0" 2707 + }, 2708 + "peerDependencies": { 2709 + "@babel/core": ">=7.0.0", 2710 + "@babel/template": ">=7.0.0", 2711 + "@types/react": ">=17.0.0", 2712 + "react": ">=17.0.0" 2713 + }, 2714 + "peerDependenciesMeta": { 2715 + "@babel/core": { 2716 + "optional": true 2717 + }, 2718 + "@babel/template": { 2719 + "optional": true 2720 + }, 2721 + "@types/react": { 2722 + "optional": true 2723 + }, 2724 + "react": { 2725 + "optional": true 2726 + } 2727 + } 2728 + }, 2729 + "node_modules/js-tokens": { 2730 + "version": "4.0.0", 2731 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2732 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2733 + "license": "MIT" 2734 + }, 2735 + "node_modules/jsdom": { 2736 + "version": "26.1.0", 2737 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", 2738 + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", 2739 + "dev": true, 2740 + "license": "MIT", 2741 + "dependencies": { 2742 + "cssstyle": "^4.2.1", 2743 + "data-urls": "^5.0.0", 2744 + "decimal.js": "^10.5.0", 2745 + "html-encoding-sniffer": "^4.0.0", 2746 + "http-proxy-agent": "^7.0.2", 2747 + "https-proxy-agent": "^7.0.6", 2748 + "is-potential-custom-element-name": "^1.0.1", 2749 + "nwsapi": "^2.2.16", 2750 + "parse5": "^7.2.1", 2751 + "rrweb-cssom": "^0.8.0", 2752 + "saxes": "^6.0.0", 2753 + "symbol-tree": "^3.2.4", 2754 + "tough-cookie": "^5.1.1", 2755 + "w3c-xmlserializer": "^5.0.0", 2756 + "webidl-conversions": "^7.0.0", 2757 + "whatwg-encoding": "^3.1.1", 2758 + "whatwg-mimetype": "^4.0.0", 2759 + "whatwg-url": "^14.1.1", 2760 + "ws": "^8.18.0", 2761 + "xml-name-validator": "^5.0.0" 2762 + }, 2763 + "engines": { 2764 + "node": ">=18" 2765 + }, 2766 + "peerDependencies": { 2767 + "canvas": "^3.0.0" 2768 + }, 2769 + "peerDependenciesMeta": { 2770 + "canvas": { 2771 + "optional": true 2772 + } 2773 + } 2774 + }, 2775 + "node_modules/jsesc": { 2776 + "version": "3.1.0", 2777 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 2778 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 2779 + "license": "MIT", 2780 + "bin": { 2781 + "jsesc": "bin/jsesc" 2782 + }, 2783 + "engines": { 2784 + "node": ">=6" 2785 + } 2786 + }, 2787 + "node_modules/json5": { 2788 + "version": "2.2.3", 2789 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2790 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2791 + "license": "MIT", 2792 + "bin": { 2793 + "json5": "lib/cli.js" 2794 + }, 2795 + "engines": { 2796 + "node": ">=6" 2797 + } 2798 + }, 2799 + "node_modules/loupe": { 2800 + "version": "3.2.0", 2801 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz", 2802 + "integrity": "sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==", 2803 + "dev": true, 2804 + "license": "MIT" 2805 + }, 2806 + "node_modules/lru-cache": { 2807 + "version": "5.1.1", 2808 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2809 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2810 + "license": "ISC", 2811 + "dependencies": { 2812 + "yallist": "^3.0.2" 2813 + } 2814 + }, 2815 + "node_modules/lz-string": { 2816 + "version": "1.5.0", 2817 + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", 2818 + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", 2819 + "dev": true, 2820 + "license": "MIT", 2821 + "bin": { 2822 + "lz-string": "bin/bin.js" 2823 + } 2824 + }, 2825 + "node_modules/magic-string": { 2826 + "version": "0.30.17", 2827 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 2828 + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 2829 + "dev": true, 2830 + "license": "MIT", 2831 + "dependencies": { 2832 + "@jridgewell/sourcemap-codec": "^1.5.0" 2833 + } 2834 + }, 2835 + "node_modules/ms": { 2836 + "version": "2.1.3", 2837 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2838 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2839 + "license": "MIT" 2840 + }, 2841 + "node_modules/multiformats": { 2842 + "version": "9.9.0", 2843 + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", 2844 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", 2845 + "license": "(Apache-2.0 AND MIT)" 2846 + }, 2847 + "node_modules/murmurhash-js": { 2848 + "version": "1.0.0", 2849 + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", 2850 + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", 2851 + "license": "MIT" 2852 + }, 2853 + "node_modules/nanoid": { 2854 + "version": "3.3.11", 2855 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 2856 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 2857 + "devOptional": true, 2858 + "funding": [ 2859 + { 2860 + "type": "github", 2861 + "url": "https://github.com/sponsors/ai" 2862 + } 2863 + ], 2864 + "license": "MIT", 2865 + "bin": { 2866 + "nanoid": "bin/nanoid.cjs" 2867 + }, 2868 + "engines": { 2869 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2870 + } 2871 + }, 2872 + "node_modules/node-releases": { 2873 + "version": "2.0.19", 2874 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 2875 + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 2876 + "license": "MIT" 2877 + }, 2878 + "node_modules/normalize-path": { 2879 + "version": "3.0.0", 2880 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2881 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2882 + "license": "MIT", 2883 + "engines": { 2884 + "node": ">=0.10.0" 2885 + } 2886 + }, 2887 + "node_modules/nwsapi": { 2888 + "version": "2.2.21", 2889 + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", 2890 + "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", 2891 + "dev": true, 2892 + "license": "MIT" 2893 + }, 2894 + "node_modules/parse5": { 2895 + "version": "7.3.0", 2896 + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", 2897 + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", 2898 + "dev": true, 2899 + "license": "MIT", 2900 + "dependencies": { 2901 + "entities": "^6.0.0" 2902 + }, 2903 + "funding": { 2904 + "url": "https://github.com/inikulin/parse5?sponsor=1" 2905 + } 2906 + }, 2907 + "node_modules/pathe": { 2908 + "version": "2.0.3", 2909 + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 2910 + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 2911 + "dev": true, 2912 + "license": "MIT" 2913 + }, 2914 + "node_modules/pathval": { 2915 + "version": "2.0.1", 2916 + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", 2917 + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", 2918 + "dev": true, 2919 + "license": "MIT", 2920 + "engines": { 2921 + "node": ">= 14.16" 2922 + } 2923 + }, 2924 + "node_modules/picocolors": { 2925 + "version": "1.1.1", 2926 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2927 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2928 + "license": "ISC" 2929 + }, 2930 + "node_modules/picomatch": { 2931 + "version": "2.3.1", 2932 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2933 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2934 + "license": "MIT", 2935 + "engines": { 2936 + "node": ">=8.6" 2937 + }, 2938 + "funding": { 2939 + "url": "https://github.com/sponsors/jonschlinkert" 2940 + } 2941 + }, 2942 + "node_modules/postcss": { 2943 + "version": "8.5.6", 2944 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 2945 + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 2946 + "devOptional": true, 2947 + "funding": [ 2948 + { 2949 + "type": "opencollective", 2950 + "url": "https://opencollective.com/postcss/" 2951 + }, 2952 + { 2953 + "type": "tidelift", 2954 + "url": "https://tidelift.com/funding/github/npm/postcss" 2955 + }, 2956 + { 2957 + "type": "github", 2958 + "url": "https://github.com/sponsors/ai" 2959 + } 2960 + ], 2961 + "license": "MIT", 2962 + "dependencies": { 2963 + "nanoid": "^3.3.11", 2964 + "picocolors": "^1.1.1", 2965 + "source-map-js": "^1.2.1" 2966 + }, 2967 + "engines": { 2968 + "node": "^10 || ^12 || >=14" 2969 + } 2970 + }, 2971 + "node_modules/prettier": { 2972 + "version": "3.6.2", 2973 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", 2974 + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", 2975 + "license": "MIT", 2976 + "bin": { 2977 + "prettier": "bin/prettier.cjs" 2978 + }, 2979 + "engines": { 2980 + "node": ">=14" 2981 + }, 2982 + "funding": { 2983 + "url": "https://github.com/prettier/prettier?sponsor=1" 2984 + } 2985 + }, 2986 + "node_modules/pretty-format": { 2987 + "version": "27.5.1", 2988 + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", 2989 + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", 2990 + "dev": true, 2991 + "license": "MIT", 2992 + "dependencies": { 2993 + "ansi-regex": "^5.0.1", 2994 + "ansi-styles": "^5.0.0", 2995 + "react-is": "^17.0.1" 2996 + }, 2997 + "engines": { 2998 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" 2999 + } 3000 + }, 3001 + "node_modules/punycode": { 3002 + "version": "2.3.1", 3003 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 3004 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 3005 + "dev": true, 3006 + "license": "MIT", 3007 + "engines": { 3008 + "node": ">=6" 3009 + } 3010 + }, 3011 + "node_modules/react": { 3012 + "version": "19.1.1", 3013 + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", 3014 + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", 3015 + "license": "MIT", 3016 + "engines": { 3017 + "node": ">=0.10.0" 3018 + } 3019 + }, 3020 + "node_modules/react-dom": { 3021 + "version": "19.1.1", 3022 + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", 3023 + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", 3024 + "license": "MIT", 3025 + "dependencies": { 3026 + "scheduler": "^0.26.0" 3027 + }, 3028 + "peerDependencies": { 3029 + "react": "^19.1.1" 3030 + } 3031 + }, 3032 + "node_modules/react-is": { 3033 + "version": "17.0.2", 3034 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 3035 + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 3036 + "dev": true, 3037 + "license": "MIT" 3038 + }, 3039 + "node_modules/react-refresh": { 3040 + "version": "0.17.0", 3041 + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", 3042 + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", 3043 + "dev": true, 3044 + "license": "MIT", 3045 + "engines": { 3046 + "node": ">=0.10.0" 3047 + } 3048 + }, 3049 + "node_modules/readdirp": { 3050 + "version": "3.6.0", 3051 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 3052 + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 3053 + "license": "MIT", 3054 + "dependencies": { 3055 + "picomatch": "^2.2.1" 3056 + }, 3057 + "engines": { 3058 + "node": ">=8.10.0" 3059 + } 3060 + }, 3061 + "node_modules/recast": { 3062 + "version": "0.23.11", 3063 + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", 3064 + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", 3065 + "license": "MIT", 3066 + "dependencies": { 3067 + "ast-types": "^0.16.1", 3068 + "esprima": "~4.0.0", 3069 + "source-map": "~0.6.1", 3070 + "tiny-invariant": "^1.3.3", 3071 + "tslib": "^2.0.1" 3072 + }, 3073 + "engines": { 3074 + "node": ">= 4" 3075 + } 3076 + }, 3077 + "node_modules/recast/node_modules/source-map": { 3078 + "version": "0.6.1", 3079 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3080 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3081 + "license": "BSD-3-Clause", 3082 + "engines": { 3083 + "node": ">=0.10.0" 3084 + } 3085 + }, 3086 + "node_modules/resolve-pkg-maps": { 3087 + "version": "1.0.0", 3088 + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 3089 + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 3090 + "license": "MIT", 3091 + "funding": { 3092 + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 3093 + } 3094 + }, 3095 + "node_modules/rollup": { 3096 + "version": "4.46.2", 3097 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", 3098 + "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", 3099 + "devOptional": true, 3100 + "license": "MIT", 3101 + "dependencies": { 3102 + "@types/estree": "1.0.8" 3103 + }, 3104 + "bin": { 3105 + "rollup": "dist/bin/rollup" 3106 + }, 3107 + "engines": { 3108 + "node": ">=18.0.0", 3109 + "npm": ">=8.0.0" 3110 + }, 3111 + "optionalDependencies": { 3112 + "@rollup/rollup-android-arm-eabi": "4.46.2", 3113 + "@rollup/rollup-android-arm64": "4.46.2", 3114 + "@rollup/rollup-darwin-arm64": "4.46.2", 3115 + "@rollup/rollup-darwin-x64": "4.46.2", 3116 + "@rollup/rollup-freebsd-arm64": "4.46.2", 3117 + "@rollup/rollup-freebsd-x64": "4.46.2", 3118 + "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", 3119 + "@rollup/rollup-linux-arm-musleabihf": "4.46.2", 3120 + "@rollup/rollup-linux-arm64-gnu": "4.46.2", 3121 + "@rollup/rollup-linux-arm64-musl": "4.46.2", 3122 + "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", 3123 + "@rollup/rollup-linux-ppc64-gnu": "4.46.2", 3124 + "@rollup/rollup-linux-riscv64-gnu": "4.46.2", 3125 + "@rollup/rollup-linux-riscv64-musl": "4.46.2", 3126 + "@rollup/rollup-linux-s390x-gnu": "4.46.2", 3127 + "@rollup/rollup-linux-x64-gnu": "4.46.2", 3128 + "@rollup/rollup-linux-x64-musl": "4.46.2", 3129 + "@rollup/rollup-win32-arm64-msvc": "4.46.2", 3130 + "@rollup/rollup-win32-ia32-msvc": "4.46.2", 3131 + "@rollup/rollup-win32-x64-msvc": "4.46.2", 3132 + "fsevents": "~2.3.2" 3133 + } 3134 + }, 3135 + "node_modules/rrweb-cssom": { 3136 + "version": "0.8.0", 3137 + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", 3138 + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", 3139 + "dev": true, 3140 + "license": "MIT" 3141 + }, 3142 + "node_modules/safer-buffer": { 3143 + "version": "2.1.2", 3144 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3145 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 3146 + "dev": true, 3147 + "license": "MIT" 3148 + }, 3149 + "node_modules/saxes": { 3150 + "version": "6.0.0", 3151 + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", 3152 + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", 3153 + "dev": true, 3154 + "license": "ISC", 3155 + "dependencies": { 3156 + "xmlchars": "^2.2.0" 3157 + }, 3158 + "engines": { 3159 + "node": ">=v12.22.7" 3160 + } 3161 + }, 3162 + "node_modules/scheduler": { 3163 + "version": "0.26.0", 3164 + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", 3165 + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", 3166 + "license": "MIT" 3167 + }, 3168 + "node_modules/semver": { 3169 + "version": "6.3.1", 3170 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 3171 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 3172 + "license": "ISC", 3173 + "bin": { 3174 + "semver": "bin/semver.js" 3175 + } 3176 + }, 3177 + "node_modules/seroval": { 3178 + "version": "1.3.2", 3179 + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", 3180 + "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", 3181 + "license": "MIT", 3182 + "engines": { 3183 + "node": ">=10" 3184 + } 3185 + }, 3186 + "node_modules/seroval-plugins": { 3187 + "version": "1.3.2", 3188 + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.2.tgz", 3189 + "integrity": "sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==", 3190 + "license": "MIT", 3191 + "engines": { 3192 + "node": ">=10" 3193 + }, 3194 + "peerDependencies": { 3195 + "seroval": "^1.0" 3196 + } 3197 + }, 3198 + "node_modules/siginfo": { 3199 + "version": "2.0.0", 3200 + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 3201 + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 3202 + "dev": true, 3203 + "license": "ISC" 3204 + }, 3205 + "node_modules/solid-js": { 3206 + "version": "1.9.8", 3207 + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.8.tgz", 3208 + "integrity": "sha512-zF9Whfqk+s8wWuyDKnE7ekl+dJburjdZq54O6X1k4XChA57uZ5FOauYAa0s4I44XkBOM3CZmPrZC0DGjH9fKjQ==", 3209 + "license": "MIT", 3210 + "dependencies": { 3211 + "csstype": "^3.1.0", 3212 + "seroval": "~1.3.0", 3213 + "seroval-plugins": "~1.3.0" 3214 + } 3215 + }, 3216 + "node_modules/sorted-btree": { 3217 + "version": "1.8.1", 3218 + "resolved": "https://registry.npmjs.org/sorted-btree/-/sorted-btree-1.8.1.tgz", 3219 + "integrity": "sha512-395+XIP+wqNn3USkFSrNz7G3Ss/MXlZEqesxvzCRFwL14h6e8LukDHdLBePn5pwbm5OQ9vGu8mDyz2lLDIqamQ==", 3220 + "license": "MIT" 3221 + }, 3222 + "node_modules/source-map": { 3223 + "version": "0.7.6", 3224 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", 3225 + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", 3226 + "license": "BSD-3-Clause", 3227 + "engines": { 3228 + "node": ">= 12" 3229 + } 3230 + }, 3231 + "node_modules/source-map-js": { 3232 + "version": "1.2.1", 3233 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 3234 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 3235 + "devOptional": true, 3236 + "license": "BSD-3-Clause", 3237 + "engines": { 3238 + "node": ">=0.10.0" 3239 + } 3240 + }, 3241 + "node_modules/stackback": { 3242 + "version": "0.0.2", 3243 + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 3244 + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 3245 + "dev": true, 3246 + "license": "MIT" 3247 + }, 3248 + "node_modules/std-env": { 3249 + "version": "3.9.0", 3250 + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", 3251 + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", 3252 + "dev": true, 3253 + "license": "MIT" 3254 + }, 3255 + "node_modules/strip-literal": { 3256 + "version": "3.0.0", 3257 + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", 3258 + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", 3259 + "dev": true, 3260 + "license": "MIT", 3261 + "dependencies": { 3262 + "js-tokens": "^9.0.1" 3263 + }, 3264 + "funding": { 3265 + "url": "https://github.com/sponsors/antfu" 3266 + } 3267 + }, 3268 + "node_modules/strip-literal/node_modules/js-tokens": { 3269 + "version": "9.0.1", 3270 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", 3271 + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", 3272 + "dev": true, 3273 + "license": "MIT" 3274 + }, 3275 + "node_modules/symbol-tree": { 3276 + "version": "3.2.4", 3277 + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 3278 + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", 3279 + "dev": true, 3280 + "license": "MIT" 3281 + }, 3282 + "node_modules/tiny-invariant": { 3283 + "version": "1.3.3", 3284 + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", 3285 + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", 3286 + "license": "MIT" 3287 + }, 3288 + "node_modules/tiny-warning": { 3289 + "version": "1.0.3", 3290 + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", 3291 + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", 3292 + "license": "MIT" 3293 + }, 3294 + "node_modules/tinybench": { 3295 + "version": "2.9.0", 3296 + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", 3297 + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", 3298 + "dev": true, 3299 + "license": "MIT" 3300 + }, 3301 + "node_modules/tinyexec": { 3302 + "version": "0.3.2", 3303 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", 3304 + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", 3305 + "dev": true, 3306 + "license": "MIT" 3307 + }, 3308 + "node_modules/tinyglobby": { 3309 + "version": "0.2.14", 3310 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", 3311 + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 3312 + "devOptional": true, 3313 + "license": "MIT", 3314 + "dependencies": { 3315 + "fdir": "^6.4.4", 3316 + "picomatch": "^4.0.2" 3317 + }, 3318 + "engines": { 3319 + "node": ">=12.0.0" 3320 + }, 3321 + "funding": { 3322 + "url": "https://github.com/sponsors/SuperchupuDev" 3323 + } 3324 + }, 3325 + "node_modules/tinyglobby/node_modules/fdir": { 3326 + "version": "6.4.6", 3327 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", 3328 + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", 3329 + "devOptional": true, 3330 + "license": "MIT", 3331 + "peerDependencies": { 3332 + "picomatch": "^3 || ^4" 3333 + }, 3334 + "peerDependenciesMeta": { 3335 + "picomatch": { 3336 + "optional": true 3337 + } 3338 + } 3339 + }, 3340 + "node_modules/tinyglobby/node_modules/picomatch": { 3341 + "version": "4.0.3", 3342 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 3343 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 3344 + "devOptional": true, 3345 + "license": "MIT", 3346 + "engines": { 3347 + "node": ">=12" 3348 + }, 3349 + "funding": { 3350 + "url": "https://github.com/sponsors/jonschlinkert" 3351 + } 3352 + }, 3353 + "node_modules/tinypool": { 3354 + "version": "1.1.1", 3355 + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", 3356 + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", 3357 + "dev": true, 3358 + "license": "MIT", 3359 + "engines": { 3360 + "node": "^18.0.0 || >=20.0.0" 3361 + } 3362 + }, 3363 + "node_modules/tinyrainbow": { 3364 + "version": "2.0.0", 3365 + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", 3366 + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", 3367 + "dev": true, 3368 + "license": "MIT", 3369 + "engines": { 3370 + "node": ">=14.0.0" 3371 + } 3372 + }, 3373 + "node_modules/tinyspy": { 3374 + "version": "4.0.3", 3375 + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", 3376 + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", 3377 + "dev": true, 3378 + "license": "MIT", 3379 + "engines": { 3380 + "node": ">=14.0.0" 3381 + } 3382 + }, 3383 + "node_modules/tlds": { 3384 + "version": "1.259.0", 3385 + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.259.0.tgz", 3386 + "integrity": "sha512-AldGGlDP0PNgwppe2quAvuBl18UcjuNtOnDuUkqhd6ipPqrYYBt3aTxK1QTsBVknk97lS2JcafWMghjGWFtunw==", 3387 + "license": "MIT", 3388 + "bin": { 3389 + "tlds": "bin.js" 3390 + } 3391 + }, 3392 + "node_modules/tldts": { 3393 + "version": "6.1.86", 3394 + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", 3395 + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", 3396 + "dev": true, 3397 + "license": "MIT", 3398 + "dependencies": { 3399 + "tldts-core": "^6.1.86" 3400 + }, 3401 + "bin": { 3402 + "tldts": "bin/cli.js" 3403 + } 3404 + }, 3405 + "node_modules/tldts-core": { 3406 + "version": "6.1.86", 3407 + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", 3408 + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", 3409 + "dev": true, 3410 + "license": "MIT" 3411 + }, 3412 + "node_modules/to-regex-range": { 3413 + "version": "5.0.1", 3414 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3415 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3416 + "license": "MIT", 3417 + "dependencies": { 3418 + "is-number": "^7.0.0" 3419 + }, 3420 + "engines": { 3421 + "node": ">=8.0" 3422 + } 3423 + }, 3424 + "node_modules/tough-cookie": { 3425 + "version": "5.1.2", 3426 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", 3427 + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", 3428 + "dev": true, 3429 + "license": "BSD-3-Clause", 3430 + "dependencies": { 3431 + "tldts": "^6.1.32" 3432 + }, 3433 + "engines": { 3434 + "node": ">=16" 3435 + } 3436 + }, 3437 + "node_modules/tr46": { 3438 + "version": "5.1.1", 3439 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", 3440 + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", 3441 + "dev": true, 3442 + "license": "MIT", 3443 + "dependencies": { 3444 + "punycode": "^2.3.1" 3445 + }, 3446 + "engines": { 3447 + "node": ">=18" 3448 + } 3449 + }, 3450 + "node_modules/tslib": { 3451 + "version": "2.8.1", 3452 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 3453 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 3454 + "license": "0BSD" 3455 + }, 3456 + "node_modules/tsx": { 3457 + "version": "4.20.3", 3458 + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", 3459 + "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", 3460 + "license": "MIT", 3461 + "dependencies": { 3462 + "esbuild": "~0.25.0", 3463 + "get-tsconfig": "^4.7.5" 3464 + }, 3465 + "bin": { 3466 + "tsx": "dist/cli.mjs" 3467 + }, 3468 + "engines": { 3469 + "node": ">=18.0.0" 3470 + }, 3471 + "optionalDependencies": { 3472 + "fsevents": "~2.3.3" 3473 + } 3474 + }, 3475 + "node_modules/typescript": { 3476 + "version": "5.9.2", 3477 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", 3478 + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", 3479 + "license": "Apache-2.0", 3480 + "bin": { 3481 + "tsc": "bin/tsc", 3482 + "tsserver": "bin/tsserver" 3483 + }, 3484 + "engines": { 3485 + "node": ">=14.17" 3486 + } 3487 + }, 3488 + "node_modules/uint8arrays": { 3489 + "version": "3.0.0", 3490 + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz", 3491 + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 3492 + "license": "MIT", 3493 + "dependencies": { 3494 + "multiformats": "^9.4.2" 3495 + } 3496 + }, 3497 + "node_modules/unplugin": { 3498 + "version": "2.3.5", 3499 + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.5.tgz", 3500 + "integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==", 3501 + "license": "MIT", 3502 + "dependencies": { 3503 + "acorn": "^8.14.1", 3504 + "picomatch": "^4.0.2", 3505 + "webpack-virtual-modules": "^0.6.2" 3506 + }, 3507 + "engines": { 3508 + "node": ">=18.12.0" 3509 + } 3510 + }, 3511 + "node_modules/unplugin/node_modules/picomatch": { 3512 + "version": "4.0.3", 3513 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 3514 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 3515 + "license": "MIT", 3516 + "engines": { 3517 + "node": ">=12" 3518 + }, 3519 + "funding": { 3520 + "url": "https://github.com/sponsors/jonschlinkert" 3521 + } 3522 + }, 3523 + "node_modules/update-browserslist-db": { 3524 + "version": "1.1.3", 3525 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 3526 + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 3527 + "funding": [ 3528 + { 3529 + "type": "opencollective", 3530 + "url": "https://opencollective.com/browserslist" 3531 + }, 3532 + { 3533 + "type": "tidelift", 3534 + "url": "https://tidelift.com/funding/github/npm/browserslist" 3535 + }, 3536 + { 3537 + "type": "github", 3538 + "url": "https://github.com/sponsors/ai" 3539 + } 3540 + ], 3541 + "license": "MIT", 3542 + "dependencies": { 3543 + "escalade": "^3.2.0", 3544 + "picocolors": "^1.1.1" 3545 + }, 3546 + "bin": { 3547 + "update-browserslist-db": "cli.js" 3548 + }, 3549 + "peerDependencies": { 3550 + "browserslist": ">= 4.21.0" 3551 + } 3552 + }, 3553 + "node_modules/use-sync-external-store": { 3554 + "version": "1.5.0", 3555 + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", 3556 + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", 3557 + "license": "MIT", 3558 + "peerDependencies": { 3559 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 3560 + } 3561 + }, 3562 + "node_modules/vite": { 3563 + "version": "6.3.5", 3564 + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", 3565 + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", 3566 + "devOptional": true, 3567 + "license": "MIT", 3568 + "dependencies": { 3569 + "esbuild": "^0.25.0", 3570 + "fdir": "^6.4.4", 3571 + "picomatch": "^4.0.2", 3572 + "postcss": "^8.5.3", 3573 + "rollup": "^4.34.9", 3574 + "tinyglobby": "^0.2.13" 3575 + }, 3576 + "bin": { 3577 + "vite": "bin/vite.js" 3578 + }, 3579 + "engines": { 3580 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3581 + }, 3582 + "funding": { 3583 + "url": "https://github.com/vitejs/vite?sponsor=1" 3584 + }, 3585 + "optionalDependencies": { 3586 + "fsevents": "~2.3.3" 3587 + }, 3588 + "peerDependencies": { 3589 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 3590 + "jiti": ">=1.21.0", 3591 + "less": "*", 3592 + "lightningcss": "^1.21.0", 3593 + "sass": "*", 3594 + "sass-embedded": "*", 3595 + "stylus": "*", 3596 + "sugarss": "*", 3597 + "terser": "^5.16.0", 3598 + "tsx": "^4.8.1", 3599 + "yaml": "^2.4.2" 3600 + }, 3601 + "peerDependenciesMeta": { 3602 + "@types/node": { 3603 + "optional": true 3604 + }, 3605 + "jiti": { 3606 + "optional": true 3607 + }, 3608 + "less": { 3609 + "optional": true 3610 + }, 3611 + "lightningcss": { 3612 + "optional": true 3613 + }, 3614 + "sass": { 3615 + "optional": true 3616 + }, 3617 + "sass-embedded": { 3618 + "optional": true 3619 + }, 3620 + "stylus": { 3621 + "optional": true 3622 + }, 3623 + "sugarss": { 3624 + "optional": true 3625 + }, 3626 + "terser": { 3627 + "optional": true 3628 + }, 3629 + "tsx": { 3630 + "optional": true 3631 + }, 3632 + "yaml": { 3633 + "optional": true 3634 + } 3635 + } 3636 + }, 3637 + "node_modules/vite-node": { 3638 + "version": "3.2.4", 3639 + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", 3640 + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", 3641 + "dev": true, 3642 + "license": "MIT", 3643 + "dependencies": { 3644 + "cac": "^6.7.14", 3645 + "debug": "^4.4.1", 3646 + "es-module-lexer": "^1.7.0", 3647 + "pathe": "^2.0.3", 3648 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" 3649 + }, 3650 + "bin": { 3651 + "vite-node": "vite-node.mjs" 3652 + }, 3653 + "engines": { 3654 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3655 + }, 3656 + "funding": { 3657 + "url": "https://opencollective.com/vitest" 3658 + } 3659 + }, 3660 + "node_modules/vite/node_modules/fdir": { 3661 + "version": "6.4.6", 3662 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", 3663 + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", 3664 + "devOptional": true, 3665 + "license": "MIT", 3666 + "peerDependencies": { 3667 + "picomatch": "^3 || ^4" 3668 + }, 3669 + "peerDependenciesMeta": { 3670 + "picomatch": { 3671 + "optional": true 3672 + } 3673 + } 3674 + }, 3675 + "node_modules/vite/node_modules/picomatch": { 3676 + "version": "4.0.3", 3677 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 3678 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 3679 + "devOptional": true, 3680 + "license": "MIT", 3681 + "engines": { 3682 + "node": ">=12" 3683 + }, 3684 + "funding": { 3685 + "url": "https://github.com/sponsors/jonschlinkert" 3686 + } 3687 + }, 3688 + "node_modules/vitest": { 3689 + "version": "3.2.4", 3690 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", 3691 + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", 3692 + "dev": true, 3693 + "license": "MIT", 3694 + "dependencies": { 3695 + "@types/chai": "^5.2.2", 3696 + "@vitest/expect": "3.2.4", 3697 + "@vitest/mocker": "3.2.4", 3698 + "@vitest/pretty-format": "^3.2.4", 3699 + "@vitest/runner": "3.2.4", 3700 + "@vitest/snapshot": "3.2.4", 3701 + "@vitest/spy": "3.2.4", 3702 + "@vitest/utils": "3.2.4", 3703 + "chai": "^5.2.0", 3704 + "debug": "^4.4.1", 3705 + "expect-type": "^1.2.1", 3706 + "magic-string": "^0.30.17", 3707 + "pathe": "^2.0.3", 3708 + "picomatch": "^4.0.2", 3709 + "std-env": "^3.9.0", 3710 + "tinybench": "^2.9.0", 3711 + "tinyexec": "^0.3.2", 3712 + "tinyglobby": "^0.2.14", 3713 + "tinypool": "^1.1.1", 3714 + "tinyrainbow": "^2.0.0", 3715 + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", 3716 + "vite-node": "3.2.4", 3717 + "why-is-node-running": "^2.3.0" 3718 + }, 3719 + "bin": { 3720 + "vitest": "vitest.mjs" 3721 + }, 3722 + "engines": { 3723 + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3724 + }, 3725 + "funding": { 3726 + "url": "https://opencollective.com/vitest" 3727 + }, 3728 + "peerDependencies": { 3729 + "@edge-runtime/vm": "*", 3730 + "@types/debug": "^4.1.12", 3731 + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 3732 + "@vitest/browser": "3.2.4", 3733 + "@vitest/ui": "3.2.4", 3734 + "happy-dom": "*", 3735 + "jsdom": "*" 3736 + }, 3737 + "peerDependenciesMeta": { 3738 + "@edge-runtime/vm": { 3739 + "optional": true 3740 + }, 3741 + "@types/debug": { 3742 + "optional": true 3743 + }, 3744 + "@types/node": { 3745 + "optional": true 3746 + }, 3747 + "@vitest/browser": { 3748 + "optional": true 3749 + }, 3750 + "@vitest/ui": { 3751 + "optional": true 3752 + }, 3753 + "happy-dom": { 3754 + "optional": true 3755 + }, 3756 + "jsdom": { 3757 + "optional": true 3758 + } 3759 + } 3760 + }, 3761 + "node_modules/vitest/node_modules/picomatch": { 3762 + "version": "4.0.3", 3763 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 3764 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 3765 + "dev": true, 3766 + "license": "MIT", 3767 + "engines": { 3768 + "node": ">=12" 3769 + }, 3770 + "funding": { 3771 + "url": "https://github.com/sponsors/jonschlinkert" 3772 + } 3773 + }, 3774 + "node_modules/w3c-xmlserializer": { 3775 + "version": "5.0.0", 3776 + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", 3777 + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", 3778 + "dev": true, 3779 + "license": "MIT", 3780 + "dependencies": { 3781 + "xml-name-validator": "^5.0.0" 3782 + }, 3783 + "engines": { 3784 + "node": ">=18" 3785 + } 3786 + }, 3787 + "node_modules/web-vitals": { 3788 + "version": "4.2.4", 3789 + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", 3790 + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", 3791 + "dev": true, 3792 + "license": "Apache-2.0" 3793 + }, 3794 + "node_modules/webidl-conversions": { 3795 + "version": "7.0.0", 3796 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 3797 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 3798 + "dev": true, 3799 + "license": "BSD-2-Clause", 3800 + "engines": { 3801 + "node": ">=12" 3802 + } 3803 + }, 3804 + "node_modules/webpack-virtual-modules": { 3805 + "version": "0.6.2", 3806 + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", 3807 + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", 3808 + "license": "MIT" 3809 + }, 3810 + "node_modules/whatwg-encoding": { 3811 + "version": "3.1.1", 3812 + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", 3813 + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", 3814 + "dev": true, 3815 + "license": "MIT", 3816 + "dependencies": { 3817 + "iconv-lite": "0.6.3" 3818 + }, 3819 + "engines": { 3820 + "node": ">=18" 3821 + } 3822 + }, 3823 + "node_modules/whatwg-mimetype": { 3824 + "version": "4.0.0", 3825 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", 3826 + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", 3827 + "dev": true, 3828 + "license": "MIT", 3829 + "engines": { 3830 + "node": ">=18" 3831 + } 3832 + }, 3833 + "node_modules/whatwg-url": { 3834 + "version": "14.2.0", 3835 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", 3836 + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", 3837 + "dev": true, 3838 + "license": "MIT", 3839 + "dependencies": { 3840 + "tr46": "^5.1.0", 3841 + "webidl-conversions": "^7.0.0" 3842 + }, 3843 + "engines": { 3844 + "node": ">=18" 3845 + } 3846 + }, 3847 + "node_modules/why-is-node-running": { 3848 + "version": "2.3.0", 3849 + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", 3850 + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", 3851 + "dev": true, 3852 + "license": "MIT", 3853 + "dependencies": { 3854 + "siginfo": "^2.0.0", 3855 + "stackback": "0.0.2" 3856 + }, 3857 + "bin": { 3858 + "why-is-node-running": "cli.js" 3859 + }, 3860 + "engines": { 3861 + "node": ">=8" 3862 + } 3863 + }, 3864 + "node_modules/ws": { 3865 + "version": "8.18.3", 3866 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", 3867 + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", 3868 + "dev": true, 3869 + "license": "MIT", 3870 + "engines": { 3871 + "node": ">=10.0.0" 3872 + }, 3873 + "peerDependencies": { 3874 + "bufferutil": "^4.0.1", 3875 + "utf-8-validate": ">=5.0.2" 3876 + }, 3877 + "peerDependenciesMeta": { 3878 + "bufferutil": { 3879 + "optional": true 3880 + }, 3881 + "utf-8-validate": { 3882 + "optional": true 3883 + } 3884 + } 3885 + }, 3886 + "node_modules/xml-name-validator": { 3887 + "version": "5.0.0", 3888 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", 3889 + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", 3890 + "dev": true, 3891 + "license": "Apache-2.0", 3892 + "engines": { 3893 + "node": ">=18" 3894 + } 3895 + }, 3896 + "node_modules/xmlchars": { 3897 + "version": "2.2.0", 3898 + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 3899 + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", 3900 + "dev": true, 3901 + "license": "MIT" 3902 + }, 3903 + "node_modules/yallist": { 3904 + "version": "3.1.1", 3905 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3906 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3907 + "license": "ISC" 3908 + }, 3909 + "node_modules/zod": { 3910 + "version": "3.25.76", 3911 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 3912 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 3913 + "license": "MIT", 3914 + "funding": { 3915 + "url": "https://github.com/sponsors/colinhacks" 3916 + } 3917 + } 3918 + } 3919 + }
+35
package.json
··· 1 + { 2 + "name": "statusphere-esav-live", 3 + "private": true, 4 + "type": "module", 5 + "scripts": { 6 + "dev": "vite --port 3000", 7 + "start": "vite --port 3000", 8 + "build": "vite build && tsc", 9 + "serve": "vite preview", 10 + "test": "vitest run" 11 + }, 12 + "dependencies": { 13 + "@atproto/api": "^0.16.2", 14 + "@tanstack/query-db-collection": "^0.2.0", 15 + "@tanstack/react-db": "^0.1.1", 16 + "@tanstack/react-router": "^1.130.2", 17 + "@tanstack/react-router-devtools": "^1.130.2", 18 + "@tanstack/router-plugin": "^1.121.2", 19 + "jotai": "^2.13.0", 20 + "react": "^19.0.0", 21 + "react-dom": "^19.0.0" 22 + }, 23 + "devDependencies": { 24 + "@testing-library/dom": "^10.4.0", 25 + "@testing-library/react": "^16.2.0", 26 + "@types/react": "^19.0.8", 27 + "@types/react-dom": "^19.0.3", 28 + "@vitejs/plugin-react": "^4.3.4", 29 + "jsdom": "^26.0.0", 30 + "typescript": "^5.7.2", 31 + "vite": "^6.3.5", 32 + "vitest": "^3.0.5", 33 + "web-vitals": "^4.2.4" 34 + } 35 + }
public/favicon.ico

This is a binary file and will not be displayed.

public/logo192.png

This is a binary file and will not be displayed.

public/logo512.png

This is a binary file and will not be displayed.

+25
public/manifest.json
··· 1 + { 2 + "short_name": "Statusphere", 3 + "name": "Statusphere ESAV Live", 4 + "icons": [ 5 + { 6 + "src": "favicon.ico", 7 + "sizes": "64x64 32x32 24x24 16x16", 8 + "type": "image/x-icon" 9 + }, 10 + { 11 + "src": "logo192.png", 12 + "type": "image/png", 13 + "sizes": "192x192" 14 + }, 15 + { 16 + "src": "logo512.png", 17 + "type": "image/png", 18 + "sizes": "512x512" 19 + } 20 + ], 21 + "start_url": ".", 22 + "display": "standalone", 23 + "theme_color": "#000000", 24 + "background_color": "#ffffff" 25 + }
+3
public/robots.txt
··· 1 + # https://www.robotstxt.org/robotstxt.html 2 + User-agent: * 3 + Disallow:
+38
src/App.css
··· 1 + .App { 2 + text-align: center; 3 + } 4 + 5 + .App-logo { 6 + height: 40vmin; 7 + pointer-events: none; 8 + } 9 + 10 + @media (prefers-reduced-motion: no-preference) { 11 + .App-logo { 12 + animation: App-logo-spin infinite 20s linear; 13 + } 14 + } 15 + 16 + .App-header { 17 + background-color: #282c34; 18 + min-height: 100vh; 19 + display: flex; 20 + flex-direction: column; 21 + align-items: center; 22 + justify-content: center; 23 + font-size: calc(10px + 2vmin); 24 + color: white; 25 + } 26 + 27 + .App-link { 28 + color: #61dafb; 29 + } 30 + 31 + @keyframes App-logo-spin { 32 + from { 33 + transform: rotate(0deg); 34 + } 35 + to { 36 + transform: rotate(360deg); 37 + } 38 + }
+111
src/esav/ESAVLiveProvider.tsx
··· 1 + import { useSetAtom, useStore } from "jotai"; 2 + import { useEffect, useRef, type PropsWithChildren } from "react"; 3 + import { addLogEntryAtom, documentsAtom, queryStateFamily, websocketAtom, websocketStatusAtom } from './atoms'; 4 + import type { QueryDeltaMessage } from "./types"; 5 + 6 + export function ESAVLiveProvider({ 7 + children, 8 + url, 9 + }: PropsWithChildren<{ url: string }>) { 10 + const store = useStore(); 11 + const setWebsocket = useSetAtom(websocketAtom); 12 + const setWebsocketStatus = useSetAtom(websocketStatusAtom); 13 + const addLog = useSetAtom(addLogEntryAtom); 14 + 15 + const reconnectTimer = useRef<number | null>(null); 16 + 17 + const isUnmounting = useRef(false); 18 + 19 + useEffect(() => { 20 + let reconnectAttempts = 0; 21 + const connect = () => { 22 + if (isUnmounting.current) return; 23 + 24 + console.log(`[ESAV] Connecting (Attempt ${reconnectAttempts + 1})...`); 25 + setWebsocketStatus("connecting"); 26 + const ws = new WebSocket(url); 27 + 28 + ws.onopen = () => { 29 + console.log("[ESAV] WebSocket connection opened"); 30 + setWebsocketStatus("open"); 31 + setWebsocket(ws); 32 + reconnectAttempts = 0; 33 + if (reconnectTimer.current) { 34 + clearTimeout(reconnectTimer.current); 35 + } 36 + }; 37 + 38 + ws.onmessage = (event) => { 39 + try { 40 + const message = JSON.parse(event.data); 41 + 42 + if (message.type === "query-delta") { 43 + addLog({ type: 'incoming', payload: message }); 44 + const deltaMessage = message as QueryDeltaMessage; 45 + const { documents, queries } = deltaMessage 46 + 47 + if (documents) { 48 + store.set(documentsAtom, (prev) => ({ ...prev, ...documents })); 49 + } 50 + 51 + if (queries) { 52 + for (const queryId in queries) { 53 + const targetQueryAtom = queryStateFamily(queryId); 54 + store.set(targetQueryAtom, queries[queryId]); 55 + } 56 + } 57 + } else if (message.type === "ping") { 58 + ws.send(JSON.stringify({ type: "pong" })); 59 + } else if (message.type === "error") { 60 + addLog({ type: 'incoming', payload: message }); 61 + console.error("[ESAV] Received error from server:", message.error); 62 + } 63 + } catch (e) { 64 + console.error("[ESAV] Failed to parse message from server", e); 65 + } 66 + }; 67 + ws.onclose = () => { 68 + console.log("[ESAV] WebSocket connection closed"); 69 + setWebsocket(null); 70 + if (isUnmounting.current) { 71 + console.log("[ESAV] Unmounting, not reconnecting."); 72 + return; 73 + } 74 + 75 + setWebsocketStatus("closed"); 76 + 77 + const delay = Math.min(1000 * 2 ** reconnectAttempts, 30000); 78 + console.log(`[ESAV] Will attempt to reconnect in ${delay / 1000}s`); 79 + reconnectAttempts++; 80 + 81 + if (reconnectTimer.current) clearTimeout(reconnectTimer.current); 82 + reconnectTimer.current = setTimeout(connect, delay); 83 + }; 84 + 85 + ws.onerror = (err) => { 86 + console.error("[ESAV] WebSocket error", err); 87 + ws.close(); 88 + }; 89 + }; 90 + 91 + isUnmounting.current = false; 92 + connect(); 93 + 94 + return () => { 95 + isUnmounting.current = true; 96 + console.log( 97 + "[ESAV] Provider unmounting. Cleaning up timers and connection." 98 + ); 99 + if (reconnectTimer.current) { 100 + clearTimeout(reconnectTimer.current); 101 + } 102 + const currentWs = store.get(websocketAtom); 103 + if (currentWs) { 104 + currentWs.onclose = null; 105 + currentWs.close(); 106 + } 107 + }; 108 + }, [url, store, setWebsocket, setWebsocketStatus]); 109 + 110 + return <>{children}</>; 111 + }
+69
src/esav/atoms.ts
··· 1 + import { atom } from 'jotai'; 2 + import { atomFamily } from 'jotai/utils'; 3 + import type { EsavDocument, QueryState, LogEntry } from './types'; 4 + const MAX_LOG_SIZE = 500; 5 + 6 + /** 7 + * Manages the WebSocket instance itself. 8 + * Should only be written to by the provider. 9 + */ 10 + export const websocketAtom = atom<WebSocket | null>(null); 11 + 12 + /** 13 + * Tracks the current status of the WebSocket connection. 14 + */ 15 + export const websocketStatusAtom = atom<'connecting' | 'open' | 'closed'>('closed'); 16 + 17 + /** 18 + * A global, normalized cache for all documents received from the server. 19 + * Maps a document URI (at://...) to its full data. 20 + * This prevents data duplication across multiple queries. 21 + */ 22 + export const documentsAtom = atom<Record<string, EsavDocument>>({}); 23 + 24 + /** 25 + * A family of atoms to hold the state for each individual query. 26 + * You get the state for a query by providing its unique queryId. 27 + */ 28 + export const queryStateFamily = atomFamily((_queryId: string) => 29 + atom<QueryState | null>(null) 30 + ); 31 + 32 + /** 33 + * Tracks active subscriptions and their component usage count. 34 + * This is an internal atom used by our hooks to know when to 35 + * send `subscribe` and `unsubscribe` messages. 36 + */ 37 + export const activeSubscriptionsAtom = atom< 38 + Record<string, { count: number; esQuery: Record<string, any> }> 39 + >({}); 40 + 41 + 42 + /** 43 + * Holds the array of log entries for display. 44 + */ 45 + export const logEntriesAtom = atom<LogEntry[]>([]); 46 + 47 + let logIdCounter = 0; 48 + 49 + /** 50 + * A "write-only" atom to add a new entry to the log. 51 + * This encapsulates the logic for creating a new entry with an ID and timestamp. 52 + * Any component can call this to add a log without needing to know the implementation details. 53 + */ 54 + export const addLogEntryAtom = atom( 55 + null, 56 + (get, set, newEntry: Omit<LogEntry, 'id' | 'timestamp'>) => { 57 + const entry: LogEntry = { 58 + id: logIdCounter++, 59 + timestamp: new Date(), 60 + ...newEntry, 61 + }; 62 + const currentLog = get(logEntriesAtom); 63 + const newLog = [entry, ...currentLog]; 64 + if (newLog.length > MAX_LOG_SIZE) { 65 + newLog.length = MAX_LOG_SIZE; 66 + } 67 + set(logEntriesAtom, newLog); 68 + } 69 + );
+118
src/esav/hooks.ts
··· 1 + import { useAtom, useAtomValue, useSetAtom } from 'jotai'; 2 + import { useEffect, useMemo, useRef } from 'react'; 3 + import { 4 + activeSubscriptionsAtom, 5 + documentsAtom, 6 + queryStateFamily, 7 + websocketAtom, 8 + websocketStatusAtom, 9 + addLogEntryAtom 10 + } from './atoms'; 11 + import type { SubscribeMessage, UnsubscribeMessage } from './types'; 12 + 13 + interface UseEsavQueryOptions { 14 + enabled?: boolean; 15 + } 16 + 17 + /** 18 + * The primary hook for subscribing to a live query and getting its results. 19 + * Manages sending subscribe/unsubscribe messages automatically. 20 + * 21 + * @param queryId A unique ID for this query. 22 + * @param esQuery The full Elasticsearch query object. 23 + * @param options Hook options, like `enabled`. 24 + * @returns The hydrated query results and loading status. 25 + */ 26 + export function useEsavQuery( 27 + queryId: string, 28 + esQuery: Record<string, any>, 29 + options: UseEsavQueryOptions = { enabled: true } 30 + ) { 31 + // @ts-expect-error intended 32 + const [activeSubscriptions, setActiveSubscriptions] = useAtom(activeSubscriptionsAtom); 33 + const ws = useAtomValue(websocketAtom); 34 + const addLog = useSetAtom(addLogEntryAtom); 35 + const wsStatus = useAtomValue(websocketStatusAtom); 36 + const queryState = useAtomValue(queryStateFamily(queryId)); 37 + const allDocuments = useAtomValue(documentsAtom); 38 + 39 + const { enabled = true } = options; 40 + const stringifiedEsQuery = useMemo(() => JSON.stringify(esQuery), [esQuery]); 41 + 42 + const esQueryRef = useRef(esQuery); 43 + const queryStateRef = useRef(queryState); 44 + useEffect(() => { 45 + esQueryRef.current = esQuery; 46 + queryStateRef.current = queryState; 47 + }); 48 + 49 + useEffect(() => { 50 + if (!enabled || wsStatus !== 'open' || !ws) { 51 + return; 52 + } 53 + 54 + const currentQuery = esQueryRef.current; 55 + 56 + setActiveSubscriptions((prev) => { 57 + const count = prev[queryId]?.count ?? 0; 58 + if (count === 0) { 59 + console.log(`[ESAV] Subscribing to ${queryId}`); 60 + const message: SubscribeMessage = { 61 + type: 'subscribe', 62 + queryId, 63 + esquery: currentQuery, 64 + ecid: queryStateRef.current?.ecid, 65 + }; 66 + addLog({ type: 'outgoing', payload: message }); 67 + ws.send(JSON.stringify(message)); 68 + } 69 + return { ...prev, [queryId]: { count: count + 1, esQuery: currentQuery } }; 70 + }); 71 + 72 + return () => { 73 + setActiveSubscriptions((prev) => { 74 + const count = prev[queryId]?.count ?? 1; 75 + if (count <= 1) { 76 + console.log(`[ESAV] Unsubscribing from ${queryId}`); 77 + if (ws.readyState === WebSocket.OPEN) { 78 + const message: UnsubscribeMessage = { type: 'unsubscribe', queryId }; 79 + addLog({ type: 'outgoing', payload: message }); 80 + ws.send(JSON.stringify(message)); 81 + } 82 + const { [queryId]: _, ...rest } = prev; 83 + return rest; 84 + } else { 85 + return { ...prev, [queryId]: { ...prev[queryId], count: count - 1 } }; 86 + } 87 + }); 88 + }; 89 + }, [queryId, stringifiedEsQuery, enabled, ws, wsStatus, setActiveSubscriptions]); 90 + 91 + 92 + const hydratedData = useMemo(() => { 93 + if (!queryState?.result) return []; 94 + return queryState.result 95 + .map((uri) => allDocuments[uri]) 96 + .filter(Boolean); 97 + }, [queryState?.result, allDocuments]); 98 + 99 + const isLoading = wsStatus !== 'open' || queryState === null; 100 + 101 + return { 102 + data: hydratedData, 103 + uris: queryState?.result ?? [], 104 + ecid: queryState?.ecid, 105 + isLoading, 106 + status: wsStatus, 107 + }; 108 + } 109 + 110 + /** 111 + * A simple hook to get a single document from the global cache. 112 + * @param uri The at:// URI of the document. 113 + */ 114 + export function useEsavDocument(uri: string | undefined) { 115 + const allDocuments = useAtomValue(documentsAtom); 116 + if (!uri) return undefined; 117 + return allDocuments[uri]; 118 + }
+41
src/esav/types.ts
··· 1 + // A document as stored in our global cache 2 + export interface EsavDocument { 3 + cid: string; 4 + doc: Record<string, any>; // The indexed column from elasticsearch 5 + } 6 + 7 + // The state for a single query subscription 8 + export interface QueryState { 9 + ecid: string; 10 + result: string[]; // An ordered array of document URIs 11 + } 12 + 13 + // The server->client message we expect 14 + export interface QueryDeltaMessage { 15 + type: 'query-delta'; 16 + documents?: Record<string, EsavDocument>; 17 + queries?: Record<string, QueryState>; 18 + } 19 + 20 + // The client->server message for subscribing 21 + export interface SubscribeMessage { 22 + type: 'subscribe'; 23 + queryId: string; 24 + esquery: Record<string, any>; 25 + ecid?: string; // Optional last known ECID 26 + } 27 + 28 + // The client->server message for unsubscribing 29 + export interface UnsubscribeMessage { 30 + type: 'unsubscribe'; 31 + queryId: string; 32 + } 33 + 34 + export type LogEntryType = 'incoming' | 'outgoing' | 'status' | 'error'; 35 + 36 + export interface LogEntry { 37 + id: number; 38 + timestamp: Date; 39 + type: LogEntryType; 40 + payload: any; 41 + }
+44
src/logo.svg
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <svg id="Layer_1" 3 + xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 841.9 595.3"> 4 + <!-- Generator: Adobe Illustrator 29.3.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 146) --> 5 + <defs> 6 + <style> 7 + .st0 { 8 + fill: #9ae7fc; 9 + } 10 + 11 + .st1 { 12 + fill: #61dafb; 13 + } 14 + </style> 15 + </defs> 16 + <g> 17 + <path class="st1" d="M666.3,296.5c0-32.5-40.7-63.3-103.1-82.4,14.4-63.6,8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6,0,8.3.9,11.4,2.6,13.6,7.8,19.5,37.5,14.9,75.7-1.1,9.4-2.9,19.3-5.1,29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50,32.6-30.3,63.2-46.9,84-46.9v-22.3c-27.5,0-63.5,19.6-99.9,53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7,0,51.4,16.5,84,46.6-14,14.7-28,31.4-41.3,49.9-22.6,2.4-44,6.1-63.6,11-2.3-10-4-19.7-5.2-29-4.7-38.2,1.1-67.9,14.6-75.8,3-1.8,6.9-2.6,11.5-2.6v-22.3c-8.4,0-16,1.8-22.6,5.6-28.1,16.2-34.4,66.7-19.9,130.1-62.2,19.2-102.7,49.9-102.7,82.3s40.7,63.3,103.1,82.4c-14.4,63.6-8,114.2,20.2,130.4,6.5,3.8,14.1,5.6,22.5,5.6,27.5,0,63.5-19.6,99.9-53.6,36.4,33.8,72.4,53.2,99.9,53.2,8.4,0,16-1.8,22.6-5.6,28.1-16.2,34.4-66.7,19.9-130.1,62-19.1,102.5-49.9,102.5-82.3zm-130.2-66.7c-3.7,12.9-8.3,26.2-13.5,39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4,14.2,2.1,27.9,4.7,41,7.9zm-45.8,106.5c-7.8,13.5-15.8,26.3-24.1,38.2-14.9,1.3-30,2-45.2,2s-30.2-.7-45-1.9c-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8,6.2-13.4,13.2-26.8,20.7-39.9,7.8-13.5,15.8-26.3,24.1-38.2,14.9-1.3,30-2,45.2-2s30.2.7,45,1.9c8.3,11.9,16.4,24.6,24.2,38,7.6,13.1,14.5,26.4,20.8,39.8-6.3,13.4-13.2,26.8-20.7,39.9zm32.3-13c5.4,13.4,10,26.8,13.8,39.8-13.1,3.2-26.9,5.9-41.2,8,4.9-7.7,9.8-15.6,14.4-23.7,4.6-8,8.9-16.1,13-24.1zm-101.4,106.7c-9.3-9.6-18.6-20.3-27.8-32,9,.4,18.2.7,27.5.7s18.7-.2,27.8-.7c-9,11.7-18.3,22.4-27.5,32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9,3.7-12.9,8.3-26.2,13.5-39.5,4.1,8,8.4,16,13.1,24s9.5,15.8,14.4,23.4zm73.9-208.1c9.3,9.6,18.6,20.3,27.8,32-9-.4-18.2-.7-27.5-.7s-18.7.2-27.8.7c9-11.7,18.3-22.4,27.5-32zm-74,58.9c-4.9,7.7-9.8,15.6-14.4,23.7-4.6,8-8.9,16-13,24-5.4-13.4-10-26.8-13.8-39.8,13.1-3.1,26.9-5.8,41.2-7.9zm-90.5,125.2c-35.4-15.1-58.3-34.9-58.3-50.6s22.9-35.6,58.3-50.6c8.6-3.7,18-7,27.7-10.1,5.7,19.6,13.2,40,22.5,60.9-9.2,20.8-16.6,41.1-22.2,60.6-9.9-3.1-19.3-6.5-28-10.2zm53.8,142.9c-13.6-7.8-19.5-37.5-14.9-75.7,1.1-9.4,2.9-19.3,5.1-29.4,19.6,4.8,41,8.5,63.5,10.9,13.5,18.5,27.5,35.3,41.6,50-32.6,30.3-63.2,46.9-84,46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7,38.2-1.1,67.9-14.6,75.8-3,1.8-6.9,2.6-11.5,2.6-20.7,0-51.4-16.5-84-46.6,14-14.7,28-31.4,41.3-49.9,22.6-2.4,44-6.1,63.6-11,2.3,10.1,4.1,19.8,5.2,29.1zm38.5-66.7c-8.6,3.7-18,7-27.7,10.1-5.7-19.6-13.2-40-22.5-60.9,9.2-20.8,16.6-41.1,22.2-60.6,9.9,3.1,19.3,6.5,28.1,10.2,35.4,15.1,58.3,34.9,58.3,50.6,0,15.7-23,35.6-58.4,50.6zm-264.9-268.7z"/> 18 + <circle class="st1" cx="420.9" cy="296.5" r="45.7"/> 19 + <path class="st1" d="M520.5,78.1"/> 20 + </g> 21 + <circle class="st0" cx="420.8" cy="296.6" r="43"/> 22 + <path class="st1" d="M466.1,296.6c0,25-20.2,45.2-45.2,45.2s-45.2-20.2-45.2-45.2,20.2-45.2,45.2-45.2,45.2,20.2,45.2,45.2ZM386,295.6v-6.3c0-1.1,1.2-5.1,1.8-6.2,1-1.9,2.9-3.5,4.6-4.7l-3.4-3.4c4-3.6,9.4-3.7,13.7-.7,1.9-4.7,6.6-7.1,11.6-6.7l-.8,4.2c5.9.2,13.1,4.1,13.1,10.8s0,.5-.7.7c-1.7.3-3.4-.4-5-.6s-1.2-.4-1.2.3,2.5,4.1,3,5.5,1,3.5.8,5.3c-5.6-.8-10.5-3.2-14.8-6.7.3,2.6,4.1,21.7,5.3,21.9s.8-.6,1-1.1,1.3-6.3,1.3-6.7c0-1-1.7-1.8-2.2-2.8-1.2-2.7,1.3-4.7,3.7-3.3s5.2,6.2,7.5,7.3,13,1.4,14.8,3.3-2.9,4.6-1.5,7.6c6.7-2.6,13.5-3.3,20.6-2.5,3.1-9.7,3.1-20.3-.9-29.8-7.3,0-14.7-3.6-17.2-10.8-2.5-7.2-.7-8.6-1.3-9.3-.8-1-6.3.6-7.4-1.5s.3-1.1-.2-1.4-1.9-.6-2.6-.8c-26-6.4-51.3,15.7-49.7,42.1,0,1.6,1.6,10.3,2.4,11.1s4.8,0,6.3,0,3.7.3,5,.5c2.9.4,7.2,2.4,9.4,2.5s2.4-.8,2.7-2.4c.4-2.6.5-7.4.5-10.1s-1-7.8-1.3-11.6c-.9-.2-.7,0-.9.5-.7,1.3-1.1,3.2-1.9,4.8s-5.2,8.7-5.7,9-.7-.5-.8-.8c-1.6-3.5-2-7.9-1.9-11.8-.9-1-5.4,4.9-6.7,5.3l-.8-.4v-.3h-.2ZM455.6,276.4c1.1-1.2-6-8.9-7.2-10-3-2.7-5.4-4.5-3.5,1.4s5.7,7.8,10.6,8.5h.1ZM410.9,270.1c-.4-.5-6.1,2.9-5.5,4.6,1.9-1.3,5.9-1.7,5.5-4.6ZM400.4,276.4c-.3-2.4-6.3-2.7-7.2-1s1.6,1.4,1.9,1.4c1.8.3,3.5-.6,5.2-.4h.1ZM411.3,276.8c3.8,1.3,6.6,3.6,10.9,3.7s0-3-1.2-3.9c-2.2-1.7-5.1-2.4-7.8-2.4s-1.6-.3-1.4.4c2.8.6,7.3.7,8.4,3.8-2.3-.3-3.9-1.6-6.2-2s-2.5-.5-2.6.3h0ZM420.6,290.3c-.8-5.1-5.7-10.8-10.9-11.6s-1.3-.4-.8.5,4.7,3.2,5.7,4,4.5,4.2,2.1,3.8-8.4-7.8-9.4-6.7c.2.9,1.1,1.9,1.7,2.7,3,3.8,6.9,6.8,11.8,7.4h-.2ZM395.3,279.8c-5,1.1-6.9,6.3-6.7,11,.7.8,5-3.8,5.4-4.5s2.7-4.6,1.1-4-2.9,4.4-4.2,4.6.2-2.1.4-2.5c1.1-1.6,2.9-3.1,4-4.6h0ZM400.4,281.5c-.4-.5-2,1.3-2.3,1.7-2.9,3.9-2.6,10.2-1.5,14.8.8.2.8-.3,1.2-.7,3-3.8,5.5-10.5,4.5-15.4-2.1,3.1-3.1,7.3-3.6,11h-1.3c0-4,1.9-7.7,3-11.4h0ZM426.9,305.9c0-1.7-1.7-1.4-2.5-1.9s-1.3-1.9-3-1.4c1.3,2.1,3,3.2,5.5,3.4h0ZM417.2,308.5c7.6.7,5.5-1.9,1.4-5.5-1.3-.3-1.5,4.5-1.4,5.5ZM437,309.7c-3.5-.3-7.8-2-11.2-2.1s-1.3,0-1.9.7c4,1.3,8.4,1.7,12.1,4l1-2.5h0ZM420.5,312.8c-7.3,0-15.1,3.7-20.4,8.8s-4.8,5.3-4.8,6.2c0,1.8,8.6,6.2,10.5,6.8,12.1,4.8,27.5,3.5,38.2-4.2s3.1-2.7,0-6.2c-5.7-6.6-14.7-11.4-23.4-11.3h-.1ZM398.7,316.9c-1.4-1.4-5-1.9-7-2.1s-5.3-.3-6.9.6l13.9,1.4h0ZM456.9,314.8h-7.4c-.9,0-4.9,1.1-6,1.6s-.8.6,0,.5c2.4,0,5.1-1,7.6-1.3s3.5.2,5.1,0,1.3-.3.6-.8h0Z"/> 23 + <path class="st0" d="M386,295.6l.8.4c1.3-.3,5.8-6.2,6.7-5.3,0,3.9.3,8.3,1.9,11.8s0,1.2.8.8,5.1-7.8,5.7-9,1.3-3.5,1.9-4.8,0-.7.9-.5c.3,3.8,1.2,7.8,1.3,11.6s0,7.5-.5,10.1-1.1,2.4-2.7,2.4-6.5-2.1-9.4-2.5-3.7-.5-5-.5-5.4,1.1-6.3,0-2.2-9.5-2.4-11.1c-1.5-26.4,23.7-48.5,49.7-42.1s2.2.4,2.6.8,0,1,.2,1.4c1.1,2,6.5.5,7.4,1.5s.4,6.9,1.3,9.3c2.5,7.2,10,10.9,17.2,10.8,4,9.4,4,20.1.9,29.8-7.2-.7-13.9,0-20.6,2.5-1.3-3.1,4.1-5.1,1.5-7.6s-11.8-1.9-14.8-3.3-5.4-6.1-7.5-7.3-4.9.6-3.7,3.3,2.1,1.8,2.2,2.8-1,6.2-1.3,6.7-.3,1.3-1,1.1c-1.1-.3-5-19.3-5.3-21.9,4.3,3.5,9.2,5.9,14.8,6.7.2-1.9-.3-3.5-.8-5.3s-3-5.1-3-5.5c0-.8.9-.3,1.2-.3,1.6,0,3.3.8,5,.6s.7.3.7-.7c0-6.6-7.2-10.6-13.1-10.8l.8-4.2c-5.1-.3-9.6,2-11.6,6.7-4.3-3-9.8-3-13.7.7l3.4,3.4c-1.8,1.3-3.5,2.8-4.6,4.7s-1.8,5.1-1.8,6.2v6.6h.2ZM431.6,265c7.8,2.1,8.7-3.5.2-1.3l-.2,1.3ZM432.4,270.9c.3.6,6.4-.4,5.8-2.3s-4.6.6-5.7.6l-.2,1.7h.1ZM434.5,276c.8,1.2,5.7-1.8,5.5-2.7-.4-1.9-6.6,1.2-5.5,2.7ZM442.9,276.4c-.9-.9-5,2.8-4.6,4,.6,2.4,5.7-3,4.6-4ZM445.1,279.9c-.3.2-3.1,4.6-1.5,5s3.5-3.4,3.5-4-1.3-1.3-2-.9h0ZM448.9,287.4c2.1.8,3.8-5.1,2.3-5.5-1.9-.6-2.6,5.1-2.3,5.5ZM457.3,288.6c.5-1.7,1.1-4.7-1-5.5-1,.3-.6,3.9-.6,4.8l.3.5,1.3.2h0Z"/> 24 + <path class="st0" d="M455.6,276.4c-5-.8-9.1-3.6-10.6-8.5s.5-4,3.5-1.4,8.3,8.7,7.2,10h-.1Z"/> 25 + <path class="st0" d="M420.6,290.3c-4.9-.6-8.9-3.6-11.8-7.4s-1.5-1.8-1.7-2.7c1-1,8.5,6.6,9.4,6.7,2.4.4-1.8-3.5-2.1-3.8-1-.8-5.4-3.5-5.7-4-.4-.8.5-.5.8-.5,5.2.8,10.1,6.6,10.9,11.6h.2Z"/> 26 + <path class="st0" d="M400.4,281.5c-1.1,3.7-3,7.3-3,11.4h1.3c.5-3.7,1.5-7.8,3.6-11,1,4.8-1.5,11.6-4.5,15.4s-.4.8-1.2.7c-1.1-4.5-1.3-10.8,1.5-14.8s1.9-2.2,2.3-1.7h0Z"/> 27 + <path class="st0" d="M411.3,276.8c0-.8,2.1-.4,2.6-.3,2.4.4,4,1.7,6.2,2-1.2-3.1-5.7-3.2-8.4-3.8,0-.8.9-.4,1.4-.4,2.8,0,5.6.7,7.8,2.4,2.2,1.7,4,4,1.2,3.9-4.3,0-7.1-2.4-10.9-3.7h0Z"/> 28 + <path class="st0" d="M395.3,279.8c-1.1,1.6-3,3-4,4.6s-1.9,2.8-.4,2.5,2.8-4,4.2-4.6-.9,3.6-1.1,4c-.4.7-4.7,5.2-5.4,4.5-.2-4.6,1.8-9.9,6.7-11h0Z"/> 29 + <path class="st0" d="M437,309.7l-1,2.5c-3.6-2.3-8-2.8-12.1-4,.5-.7,1.1-.7,1.9-.7,3.4,0,7.8,1.8,11.2,2.1h0Z"/> 30 + <path class="st0" d="M417.2,308.5c0-1,0-5.8,1.4-5.5,4,3.5,6.1,6.2-1.4,5.5Z"/> 31 + <path class="st0" d="M400.4,276.4c-1.8-.3-3.5.7-5.2.4s-2.3-.8-1.9-1.4c.8-1.6,6.9-1.4,7.2,1h-.1Z"/> 32 + <path class="st0" d="M410.9,270.1c.4,3-3.6,3.3-5.5,4.6-.6-1.8,5-5.1,5.5-4.6Z"/> 33 + <path class="st0" d="M426.9,305.9c-2.5-.2-4.1-1.3-5.5-3.4,1.7-.4,2,.8,3,1.4s2.6.3,2.5,1.9h0Z"/> 34 + <path class="st1" d="M432.4,270.9l.2-1.7c1.1,0,5.1-2.2,5.7-.6s-5.5,2.9-5.8,2.3h-.1Z"/> 35 + <path class="st1" d="M431.6,265l.2-1.3c8.4-2.1,7.7,3.4-.2,1.3Z"/> 36 + <path class="st1" d="M434.5,276c-1.1-1.5,5.1-4.6,5.5-2.7s-4.6,4-5.5,2.7Z"/> 37 + <path class="st1" d="M442.9,276.4c1.1,1.1-4,6.4-4.6,4s3.7-4.9,4.6-4Z"/> 38 + <path class="st1" d="M445.1,279.9c.7-.4,2.1,0,2,.9s-2.4,4.4-3.5,4,1.3-4.8,1.5-5h0Z"/> 39 + <path class="st1" d="M448.9,287.4c-.3-.3.4-6.1,2.3-5.5,1.4.4-.2,6.2-2.3,5.5Z"/> 40 + <path class="st1" d="M457.3,288.6l-1.3-.2-.3-.5c0-.9-.4-4.6.6-4.8,2.1.8,1.5,3.8,1,5.5h0Z"/> 41 + <path class="st0" d="M420.5,312.8c8.9,0,17.9,4.7,23.4,11.3,5.6,6.6,3.8,3.5,0,6.2-10.7,7.7-26.1,9-38.2,4.2-1.9-.8-10.5-5.1-10.5-6.8s4-5.3,4.8-6.2c5.3-5,13.1-8.6,20.4-8.8h.1Z"/> 42 + <path class="st0" d="M398.7,316.9l-13.9-1.4c1.7-1,5-.8,6.9-.6s5.6.7,7,2.1h0Z"/> 43 + <path class="st0" d="M456.9,314.8c.7.5,0,.8-.6.8-1.6.2-3.5-.2-5.1,0-2.4.3-5.2,1.2-7.6,1.3s-1.1,0,0-.5,5.1-1.6,6-1.6h7.4,0Z"/> 44 + </svg>
+50
src/main.tsx
··· 1 + import { StrictMode } from 'react' 2 + import ReactDOM from 'react-dom/client' 3 + import { RouterProvider, createRouter } from '@tanstack/react-router' 4 + 5 + // Import the generated route tree 6 + import { routeTree } from './routeTree.gen' 7 + 8 + import './styles.css' 9 + import reportWebVitals from './reportWebVitals.ts' 10 + import { AuthProvider } from './resuablepasslogin/PassAuthProvider.tsx' 11 + import { ESAVLiveProvider } from './esav/ESAVLiveProvider.tsx' 12 + 13 + const ESAV_WEBSOCKET_URL = 'wss://esav.whey.party/xrpc/party.whey.esav.esSync'; 14 + 15 + // Create a new router instance 16 + const router = createRouter({ 17 + routeTree, 18 + context: {}, 19 + defaultPreload: 'intent', 20 + scrollRestoration: true, 21 + defaultStructuralSharing: true, 22 + defaultPreloadStaleTime: 0, 23 + }) 24 + 25 + // Register the router instance for type safety 26 + declare module '@tanstack/react-router' { 27 + interface Register { 28 + router: typeof router 29 + } 30 + } 31 + 32 + // Render the app 33 + const rootElement = document.getElementById('app') 34 + if (rootElement && !rootElement.innerHTML) { 35 + const root = ReactDOM.createRoot(rootElement) 36 + root.render( 37 + // <StrictMode> 38 + <ESAVLiveProvider url={ESAV_WEBSOCKET_URL}> 39 + <AuthProvider> 40 + <RouterProvider router={router} /> 41 + </AuthProvider> 42 + </ESAVLiveProvider> 43 + //</StrictMode>, 44 + ) 45 + } 46 + 47 + // If you want to start measuring performance in your app, pass a function 48 + // to log results (for example: reportWebVitals(console.log)) 49 + // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 50 + reportWebVitals()
+13
src/reportWebVitals.ts
··· 1 + const reportWebVitals = (onPerfEntry?: () => void) => { 2 + if (onPerfEntry && onPerfEntry instanceof Function) { 3 + import('web-vitals').then(({ onCLS, onINP, onFCP, onLCP, onTTFB }) => { 4 + onCLS(onPerfEntry) 5 + onINP(onPerfEntry) 6 + onFCP(onPerfEntry) 7 + onLCP(onPerfEntry) 8 + onTTFB(onPerfEntry) 9 + }) 10 + } 11 + } 12 + 13 + export default reportWebVitals
+314
src/resuablepasslogin/Login.tsx
··· 1 + import React, { useEffect, useState, useRef } from "react"; 2 + import { useAuth } from "./PassAuthProvider"; 3 + 4 + interface LoginProps { 5 + compact?: boolean; 6 + } 7 + 8 + export default function Login({ compact = false }: LoginProps) { 9 + const { loginStatus, login, logout, loading, authed } = useAuth(); 10 + const [user, setUser] = useState(""); 11 + const [password, setPassword] = useState(""); 12 + const [serviceURL, setServiceURL] = useState("bsky.social"); 13 + const [showLoginForm, setShowLoginForm] = useState(false); 14 + const formRef = useRef<HTMLDivElement>(null); 15 + 16 + useEffect(() => { 17 + function handleClickOutside(event: MouseEvent) { 18 + if (formRef.current && !formRef.current.contains(event.target as Node)) { 19 + setShowLoginForm(false); 20 + } 21 + } 22 + 23 + if (showLoginForm) { 24 + document.addEventListener("mousedown", handleClickOutside); 25 + } 26 + 27 + return () => { 28 + document.removeEventListener("mousedown", handleClickOutside); 29 + }; 30 + }, [showLoginForm]); 31 + 32 + if (loading) { 33 + return ( 34 + <div 35 + style={{ 36 + display: "flex", 37 + alignItems: "center", 38 + justifyContent: "center", 39 + padding: "1.5rem", 40 + color: "#6b7280", 41 + }} 42 + > 43 + Loading... 44 + </div> 45 + ); 46 + } 47 + 48 + if (compact) { 49 + if (authed) { 50 + return ( 51 + <button 52 + onClick={logout} 53 + style={{ 54 + fontSize: "0.875rem", 55 + lineHeight: "1.25rem", 56 + backgroundColor: "#4b5563", // hover: backgroundColor: '#374151' 57 + color: "#ffffff", 58 + borderRadius: "0.25rem", 59 + padding: "0.25rem 0.75rem", 60 + fontWeight: "500", 61 + transition: "background-color 150ms cubic-bezier(0.4, 0, 0.2, 1)", 62 + }} 63 + > 64 + Log out 65 + </button> 66 + ); 67 + } else { 68 + return ( 69 + <div style={{ position: "relative" }} ref={formRef}> 70 + <button 71 + onClick={() => setShowLoginForm(!showLoginForm)} 72 + style={{ 73 + fontSize: "0.875rem", 74 + lineHeight: "1.25rem", 75 + backgroundColor: "#4b5563", // hover: backgroundColor: '#374151' 76 + color: "#ffffff", 77 + borderRadius: "0.25rem", 78 + padding: "0.25rem 0.75rem", 79 + fontWeight: "500", 80 + transition: "background-color 150ms cubic-bezier(0.4, 0, 0.2, 1)", 81 + }} 82 + > 83 + Log in 84 + </button> 85 + {showLoginForm && ( 86 + <div 87 + style={{ 88 + position: "absolute", 89 + top: "100%", 90 + right: "0px", 91 + marginTop: "0.5rem", 92 + width: "20rem", 93 + backgroundColor: "#ffffff", // dark: backgroundColor: '#111827' 94 + borderRadius: "0.5rem", 95 + boxShadow: 96 + "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)", 97 + border: "1px solid #e5e7eb", // dark: border: '1px solid #374151' 98 + padding: "1rem", 99 + zIndex: 50, 100 + }} 101 + > 102 + <form 103 + onSubmit={(e) => { 104 + e.preventDefault(); 105 + login(user, password, `https://${serviceURL}`); 106 + setShowLoginForm(false); 107 + }} 108 + style={{ 109 + display: "flex", 110 + flexDirection: "column", 111 + gap: "0.75rem", 112 + }} 113 + > 114 + <p 115 + style={{ 116 + fontSize: "0.75rem", 117 + lineHeight: "1rem", 118 + color: "#6b7280", // dark: color: '#9ca3af' 119 + }} 120 + > 121 + sorry for the temporary login, 122 + <br /> 123 + oauth will come soon enough i swear 124 + </p> 125 + <input 126 + type="text" 127 + placeholder="Username" 128 + value={user} 129 + onChange={(e) => setUser(e.target.value)} 130 + style={{ 131 + padding: "0.5rem 0.75rem", 132 + borderRadius: "0.25rem", 133 + border: "1px solid #d1d5db", // dark: border: '1px solid #374151' 134 + backgroundColor: "#ffffff", // dark: backgroundColor: '#1f2937' 135 + color: "#111827", // dark: color: '#f3f4f6' 136 + fontSize: "0.875rem", 137 + lineHeight: "1.25rem", 138 + // focus: outline: 'none', boxShadow: '0 0 0 2px #3b82f6' 139 + }} 140 + autoComplete="username" 141 + /> 142 + <input 143 + type="password" 144 + placeholder="Password" 145 + value={password} 146 + onChange={(e) => setPassword(e.target.value)} 147 + style={{ 148 + padding: "0.5rem 0.75rem", 149 + borderRadius: "0.25rem", 150 + border: "1px solid #d1d5db", // dark: border: '1px solid #374151' 151 + backgroundColor: "#ffffff", // dark: backgroundColor: '#1f2937' 152 + color: "#111827", // dark: color: '#f3f4f6' 153 + fontSize: "0.875rem", 154 + lineHeight: "1.25rem", 155 + // focus: outline: 'none', boxShadow: '0 0 0 2px #3b82f6' 156 + }} 157 + autoComplete="current-password" 158 + /> 159 + <input 160 + type="text" 161 + placeholder="bsky.social" 162 + value={serviceURL} 163 + onChange={(e) => setServiceURL(e.target.value)} 164 + style={{ 165 + padding: "0.5rem 0.75rem", 166 + borderRadius: "0.25rem", 167 + border: "1px solid #d1d5db", // dark: border: '1px solid #374151' 168 + backgroundColor: "#ffffff", // dark: backgroundColor: '#1f2937' 169 + color: "#111827", // dark: color: '#f3f4f6' 170 + fontSize: "0.875rem", 171 + lineHeight: "1.25rem", 172 + // focus: outline: 'none', boxShadow: '0 0 0 2px #3b82f6' 173 + }} 174 + /> 175 + <button 176 + type="submit" 177 + style={{ 178 + backgroundColor: "#4b5563", // hover: backgroundColor: '#374151' 179 + color: "#ffffff", 180 + borderRadius: "0.25rem", 181 + padding: "0.5rem 1rem", 182 + fontWeight: "500", 183 + fontSize: "0.875rem", 184 + lineHeight: "1.25rem", 185 + transition: 186 + "background-color 150ms cubic-bezier(0.4, 0, 0.2, 1)", 187 + }} 188 + > 189 + Log in 190 + </button> 191 + </form> 192 + </div> 193 + )} 194 + </div> 195 + ); 196 + } 197 + } 198 + 199 + return ( 200 + <div className="p-6 bg-gray-100 dark:bg-gray-900 rounded-xl shadow border border-gray-200 dark:border-gray-800 mt-6 mx-4"> 201 + {authed ? ( 202 + <div className="flex flex-col items-center justify-center text-center"> 203 + <p className="text-lg font-semibold mb-6 text-gray-800 dark:text-gray-100"> 204 + You are logged in! 205 + </p> 206 + <button 207 + onClick={logout} 208 + className="bg-gray-600 hover:bg-gray-700 text-white rounded px-6 py-2 font-semibold text-base transition-colors" 209 + > 210 + Log out 211 + </button> 212 + </div> 213 + ) : ( 214 + <form 215 + onSubmit={(e) => { 216 + e.preventDefault(); 217 + login(user, password, `https://${serviceURL}`); 218 + }} 219 + className="flex flex-col gap-4" 220 + > 221 + <p className="text-sm text-gray-500 dark:text-gray-400 mb-2"> 222 + sorry for the temporary login, 223 + <br /> 224 + oauth will come soon enough i swear 225 + </p> 226 + <input 227 + type="text" 228 + placeholder="Username" 229 + value={user} 230 + onChange={(e) => setUser(e.target.value)} 231 + className="px-3 py-2 rounded border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 text-base focus:outline-none focus:ring-2 focus:ring-blue-500" 232 + autoComplete="username" 233 + /> 234 + <input 235 + type="password" 236 + placeholder="Password" 237 + value={password} 238 + onChange={(e) => setPassword(e.target.value)} 239 + className="px-3 py-2 rounded border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 text-base focus:outline-none focus:ring-2 focus:ring-blue-500" 240 + autoComplete="current-password" 241 + /> 242 + <input 243 + type="text" 244 + placeholder="bsky.social" 245 + value={serviceURL} 246 + onChange={(e) => setServiceURL(e.target.value)} 247 + className="px-3 py-2 rounded border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 text-base focus:outline-none focus:ring-2 focus:ring-blue-500" 248 + /> 249 + <button 250 + type="submit" 251 + className="bg-gray-600 hover:bg-gray-700 text-white rounded px-6 py-2 font-semibold text-base transition-colors mt-2" 252 + > 253 + Log in 254 + </button> 255 + </form> 256 + )} 257 + </div> 258 + ); 259 + } 260 + 261 + export const ProfileThing = () => { 262 + const { agent, loading, loginStatus, authed } = useAuth(); 263 + const [response, setResponse] = useState<any>(null); 264 + 265 + useEffect(() => { 266 + if (loginStatus && agent && !loading && authed) { 267 + fetchUser(); 268 + } 269 + }, [loginStatus, agent, loading, authed]); 270 + 271 + const fetchUser = async () => { 272 + if (!agent) { 273 + console.error("Agent is null or undefined"); 274 + return; 275 + } 276 + const res = await agent.app.bsky.actor.getProfile({ 277 + actor: agent.assertDid, 278 + }); 279 + setResponse(res.data); 280 + }; 281 + 282 + if (!authed) { 283 + return ( 284 + <div className="inline-block"> 285 + <span className="text-gray-100 text-base font-medium px-1.5"> 286 + Login 287 + </span> 288 + </div> 289 + ); 290 + } 291 + 292 + if (!response) { 293 + return ( 294 + <div className="flex flex-col items-start gap-1.5"> 295 + <span className="w-5 h-5 border-2 border-gray-200 dark:border-gray-600 border-t-transparent rounded-full animate-spin inline-block" /> 296 + <span className="text-gray-100">Loading... </span> 297 + </div> 298 + ); 299 + } 300 + 301 + return ( 302 + <div className="flex flex-row items-start gap-1.5"> 303 + <img 304 + src={response?.avatar} 305 + alt="avatar" 306 + className="w-[30px] h-[30px] rounded-full object-cover" 307 + /> 308 + <div> 309 + <div className="text-gray-100 text-xs">{response?.displayName}</div> 310 + <div className="text-gray-100 text-xs">@{response?.handle}</div> 311 + </div> 312 + </div> 313 + ); 314 + };
+144
src/resuablepasslogin/PassAuthProvider.tsx
··· 1 + import React, { createContext, useState, useEffect, useContext } from 'react'; 2 + import { AtpAgent, type AtpSessionData } from '@atproto/api'; 3 + 4 + interface AuthContextValue { 5 + agent: AtpAgent | null; 6 + loginStatus: boolean; 7 + login: (user: string, password: string, service?: string) => Promise<void>; 8 + logout: () => Promise<void>; 9 + loading: boolean; 10 + authed: boolean | undefined; 11 + } 12 + 13 + const AuthContext = createContext<AuthContextValue>({} as AuthContextValue); 14 + 15 + export const AuthProvider = ({ children } : { children: React.ReactNode }) => { 16 + const [agent, setAgent] = useState<AtpAgent | null>(null); 17 + const [loginStatus, setLoginStatus] = useState(false); 18 + const [loading, setLoading] = useState(true); 19 + const [increment, setIncrement] = useState(0); 20 + const [authed, setAuthed] = useState<boolean | undefined>(undefined); 21 + 22 + useEffect(() => { 23 + const initialize = async () => { 24 + try { 25 + const service = localStorage.getItem('service'); 26 + // const user = await AsyncStorage.getItem('user'); 27 + // const password = await AsyncStorage.getItem('password'); 28 + const session = localStorage.getItem("sess"); 29 + 30 + if (service && session) { 31 + console.log("Auto-login service is:", service); 32 + const apiAgent = new AtpAgent({ service }); 33 + try { 34 + if (!apiAgent) { 35 + console.log("Agent is null or undefined"); 36 + return; 37 + } 38 + let sess: AtpSessionData = JSON.parse(session); 39 + console.log("resuming session is:", sess); 40 + const { data } = await apiAgent.resumeSession(sess); 41 + console.log("!!!8!!! agent resume session") 42 + setAgent(apiAgent); 43 + setLoginStatus(true); 44 + setLoading(false); 45 + setAuthed(true); 46 + } catch (e) { 47 + console.log("Failed to resume session" + e); 48 + setLoginStatus(true); 49 + localStorage.removeItem("sess"); 50 + localStorage.removeItem('service'); 51 + const apiAgent = new AtpAgent({ service: 'https://api.bsky.app' }); 52 + setAgent(apiAgent); 53 + setLoginStatus(true); 54 + setLoading(false); 55 + setAuthed(false); 56 + return; 57 + } 58 + } 59 + else { 60 + const apiAgent = new AtpAgent({ service: 'https://api.bsky.app' }); 61 + setAgent(apiAgent); 62 + setLoginStatus(true); 63 + setLoading(false); 64 + setAuthed(false); 65 + } 66 + } catch (e) { 67 + console.log('Failed to auto-login:', e); 68 + } finally { 69 + setLoading(false); 70 + } 71 + }; 72 + 73 + initialize(); 74 + }, [increment]); 75 + 76 + const login = async (user: string, password: string, service: string = 'https://bsky.social') => { 77 + try { 78 + let sessionthing 79 + const apiAgent = new AtpAgent({ 80 + service: service, 81 + persistSession: (evt, sess) => { 82 + sessionthing = sess; 83 + }, 84 + }); 85 + await apiAgent.login({ identifier: user, password }); 86 + console.log("!!!8!!! agent logged on") 87 + 88 + localStorage.setItem('service', service); 89 + // await AsyncStorage.setItem('user', user); 90 + // await AsyncStorage.setItem('password', password); 91 + if (sessionthing) { 92 + localStorage.setItem('sess', JSON.stringify(sessionthing)); 93 + } else { 94 + localStorage.setItem('sess', '{}'); 95 + } 96 + 97 + setAgent(apiAgent); 98 + setLoginStatus(true); 99 + setAuthed(true); 100 + } catch (e) { 101 + console.error('Login failed:', e); 102 + } 103 + }; 104 + 105 + const logout = async () => { 106 + if (!agent) { 107 + console.error("Agent is null or undefined"); 108 + return; 109 + } 110 + setLoading(true); 111 + try { 112 + // check if its even in async storage before removing 113 + if (localStorage.getItem('service') && localStorage.getItem('sess')) { 114 + localStorage.removeItem('service'); 115 + localStorage.removeItem('sess'); 116 + } 117 + await agent.logout(); 118 + console.log("!!!8!!! agent logout") 119 + setLoginStatus(false); 120 + setAuthed(undefined); 121 + await agent.com.atproto.server.deleteSession(); 122 + console.log("!!!8!!! agent deltesession") 123 + //setAgent(null); 124 + setIncrement(increment + 1); 125 + } catch (e) { 126 + console.error("Logout failed:", e); 127 + } finally { 128 + setLoading(false); 129 + } 130 + }; 131 + 132 + // why the hell are we doing this 133 + /*if (loading) { 134 + return <div><span>Laoding...ae</span></div>; 135 + }*/ 136 + 137 + return ( 138 + <AuthContext.Provider value={{ agent, loginStatus, login, logout, loading, authed }}> 139 + {children} 140 + </AuthContext.Provider> 141 + ); 142 + }; 143 + 144 + export const useAuth = () => useContext(AuthContext);
+59
src/routeTree.gen.ts
··· 1 + /* eslint-disable */ 2 + 3 + // @ts-nocheck 4 + 5 + // noinspection JSUnusedGlobalSymbols 6 + 7 + // This file was automatically generated by TanStack Router. 8 + // You should NOT make any changes in this file as it will be overwritten. 9 + // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. 10 + 11 + import { Route as rootRouteImport } from './routes/__root' 12 + import { Route as IndexRouteImport } from './routes/index' 13 + 14 + const IndexRoute = IndexRouteImport.update({ 15 + id: '/', 16 + path: '/', 17 + getParentRoute: () => rootRouteImport, 18 + } as any) 19 + 20 + export interface FileRoutesByFullPath { 21 + '/': typeof IndexRoute 22 + } 23 + export interface FileRoutesByTo { 24 + '/': typeof IndexRoute 25 + } 26 + export interface FileRoutesById { 27 + __root__: typeof rootRouteImport 28 + '/': typeof IndexRoute 29 + } 30 + export interface FileRouteTypes { 31 + fileRoutesByFullPath: FileRoutesByFullPath 32 + fullPaths: '/' 33 + fileRoutesByTo: FileRoutesByTo 34 + to: '/' 35 + id: '__root__' | '/' 36 + fileRoutesById: FileRoutesById 37 + } 38 + export interface RootRouteChildren { 39 + IndexRoute: typeof IndexRoute 40 + } 41 + 42 + declare module '@tanstack/react-router' { 43 + interface FileRoutesByPath { 44 + '/': { 45 + id: '/' 46 + path: '/' 47 + fullPath: '/' 48 + preLoaderRoute: typeof IndexRouteImport 49 + parentRoute: typeof rootRouteImport 50 + } 51 + } 52 + } 53 + 54 + const rootRouteChildren: RootRouteChildren = { 55 + IndexRoute: IndexRoute, 56 + } 57 + export const routeTree = rootRouteImport 58 + ._addFileChildren(rootRouteChildren) 59 + ._addFileTypes<FileRouteTypes>()
+11
src/routes/__root.tsx
··· 1 + import { Outlet, createRootRoute } from '@tanstack/react-router' 2 + import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' 3 + 4 + export const Route = createRootRoute({ 5 + component: () => ( 6 + <> 7 + <Outlet /> 8 + <TanStackRouterDevtools /> 9 + </> 10 + ), 11 + })
+532
src/routes/index.tsx
··· 1 + import { createFileRoute } from "@tanstack/react-router"; 2 + import logo from "../logo.svg"; 3 + import "../App.css"; 4 + import { useEsavQuery, useEsavDocument } from "../esav/hooks"; 5 + import { useState, useEffect } from "react"; 6 + import Login from "@/resuablepasslogin/Login"; 7 + import { useAtomValue } from "jotai"; 8 + import { websocketStatusAtom, logEntriesAtom } from "@/esav/atoms"; 9 + import type { LogEntry } from "@/esav/types"; 10 + import { useAuth } from "@/resuablepasslogin/PassAuthProvider"; 11 + // import type { EsavDocument } from '../esav/types'; 12 + 13 + export const Route = createFileRoute("/")({ 14 + component: App, 15 + }); 16 + 17 + function App() { 18 + const [profileCache, setProfileCache] = useState<{ 19 + [did: string]: { pfp: string; handle: string } | null; 20 + }>({}); 21 + const { agent, loading } = useAuth(); 22 + const feedQuery = { 23 + query: { 24 + term: { "$metadata.collection": "xyz.statusphere.status" }, 25 + }, 26 + sort: [{ "$metadata.indexedAt": "desc" }], 27 + size: 100, 28 + }; 29 + const { uris, isLoading } = useEsavQuery("statusphere-main-page", feedQuery); 30 + const [profile, setProfile] = useState<{ 31 + pfp: string; 32 + handle: string; 33 + } | null>(null); 34 + 35 + useEffect(() => { 36 + if (!agent || !agent.did || loading) { 37 + setProfile(null); 38 + return; 39 + } 40 + const did = agent.did; 41 + 42 + const fetchProfile = async () => { 43 + const cachedProfile = profileCache[did]; 44 + if (cachedProfile !== undefined) { 45 + setProfile(cachedProfile); 46 + return; 47 + } 48 + 49 + try { 50 + const res = await fetch( 51 + `https://esav.whey.party/xrpc/party.whey.esav.resolveIdentity?did=${did}&includePfp=true` 52 + ); 53 + const json = await res.json(); 54 + setProfile(json); 55 + setProfileCache((prevCache) => ({ 56 + ...prevCache, 57 + [did]: json, 58 + })); 59 + } catch (err) { 60 + console.error("Failed to fetch profile:", err); 61 + setProfileCache((prevCache) => ({ 62 + ...prevCache, 63 + [did]: null, 64 + })); 65 + } 66 + }; 67 + 68 + fetchProfile(); 69 + }, [agent, loading]); 70 + 71 + return ( 72 + <> 73 + <ReconnectingHeader /> 74 + <div 75 + style={{ 76 + display: "flex", 77 + flexDirection: "column", 78 + maxWidth: 1000, 79 + marginLeft: "auto", 80 + marginRight: "auto", 81 + gap: 12, 82 + }} 83 + > 84 + <div 85 + style={{ 86 + display: "flex", 87 + flexDirection: "row", 88 + alignItems: "center", 89 + gap: "auto", 90 + padding: "8px 12px", 91 + }} 92 + > 93 + <span style={{ fontWeight: 700, fontSize: 24, marginRight: "auto" }}> 94 + Statusphere ESAV Live 95 + </span> 96 + <div 97 + style={{ 98 + display: "flex", 99 + flexDirection: "row", 100 + alignItems: "center", 101 + gap: 8, 102 + }} 103 + > 104 + {profile && ( 105 + <> 106 + <img 107 + style={{ height: 24, width: 24, borderRadius: 9999 }} 108 + src={profile.pfp} 109 + alt="pfp" 110 + /> 111 + <span>@{profile.handle}</span> 112 + </> 113 + )} 114 + <Login compact /> 115 + </div> 116 + </div> 117 + {agent?.did && ( 118 + <div 119 + style={{ 120 + display: "flex", 121 + flexDirection: "column", 122 + gap: 4, 123 + 124 + padding: "8px 12px", 125 + }} 126 + > 127 + <span style={{ fontWeight: 700, fontSize: 20, marginBottom: 8 }}> 128 + How are you feeling? 129 + </span> 130 + <StatusButtons /> 131 + </div> 132 + )} 133 + {/* <span>the uris are {uris}</span> */} 134 + <div 135 + style={{ 136 + padding: "8px 12px", 137 + }} 138 + > 139 + <span style={{ fontWeight: 700, fontSize: 20, marginRight: "auto" }}> 140 + Recent Statuses 141 + </span> 142 + {isLoading && uris.length === 0 ? ( 143 + <span>Connecting to ESAV Live...</span> 144 + ) : ( 145 + uris.map((uri) => ( 146 + <Status key={uri} uri={uri} profileCache={profileCache} setProfileCache={setProfileCache} /> 147 + )) 148 + )} 149 + </div> 150 + <DeltaLogViewer /> 151 + </div> 152 + </> 153 + ); 154 + } 155 + const Status = ({ 156 + uri, 157 + profileCache, 158 + setProfileCache 159 + }: { 160 + uri: string; 161 + profileCache: { [did: string]: { pfp: string; handle: string } | null }; 162 + setProfileCache: React.Dispatch<React.SetStateAction<{ [x: string]: { pfp: string; handle: string; } | null; }>> 163 + }) => { 164 + const data = useEsavDocument(uri); 165 + const [showJson, setShowJson] = useState(false); 166 + const [profile, setProfile] = useState<{ 167 + pfp: string; 168 + handle: string; 169 + } | null>(null); 170 + 171 + useEffect(() => { 172 + if (!data?.doc?.["$metadata.did"]) return; 173 + 174 + const did = data.doc["$metadata.did"]; 175 + 176 + const cachedProfile = profileCache[did]; 177 + if (cachedProfile !== undefined) { 178 + setProfile(cachedProfile); 179 + return; 180 + } 181 + 182 + const fetchProfile = async () => { 183 + try { 184 + const res = await fetch( 185 + `https://esav.whey.party/xrpc/party.whey.esav.resolveIdentity?did=${did}&includePfp=true` 186 + ); 187 + const json = await res.json(); 188 + setProfile(json); 189 + setProfileCache(prevCache => ({ 190 + ...prevCache, 191 + [did]: json 192 + })); 193 + } catch (err) { 194 + console.error("Failed to fetch profile:", err); 195 + setProfileCache(prevCache => ({ 196 + ...prevCache, 197 + [did]: null 198 + })); 199 + } 200 + }; 201 + 202 + fetchProfile(); 203 + }, [data?.doc?.["$metadata.did"], profileCache]); 204 + 205 + if (!data) return <StatusSkeleton />; 206 + 207 + return ( 208 + <div 209 + style={{ 210 + border: "1px solid #ccc", 211 + padding: "10px", 212 + margin: "10px", 213 + display: "flex", 214 + flexDirection: "column", 215 + borderRadius: 10, 216 + }} 217 + > 218 + <div 219 + style={{ 220 + display: "flex", 221 + flexDirection: "row", 222 + alignItems: "center", 223 + gap: 12, 224 + }} 225 + > 226 + <p style={{ fontSize: 42, margin: 0 }}>{data.doc.status}</p> 227 + {profile ? ( 228 + <div 229 + style={{ 230 + display: "flex", 231 + flexDirection: "row", 232 + alignItems: "center", 233 + gap: 4, 234 + }} 235 + > 236 + <img 237 + style={{ height: 24, width: 24, borderRadius: 9999 }} 238 + src={profile.pfp} 239 + alt="pfp" 240 + /> 241 + <span> 242 + @{profile.handle} is feeling {data.doc.status} today 243 + </span> 244 + </div> 245 + ) : ( 246 + <span>Loading profile...</span> 247 + )} 248 + <button onClick={() => setShowJson((prev) => !prev)}> 249 + {showJson ? "Hide JSON" : "Show JSON"} 250 + </button> 251 + </div> 252 + <div> 253 + {showJson && ( 254 + <pre 255 + style={{ 256 + fontFamily: "monospace", 257 + fontSize: "14px", 258 + background: "#f4f4f4", 259 + padding: "1em", 260 + borderRadius: "8px", 261 + marginTop: "0.5em", 262 + marginBottom: 0, 263 + whiteSpace: "pre-wrap", 264 + wordBreak: "break-word", 265 + }} 266 + > 267 + <code>{JSON.stringify(data.doc, null, 2)}</code> 268 + </pre> 269 + )} 270 + </div> 271 + </div> 272 + ); 273 + }; 274 + 275 + const StatusSkeleton = () => ( 276 + <div 277 + style={{ 278 + border: "1px solid #eee", 279 + padding: "10px", 280 + margin: "10px", 281 + backgroundColor: "#f9f9f9", 282 + }} 283 + > 284 + <p>Loading post...</p> 285 + </div> 286 + ); 287 + 288 + function ReconnectingHeader() { 289 + const status = useAtomValue(websocketStatusAtom); 290 + 291 + if (status === "open") { 292 + return null; 293 + } 294 + 295 + const message = 296 + status === "connecting" 297 + ? "Connecting to ESAV Live..." 298 + : "Connection lost. Attempting to reconnect..."; 299 + 300 + return ( 301 + <div 302 + style={{ 303 + position: "sticky", 304 + top: 0, 305 + left: 0, 306 + width: "100%", 307 + padding: "8px", 308 + backgroundColor: "#ffc107", 309 + color: "#333", 310 + textAlign: "center", 311 + fontWeight: "bold", 312 + zIndex: 1000, 313 + boxShadow: "0 2px 4px rgba(0,0,0,0.1)", 314 + }} 315 + > 316 + {message} 317 + </div> 318 + ); 319 + } 320 + 321 + const LogEntryItem = ({ entry }: { entry: LogEntry }) => { 322 + const { type, timestamp, payload } = entry; 323 + 324 + const typeStyles = { 325 + incoming: { icon: "⬇️", color: "#4caf50", name: "Incoming" }, 326 + outgoing: { icon: "⬆️", color: "#ffeb3b", name: "Outgoing" }, 327 + status: { icon: "ℹ️", color: "#2196f3", name: "Status" }, 328 + error: { icon: "❌", color: "#f44336", name: "Error" }, 329 + }; 330 + 331 + const { icon, color, name } = typeStyles[type]; 332 + 333 + return ( 334 + <div 335 + style={{ 336 + borderBottom: "1px solid #444", 337 + padding: "8px", 338 + fontFamily: "monospace", 339 + fontSize: "12px", 340 + borderLeft: `4px solid ${color}`, 341 + }} 342 + > 343 + <div style={{ fontWeight: "bold", marginBottom: "4px" }}> 344 + <span style={{ marginRight: "8px" }}>{icon}</span> 345 + {name} 346 + <span style={{ float: "right", color: "#888" }}> 347 + {timestamp.toLocaleTimeString()} 348 + </span> 349 + </div> 350 + {typeof payload === "object" ? ( 351 + <pre 352 + style={{ 353 + margin: 0, 354 + padding: "8px", 355 + backgroundColor: "rgba(0,0,0,0.2)", 356 + borderRadius: "4px", 357 + whiteSpace: "pre-wrap", 358 + wordBreak: "break-all", 359 + fontSize: "11px", 360 + maxHeight: "200px", 361 + overflowY: "auto", 362 + }} 363 + > 364 + {JSON.stringify(payload, null, 2)} 365 + </pre> 366 + ) : ( 367 + <code style={{ color: "#ccc" }}>{String(payload)}</code> 368 + )} 369 + </div> 370 + ); 371 + }; 372 + 373 + function DeltaLogViewer() { 374 + const [open, setOpen] = useState(false); 375 + const log = useAtomValue(logEntriesAtom); 376 + 377 + return ( 378 + <div 379 + style={{ 380 + position: "fixed", 381 + bottom: "10px", 382 + right: "10px", 383 + width: open ? "min(850px,90dvw)" : "280px", 384 + backgroundColor: "#2d2d2d", 385 + color: "#f1f1f1", 386 + border: "1px solid #555", 387 + borderRadius: "8px", 388 + boxShadow: "0 4px 12px rgba(0,0,0,0.3)", 389 + zIndex: 2000, 390 + overflow: "hidden", 391 + display: "flex", 392 + flexDirection: "column", 393 + maxHeight: "600px", 394 + transition: "width 0.1s ease", 395 + }} 396 + > 397 + <div 398 + style={{ 399 + display: "flex", 400 + justifyContent: "space-between", 401 + alignItems: "center", 402 + padding: "8px 12px", 403 + backgroundColor: "#3c3c3c", 404 + borderBottom: "1px solid #555", 405 + fontWeight: 700, 406 + }} 407 + > 408 + <span>ESAV Live Log</span> 409 + <button 410 + onClick={() => setOpen(!open)} 411 + style={{ 412 + background: "transparent", 413 + border: "none", 414 + color: "#ccc", 415 + fontSize: "16px", 416 + cursor: "pointer", 417 + padding: "4px 8px", 418 + borderRadius: "4px", 419 + transition: "background 0.01s", 420 + }} 421 + onMouseEnter={(e) => (e.currentTarget.style.background = "#444")} 422 + onMouseLeave={(e) => 423 + (e.currentTarget.style.background = "transparent") 424 + } 425 + title={open ? "Collapse log" : "Expand log"} 426 + > 427 + {open ? "close" : "open"} 428 + </button> 429 + </div> 430 + <div 431 + style={{ 432 + flex: 1, 433 + overflowY: "auto", 434 + display: open ? "flex" : "none", 435 + flexDirection: "column", 436 + }} 437 + > 438 + {log.length === 0 ? ( 439 + <div style={{ padding: "10px", color: "#888" }}> 440 + Waiting for events... 441 + </div> 442 + ) : ( 443 + log.map((entry) => <LogEntryItem key={entry.id} entry={entry} />) 444 + )} 445 + </div> 446 + </div> 447 + ); 448 + } 449 + 450 + const statuses = [ 451 + "👍", 452 + "👎", 453 + "💙", 454 + "🥹", 455 + "😧", 456 + "😤", 457 + "🙃", 458 + "😎", 459 + "🤓", 460 + "🤨", 461 + "🥳", 462 + "😭", 463 + "😢", 464 + "🤯", 465 + "🫡", 466 + "💀", 467 + "✊", 468 + "🤘", 469 + "👀", 470 + "🧠", 471 + "👩‍💻", 472 + "🧑‍💻", 473 + "🥷", 474 + "🧌", 475 + "🦋", 476 + "🚀", 477 + "😴", 478 + ]; 479 + 480 + function StatusButtons() { 481 + const { agent, loading } = useAuth(); 482 + 483 + if (!agent || !agent.did || loading) { 484 + return <span>loading...</span>; 485 + } 486 + const did = agent.did; 487 + 488 + const createStatus = (status: string) => { 489 + const response = agent.com.atproto.repo.createRecord({ 490 + repo: did, 491 + collection: "xyz.statusphere.status", 492 + record: { 493 + $type: "xyz.statusphere.status", 494 + createdAt: new Date().toISOString(), 495 + status: status, 496 + }, 497 + }); 498 + }; 499 + 500 + return ( 501 + <div 502 + style={{ 503 + display: "flex", 504 + flexWrap: "wrap", 505 + gap: "0.5rem", 506 + padding: "0px 12px", 507 + }} 508 + > 509 + {statuses.map((emoji) => ( 510 + <button 511 + key={emoji} 512 + onClick={() => createStatus(emoji)} 513 + style={{ 514 + fontSize: 24, 515 + height: 50, 516 + width: 50, 517 + cursor: "pointer", 518 + border: "1px solid #ccc", 519 + borderRadius: 9999, 520 + backgroundColor: "#fff", 521 + display: "flex", 522 + alignItems: "center", 523 + justifyContent: "center", 524 + textAlign: "center", 525 + }} 526 + > 527 + {emoji} 528 + </button> 529 + ))} 530 + </div> 531 + ); 532 + }
+14
src/styles.css
··· 1 + 2 + body { 3 + margin: 0; 4 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 5 + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 6 + sans-serif; 7 + -webkit-font-smoothing: antialiased; 8 + -moz-osx-font-smoothing: grayscale; 9 + } 10 + 11 + code { 12 + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 13 + monospace; 14 + }
+28
tsconfig.json
··· 1 + { 2 + "include": ["**/*.ts", "**/*.tsx"], 3 + "compilerOptions": { 4 + "target": "ES2022", 5 + "jsx": "react-jsx", 6 + "module": "ESNext", 7 + "lib": ["ES2022", "DOM", "DOM.Iterable"], 8 + "types": ["vite/client"], 9 + 10 + /* Bundler mode */ 11 + "moduleResolution": "bundler", 12 + "allowImportingTsExtensions": true, 13 + "verbatimModuleSyntax": true, 14 + "noEmit": true, 15 + 16 + /* Linting */ 17 + "skipLibCheck": true, 18 + "strict": true, 19 + "noUnusedLocals": true, 20 + "noUnusedParameters": true, 21 + "noFallthroughCasesInSwitch": true, 22 + "noUncheckedSideEffectImports": true, 23 + "baseUrl": ".", 24 + "paths": { 25 + "@/*": ["./src/*"], 26 + } 27 + } 28 + }
+18
vite.config.ts
··· 1 + import { defineConfig } from 'vite' 2 + import viteReact from '@vitejs/plugin-react' 3 + import { TanStackRouterVite } from '@tanstack/router-plugin/vite' 4 + import { resolve } from 'node:path' 5 + 6 + // https://vitejs.dev/config/ 7 + export default defineConfig({ 8 + plugins: [TanStackRouterVite({ autoCodeSplitting: true }), viteReact()], 9 + test: { 10 + globals: true, 11 + environment: 'jsdom', 12 + }, 13 + resolve: { 14 + alias: { 15 + '@': resolve(__dirname, './src'), 16 + }, 17 + }, 18 + })