Compare commits

...

1 Commits

Author SHA1 Message Date
Alex Yang a0d5350f84 fix(docs): react 19 warning 2025-03-09 00:47:22 -08:00
9 changed files with 392 additions and 108 deletions
-1
View File
@@ -51,7 +51,6 @@
"react-dom": "^19.0.0",
"react-icons": "^5.3.0",
"react-monaco-editor": "^0.56.2",
"react-text-transition": "^3.1.0",
"react-use-measure": "^2.1.1",
"rehype-katex": "^7.0.1",
"remark-math": "^6.0.0",
+6 -1
View File
@@ -2,6 +2,7 @@ import { rehypeCodeDefaultOptions } from "fumadocs-core/mdx-plugins";
import { fileGenerator, remarkDocGen, remarkInstall } from "fumadocs-docgen";
import { defineConfig, defineDocs } from "fumadocs-mdx/config";
import { transformerTwoslash } from "fumadocs-twoslash";
import { createFileSystemTypesCache } from "fumadocs-twoslash/cache-fs";
import rehypeKatex from "rehype-katex";
import remarkMath from "remark-math";
@@ -20,7 +21,11 @@ export default defineConfig({
},
transformers: [
...(rehypeCodeDefaultOptions.transformers ?? []),
transformerTwoslash(),
transformerTwoslash({
typesCache: createFileSystemTypesCache({
dir: ".next/cache/twoslash",
}),
}),
{
name: "transformers:remove-notation-escape",
code(hast) {
+2 -2
View File
@@ -8,7 +8,7 @@ import {
} from "@/components/infinite-providers";
import { MagicMove } from "@/components/magic-move";
import { NpmInstall } from "@/components/npm-install";
import { TextEffect } from "@/components/text-effect";
import { Supports } from "@/components/supports";
import { Button } from "@/components/ui/button";
import { Skeleton } from "@/components/ui/skeleton";
import { LEGACY_DOCUMENT_URL } from "@/lib/const";
@@ -35,7 +35,7 @@ export default function HomePage() {
</p>
<div className="text-center text-lg text-fd-muted-foreground mb-12">
<span>Designed for building web applications in </span>
<TextEffect />
<Supports />
</div>
<div className="flex flex-wrap justify-center gap-4">
@@ -13,6 +13,8 @@ import { notFound } from "next/navigation";
const { AutoTypeTable } = createTypeTable();
export const revalidate = false;
export default async function Page(props: {
params: Promise<{ slug?: string[] }>;
}) {
@@ -26,6 +28,7 @@ export default async function Page(props: {
<DocsPage
toc={page.data.toc}
full={page.data.full}
lastUpdate={page.data.lastModified}
editOnGithub={{
owner: "run-llama",
repo: "LlamaIndexTS",
+62
View File
@@ -0,0 +1,62 @@
import fg from "fast-glob";
import { fileGenerator, remarkDocGen, remarkInstall } from "fumadocs-docgen";
import { remarkInclude } from "fumadocs-mdx/config";
import { remarkAutoTypeTable } from "fumadocs-typescript";
import matter from "gray-matter";
import * as fs from "node:fs/promises";
import path from "node:path";
import { remark } from "remark";
import remarkGfm from "remark-gfm";
import remarkMdx from "remark-mdx";
import remarkStringify from "remark-stringify";
export const revalidate = false;
export async function GET() {
const files = await fg([
"./src/content/docs/**/*.mdx",
// remove generated openapi files
"!./src/content/docs/cloud/api/**/*",
]);
const scan = files.map(async (file) => {
const fileContent = await fs.readFile(file);
const { content, data } = matter(fileContent.toString());
const dir = path.dirname(file).split(path.sep).at(4);
const category = {
llamaindex: "LlamaIndexTS Framework",
api: "LlamaIndexTS API",
cloud: "LlamaCloud Service",
}[dir ?? ""];
const processed = await processContent(file, content);
return `file: ${file}
# ${category}: ${data.title}
${data.description}
${processed}`;
});
const scanned = await Promise.all(scan);
return new Response(scanned.join("\n\n"));
}
async function processContent(path: string, content: string): Promise<string> {
const file = await remark()
.use(remarkMdx)
.use(remarkInclude)
.use(remarkGfm)
.use(remarkAutoTypeTable)
.use(remarkDocGen, { generators: [fileGenerator()] })
.use(remarkInstall, { persist: { id: "package-manager" } })
.use(remarkStringify)
.process({
path,
value: content,
});
return String(file);
}
@@ -0,0 +1,268 @@
import { cn } from "@/lib/utils";
import {
AnimatePresence,
motion,
Transition,
type AnimationControls,
type Target,
type TargetAndTransition,
type VariantLabels,
} from "framer-motion";
import React, {
forwardRef,
useCallback,
useEffect,
useImperativeHandle,
useMemo,
useState,
} from "react";
export interface RotatingTextRef {
next: () => void;
previous: () => void;
jumpTo: (index: number) => void;
reset: () => void;
}
export interface RotatingTextProps
extends Omit<
React.ComponentPropsWithoutRef<typeof motion.span>,
"children" | "transition" | "initial" | "animate" | "exit"
> {
texts: string[];
transition?: Transition;
initial?: boolean | Target | VariantLabels;
animate?: boolean | VariantLabels | AnimationControls | TargetAndTransition;
exit?: Target | VariantLabels;
animatePresenceMode?: "sync" | "wait";
animatePresenceInitial?: boolean;
rotationInterval?: number;
staggerDuration?: number;
staggerFrom?: "first" | "last" | "center" | "random" | number;
loop?: boolean;
auto?: boolean;
splitBy?: string;
onNext?: (index: number) => void;
mainClassName?: string;
splitLevelClassName?: string;
elementLevelClassName?: string;
}
export const RotatingText = forwardRef<RotatingTextRef, RotatingTextProps>(
(
{
texts,
transition = { type: "spring", damping: 25, stiffness: 300 },
initial = { y: "100%", opacity: 0 },
animate = { y: 0, opacity: 1 },
exit = { y: "-120%", opacity: 0 },
animatePresenceMode = "wait",
animatePresenceInitial = false,
rotationInterval = 2000,
staggerDuration = 0,
staggerFrom = "first",
loop = true,
auto = true,
splitBy = "characters",
onNext,
mainClassName,
splitLevelClassName,
elementLevelClassName,
...rest
},
ref,
) => {
const [currentTextIndex, setCurrentTextIndex] = useState<number>(0);
const splitIntoCharacters = (text: string): string[] => {
if (typeof Intl !== "undefined" && Intl.Segmenter) {
const segmenter = new Intl.Segmenter("en", { granularity: "grapheme" });
return Array.from(
segmenter.segment(text),
(segment) => segment.segment,
);
}
return Array.from(text);
};
const elements = useMemo(() => {
const currentText: string = texts[currentTextIndex];
if (splitBy === "characters") {
const words = currentText.split(" ");
return words.map((word, i) => ({
characters: splitIntoCharacters(word),
needsSpace: i !== words.length - 1,
}));
}
if (splitBy === "words") {
return currentText.split(" ").map((word, i, arr) => ({
characters: [word],
needsSpace: i !== arr.length - 1,
}));
}
if (splitBy === "lines") {
return currentText.split("\n").map((line, i, arr) => ({
characters: [line],
needsSpace: i !== arr.length - 1,
}));
}
return currentText.split(splitBy).map((part, i, arr) => ({
characters: [part],
needsSpace: i !== arr.length - 1,
}));
}, [texts, currentTextIndex, splitBy]);
const getStaggerDelay = useCallback(
(index: number, totalChars: number): number => {
const total = totalChars;
if (staggerFrom === "first") return index * staggerDuration;
if (staggerFrom === "last")
return (total - 1 - index) * staggerDuration;
if (staggerFrom === "center") {
const center = Math.floor(total / 2);
return Math.abs(center - index) * staggerDuration;
}
if (staggerFrom === "random") {
const randomIndex = Math.floor(Math.random() * total);
return Math.abs(randomIndex - index) * staggerDuration;
}
return Math.abs((staggerFrom as number) - index) * staggerDuration;
},
[staggerFrom, staggerDuration],
);
const handleIndexChange = useCallback(
(newIndex: number) => {
setCurrentTextIndex(newIndex);
if (onNext) onNext(newIndex);
},
[onNext],
);
const next = useCallback(() => {
const nextIndex =
currentTextIndex === texts.length - 1
? loop
? 0
: currentTextIndex
: currentTextIndex + 1;
if (nextIndex !== currentTextIndex) {
handleIndexChange(nextIndex);
}
}, [currentTextIndex, texts.length, loop, handleIndexChange]);
const previous = useCallback(() => {
const prevIndex =
currentTextIndex === 0
? loop
? texts.length - 1
: currentTextIndex
: currentTextIndex - 1;
if (prevIndex !== currentTextIndex) {
handleIndexChange(prevIndex);
}
}, [currentTextIndex, texts.length, loop, handleIndexChange]);
const jumpTo = useCallback(
(index: number) => {
const validIndex = Math.max(0, Math.min(index, texts.length - 1));
if (validIndex !== currentTextIndex) {
handleIndexChange(validIndex);
}
},
[texts.length, currentTextIndex, handleIndexChange],
);
const reset = useCallback(() => {
if (currentTextIndex !== 0) {
handleIndexChange(0);
}
}, [currentTextIndex, handleIndexChange]);
useImperativeHandle(
ref,
() => ({
next,
previous,
jumpTo,
reset,
}),
[next, previous, jumpTo, reset],
);
useEffect(() => {
if (!auto) return;
const intervalId = setInterval(next, rotationInterval);
return () => clearInterval(intervalId);
}, [next, rotationInterval, auto]);
return (
<motion.span
className={cn(
"flex flex-wrap whitespace-pre-wrap relative",
mainClassName,
)}
{...rest}
layout
transition={transition}
>
<span className="sr-only">{texts[currentTextIndex]}</span>
<AnimatePresence
mode={animatePresenceMode}
initial={animatePresenceInitial}
>
<motion.div
key={currentTextIndex}
className={cn(
splitBy === "lines"
? "flex flex-col w-full"
: "flex flex-wrap whitespace-pre-wrap relative",
)}
layout
aria-hidden="true"
>
{elements.map((wordObj, wordIndex, array) => {
const previousCharsCount = array
.slice(0, wordIndex)
.reduce((sum, word) => sum + word.characters.length, 0);
return (
<span
key={wordIndex}
className={cn("inline-flex", splitLevelClassName)}
>
{wordObj.characters.map((char, charIndex) => (
<motion.span
key={charIndex}
initial={initial}
animate={animate}
exit={exit}
transition={{
...transition,
delay: getStaggerDelay(
previousCharsCount + charIndex,
array.reduce(
(sum, word) => sum + word.characters.length,
0,
),
),
}}
className={cn("inline-block", elementLevelClassName)}
>
{char}
</motion.span>
))}
{wordObj.needsSpace && (
<span className="whitespace-pre"> </span>
)}
</span>
);
})}
</motion.div>
</AnimatePresence>
</motion.span>
);
},
);
RotatingText.displayName = "RotatingText";
+27
View File
@@ -0,0 +1,27 @@
"use client";
import { RotatingText } from "@/components/reactbits/rotating-text";
const supports = [
"Next.js",
"Node.js",
"Hono",
"Express.js",
"Deno",
"Nest.js",
"Waku",
];
export const Supports = () => {
return (
<RotatingText
texts={supports}
mainClassName="inline-flex bg-transparent overflow-hidden justify-center"
initial={{ y: "100%" }}
animate={{ y: 0 }}
exit={{ y: "-120%" }}
staggerDuration={0.025}
transition={{ type: "spring", damping: 30, stiffness: 400 }}
rotationInterval={2000}
/>
);
};
-28
View File
@@ -1,28 +0,0 @@
"use client";
import { useEffect, useState } from "react";
import ReactTextTransition from "react-text-transition";
const supports = [
"Next.js",
"Node.js",
"Hono",
"Express.js",
"Deno",
"Nest.js",
"Waku",
];
export const TextEffect = () => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const id = setInterval(() => {
setCounter(
(Math.floor(Math.random() * supports.length) + 1) % supports.length,
);
}, 4000);
return () => {
clearInterval(id);
};
}, []);
return <ReactTextTransition inline>{supports[counter]}</ReactTextTransition>;
};
+24 -76
View File
@@ -138,7 +138,7 @@ importers:
version: 2.0.0
fumadocs-mdx:
specifier: ^11.5.6
version: 11.5.6(acorn@8.14.0)(fumadocs-core@15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
version: 11.5.6(@fumadocs/mdx-remote@1.2.0(acorn@8.14.0)(fumadocs-core@15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(acorn@8.14.0)(fumadocs-core@15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))
fumadocs-openapi:
specifier: ^6.3.0
version: 6.3.0(@scalar/api-client-react@1.1.25(@hyperjump/browser@1.2.0)(axios@1.7.9)(react@19.0.0)(tailwindcss@4.0.9)(typescript@5.7.3))(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(ajv@8.17.1)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(tailwindcss@4.0.9)
@@ -178,9 +178,6 @@ importers:
react-monaco-editor:
specifier: ^0.56.2
version: 0.56.2(@types/react@19.0.10)(monaco-editor@0.52.2)(react@19.0.0)
react-text-transition:
specifier: ^3.1.0
version: 3.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-use-measure:
specifier: ^2.1.1
version: 2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -3110,6 +3107,13 @@ packages:
'@formatjs/intl-localematcher@0.6.0':
resolution: {integrity: sha512-4rB4g+3hESy1bHSBG3tDFaMY2CH67iT7yne1e+0CLTsGLDcmoEWWpJjjpWVaYgYfYuohIRuo0E+N536gd2ZHZA==}
'@fumadocs/mdx-remote@1.2.0':
resolution: {integrity: sha512-S0pEpJZV8hiixXC2PGpRxGnR6kCVg3E6m+iaNb/gPIBK0CE6LIXXi2j8lNX1MO03bV1g+yb0d+aoK4Ldl+l2kA==}
peerDependencies:
fumadocs-core: ^14.0.0 || ^15.0.0
next: 14.x.x || 15.x.x
react: 18.x.x || 19.x.x
'@fumari/json-schema-to-typescript@1.1.2':
resolution: {integrity: sha512-OTWBpcRHnMcev652Dcl6xh2SFdTgiZzI9p4iI+pQI06LPOJKHBCVXQEBdOYlczPDQfOxwcNd3QGYeIAnOA0j2g==}
engines: {node: '>=18.0.0'}
@@ -4278,33 +4282,6 @@ packages:
'@radix-ui/rect@1.1.0':
resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
'@react-spring/animated@9.7.5':
resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
'@react-spring/core@9.7.5':
resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
'@react-spring/rafz@9.7.5':
resolution: {integrity: sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==}
'@react-spring/shared@9.7.5':
resolution: {integrity: sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
'@react-spring/types@9.7.5':
resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==}
'@react-spring/web@9.7.5':
resolution: {integrity: sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
'@redis/bloom@1.2.0':
resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==}
peerDependencies:
@@ -10158,11 +10135,6 @@ packages:
'@types/react':
optional: true
react-text-transition@3.1.0:
resolution: {integrity: sha512-NtXEVAXvSh78+8JAnrVjpbftzD4kPowacv4GB2Nyq9C/8ko6fSm6M/XvKWQLCaZi68i9F28b++Sp8uVThlzLyg==}
peerDependencies:
react: '>=18.0.0'
react-use-measure@2.1.7:
resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==}
peerDependencies:
@@ -13654,6 +13626,19 @@ snapshots:
dependencies:
tslib: 2.8.1
'@fumadocs/mdx-remote@1.2.0(acorn@8.14.0)(fumadocs-core@15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
dependencies:
'@mdx-js/mdx': 3.1.0(acorn@8.14.0)
fumadocs-core: 15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
gray-matter: 4.0.3
next: 15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0
zod: 3.24.2
transitivePeerDependencies:
- acorn
- supports-color
optional: true
'@fumari/json-schema-to-typescript@1.1.2':
dependencies:
'@apidevtools/json-schema-ref-parser': 11.9.3
@@ -14870,38 +14855,6 @@ snapshots:
'@radix-ui/rect@1.1.0': {}
'@react-spring/animated@9.7.5(react@19.0.0)':
dependencies:
'@react-spring/shared': 9.7.5(react@19.0.0)
'@react-spring/types': 9.7.5
react: 19.0.0
'@react-spring/core@9.7.5(react@19.0.0)':
dependencies:
'@react-spring/animated': 9.7.5(react@19.0.0)
'@react-spring/shared': 9.7.5(react@19.0.0)
'@react-spring/types': 9.7.5
react: 19.0.0
'@react-spring/rafz@9.7.5': {}
'@react-spring/shared@9.7.5(react@19.0.0)':
dependencies:
'@react-spring/rafz': 9.7.5
'@react-spring/types': 9.7.5
react: 19.0.0
'@react-spring/types@9.7.5': {}
'@react-spring/web@9.7.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@react-spring/animated': 9.7.5(react@19.0.0)
'@react-spring/core': 9.7.5(react@19.0.0)
'@react-spring/shared': 9.7.5(react@19.0.0)
'@react-spring/types': 9.7.5
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
'@redis/bloom@1.2.0(@redis/client@1.6.0)':
dependencies:
'@redis/client': 1.6.0
@@ -18887,7 +18840,7 @@ snapshots:
unist-util-visit: 5.0.0
zod: 3.24.2
fumadocs-mdx@11.5.6(acorn@8.14.0)(fumadocs-core@15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)):
fumadocs-mdx@11.5.6(@fumadocs/mdx-remote@1.2.0(acorn@8.14.0)(fumadocs-core@15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(acorn@8.14.0)(fumadocs-core@15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)):
dependencies:
'@mdx-js/mdx': 3.1.0(acorn@8.14.0)
'@standard-schema/spec': 1.0.0
@@ -18901,6 +18854,8 @@ snapshots:
next: 15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
unist-util-visit: 5.0.0
zod: 3.24.2
optionalDependencies:
'@fumadocs/mdx-remote': 1.2.0(acorn@8.14.0)(fumadocs-core@15.0.15(@types/react@19.0.10)(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(next@15.2.1(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
transitivePeerDependencies:
- acorn
- supports-color
@@ -22546,13 +22501,6 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.10
react-text-transition@3.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@react-spring/web': 9.7.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0
transitivePeerDependencies:
- react-dom
react-use-measure@2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
react: 19.0.0