diff --git a/.changeset/add-webgl-webgpu-react.md b/.changeset/add-webgl-webgpu-react.md new file mode 100644 index 00000000..a700a8c1 --- /dev/null +++ b/.changeset/add-webgl-webgpu-react.md @@ -0,0 +1,8 @@ +--- +"@lottiefiles/dotlottie-react": minor +--- + +Add WebGL and WebGPU renderer support via subpath exports + +* `@lottiefiles/dotlottie-react/webgl` — WebGL renderer component +* `@lottiefiles/dotlottie-react/webgpu` — WebGPU renderer component (with optional `device` prop) diff --git a/examples/next/next.config.mjs b/examples/next/next.config.mjs index d5456a15..08053c21 100644 --- a/examples/next/next.config.mjs +++ b/examples/next/next.config.mjs @@ -1,6 +1,22 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, + webpack: (config) => { + // Deduplicate React in the monorepo so linked workspace packages + // resolve the same copy as the app (prevents "invalid hook call"). + config.resolve.alias = { + ...config.resolve.alias, + react: path.resolve(__dirname, 'node_modules/react'), + 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'), + }; + + return config; + }, }; export default nextConfig; diff --git a/examples/next/src/pages/api/hello.ts b/examples/next/src/pages/api/hello.ts deleted file mode 100644 index a5d44d70..00000000 --- a/examples/next/src/pages/api/hello.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next'; - -interface Data { - name: string; -} - -export default function handler(_req: NextApiRequest, res: NextApiResponse): void { - res.status(200).json({ name: 'John Doe' }); -} diff --git a/examples/next/src/pages/index.tsx b/examples/next/src/pages/index.tsx index c5cedfcb..66a7d881 100644 --- a/examples/next/src/pages/index.tsx +++ b/examples/next/src/pages/index.tsx @@ -1,78 +1,119 @@ -import type { DotLottie, DotLottieWorker } from '@lottiefiles/dotlottie-react'; +import type { DotLottie, DotLottieReactProps } from '@lottiefiles/dotlottie-react'; import { DotLottieReact } from '@lottiefiles/dotlottie-react'; -import { Inter } from 'next/font/google'; +import dynamic from 'next/dynamic'; import Head from 'next/head'; -import { useState } from 'react'; +import type { ComponentType } from 'react'; +import { useEffect, useState } from 'react'; -import styles from '@/styles/Home.module.css'; +type Renderer = 'canvas' | 'webgl' | 'webgpu'; -const inter = Inter({ subsets: ['latin'] }); +const DotLottieWebGL = dynamic(() => import('@lottiefiles/dotlottie-react/webgl').then((m) => m.DotLottieReact), { + ssr: false, +}); +const DotLottieWebGPU = dynamic(() => import('@lottiefiles/dotlottie-react/webgpu').then((m) => m.DotLottieReact), { + ssr: false, +}); -const src = 'https://lottie.host/e641272e-039b-4612-96de-138acfbede6e/bc0sW78EeR.lottie'; +const rendererComponent: Record> = { + canvas: DotLottieReact, + webgl: DotLottieWebGL, + webgpu: DotLottieWebGPU, +}; + +const animations = [ + 'https://lottie.host/e641272e-039b-4612-96de-138acfbede6e/bc0sW78EeR.lottie', + 'https://lottie.host/f315768c-a29b-41fd-b5a8-a1c1dfb36cd2/CRiiNg8fqQ.lottie', + 'https://lottie.host/647eb023-6040-4b60-a275-e2546994dd7f/zDCfp5lhLe.json', +]; export default function Home() { - const [dotLottie, setDotLottie] = useState(null); - const [showDotLottie, setShowDotLottie] = useState(false); + const [dotLottie, setDotLottie] = useState(null); + const [renderer, setRenderer] = useState('canvas'); + const [loop, setLoop] = useState(true); + const [speed, setSpeed] = useState(1); + const [currentFrame, setCurrentFrame] = useState(0); + const [srcIdx, setSrcIdx] = useState(0); + const [autoplay, setAutoplay] = useState(true); + + useEffect(() => { + function onFrame(event: { currentFrame: number }) { + setCurrentFrame(event.currentFrame); + } + + dotLottie?.addEventListener('frame', onFrame); + + return () => { + dotLottie?.removeEventListener('frame', onFrame); + }; + }, [dotLottie]); + + const progress = dotLottie?.isLoaded ? (currentFrame / dotLottie.totalFrames) * 100 : 0; + const Component = rendererComponent[renderer]; return ( <> - Create Next App - + dotlottie-react Next.js Example - -
- {showDotLottie && ( - - )} -
- - - - +
+

dotlottie-react + Next.js

+ + {/* Renderer selector */} +
+ Renderer +
+ {(['canvas', 'webgl', 'webgpu'] as const).map((r) => ( + + ))} +
+
+ + {/* Animation */} + + + {/* Progress */} + + + {/* Controls */} +
+ + + + + + + +
+

+ Speed: {speed}x · Frame: {Math.round(currentFrame)} · Renderer: {renderer} +

); diff --git a/examples/next/src/styles/Home.module.css b/examples/next/src/styles/Home.module.css deleted file mode 100644 index ff88d347..00000000 --- a/examples/next/src/styles/Home.module.css +++ /dev/null @@ -1,223 +0,0 @@ -.main { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - padding: 6rem; - min-height: 100vh; -} - -.description { - display: inherit; - justify-content: inherit; - align-items: inherit; - font-size: 0.85rem; - max-width: var(--max-width); - width: 100%; - z-index: 2; - font-family: var(--font-mono); -} - -.description a { - display: flex; - justify-content: center; - align-items: center; - gap: 0.5rem; -} - -.description p { - position: relative; - margin: 0; - padding: 1rem; - background-color: rgba(var(--callout-rgb), 0.5); - border: 1px solid rgba(var(--callout-border-rgb), 0.3); - border-radius: var(--border-radius); -} - -.code { - font-weight: 700; - font-family: var(--font-mono); -} - -.grid { - display: grid; - grid-template-columns: repeat(4, minmax(25%, auto)); - max-width: 100%; - width: var(--max-width); -} - -.card { - padding: 1rem 1.2rem; - border-radius: var(--border-radius); - background: rgba(var(--card-rgb), 0); - border: 1px solid rgba(var(--card-border-rgb), 0); - transition: - background 200ms, - border 200ms; -} - -.card span { - display: inline-block; - transition: transform 200ms; -} - -.card h2 { - font-weight: 600; - margin-bottom: 0.7rem; -} - -.card p { - margin: 0; - opacity: 0.6; - font-size: 0.9rem; - line-height: 1.5; - max-width: 30ch; -} - -.center { - display: flex; - justify-content: center; - align-items: center; - position: relative; - padding: 4rem 0; -} - -.center::before { - background: var(--secondary-glow); - border-radius: 50%; - width: 480px; - height: 360px; - margin-left: -400px; -} - -.center::after { - background: var(--primary-glow); - width: 240px; - height: 180px; - z-index: -1; -} - -.center::before, -.center::after { - content: ""; - left: 50%; - position: absolute; - filter: blur(45px); - transform: translateZ(0); -} - -.logo { - position: relative; -} -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - .card:hover { - background: rgba(var(--card-rgb), 0.1); - border: 1px solid rgba(var(--card-border-rgb), 0.15); - } - - .card:hover span { - transform: translateX(4px); - } -} - -@media (prefers-reduced-motion) { - .card:hover span { - transform: none; - } -} - -/* Mobile */ -@media (max-width: 700px) { - .content { - padding: 4rem; - } - - .grid { - grid-template-columns: 1fr; - margin-bottom: 120px; - max-width: 320px; - text-align: center; - } - - .card { - padding: 1rem 2.5rem; - } - - .card h2 { - margin-bottom: 0.5rem; - } - - .center { - padding: 8rem 0 6rem; - } - - .center::before { - transform: none; - height: 300px; - } - - .description { - font-size: 0.8rem; - } - - .description a { - padding: 1rem; - } - - .description p, - .description div { - display: flex; - justify-content: center; - position: fixed; - width: 100%; - } - - .description p { - align-items: center; - inset: 0 0 auto; - padding: 2rem 1rem 1.4rem; - border-radius: 0; - border: none; - border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); - background: linear-gradient(to bottom, rgba(var(--background-start-rgb), 1), rgba(var(--callout-rgb), 0.5)); - background-clip: padding-box; - backdrop-filter: blur(24px); - } - - .description div { - align-items: flex-end; - pointer-events: none; - inset: auto 0 0; - padding: 2rem; - height: 200px; - background: linear-gradient(to bottom, transparent 0%, rgb(var(--background-end-rgb)) 40%); - z-index: 1; - } -} - -/* Tablet and Smaller Desktop */ -@media (min-width: 701px) and (max-width: 1120px) { - .grid { - grid-template-columns: repeat(2, 50%); - } -} - -@media (prefers-color-scheme: dark) { - .vercelLogo { - filter: invert(1); - } - - .logo { - filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); - } -} - -@keyframes rotate { - from { - transform: rotate(360deg); - } - to { - transform: rotate(0deg); - } -} diff --git a/examples/next/src/styles/globals.css b/examples/next/src/styles/globals.css index 394bc4d4..aa0b894d 100644 --- a/examples/next/src/styles/globals.css +++ b/examples/next/src/styles/globals.css @@ -1,78 +1,21 @@ -:root { - --max-width: 1100px; - --border-radius: 12px; - --font-mono: - ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", "Roboto Mono", "Oxygen Mono", - "Ubuntu Monospace", "Source Code Pro", "Fira Mono", "Droid Sans Mono", "Courier New", monospace; - - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; - - --primary-glow: conic-gradient( - from 180deg at 50% 50%, - #16abff33 0deg, - #0885ff33 55deg, - #54d6ff33 120deg, - #0071ff33 160deg, - transparent 360deg - ); - --secondary-glow: radial-gradient(rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)); - - --tile-start-rgb: 239, 245, 249; - --tile-end-rgb: 228, 232, 233; - --tile-border: conic-gradient(#00000080, #00000040, #00000030, #00000020, #00000010, #00000010, #00000080); - - --callout-rgb: 238, 240, 241; - --callout-border-rgb: 172, 175, 176; - --card-rgb: 180, 185, 188; - --card-border-rgb: 131, 134, 135; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - - --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); - --secondary-glow: linear-gradient(to bottom right, rgba(1, 65, 255, 0), rgba(1, 65, 255, 0), rgba(1, 65, 255, 0.3)); - - --tile-start-rgb: 2, 13, 46; - --tile-end-rgb: 2, 5, 19; - --tile-border: conic-gradient(#ffffff80, #ffffff40, #ffffff30, #ffffff20, #ffffff10, #ffffff10, #ffffff80); - - --callout-rgb: 20, 20, 20; - --callout-border-rgb: 108, 108, 108; - --card-rgb: 100, 100, 100; - --card-border-rgb: 200, 200, 200; - } -} - * { box-sizing: border-box; padding: 0; margin: 0; } -html, -body { - max-width: 100vw; - overflow-x: hidden; -} - body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient(to bottom, transparent, rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb)); + font-family: system-ui, sans-serif; } -a { - color: inherit; - text-decoration: none; +button { + padding: 0.4rem 0.8rem; + border-radius: 4px; + border: 1px solid #ccc; + background: #fff; + cursor: pointer; } -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } +button:hover { + background: #f0f0f0; } diff --git a/examples/react/.eslintrc.cjs b/examples/react/.eslintrc.cjs deleted file mode 100644 index 172ad0d1..00000000 --- a/examples/react/.eslintrc.cjs +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended'], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], - }, -}; diff --git a/examples/react/index.html b/examples/react/index.html index 8bdfc713..30f4299f 100644 --- a/examples/react/index.html +++ b/examples/react/index.html @@ -1,13 +1,12 @@ - - - - - DotLottie React Example - - -
- - + + + + dotlottie-react Example + + +
+ + diff --git a/examples/react/package.json b/examples/react/package.json index f094c6c0..c5ab6bb7 100644 --- a/examples/react/package.json +++ b/examples/react/package.json @@ -4,31 +4,20 @@ "type": "module", "private": true, "scripts": { - "build": "npm run build:client && npm run build:server", - "build:client": "vite build --ssrManifest --outDir dist/client", - "build:server": "vite build --ssr src/server-entry.tsx --outDir dist/server", - "dev": "node server", - "lint": "eslint . --ext .ts,.tsx --report-unused-disable-directives --max-warnings 0", - "preview": "cross-env NODE_ENV=production node server" + "build": "vite build", + "dev": "vite dev --port 3000", + "preview": "vite preview" }, "dependencies": { "@lottiefiles/dotlottie-react": "workspace:*", - "compression": "^1.7.4", - "express": "^4.19.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sirv": "^2.0.4" + "react": "^19", + "react-dom": "^19" }, "devDependencies": { - "@types/react": "^18.2.37", - "@types/react-dom": "^18.2.15", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@types/react": "^19", + "@types/react-dom": "^19", "@vitejs/plugin-react-swc": "^3.5.0", - "eslint": "^8.53.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.4", - "typescript": "^5.2.2", - "vite": "^5.0.13" + "typescript": "5.9.3", + "vite": "^6" } } diff --git a/examples/react/server.js b/examples/react/server.js deleted file mode 100644 index 41700df8..00000000 --- a/examples/react/server.js +++ /dev/null @@ -1,69 +0,0 @@ -/* eslint-disable no-undef */ - -import fs from 'node:fs/promises'; -import express from 'express'; - -// Constants -const isProduction = process.env.NODE_ENV === 'production'; -const port = process.env.PORT || 5173; -const base = process.env.BASE || '/'; - -// Cached production assets -const templateHtml = isProduction ? await fs.readFile('./dist/client/index.html', 'utf-8') : ''; -const ssrManifest = isProduction ? await fs.readFile('./dist/client/.vite/ssr-manifest.json', 'utf-8') : undefined; - -// Create http server -const app = express(); - -// Add Vite or respective production middlewares -let vite; -if (!isProduction) { - const { createServer } = await import('vite'); - vite = await createServer({ - server: { middlewareMode: true }, - appType: 'custom', - base, - }); - app.use(vite.middlewares); -} else { - const compression = (await import('compression')).default; - const sirv = (await import('sirv')).default; - app.use(compression()); - app.use(base, sirv('./dist/client', { extensions: [] })); -} - -// Serve HTML -app.use('*', async (req, res) => { - try { - const url = req.originalUrl.replace(base, ''); - - let template; - let render; - if (!isProduction) { - // Always read fresh template in development - template = await fs.readFile('./index.html', 'utf-8'); - template = await vite.transformIndexHtml(url, template); - render = (await vite.ssrLoadModule('/src/server-entry.tsx')).render; - } else { - template = templateHtml; - render = (await import('./dist/server/server-entry.js')).render; - } - - const rendered = await render(url, ssrManifest); - - const html = template - .replace(``, rendered.head ?? '') - .replace(``, rendered.html ?? ''); - - res.status(200).set({ 'Content-Type': 'text/html' }).send(html); - } catch (e) { - vite?.ssrFixStacktrace(e); - console.log(e.stack); - res.status(500).end(e.stack); - } -}); - -// Start http server -app.listen(port, () => { - console.log(`Server started at http://localhost:${port}`); -}); diff --git a/examples/react/src/App.css b/examples/react/src/App.css deleted file mode 100644 index b9d355df..00000000 --- a/examples/react/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/examples/react/src/App.tsx b/examples/react/src/App.tsx index ab6db3d7..a3a90e65 100644 --- a/examples/react/src/App.tsx +++ b/examples/react/src/App.tsx @@ -1,204 +1,102 @@ -// import { DotLottieReact, DotLottie, setWasmUrl } from '@lottiefiles/dotlottie-react'; -import { type DotLottieWorker, DotLottieWorkerReact, setWasmUrl } from '@lottiefiles/dotlottie-react'; -import React, { useState } from 'react'; +import type { DotLottie } from '@lottiefiles/dotlottie-react'; +import { lazy, Suspense, useEffect, useState } from 'react'; + +type Renderer = 'canvas' | 'webgl' | 'webgpu'; + +const DotLottieCanvas = lazy(() => import('@lottiefiles/dotlottie-react').then((m) => ({ default: m.DotLottieReact }))); +const DotLottieWebGL = lazy(() => + import('@lottiefiles/dotlottie-react/webgl').then((m) => ({ default: m.DotLottieReact })), +); +const DotLottieWebGPU = lazy(() => + import('@lottiefiles/dotlottie-react/webgpu').then((m) => ({ default: m.DotLottieReact })), +); + +const rendererComponent = { + canvas: DotLottieCanvas, + webgl: DotLottieWebGL, + webgpu: DotLottieWebGPU, +} as const; const animations = [ - // 'https://lottie.host/68f06eea-5f90-4e58-b51e-3abe1fbd74b8/llUlrzgWDQ.lottie', 'https://lottie.host/e641272e-039b-4612-96de-138acfbede6e/bc0sW78EeR.lottie', - './markers_example.json', 'https://lottie.host/f315768c-a29b-41fd-b5a8-a1c1dfb36cd2/CRiiNg8fqQ.lottie', 'https://lottie.host/647eb023-6040-4b60-a275-e2546994dd7f/zDCfp5lhLe.json', - './dragon.json', ]; -setWasmUrl(new URL('../../../packages/web/src/core/dotlottie-player.wasm', import.meta.url).href); - function App() { - const [dotLottie, setDotLottie] = useState(null); + const [dotLottie, setDotLottie] = useState(null); + const [renderer, setRenderer] = useState('canvas'); const [loop, setLoop] = useState(true); const [speed, setSpeed] = useState(1); const [currentFrame, setCurrentFrame] = useState(0); const [srcIdx, setSrcIdx] = useState(0); - const [useFrameInterpolation, setUseFrameInterpolation] = useState(false); - const [playOnHover, setPlayOnHover] = useState(false); - const [autoResizeCanvas, setAutoResizeCanvas] = useState(true); - const [marker, setMarker] = useState(''); - const [allMarkers, setAllMarkers] = useState([]); - const [animationsIds, setAnimationsIds] = useState([]); - const [currentAnimationId, setCurrentAnimationId] = useState(''); - const [isMounted, setIsMounted] = useState(false); - - React.useEffect(() => { - setIsMounted(true); - }, []); + const [autoplay, setAutoplay] = useState(true); - React.useEffect(() => { - function updateCurrentFrame(event: { currentFrame: number }) { - // console.log('currentFrame', event.currentFrame); + useEffect(() => { + function onFrame(event: { currentFrame: number }) { setCurrentFrame(event.currentFrame); } - function onLoad() { - if (dotLottie) { - setAllMarkers(dotLottie.markers().map((marker) => marker.name)); - setAnimationsIds(dotLottie.manifest?.animations.map((animation) => animation.id) || []); - setCurrentAnimationId(dotLottie.activeAnimationId || ''); - } - } - - dotLottie?.addEventListener('play', console.log); - dotLottie?.addEventListener('freeze', console.log); - dotLottie?.addEventListener('unfreeze', console.log); - dotLottie?.addEventListener('pause', console.log); - dotLottie?.addEventListener('stop', console.log); - dotLottie?.addEventListener('load', onLoad); - dotLottie?.addEventListener('frame', updateCurrentFrame); + dotLottie?.addEventListener('frame', onFrame); return () => { - dotLottie?.removeEventListener('play', console.log); - dotLottie?.removeEventListener('freeze', console.log); - dotLottie?.removeEventListener('unfreeze', console.log); - dotLottie?.addEventListener('pause', console.log); - dotLottie?.addEventListener('stop', console.log); - dotLottie?.removeEventListener('load', onLoad); - dotLottie?.removeEventListener('frame', updateCurrentFrame); + dotLottie?.removeEventListener('frame', onFrame); }; }, [dotLottie]); const progress = dotLottie?.isLoaded ? (currentFrame / dotLottie.totalFrames) * 100 : 0; + const Component = rendererComponent[renderer]; return ( -
-
- {isMounted && ( - +

dotlottie-react example

+ + {/* Renderer selector */} +
+ Renderer +
+ {(['canvas', 'webgl', 'webgpu'] as const).map((r) => ( + + ))} +
+
+ + {/* Animation */} + Loading renderer...
} + > + - )} - - - - - - - - - - - - { - setAutoResizeCanvas(!autoResizeCanvas); - }} - /> - Auto resize canvas -
- + {/* Controls */} +
+ + + + + + + +
+

+ Speed: {speed}x · Frame: {Math.round(currentFrame)} · Renderer: {renderer} +

); } diff --git a/examples/react/src/assets/react.svg b/examples/react/src/assets/react.svg deleted file mode 100644 index 6c87de9b..00000000 --- a/examples/react/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/examples/react/src/client-entry.tsx b/examples/react/src/client-entry.tsx index d86c660a..76c14c38 100644 --- a/examples/react/src/client-entry.tsx +++ b/examples/react/src/client-entry.tsx @@ -1,12 +1,5 @@ -import './index.css'; -import ReactDOM from 'react-dom/client'; +import { createRoot } from 'react-dom/client'; + import App from './App'; -ReactDOM.hydrateRoot( - document.getElementById('root') as HTMLElement, - // - , - { - /* , */ - }, -); +createRoot(document.getElementById('root')!).render(); diff --git a/examples/react/src/index.css b/examples/react/src/index.css deleted file mode 100644 index 6119ad9a..00000000 --- a/examples/react/src/index.css +++ /dev/null @@ -1,68 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/examples/react/src/server-entry.tsx b/examples/react/src/server-entry.tsx deleted file mode 100644 index 3ade5857..00000000 --- a/examples/react/src/server-entry.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import './index.css'; -import ReactDOMServer from 'react-dom/server'; -import App from './App'; - -export function render() { - const html = ReactDOMServer.renderToString( - // - , - // , - ); - return { html }; -} diff --git a/examples/react/vite.config.ts b/examples/react/vite.config.ts index 066de454..90c91e7a 100644 --- a/examples/react/vite.config.ts +++ b/examples/react/vite.config.ts @@ -1,7 +1,6 @@ import react from '@vitejs/plugin-react-swc'; import { defineConfig } from 'vite'; -// https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], publicDir: '../../fixtures', diff --git a/packages/react/package.json b/packages/react/package.json index c96b5e35..521b4818 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -19,6 +19,23 @@ "module": "dist/index.js", "browser": "dist/browser/index.js", "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "./webgl": { + "types": "./dist/webgl/index.d.ts", + "import": "./dist/webgl/index.js", + "default": "./dist/webgl/index.js" + }, + "./webgpu": { + "types": "./dist/webgpu/index.d.ts", + "import": "./dist/webgpu/index.js", + "default": "./dist/webgpu/index.js" + } + }, "files": [ "dist" ], @@ -52,6 +69,7 @@ "devDependencies": { "@testing-library/user-event": "^14.5.2", "@types/react": "^19", + "@webgpu/types": "^0.1.69", "@types/react-dom": "^19", "@vitejs/plugin-react": "^4.2.1", "@vitest/browser": "^4.0.18", diff --git a/packages/react/src/webgl/index.tsx b/packages/react/src/webgl/index.tsx new file mode 100644 index 00000000..a7e629e3 --- /dev/null +++ b/packages/react/src/webgl/index.tsx @@ -0,0 +1,25 @@ +'use client'; + +import type { Config, DotLottie } from '@lottiefiles/dotlottie-web'; +import type { WebGLConfig } from '@lottiefiles/dotlottie-web/webgl'; +import { DotLottie as DotLottieWebGL } from '@lottiefiles/dotlottie-web/webgl'; +import type { ReactNode } from 'react'; + +import type { BaseDotLottieProps } from '../base-dotlottie-react'; +import { BaseDotLottieReact } from '../base-dotlottie-react'; + +export type DotLottieReactProps = Omit, 'createDotLottie'>; + +const createDotLottie = (config: Config): DotLottie => + new DotLottieWebGL(config as unknown as WebGLConfig) as unknown as DotLottie; + +export const DotLottieReact = (props: DotLottieReactProps): ReactNode => { + return ; +}; + +export type * from '@lottiefiles/dotlottie-web'; +export type { WebGLConfig } from '@lottiefiles/dotlottie-web/webgl'; + +export const setWasmUrl = (url: string): void => { + DotLottieWebGL.setWasmUrl(url); +}; diff --git a/packages/react/src/webgpu/index.tsx b/packages/react/src/webgpu/index.tsx new file mode 100644 index 00000000..0401b743 --- /dev/null +++ b/packages/react/src/webgpu/index.tsx @@ -0,0 +1,27 @@ +'use client'; + +import type { Config, DotLottie } from '@lottiefiles/dotlottie-web'; +import type { WebGPUConfig } from '@lottiefiles/dotlottie-web/webgpu'; +import { DotLottie as DotLottieWebGPU } from '@lottiefiles/dotlottie-web/webgpu'; +import type { ReactNode } from 'react'; + +import type { BaseDotLottieProps } from '../base-dotlottie-react'; +import { BaseDotLottieReact } from '../base-dotlottie-react'; + +export type DotLottieReactProps = Omit, 'createDotLottie'> & { + device?: GPUDevice; +}; + +export const DotLottieReact = ({ device, ...props }: DotLottieReactProps): ReactNode => { + const createDotLottie = (config: Config): DotLottie => + new DotLottieWebGPU({ ...config, device } as unknown as WebGPUConfig) as unknown as DotLottie; + + return ; +}; + +export type * from '@lottiefiles/dotlottie-web'; +export type { WebGPUConfig } from '@lottiefiles/dotlottie-web/webgpu'; + +export const setWasmUrl = (url: string): void => { + DotLottieWebGPU.setWasmUrl(url); +}; diff --git a/packages/react/tsconfig.build.json b/packages/react/tsconfig.build.json index 12c26e9b..7e2a0b7d 100644 --- a/packages/react/tsconfig.build.json +++ b/packages/react/tsconfig.build.json @@ -12,7 +12,11 @@ "jsx": "react-jsx", - "exactOptionalPropertyTypes": false + "exactOptionalPropertyTypes": false, + + "moduleResolution": "bundler", + + "types": ["@webgpu/types"] }, // Files included in compilation diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index 4a391459..59705acf 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -5,6 +5,8 @@ // Compiler options "compilerOptions": { "jsx": "react-jsx", - "exactOptionalPropertyTypes": false + "exactOptionalPropertyTypes": false, + "moduleResolution": "bundler", + "types": ["@webgpu/types"] } } diff --git a/packages/react/tsdown.config.ts b/packages/react/tsdown.config.ts index 3574d9ea..b2dd8e1e 100644 --- a/packages/react/tsdown.config.ts +++ b/packages/react/tsdown.config.ts @@ -25,4 +25,30 @@ export default defineConfig([ noExternal: Object.keys(pkg.dependencies), outDir: 'dist/browser', }, + // WebGL + { + ...config, + entry: { 'webgl/index': './src/webgl/index.tsx' }, + }, + // WebGL CDN build + { + ...config, + entry: { 'webgl/index': './src/webgl/index.tsx' }, + dts: false, + noExternal: Object.keys(pkg.dependencies), + outDir: 'dist/browser', + }, + // WebGPU + { + ...config, + entry: { 'webgpu/index': './src/webgpu/index.tsx' }, + }, + // WebGPU CDN build + { + ...config, + entry: { 'webgpu/index': './src/webgpu/index.tsx' }, + dts: false, + noExternal: Object.keys(pkg.dependencies), + outDir: 'dist/browser', + }, ]); diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index 8b31aa99..82f24b06 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -7,5 +7,5 @@ "types": ["@webgpu/types"] }, - "exclude": ["tsdown.config.ts", "rolldown-plugins"] + "exclude": ["tsdown.config.ts", "rolldown-plugins", "dotlottie-rs"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd805396..4383cce3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -226,52 +226,28 @@ importers: '@lottiefiles/dotlottie-react': specifier: workspace:* version: link:../../packages/react - compression: - specifier: ^1.7.4 - version: 1.8.1 - express: - specifier: ^4.19.2 - version: 4.22.1 react: - specifier: ^18.2.0 - version: 18.3.1 + specifier: ^19 + version: 19.2.3 react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - sirv: - specifier: ^2.0.4 - version: 2.0.4 + specifier: ^19 + version: 19.2.3(react@19.2.3) devDependencies: '@types/react': - specifier: ^18.2.37 - version: 18.3.23 + specifier: ^19 + version: 19.2.7 '@types/react-dom': - specifier: ^18.2.15 - version: 18.3.7(@types/react@18.3.23) - '@typescript-eslint/eslint-plugin': - specifier: ^6.10.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': - specifier: ^6.10.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^19 + version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react-swc': specifier: ^3.5.0 - version: 3.10.0(@swc/helpers@0.5.17)(vite@5.4.19(@types/node@22.15.24)(lightningcss@1.30.1)(terser@5.40.0)) - eslint: - specifier: ^8.53.0 - version: 8.57.1 - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.4.4 - version: 0.4.20(eslint@8.57.1) + version: 3.10.0(@swc/helpers@0.5.17)(vite@6.4.2(@types/node@22.15.24)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) typescript: - specifier: ^5.2.2 + specifier: 5.9.3 version: 5.9.3 vite: - specifier: ^5.0.13 - version: 5.4.19(@types/node@22.15.24)(lightningcss@1.30.1)(terser@5.40.0) + specifier: ^6 + version: 6.4.2(@types/node@22.15.24)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/solid: dependencies: @@ -422,6 +398,9 @@ importers: '@vitest/coverage-istanbul': specifier: ^4.0.18 version: 4.0.18(vitest@4.0.18) + '@webgpu/types': + specifier: ^0.1.69 + version: 0.1.69 react: specifier: ^19 version: 19.1.1 @@ -3017,17 +2996,9 @@ packages: '@types/parse5@5.0.3': resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} - peerDependencies: - '@types/react': ^18.0.0 - '@types/react-dom@19.1.9': resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==} peerDependencies: @@ -3038,9 +3009,6 @@ packages: peerDependencies: '@types/react': ^19.2.0 - '@types/react@18.3.23': - resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} - '@types/react@19.1.12': resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} @@ -3399,10 +3367,6 @@ packages: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3506,9 +3470,6 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} @@ -3633,10 +3594,6 @@ packages: birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -3678,22 +3635,10 @@ packages: resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} engines: {node: '>= 0.8'} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -3845,14 +3790,6 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} - engines: {node: '>= 0.8.0'} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -3860,14 +3797,6 @@ packages: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - conventional-changelog-angular@8.1.0: resolution: {integrity: sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==} engines: {node: '>=18'} @@ -3884,9 +3813,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -4192,14 +4118,6 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -4244,18 +4162,10 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -4334,16 +4244,9 @@ packages: oxc-resolver: optional: true - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@3.19.16: resolution: {integrity: sha512-7+XC3vGrbAhCHd8LTFHvnZjRpZKZ8YHRZqJTkpNoxcJ2mCyNs2SwI+6VkV/ij8Y3YW7wfBN4EbU06/F5+m/wkQ==} @@ -4367,10 +4270,6 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -4403,21 +4302,9 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} @@ -4445,9 +4332,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -4568,10 +4452,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -4580,10 +4460,6 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -4666,10 +4542,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - find-chrome-bin@2.0.2: resolution: {integrity: sha512-KlggCilbbvgETk/WEq9NG894U8yu4erIW0SjMm1sMPm2xihCHeNoybpzGoxEzHRthwF3XrKOgHYtfqgJzpCH2w==} engines: {node: '>=18.0.0'} @@ -4701,17 +4573,9 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -4748,14 +4612,6 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -4827,10 +4683,6 @@ packages: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4848,10 +4700,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -4892,10 +4740,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -4989,10 +4833,6 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -5468,10 +5308,6 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - mdast-comment-marker@2.1.2: resolution: {integrity: sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==} @@ -5557,10 +5393,6 @@ packages: mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - meow@12.1.1: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} @@ -5577,9 +5409,6 @@ packages: resolution: {integrity: sha512-F3K1W45PvTjRZzbcYIhXntNr8cux00gUxR8IzNPPG+80gNlAHZGVBwFyN4x5yjw/7QkLPKDbRQBK4KrJKo69mw==} engines: {node: '>=18'} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -5590,10 +5419,6 @@ packages: mermaid@8.14.0: resolution: {integrity: sha512-ITSHjwVaby1Li738sxhF48sLTxcNyUAoWfoqyztL1f7J6JOLpHOuQPNLBb6lxGPUA0u7xP9IRULgvod0dKu35A==} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -5780,11 +5605,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -5833,9 +5653,6 @@ packages: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -5883,14 +5700,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -5975,21 +5784,9 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -6082,10 +5879,6 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -6115,9 +5908,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -6280,10 +6070,6 @@ packages: propose@0.0.5: resolution: {integrity: sha512-Jary1vb+ap2DIwOGfyiadcK4x1Iu3pzpkDBy8tljFPmQvnc9ES3m1PMZOMiWOG50cfoAyYNtGeBzrp+Rlh4G9A==} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - proxy-agent@6.4.0: resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} @@ -6335,10 +6121,6 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} - engines: {node: '>=0.6'} - quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -6354,25 +6136,12 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} - react-device-detect@2.2.3: resolution: {integrity: sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==} peerDependencies: react: '>= 0.14.0' react-dom: '>= 0.14.0' - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - react-dom@19.1.1: resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: @@ -6441,10 +6210,6 @@ packages: react: '>=18' react-dom: '>=18' - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - react@19.1.1: resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} @@ -6747,9 +6512,6 @@ packages: sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} @@ -6779,10 +6541,6 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -6796,16 +6554,9 @@ packages: resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} engines: {node: '>=10'} - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp-phash@2.2.0: resolution: {integrity: sha512-/gBoes9EycJkt/2aakKl9BeSGxFbPpZ5lCDtpRRlnU+vkqqcdXi8YLIlXnJsTtTBmaL82zh1bPkV7uZSSIsj8w==} engines: {node: '>= 10'} @@ -6828,22 +6579,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -6854,10 +6589,6 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} @@ -7255,10 +6986,6 @@ packages: to-vfile@7.2.4: resolution: {integrity: sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -7386,10 +7113,6 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - typed-query-selector@2.12.0: resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} @@ -7516,10 +7239,6 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - unplugin-solid@1.0.0: resolution: {integrity: sha512-pv1CS3XMtf3WwX8Dq9Bvo4qH6mfjN2xOgbaPcnqW1dLhyP/JQCvueGEsN0dYIZ4JvxaD/G/Ot1JnBzNQGHkfeA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -7563,10 +7282,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true @@ -7586,10 +7301,6 @@ packages: resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} engines: {node: ^18.17.0 || >=20.5.0} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - vfile-find-up@6.0.0: resolution: {integrity: sha512-TPE1tYyHrYxewHxi42F8yP45rY5fK78jiPg9WP1xH5TfAbdncxja5NquZyYSSzG1aHpK98AvUOVJrEOoTonW6w==} @@ -7667,6 +7378,46 @@ packages: terser: optional: true + vite@6.4.2: + resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -10142,14 +9893,8 @@ snapshots: '@types/parse5@5.0.3': {} - '@types/prop-types@15.7.14': {} - '@types/pug@2.0.10': {} - '@types/react-dom@18.3.7(@types/react@18.3.23)': - dependencies: - '@types/react': 18.3.23 - '@types/react-dom@19.1.9(@types/react@19.1.12)': dependencies: '@types/react': 19.1.12 @@ -10158,11 +9903,6 @@ snapshots: dependencies: '@types/react': 19.2.7 - '@types/react@18.3.23': - dependencies: - '@types/prop-types': 15.7.14 - csstype: 3.2.3 - '@types/react@19.1.12': dependencies: csstype: 3.1.3 @@ -10385,11 +10125,11 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react-swc@3.10.0(@swc/helpers@0.5.17)(vite@5.4.19(@types/node@22.15.24)(lightningcss@1.30.1)(terser@5.40.0))': + '@vitejs/plugin-react-swc@3.10.0(@swc/helpers@0.5.17)(vite@6.4.2(@types/node@22.15.24)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.9 '@swc/core': 1.11.29(@swc/helpers@0.5.17) - vite: 5.4.19(@types/node@22.15.24)(lightningcss@1.30.1)(terser@5.40.0) + vite: 6.4.2(@types/node@22.15.24)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@swc/helpers' @@ -10692,11 +10432,6 @@ snapshots: abbrev@2.0.0: {} - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -10786,8 +10521,6 @@ snapshots: aria-query@5.3.2: {} - array-flatten@1.1.1: {} - array-ify@1.0.0: {} array-union@2.1.0: {} @@ -10900,23 +10633,6 @@ snapshots: birpc@4.0.0: {} - body-parser@1.20.4: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.14.1 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -10962,20 +10678,8 @@ snapshots: bytes-iec@3.1.1: {} - bytes@3.1.2: {} - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -11112,22 +10816,6 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 - compressible@2.0.18: - dependencies: - mime-db: 1.52.0 - - compression@1.8.1: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.1.0 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - concat-map@0.0.1: {} concat-stream@2.0.0: @@ -11137,12 +10825,6 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - conventional-changelog-angular@8.1.0: dependencies: compare-func: 2.0.0 @@ -11159,11 +10841,10 @@ snapshots: convert-source-map@2.0.0: {} - cookie-signature@1.0.7: {} - cookie@0.6.0: {} - cookie@0.7.2: {} + cookie@0.7.2: + optional: true core-util-is@1.0.3: {} @@ -11541,10 +11222,6 @@ snapshots: de-indent@1.0.2: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@4.3.4: dependencies: ms: 2.1.2 @@ -11577,12 +11254,8 @@ snapshots: dependencies: robust-predicates: 3.0.2 - depd@2.0.0: {} - dequal@2.0.3: {} - destroy@1.2.0: {} - detect-indent@6.1.0: {} detect-libc@2.0.4: {} @@ -11645,16 +11318,8 @@ snapshots: dts-resolver@2.1.3: {} - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} - effect@3.19.16: dependencies: '@standard-schema/spec': 1.0.0 @@ -11672,8 +11337,6 @@ snapshots: empathic@2.0.0: {} - encodeurl@2.0.0: {} - end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -11704,16 +11367,8 @@ snapshots: dependencies: stackframe: 1.3.4 - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - es6-promise@3.3.1: {} esbuild@0.21.5: @@ -11828,8 +11483,6 @@ snapshots: escalade@3.2.0: {} - escape-html@1.0.3: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -11987,48 +11640,10 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: {} - events@3.3.0: {} expect-type@1.3.0: {} - express@4.22.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.4 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.14.1 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - extend@3.0.2: {} extendable-error@0.1.7: {} @@ -12103,18 +11718,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.2: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - find-chrome-bin@2.0.2: dependencies: '@puppeteer/browsers': 2.10.5 @@ -12151,12 +11754,8 @@ snapshots: format@0.2.2: {} - forwarded@0.2.0: {} - fraction.js@4.3.7: {} - fresh@0.5.2: {} - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -12185,24 +11784,6 @@ snapshots: get-east-asian-width@1.4.0: {} - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - get-stream@5.2.0: dependencies: pump: 3.0.2 @@ -12297,8 +11878,6 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.3.0 - gopd@1.2.0: {} - graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -12312,8 +11891,6 @@ snapshots: has-flag@4.0.0: {} - has-symbols@1.1.0: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -12358,14 +11935,6 @@ snapshots: html-escaper@2.0.2: {} - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 @@ -12446,8 +12015,6 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 - ipaddr.js@1.9.1: {} - is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -12843,8 +12410,6 @@ snapshots: markdown-table@3.0.4: {} - math-intrinsics@1.1.0: {} - mdast-comment-marker@2.1.2: dependencies: '@types/mdast': 3.0.11 @@ -13066,8 +12631,6 @@ snapshots: mdn-data@2.0.14: {} - media-typer@0.3.0: {} - meow@12.1.1: {} meow@13.2.0: {} @@ -13080,8 +12643,6 @@ snapshots: dependencies: is-what: 5.5.0 - merge-descriptors@1.0.3: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -13098,8 +12659,6 @@ snapshots: moment-mini: 2.29.4 stylis: 4.3.6 - methods@1.1.2: {} - micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.1.0 @@ -13525,8 +13084,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mime@1.6.0: {} - mimic-function@5.0.1: {} min-indent@1.0.1: {} @@ -13563,8 +13120,6 @@ snapshots: mrmime@2.0.1: {} - ms@2.0.0: {} - ms@2.1.2: {} ms@2.1.3: {} @@ -13618,10 +13173,6 @@ snapshots: natural-compare@1.4.0: {} - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - neo-async@2.6.2: {} netmask@2.0.2: {} @@ -13696,16 +13247,8 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.4: {} - obug@2.1.1: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.1.0: {} - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -13830,8 +13373,6 @@ snapshots: dependencies: entities: 6.0.0 - parseurl@1.3.3: {} - pascal-case@3.1.2: dependencies: no-case: 3.0.4 @@ -13854,8 +13395,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.12: {} - path-to-regexp@6.3.0: optional: true @@ -13988,11 +13527,6 @@ snapshots: dependencies: levenshtein-edit-distance: 1.0.0 - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - proxy-agent@6.4.0: dependencies: agent-base: 7.1.3 @@ -14085,10 +13619,6 @@ snapshots: q@1.5.1: {} - qs@6.14.1: - dependencies: - side-channel: 1.1.0 - quansync@0.2.11: {} quansync@1.0.0: {} @@ -14102,27 +13632,12 @@ snapshots: dependencies: safe-buffer: 5.2.1 - range-parser@1.2.1: {} - - raw-body@2.5.3: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - react-device-detect@2.2.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) ua-parser-js: 1.0.40 - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-dom@19.1.1(react@19.1.1): dependencies: react: 19.1.1 @@ -14182,10 +13697,6 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - react@19.1.1: {} react@19.2.3: {} @@ -14843,10 +14354,6 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.26.0: {} scheduler@0.27.0: {} @@ -14868,24 +14375,6 @@ snapshots: semver@7.7.4: {} - send@0.19.2: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -14896,19 +14385,8 @@ snapshots: seroval@1.5.0: {} - serve-static@1.16.3: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color - set-cookie-parser@2.7.1: {} - setprototypeof@1.2.0: {} - sharp-phash@2.2.0(sharp@0.33.5): dependencies: sharp: 0.33.5 @@ -14977,34 +14455,6 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -15013,12 +14463,6 @@ snapshots: dependencies: is-arrayish: 0.3.2 - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.29 - mrmime: 2.0.1 - totalist: 3.0.1 - sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 @@ -15144,7 +14588,8 @@ snapshots: stack-generator: 2.0.10 stacktrace-gps: 3.1.2 - statuses@2.0.2: {} + statuses@2.0.2: + optional: true std-env@3.10.0: {} @@ -15474,8 +14919,6 @@ snapshots: is-buffer: 2.0.5 vfile: 5.3.2 - toidentifier@1.0.1: {} - totalist@3.0.1: {} tough-cookie@4.1.4: @@ -15596,11 +15039,6 @@ snapshots: type-fest@4.41.0: optional: true - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - typed-query-selector@2.12.0: {} typedarray@0.0.6: {} @@ -15836,8 +15274,6 @@ snapshots: universalify@0.2.0: optional: true - unpipe@1.0.0: {} - unplugin-solid@1.0.0(rollup@4.57.1)(solid-js@1.9.11)(vite@7.3.1(@types/node@22.15.24)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): dependencies: '@babel/core': 7.29.0 @@ -15888,8 +15324,6 @@ snapshots: util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} - uuid@10.0.0: {} uvu@0.5.6: @@ -15906,8 +15340,6 @@ snapshots: validate-npm-package-name@6.0.2: {} - vary@1.1.2: {} - vfile-find-up@6.0.0: dependencies: to-vfile: 7.2.4 @@ -15999,6 +15431,23 @@ snapshots: lightningcss: 1.30.1 terser: 5.40.0 + vite@6.4.2(@types/node@22.15.24)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): + dependencies: + esbuild: 0.25.5 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.15.24 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + terser: 5.40.0 + tsx: 4.19.4 + yaml: 2.8.0 + vite@7.3.1(@types/node@22.15.24)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.27.3