diff --git a/examples/react/with-responsive-image/.cta.json b/examples/react/with-responsive-image/.cta.json new file mode 100644 index 00000000000..ff0249186d2 --- /dev/null +++ b/examples/react/with-responsive-image/.cta.json @@ -0,0 +1,11 @@ +{ + "projectName": "with-responsive-image", + "mode": "file-router", + "typescript": true, + "tailwind": false, + "packageManager": "npm", + "git": true, + "version": 1, + "framework": "react-cra", + "chosenAddOns": [] +} diff --git a/examples/react/with-responsive-image/.gitignore b/examples/react/with-responsive-image/.gitignore new file mode 100644 index 00000000000..693a705328d --- /dev/null +++ b/examples/react/with-responsive-image/.gitignore @@ -0,0 +1,9 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +count.txt +.env +.nitro +.tanstack diff --git a/examples/react/with-responsive-image/README.md b/examples/react/with-responsive-image/README.md new file mode 100644 index 00000000000..540217917db --- /dev/null +++ b/examples/react/with-responsive-image/README.md @@ -0,0 +1,5 @@ +# TanStack + ResponsiveImage + +Integrating [ResponsiveImage](https://responsive-image.dev) with TanStack Router. + +Run `pnpm dev` to run locally. diff --git a/examples/react/with-responsive-image/index.html b/examples/react/with-responsive-image/index.html new file mode 100644 index 00000000000..fe0cb11af88 --- /dev/null +++ b/examples/react/with-responsive-image/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + + Create TanStack App - with-responsive-image + + +
+ + + diff --git a/examples/react/with-responsive-image/package.json b/examples/react/with-responsive-image/package.json new file mode 100644 index 00000000000..6fc4e037c36 --- /dev/null +++ b/examples/react/with-responsive-image/package.json @@ -0,0 +1,33 @@ +{ + "name": "with-responsive-image", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port 3000", + "start": "vite --port 3000", + "build": "vite build && tsc", + "serve": "vite preview" + }, + "dependencies": { + "@responsive-image/core": "^2.1.0", + "@responsive-image/react": "^1.1.2", + "@tanstack/react-devtools": "^0.2.2", + "@tanstack/react-router": "^1.131.32", + "@tanstack/react-router-devtools": "^1.131.32", + "@tanstack/router-plugin": "^1.131.32", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@responsive-image/vite-plugin": "^2.0.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.2.0", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "jsdom": "^26.0.0", + "typescript": "^5.7.2", + "vite": "^7.1.3", + "web-vitals": "^4.2.4" + } +} diff --git a/examples/react/with-responsive-image/public/favicon.ico b/examples/react/with-responsive-image/public/favicon.ico new file mode 100644 index 00000000000..a11777cc471 Binary files /dev/null and b/examples/react/with-responsive-image/public/favicon.ico differ diff --git a/examples/react/with-responsive-image/public/logo192.png b/examples/react/with-responsive-image/public/logo192.png new file mode 100644 index 00000000000..fc44b0a3796 Binary files /dev/null and b/examples/react/with-responsive-image/public/logo192.png differ diff --git a/examples/react/with-responsive-image/public/logo512.png b/examples/react/with-responsive-image/public/logo512.png new file mode 100644 index 00000000000..a4e47a6545b Binary files /dev/null and b/examples/react/with-responsive-image/public/logo512.png differ diff --git a/examples/react/with-responsive-image/public/manifest.json b/examples/react/with-responsive-image/public/manifest.json new file mode 100644 index 00000000000..078ef501162 --- /dev/null +++ b/examples/react/with-responsive-image/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "TanStack App", + "name": "Create TanStack App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/examples/react/with-responsive-image/public/robots.txt b/examples/react/with-responsive-image/public/robots.txt new file mode 100644 index 00000000000..e9e57dc4d41 --- /dev/null +++ b/examples/react/with-responsive-image/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/react/with-responsive-image/src/global.d.ts b/examples/react/with-responsive-image/src/global.d.ts new file mode 100644 index 00000000000..6371e6b0aff --- /dev/null +++ b/examples/react/with-responsive-image/src/global.d.ts @@ -0,0 +1,6 @@ +declare module '*responsive' { + import type { ImageData } from '@responsive-image/core' + + const value: ImageData + export default value +} diff --git a/examples/react/with-responsive-image/src/images.ts b/examples/react/with-responsive-image/src/images.ts new file mode 100644 index 00000000000..be53dc19777 --- /dev/null +++ b/examples/react/with-responsive-image/src/images.ts @@ -0,0 +1,51 @@ +import { notFound } from '@tanstack/react-router' +import type { ImageData } from '@responsive-image/core' + +const thumbnails = import.meta.glob<{ default: ImageData }>( + './images/gallery/*.jpg', + { + eager: true, // this is just generating image meta data, not need for lazy loading + query: { + w: '200;400', + responsive: true, // opt into processing by @responsive-image/vite, see vite.config.ts. Without this, default vite asset handling applies. + }, + }, +) + +const images = import.meta.glob<{ default: ImageData }>( + './images/gallery/*.jpg', + { + eager: true, // this is just generating image meta data, not need for lazy loading + query: { + responsive: true, // opt into processing by @responsive-image/vite, see vite.config.ts. Without this, default vite asset handling applies. + }, + }, +) + +export function getThumbsnails(): Record { + return Object.fromEntries( + Object.entries(thumbnails).map(([imageId, module]) => [ + normalizeImageId(imageId), + module.default, + ]), + ) +} + +export function getImage(imageId: string): ImageData { + const module = images[denormalizeImageId(imageId)] + + if (!module) { + throw notFound({ data: { foo: 1 } }) + } + + return module.default +} + +// Remove leading `./images/gallery/` from import.meta.glob keys for nicer URLs +function normalizeImageId(imageId: string): string { + return imageId.replace(/^\.\/images\/gallery\//, '') +} + +function denormalizeImageId(imageId: string): string { + return `./images/gallery/${imageId}` +} diff --git a/examples/react/with-responsive-image/src/images/gallery/01.jpg b/examples/react/with-responsive-image/src/images/gallery/01.jpg new file mode 100644 index 00000000000..6251adc381f Binary files /dev/null and b/examples/react/with-responsive-image/src/images/gallery/01.jpg differ diff --git a/examples/react/with-responsive-image/src/images/gallery/02.jpg b/examples/react/with-responsive-image/src/images/gallery/02.jpg new file mode 100644 index 00000000000..db5730b4622 Binary files /dev/null and b/examples/react/with-responsive-image/src/images/gallery/02.jpg differ diff --git a/examples/react/with-responsive-image/src/images/gallery/03.jpg b/examples/react/with-responsive-image/src/images/gallery/03.jpg new file mode 100644 index 00000000000..00c08e20b55 Binary files /dev/null and b/examples/react/with-responsive-image/src/images/gallery/03.jpg differ diff --git a/examples/react/with-responsive-image/src/images/gallery/04.jpg b/examples/react/with-responsive-image/src/images/gallery/04.jpg new file mode 100644 index 00000000000..6831a1c5843 Binary files /dev/null and b/examples/react/with-responsive-image/src/images/gallery/04.jpg differ diff --git a/examples/react/with-responsive-image/src/images/splash-dark.png b/examples/react/with-responsive-image/src/images/splash-dark.png new file mode 100644 index 00000000000..d540bd747e7 Binary files /dev/null and b/examples/react/with-responsive-image/src/images/splash-dark.png differ diff --git a/examples/react/with-responsive-image/src/main.tsx b/examples/react/with-responsive-image/src/main.tsx new file mode 100644 index 00000000000..1b093697f9a --- /dev/null +++ b/examples/react/with-responsive-image/src/main.tsx @@ -0,0 +1,42 @@ +import { StrictMode } from 'react' +import ReactDOM from 'react-dom/client' +import { RouterProvider, createRouter } from '@tanstack/react-router' + +// Import the generated route tree +import { routeTree } from './routeTree.gen' + +import './styles.css' +import reportWebVitals from './reportWebVitals.ts' + +// Create a new router instance +const router = createRouter({ + routeTree, + context: {}, + defaultPreload: 'intent', + scrollRestoration: true, + defaultStructuralSharing: true, + defaultPreloadStaleTime: 0, +}) + +// Register the router instance for type safety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +// Render the app +const rootElement = document.getElementById('app') +if (rootElement && !rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + root.render( + + + , + ) +} + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals() diff --git a/examples/react/with-responsive-image/src/reportWebVitals.ts b/examples/react/with-responsive-image/src/reportWebVitals.ts new file mode 100644 index 00000000000..16b66b5f6ce --- /dev/null +++ b/examples/react/with-responsive-image/src/reportWebVitals.ts @@ -0,0 +1,13 @@ +const reportWebVitals = (onPerfEntry?: () => void) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ onCLS, onINP, onFCP, onLCP, onTTFB }) => { + onCLS(onPerfEntry) + onINP(onPerfEntry) + onFCP(onPerfEntry) + onLCP(onPerfEntry) + onTTFB(onPerfEntry) + }) + } +} + +export default reportWebVitals diff --git a/examples/react/with-responsive-image/src/routeTree.gen.ts b/examples/react/with-responsive-image/src/routeTree.gen.ts new file mode 100644 index 00000000000..9bb6eab912a --- /dev/null +++ b/examples/react/with-responsive-image/src/routeTree.gen.ts @@ -0,0 +1,77 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as ImageIdRouteImport } from './routes/$imageId' +import { Route as IndexRouteImport } from './routes/index' + +const ImageIdRoute = ImageIdRouteImport.update({ + id: '/$imageId', + path: '/$imageId', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/$imageId': typeof ImageIdRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/$imageId': typeof ImageIdRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/$imageId': typeof ImageIdRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/$imageId' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/$imageId' + id: '__root__' | '/' | '/$imageId' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + ImageIdRoute: typeof ImageIdRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/$imageId': { + id: '/$imageId' + path: '/$imageId' + fullPath: '/$imageId' + preLoaderRoute: typeof ImageIdRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + ImageIdRoute: ImageIdRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/examples/react/with-responsive-image/src/routes/$imageId.tsx b/examples/react/with-responsive-image/src/routes/$imageId.tsx new file mode 100644 index 00000000000..3ae8f838ba0 --- /dev/null +++ b/examples/react/with-responsive-image/src/routes/$imageId.tsx @@ -0,0 +1,14 @@ +import { createFileRoute } from '@tanstack/react-router' +import { ResponsiveImage } from '@responsive-image/react' +import { getImage } from '../images.ts' + +export const Route = createFileRoute('/$imageId')({ + loader: ({ params }) => getImage(params.imageId), + component: Image, +}) + +function Image() { + const image = Route.useLoaderData() + + return +} diff --git a/examples/react/with-responsive-image/src/routes/__root.tsx b/examples/react/with-responsive-image/src/routes/__root.tsx new file mode 100644 index 00000000000..40c7daa9f76 --- /dev/null +++ b/examples/react/with-responsive-image/src/routes/__root.tsx @@ -0,0 +1,38 @@ +import { Outlet, Link, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools' +import { TanstackDevtools } from '@tanstack/react-devtools' +import { ResponsiveImage } from '@responsive-image/react' +import './app.css' +import { getThumbsnails } from '../images.ts' + +export const Route = createRootRoute({ + component: App, +}) + +function App() { + return ( + <> + +
+ +
+ , + }, + ]} + /> + + ) +} diff --git a/examples/react/with-responsive-image/src/routes/app.css b/examples/react/with-responsive-image/src/routes/app.css new file mode 100644 index 00000000000..d44a9f64438 --- /dev/null +++ b/examples/react/with-responsive-image/src/routes/app.css @@ -0,0 +1,34 @@ +aside { + display: flex; + overflow: auto; + justify-content: center; + + margin-bottom: 5px; +} + +aside a { + border: solid 1px transparent; +} + +aside a.active { + border-color: #00c2ab; +} + +img { + display: block; +} + +main { + display: flex; + justify-content: center; + flex-wrap: wrap; +} + +.intro { + padding: 20px; +} + +img.large { + max-height: calc(100vh - 140px); + width: auto; +} diff --git a/examples/react/with-responsive-image/src/routes/index.tsx b/examples/react/with-responsive-image/src/routes/index.tsx new file mode 100644 index 00000000000..c5b7c3138dc --- /dev/null +++ b/examples/react/with-responsive-image/src/routes/index.tsx @@ -0,0 +1,40 @@ +import { createFileRoute } from '@tanstack/react-router' +import { ResponsiveImage } from '@responsive-image/react' +import visual from '../images/splash-dark.png?w=300;600&responsive' + +export const Route = createFileRoute('/')({ + component: Index, +}) + +function Index() { + return ( + <> + +
+

Welcome to this TanStack Router + ResponsiveImage demo

+ +
+ + ) +} diff --git a/examples/react/with-responsive-image/src/styles.css b/examples/react/with-responsive-image/src/styles.css new file mode 100644 index 00000000000..bd6643c45b9 --- /dev/null +++ b/examples/react/with-responsive-image/src/styles.css @@ -0,0 +1,20 @@ +body { + margin: 0; + font-family: + -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', + 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + background-color: black; + color: #ccc; +} + +a { + color: #00c2ab; +} + +code { + font-family: + source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; +} diff --git a/examples/react/with-responsive-image/tsconfig.json b/examples/react/with-responsive-image/tsconfig.json new file mode 100644 index 00000000000..b088e9ab63c --- /dev/null +++ b/examples/react/with-responsive-image/tsconfig.json @@ -0,0 +1,29 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "target": "ES2022", + "jsx": "react-jsx", + "module": "ESNext", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["vite/client"], + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + /* Linting */ + "skipLibCheck": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "noUncheckedIndexedAccess": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/examples/react/with-responsive-image/vite.config.ts b/examples/react/with-responsive-image/vite.config.ts new file mode 100644 index 00000000000..34dd0823b22 --- /dev/null +++ b/examples/react/with-responsive-image/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite' +import viteReact from '@vitejs/plugin-react' +import { tanstackRouter } from '@tanstack/router-plugin/vite' +import { setupPlugins } from '@responsive-image/vite-plugin' + +export default defineConfig({ + plugins: [ + tanstackRouter({ autoCodeSplitting: true }), + viteReact(), + setupPlugins({ + include: /^[^?]+\.(?:jpg|png)\?.*responsive.*$/, + lqip: { type: 'thumbhash' }, + }), + ], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99a2f0895e0..2acbbaa8d4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5648,6 +5648,64 @@ importers: specifier: 6.3.5 version: 6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.7.0) + examples/react/with-responsive-image: + dependencies: + '@responsive-image/core': + specifier: ^2.1.0 + version: 2.1.0(blurhash@2.0.5)(thumbhash@0.1.1) + '@responsive-image/react': + specifier: ^1.1.2 + version: 1.1.2(blurhash@2.0.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(thumbhash@0.1.1) + '@tanstack/react-devtools': + specifier: ^0.2.2 + version: 0.2.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.5) + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-router-devtools': + specifier: workspace:^ + version: link:../../../packages/react-router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + devDependencies: + '@responsive-image/vite-plugin': + specifier: ^2.0.0 + version: 2.0.1(rollup@4.41.1)(vite@6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.7.0)) + '@testing-library/dom': + specifier: ^10.4.0 + version: 10.4.0 + '@testing-library/react': + specifier: ^16.2.0 + version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@types/react': + specifier: ^19.0.8 + version: 19.0.8 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.0.3(@types/react@19.0.8) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.6.0(vite@6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.7.0)) + jsdom: + specifier: ^26.0.0 + version: 26.1.0 + typescript: + specifier: ^5.7.2 + version: 5.9.2 + vite: + specifier: 6.3.5 + version: 6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.7.0) + web-vitals: + specifier: ^4.2.4 + version: 4.2.4 + examples/react/with-trpc: dependencies: '@tanstack/react-router': @@ -7630,6 +7688,9 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} @@ -8460,6 +8521,128 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/confirm@5.1.4': resolution: {integrity: sha512-EsiT7K4beM5fN5Mz6j866EFA9+v9d5o9VUra3hrg8zY4GHmCS8b616FErbdo5eyKoVotBQkHzMIeeKYsKDStDw==} engines: {node: '>=18'} @@ -9648,6 +9831,33 @@ packages: '@types/react-dom': optional: true + '@responsive-image/build-utils@2.0.0': + resolution: {integrity: sha512-YaYmxORoYV1xX880fN/wGo2c1sKwM3jDrHFJaT+0pKFjCm89+ce8dhI7Mff/DDTxMVeoNLIHbX4WENoQyXTYLQ==} + engines: {node: 20.* || >= 22} + + '@responsive-image/core@2.1.0': + resolution: {integrity: sha512-UH1sLdoPVhLoKQC9tjFmhq+m2y1dknMETQ7VeX3gu98XRElz1bxNlx8ahy73H74452MyrlsyIzODyA58NkYfBQ==} + peerDependencies: + blurhash: ^2.0.0 + thumbhash: ^0.1.1 + peerDependenciesMeta: + blurhash: + optional: true + thumbhash: + optional: true + + '@responsive-image/react@1.1.2': + resolution: {integrity: sha512-8DU5nyOkNQkBMmneRJgTCXJYGOXRVS42jrbQu2Cx3L9/kncPCF3i7tCq8D7HiuFZDBzGiiJ6P01ygOom7OnWHQ==} + peerDependencies: + react: ^19.0.0 + react-dom: ^19.0.0 + + '@responsive-image/vite-plugin@2.0.1': + resolution: {integrity: sha512-KDuqCqZTj5v/q27rt1+gFwt0PZ1jKqPQZxKTeg0ojEAkWat7ata0y8P6ZS5cHMmu3wgVRmi/ZsMVPjcc5xscxg==} + engines: {node: 20.* || >= 22} + peerDependencies: + vite: 6.3.5 + '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} @@ -10400,6 +10610,22 @@ packages: engines: {node: '>=18'} hasBin: true + '@tanstack/devtools-event-bus@0.2.1': + resolution: {integrity: sha512-JMq3AmrQR2LH9P8Rcj1MTq8Iq/mPk/PyuqSw1L0hO2Wl8G1oz5ue31fS8u8lIgOCVR/mGdJah18p+Pj5OosRJA==} + engines: {node: '>=18'} + + '@tanstack/devtools-ui@0.2.2': + resolution: {integrity: sha512-G2gRyoGpjtr25w9BqQzPbefiJ9WALWYLOVxVr+NoqOLDA680nUO5KJjp7oLZMfnKssWxACgulaQ3DUmGGJuysQ==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + + '@tanstack/devtools@0.3.0': + resolution: {integrity: sha512-uxj3MM2/ZlQDlhnBoUSlJC8oneJ+sPh6hK0kgiKZAEgrlUvZfUNgKGhrmMHZaAGl/WEglhZoxXwvvo9HAFT8yw==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + '@tanstack/query-core@5.66.0': resolution: {integrity: sha512-J+JeBtthiKxrpzUu7rfIPDzhscXF2p5zE/hVdrqkACBP8Yu0M96mwJ5m/8cPPYQE9aRNvXztXHlNwIh4FEeMZw==} @@ -10409,6 +10635,15 @@ packages: '@tanstack/query-devtools@5.72.2': resolution: {integrity: sha512-mMKnGb+iOhVBcj6jaerCFRpg8pACStdG8hmUBHPtToeZzs4ctjBUL1FajqpVn2WaMxnq8Wya+P3Q5tPFNM9jQw==} + '@tanstack/react-devtools@0.2.2': + resolution: {integrity: sha512-Ig8ZYqUPJ+nwRvF/RpkQHPbgEkrL3b2PjeYBgXgT5OemyRUlmG12UutvMBV+bJuBsSOKHrNf29IvzC0Vw9Bt1A==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^19.0.8 + '@types/react-dom': ^19.0.3 + react: ^19.0.0 + react-dom: ^19.0.0 + '@tanstack/react-query-devtools@5.67.2': resolution: {integrity: sha512-cmj2DxBc+/9btQ66n5xI8wTtAma2BLVa403K7zIYiguzJ/kV201jnGensYqJeu1Rd8uRMLLRM74jLVMLDWNRJA==} peerDependencies: @@ -11192,6 +11427,10 @@ packages: resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -11249,6 +11488,15 @@ packages: bare-events@2.5.4: resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + base-n@3.0.0: + resolution: {integrity: sha512-u+HQjUyXwqZLbDDlunZUoFlWSZWIwIpNpDErBMOCkBU/VOMpVYMLYih/+FRFCkfrgXrdnbI46fTkUIu1C22v7Q==} + engines: {node: '>= 10.0.0'} + hasBin: true + + base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -11268,6 +11516,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blurhash@2.0.5: + resolution: {integrity: sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==} + body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -11485,6 +11736,10 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -11707,6 +11962,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -12852,6 +13111,10 @@ packages: resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} engines: {node: '>= 4'} + imagetools-core@7.1.0: + resolution: {integrity: sha512-8Aa4NecBBGmTkaAUjcuRYgTPKHCsBEWYmCnvKCL6/bxedehtVVFyZPdXe8DD0Nevd6UWBq85ifUaJ8498lgqNQ==} + engines: {node: '>=18.0.0'} + immer@10.1.1: resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} @@ -13130,6 +13393,9 @@ packages: resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} engines: {node: 20 || >=22} + javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + jest-diff@30.0.5: resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -13182,6 +13448,15 @@ packages: canvas: optional: true + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -14675,6 +14950,10 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -15009,6 +15288,9 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + thumbhash@0.1.1: + resolution: {integrity: sha512-kH5pKeIIBPQXAOni2AiY/Cu/NKdkFREdpH+TLdM0g6WA7RriCv0kPLgP731ady67MhTAqrVG/4mnEeibVuCJcg==} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -15077,6 +15359,10 @@ packages: resolution: {integrity: sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==} engines: {node: '>=16'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -15084,6 +15370,10 @@ packages: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tree-dump@1.0.2: resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} engines: {node: '>=10.0'} @@ -15754,6 +16044,10 @@ packages: resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} engines: {node: '>=18'} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -15817,6 +16111,18 @@ packages: utf-8-validate: optional: true + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -16365,6 +16671,11 @@ snapshots: dependencies: tslib: 2.8.1 + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.1': dependencies: tslib: 2.8.1 @@ -17178,6 +17489,92 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} + '@img/sharp-darwin-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.0 + optional: true + + '@img/sharp-darwin-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + optional: true + + '@img/sharp-linux-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.0 + optional: true + + '@img/sharp-linux-arm@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.0 + optional: true + + '@img/sharp-linux-ppc64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.0 + optional: true + + '@img/sharp-linux-s390x@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.0 + optional: true + + '@img/sharp-linux-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + optional: true + + '@img/sharp-wasm32@0.34.3': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-win32-arm64@0.34.3': + optional: true + + '@img/sharp-win32-ia32@0.34.3': + optional: true + + '@img/sharp-win32-x64@0.34.3': + optional: true + '@inquirer/confirm@5.1.4(@types/node@22.13.4)': dependencies: '@inquirer/core': 10.1.5(@types/node@22.13.4) @@ -18483,6 +18880,48 @@ snapshots: '@types/react': 19.0.8 '@types/react-dom': 19.0.3(@types/react@19.0.8) + '@responsive-image/build-utils@2.0.0(blurhash@2.0.5)(rollup@4.41.1)(thumbhash@0.1.1)': + dependencies: + '@responsive-image/core': 2.1.0(blurhash@2.0.5)(thumbhash@0.1.1) + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + base-n: 3.0.0 + imagetools-core: 7.1.0 + javascript-stringify: 2.1.0 + sharp: 0.34.3 + transitivePeerDependencies: + - blurhash + - rollup + - thumbhash + + '@responsive-image/core@2.1.0(blurhash@2.0.5)(thumbhash@0.1.1)': + dependencies: + base64-arraybuffer: 1.0.2 + optionalDependencies: + blurhash: 2.0.5 + thumbhash: 0.1.1 + + '@responsive-image/react@1.1.2(blurhash@2.0.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(thumbhash@0.1.1)': + dependencies: + '@responsive-image/core': 2.1.0(blurhash@2.0.5)(thumbhash@0.1.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + transitivePeerDependencies: + - blurhash + - thumbhash + + '@responsive-image/vite-plugin@2.0.1(rollup@4.41.1)(vite@6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.7.0))': + dependencies: + '@responsive-image/build-utils': 2.0.0(blurhash@2.0.5)(rollup@4.41.1)(thumbhash@0.1.1) + '@responsive-image/core': 2.1.0(blurhash@2.0.5)(thumbhash@0.1.1) + '@rollup/pluginutils': 5.1.4(rollup@4.41.1) + blurhash: 2.0.5 + imagetools-core: 7.1.0 + sharp: 0.34.3 + thumbhash: 0.1.1 + vite: 6.3.5(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.7.0) + transitivePeerDependencies: + - rollup + '@rolldown/pluginutils@1.0.0-beta.19': {} '@rollup/plugin-alias@5.1.1(rollup@4.41.1)': @@ -19264,12 +19703,52 @@ snapshots: - typescript - vite + '@tanstack/devtools-event-bus@0.2.1': + dependencies: + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@tanstack/devtools-ui@0.2.2(csstype@3.1.3)(solid-js@1.9.5)': + dependencies: + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.5 + transitivePeerDependencies: + - csstype + + '@tanstack/devtools@0.3.0(csstype@3.1.3)(solid-js@1.9.5)': + dependencies: + '@solid-primitives/keyboard': 1.3.0(solid-js@1.9.5) + '@tanstack/devtools-event-bus': 0.2.1 + '@tanstack/devtools-ui': 0.2.2(csstype@3.1.3)(solid-js@1.9.5) + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.5 + transitivePeerDependencies: + - bufferutil + - csstype + - utf-8-validate + '@tanstack/query-core@5.66.0': {} '@tanstack/query-devtools@5.67.2': {} '@tanstack/query-devtools@5.72.2': {} + '@tanstack/react-devtools@0.2.2(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.5)': + dependencies: + '@tanstack/devtools': 0.3.0(csstype@3.1.3)(solid-js@1.9.5) + '@types/react': 19.0.8 + '@types/react-dom': 19.0.3(@types/react@19.0.8) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + transitivePeerDependencies: + - bufferutil + - csstype + - solid-js + - utf-8-validate + '@tanstack/react-query-devtools@5.67.2(@tanstack/react-query@5.66.0(react@19.0.0))(react@19.0.0)': dependencies: '@tanstack/query-devtools': 5.67.2 @@ -20246,6 +20725,8 @@ snapshots: pvutils: 1.1.3 tslib: 2.8.1 + assert-plus@1.0.0: {} + assertion-error@2.0.1: {} ast-module-types@6.0.1: {} @@ -20330,6 +20811,12 @@ snapshots: bare-events@2.5.4: optional: true + base-n@3.0.0: + dependencies: + dashdash: 1.14.1 + + base64-arraybuffer@1.0.2: {} + base64-js@1.5.1: {} batch@0.6.1: {} @@ -20348,6 +20835,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + blurhash@2.0.5: {} + body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -20612,6 +21101,11 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colorette@2.0.20: {} colorspace@1.1.4: @@ -20814,6 +21308,10 @@ snapshots: csstype@3.1.3: {} + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + data-uri-to-buffer@4.0.1: {} data-urls@5.0.0: @@ -22158,6 +22656,8 @@ snapshots: ignore@7.0.3: {} + imagetools-core@7.1.0: {} + immer@10.1.1: {} import-fresh@3.3.0: @@ -22380,6 +22880,8 @@ snapshots: dependencies: '@isaacs/cliui': 8.0.2 + javascript-stringify@2.1.0: {} + jest-diff@30.0.5: dependencies: '@jest/diff-sequences': 30.0.1 @@ -22446,6 +22948,33 @@ snapshots: - supports-color - utf-8-validate + jsdom@26.1.0: + dependencies: + cssstyle: 4.2.1 + data-urls: 5.0.0 + decimal.js: 10.5.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.16 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -24119,6 +24648,35 @@ snapshots: dependencies: kind-of: 6.0.3 + sharp@0.34.3: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -24509,6 +25067,8 @@ snapshots: through@2.3.8: {} + thumbhash@0.1.1: {} + thunky@1.1.0: {} tiny-invariant@1.3.3: {} @@ -24563,12 +25123,20 @@ snapshots: dependencies: tldts: 6.1.76 + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.76 + tr46@0.0.3: {} tr46@5.0.0: dependencies: punycode: 2.3.1 + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tree-dump@1.0.2(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -25307,6 +25875,11 @@ snapshots: tr46: 5.0.0 webidl-conversions: 7.0.0 + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -25376,6 +25949,8 @@ snapshots: ws@8.18.0: {} + ws@8.18.3: {} + xml-name-validator@5.0.0: {} xmlbuilder2@3.1.1: